Jump to content

Welcome to the new Traders Laboratory! Please bear with us as we finish the migration over the next few days. If you find any issues, want to leave feedback, get in touch with us, or offer suggestions please post to the Support forum here.

  • Welcome Guests

    Welcome. You are currently viewing the forum as a guest which does not give you access to all the great features at Traders Laboratory such as interacting with members, access to all forums, downloading attachments, and eligibility to win free giveaways. Registration is fast, simple and absolutely free. Create a FREE Traders Laboratory account here.

andypap

Maximum Value in Array if Condition is True

Recommended Posts

hi

 

i am dealing with a coding problem i dont know how to resolve efficiently

 

what i want to do is

 

first: to reset all the values of the array before last time a condition was true to the minimum value.

 

then : to get the maximum value of the array.

 

i am using a for down to loop to fill the array whitch has a fixed length

and two conditions.

 

counter = counter + 1 ;

if rsi(c,14) crosses over 50 then

counter = 0 ;

 

if c > average(c,1000) then

if counter = 1 then begin

for nn = 20 down to 1 begin

array[nn] = array[nn-1] ;

end;

array[nn] = c ;

end;

 

now the array has twenty elements some of whitch

are stored from the previous time that

the c was greater than the average when the counter equals 1 .

 

what i mean by that is the if the array evey time the condition (c> average) will start

it will carry over values from the previous time that the condition was true.

 

how can i sort this mess out ?

 

regards

Share this post


Link to post
Share on other sites

well i dont exactly understand what you mean but thatks for the reply anyway

 

 

i will try to explain further what is the problem i am dealing with.

 

when the close just became greater than the average and this represents the basic condition

every time rsi crosses over 50 (second condition)the counter reset to 1 and the value of the close is stored in array[0]...

 

the array has 20 elements...

 

in the following senario

 

the first time rsi crosses over 50 after c > average

array slot[0] stores the close of that bar and the rest of the 19 slots

are carying over the closing value of the bars where counter = 1 from the

previous time that the close > average.

 

what i want to do is

every time the first condition becomes true to reset all the array values to

a dummy value (-1) and then every time counter = 1 start filling the array

with the close...

 

note i dont want to resize the array(dynamic array).

 

then i want to get the max value of the array slots.

 

note that in case of the scenario aformentioned

the array will be

array[0] = c;

array[1] to array[19] = -1

max value of array = array[0]

 

when the second ocurrance that counter = 1 will happen while c > average

then the array will be

array[0] = c of first ocuurance

array[1] = c of second occurance

array[2] to array[19] = - 1

if array[0] > array[1] then

max value of array = array[0] else array[1]

 

my problem is coding the above efficiently the way a pro would have done it so the code will be precize and 100% accurate

 

my efforts so far require a lot of lines and i am 80% accurate..

 

for example i am using the maxlist to get tha max value by naming all the array slots one by one

 

value1 = maxlist(array[0],array[1] ......array[19]) ;

 

regards

Share this post


Link to post
Share on other sites

please tag your code with the # key.

it is located at the top of the message window.

 

Tagged code looks like this:

 

//
// this is tagged code
//

array[0] = c; 
array[1] to array[19] = -1 
max value of array = array[0] 

Share this post


Link to post
Share on other sites

let me rephrase to check your requirements:

1. you want to obtain value of close for period where the condition Close > Average is met.

2. reset function occurs where condition RSI > 50

 

would the following solution suffice?

 

inputs:
PeriodReq(20),
PeriodRSI(14);

variables:
RSI50C(0),
MyVar(0);

if Close > Average(C,1000)
then begin
RSI50C = IFF(RSI(C,PeriodRSI) > 50, Close, 0);
end
else
RSI50C = 0;
end;

MyVar = Highest(RSI50C,PeriodReq);

 

This will create a rolling fixed array that will:

1. return Close if conditions (a) C > Avg and (b) RSI > 50 are met

2. return highest Close over the past 20 periods

 

ps: i did not test the code out on TradeStation. probably may have some syntax error. but probably you need just the basic structure.

Edited by sneo

Share this post


Link to post
Share on other sites

this is the code that i am using

 

 

 

vars : cnt(0),avg(0),maxval(0), ii(0) ;

 

arrays ; carr[10](0) ;

 

avg = average(c,1000) ;

 

 

cnt + cnt + 1 ;

if rsi(c,14) crosses over 50 then

cnt = 1 ;

 

 

if c > avg then begin

if cnt = 1 then begin

for ii = 10 downto 1 begin

carr[ii] = carr[ii-1];

end;

carr[0] = c ;

end ;

end ;

 

if c < avg then

for ii = 10 downto 1 begin

carr[ii] = -1 ;

end;

 

maxval = maxlist(carr[0],carr[1],carr[2],carr[3],carr[4],

carr[5],carr[6],carr[7],carr[8],carr[9]);

 

 

 

here is a scenario of how the code should opperate

 

suppose that

while the condition c > average is true there are only 5 instances where cnt = 1

 

 

the 5 first slots of the array should hold the closing price of those instances and the remaining slot( array[5] to array[9] the dummy value..

 

then when c < average the array should reset all its slots to the dummy value

 

then when c > average again the array should start populating again every time cnt = 1

 

note that

the array will populate all the slots with a closing price only if the

ocurrances of cnt = 1 are greater than 9 in the current run of the close been greater than the average...

 

 

 

sneo (thanks for the input)

this is not about periods back...

it is an array of 10 insctances of a condition(cnt = 1) within a broader condition(c>avg) that might ocurr or not if the broader condition will switch(c<avg) before the sum of instances of the instance condition(cnt=1) will reach 10 ...

 

i hope this will clarifie everything

 

regards

Share this post


Link to post
Share on other sites
please tag your code with the # key.

it is located at the top of the message window.

 

Tagged code looks like this:

 

//
// this is tagged code
//

array[0] = c; 
array[1] to array[19] = -1 
max value of array = array[0] 

This will preserve your indents and make things easier for people to read.

Share this post


Link to post
Share on other sites

guys

 

this is a technical problem i am doing my best to describe...it is not an ethical problem...

if someone knows how it can be resolved and wants to do it can post a solution...

 

i think that this is only a matter of a certain structure of the array in a coupple of lines..

 

it can be viewed as a general routine (tutorial) in arrays because the conditions i am describing in the code can be replaced by any condition and the value assigned in the array by any value...

 

the benefit of this structure is isolating specific conditional instances within a more general condition without refering to bars back....

every time the counter = 1 the array slot will be filled with any desired value as long a the first general condition is true....

the counter doesnot have a fixed length so the array is filled in terms of length assymetrically...

thus you can get an assymetric n = (array size) moving average for example of highs

everytime rsi crosses over 70 ( this is not what i am after anyway) or anything else you can imagine of practical use...

 

so far everything works fine exept the fact that untill in the current run of the general condition , the occurances reach the size of the arrray, the array is bringing forward values from the previous run of the general condition...

 

regards

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.