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.

Tams

Array (EasyLanguage)

Recommended Posts

No, I don't think that waht I want to build is a 3 dimensional array.

I'm trying to build a Volume profile so it's a 2 dimensional array.

First dimension unlimited and unknown is the range of each day (High of the day - Low of the day) * price scale (or tick scale as you want)

 

Second dimensional array the volume of each level price (unknown )

 

So the final array is an array of the 2 first arrays each one unlimited.

The final array I think is a 2 dimensional array.

 

 

...call it whatever you will, you should draw out the data dependencies on a grid... and see how each piece of data relate to each other.

 

 

Is it possible ???

 

 

don't know, never tried it.

 

if you write out your thoughts in a step-by-step pseudo code,

e.g. one action per-line, one-line per-action,

you might be able to work out the code logics.

Edited by Tams

Share this post


Link to post
Share on other sites
any 2 arrays that has a common or dependent element on another array is a 3-D array...

 

 

 

 

 

don't know, never tried it.

 

if you write out your thoughts in a step-by-step pseudo code,

e.g. one action per-line, one-line per-action,

you might be able to work out the code logics.

 

I'll try it and I write it here, so if you could help me in the step by step way maybe I'll make it faster and useful to anyone.

Maybe if I post my thoughts and my codes you or someone else could help me doing that and we can achieve a code on an indicator that many would like to have.

Thanks again for your time

CrazyNasdaq

Share this post


Link to post
Share on other sites
I'll try it and I write it here, so if you could help me in the step by step way maybe I'll make it faster and useful to anyone.

Maybe if I post my thoughts and my codes you or someone else could help me doing that and we can achieve a code on an indicator that many would like to have.

Thanks again for your time

CrazyNasdaq

 

 

before you start running, I would suggest you to learn to walk...

(I am famous for helping people to go from step 1 to step 2, but absolutely refuse to assist anyone to skip from step zero to step 3)

 

go through post #1 (which I know you haven't yet)...

and the tutorial in post #2,

then digest post #5

 

make a few exercises...

 

array is about data manipulation,

you have to be comfortable with a 2 dimensional array before you can work on a 3-D,

because a 3-D is exponentially more complex in structure and data tracking.

Share this post


Link to post
Share on other sites

CrazyNasdaq,

 

you do not need a 2 or 3d array for this. a programming friend of mine did this in Visual Basic and used a 1-dimensional dynamic array.

 

Here were the steps:

 

1) set up the basic array structure:

 

if 'this bar' is first bar of a new day (date>date[1]), clear out array and set counter variables to zero

 

if not a new day, then expand the existing array (the one created if the first if statement was true) to add new data, while preserving the existing array

 

I believe you do this using the EL syntax Array_SetMaxIndex(ArrayName, #Elements)

 

2) populate array. something like this:

 

barrange1 = ((high - Low) / 0.25)+1;

x=0

For Counter1 = 0 to barrange1

begin

bars1[x] = low +(0.25 * Counter1);

x=x+1

end;

 

note that the variable x is going to keep track of total elements in the array

 

the part I don't understand is how often you have to re-set the size of the array and/or preserve the array so it doesn't lose data elements within the array. the code I write invariably is out of bounds of the array or some syntax just isn't right. its damn hard to find supporting documentation on EL.

Share this post


Link to post
Share on other sites
CrazyNasdaq,

 

you do not need a 2 or 3d array for this. a programming friend of mine did this in Visual Basic and used a 1-dimensional dynamic array.

 

Here were the steps:

 

1) set up the basic array structure:

 

if 'this bar' is first bar of a new day (date>date[1]), clear out array and set counter variables to zero

 

if not a new day, then expand the existing array (the one created if the first if statement was true) to add new data, while preserving the existing array

 

I believe you do this using the EL syntax Array_SetMaxIndex(ArrayName, #Elements)

 

2) populate array. something like this:

 

barrange1 = ((high - Low) / 0.25)+1;

x=0

For Counter1 = 0 to barrange1

begin

bars1[x] = low +(0.25 * Counter1);

x=x+1

end;

 

note that the variable x is going to keep track of total elements in the array

 

the part I don't understand is how often you have to re-set the size of the array and/or preserve the array so it doesn't lose data elements within the array. the code I write invariably is out of bounds of the array or some syntax just isn't right. its damn hard to find supporting documentation on EL.

Thanks for the suggestion TAMS,

I've read again the posts in the first page and the tutorial (post #2).

Here is my way of doing it:

1) use a 1 tick chart with volume set to Trade volume and NOT tick count.

*************************************

2) identify the range of each day (past and real time) and reset it each new day:

 

if date > Date[1] then begin

OpenDay = open;

HighDay = High;

LowDay = low;

CloseDay = close;

end;

 

If Date = date[1] then begin

 

If high > HighDay then

HighDay = High;

If Low < LowDay then

LowDay = Low;

if time >= Sess1endtime then

CloseDay = close;

If time < Sess1endtime and lastbaronchart then

CloseDay = close;

end;

 

RangeDay = HighDay - LowDay;

**********************************************

3) Identify the numbers of rows for each price of the day range :

 

TickScale = minmove/priceScale;

NRows = RangeDay * (1/TickScale);

**********************************************

4) Define the Array (1d dinamic array) regards volume:

 

MyVol = iff(bartype < 2, Upticks + Downticks, volume);

Array: MATRXIVoL[](0);

 

iVolume = MyVol;

iPrice = AvgPrice;

 

if date > date[1] then begin

Array_SetMaxIndex(MATRIX, NRows); // resize the array each day

MATRIXVoL[iVolume] = 0; // rest to zero each day

END;

***********************************************

5) Populate the Array for the past days and for the real time day

 

if Date = Date[1] then begin

fro iPrice = 0 to (NRows-1) begin

MATRIXVoL[iVolume] = MyVol ;

END;

 

If AvgPrice = iPrice then begin

MATRIXVoL[iVolume] = MATRIXVoL[iVolume] + MyVol;

END;

************************************************

 

These are my steps, but as a newbie about arrays, I'm not so sure about step #5, specially the last part {if AvgPrice = iPrice then begin ......ecc.....}

 

Then an other problem is:

If this way is correct a functional, how can I draw the Volume profile ??

Thanks again TAMS for your patience and your time.

 

P.S.

I have some ideas about the plotting and using ADE about this Volume profile, but it would be better to talk about it in private and then posting the final work.

If You want TAMS, write me in PVT to my TL private account.

Edited by Crazynasdaq

Share this post


Link to post
Share on other sites

5) Populate the Array for the past days and for the real time day

 

if Date = Date[1] then begin

fro iPrice = 0 to (NRows-1) begin

MATRIXVoL[iVolume] = MyVol ;

END;

 

If AvgPrice = iPrice then begin

MATRIXVoL[iVolume] = MATRIXVoL[iVolume] + MyVol;

END;

************************************************

 

This step (#5) is surely incorrect......

 

"for iPrice = 0 to (NRows-1) begin....... " is not the right way

iPrice can't be = 0 at least it can be :

 

for iPrice = HighDay downto LowDay begin

MatrixVoL[iVolume] = MyVol;

END;

 

 

Or another way (I don't know if the syntax is correct):

 

for iPrice = HighDay downto (HighDay - TickScale)=LowDay begin

MatrixVoL[iVolume] = MyVol;

END;

 

This step is the most difficult !!!

Edited by Crazynasdaq

Share this post


Link to post
Share on other sites
This step (#5) is surely incorrect......

 

"for iPrice = 0 to (NRows-1) begin....... " is not the right way

iPrice can't be = 0 at least it can be :

 

for iPrice = HighDay downto LowDay begin

MatrixVoL[iVolume] = MyVol;

END;

 

 

Or another way (I don't know if the syntax is correct):

 

for iPrice = HighDay downto (HighDay - TickScale)=LowDay begin

MatrixVoL[iVolume] = MyVol;

END;

 

This step is the most difficult !!!

 

 

iPrice is the counter

 

the loop would only makes sense if you use the counter to cycle the instructions inside the loop.

 

e.g.

for iPrice = HighDay downto LowDay begin

MatrixVoL[iPrice] = MyVol(iPrice);

END;

 

 

 

p.s. I have not studied your code or logic, the above example is for LOOP illustration only, not a correction to your logics.

more on For loop can be found here:

FOR (EasyLanguage)

http://www.traderslaboratory.com/forums/f56/easylanguage-7074.html

Share this post


Link to post
Share on other sites
iPrice is the counter

 

the loop would only makes sense if you use the counter to cycle the instructions inside the loop.

 

e.g.

for iPrice = HighDay downto LowDay begin

MatrixVoL[iPrice] = MyVol(iPrice);

END;

 

 

 

p.s. I have not studied your code or logic, the above example is for LOOP illustration only, not a correction to your logics.

more on For loop can be found here:

FOR (EasyLanguage)

http://www.traderslaboratory.com/forums/f56/easylanguage-7074.html

 

Thanks again TAMS.

I'll correct my code and think again to it for a better way if it's wrong.

 

Thanks

Crazy

Share this post


Link to post
Share on other sites

In trading, using an array is critical to compare intrabar data. Indexes can be used to compare one bar to another bar:

 

For example:

 

(If Close > High[1] then Sell) If the current close is greater than the last bars high, then sell.

 

In comparison:

 

If High > High then Sell; If this bars high is greater than this bars high then sell. This statement will never be true. You can't compare the current high to itself on the same bar using the built in price functions.

 

If you want to compare the high of the current bar at one point in time, to the high of the current bar at another point in time, you can only do that with an array. For example, if you wanted to compare the high of the price bar when your indicator crossed a threshold, and then compare the high of the price bar when the indicator started in a new direction, and that all happened on the same price bar, you would need to store the value of the high of the bar when the indicator crossed the threshold, then capture the value of the high of the price bar when the indicator started moving the other direction, then retrieve those two values from the array in order to compare them.

Share this post


Link to post
Share on other sites

EasyLanguage now has Object Oriented Arrays. EL (EasyLanguage) calls the arrays VECTOR Arrays. Actually, EL OO has something called "Collections", which are a collection of data. There are 5 different types of Collections.

 

The answer to the traditional Array in EL OO is a VECTOR. But a VECTOR array can access a particular element in the array. Here are the methods that can be used in a VECTOR array.

 

Create Initializes a new instance of the Vector class.

At(indx) Accesses an element at the specified position in the collection.

Back Accesses the last element of the collection.

Clear Removes all elements from the collection.

Empty True if there are no elements in the collection, otherwise false.

Erase(indx) Removes an element at the specified position.

Erase(indx1,indx2) Removes the elements in the specified range of index positions.

Front Accesses the first element of the collection.

Insert(indx,obj) Adds an element (obj) before the specified index.

Insert(indx,count,obj) Adds an element (obj) repeatedly before the specified position with the given count.

Pop_back Removes the last element from the collection.

Push_back(obj) Adds a new element (obj) to the end of the collection.

 

This code creates two vector ARRAYs. The code inside the METHOD subroutine only runs when an order is updated. It is an Event Driven subroutine. The event is the order status changing, for example, the order goes from Sending to Sent, or Sent to Received, or from Received to Filled, or From Filled to Closed out. This Method subroutine keeps track of unfilled Buys and Sells.

 

var: Vector UnFilledSells( NULL ), UnFilledBuys( NULL );

method void OP1_Updated( elsystem.Object sender, tsdata.trading.OrderUpdatedEventArgs args ) 

var: int iCount, int TheState, int QtyUnfilled, int BuyOrSell,
		string OrdrNum, bool ItsInThere, int SellsCount, int BuysCount;

begin

Once Begin  // If the vector is created more than once, it deletes all the elements
UnFilledSells = new Vector;  // Create the new array.
UnFilledBuys = new Vector; 
End;

TheState = args.State; // Get the state of the current order
if OP1.Orders.Count > 0 then QtyUnfilled = OP1[0].LeftQuantity else QtyUnfilled = 0;
OrdrNum = args.OrderID;  // Get the order number of the order that was just updated

if StrLen(OrdrNum) > 0 then BuyOrSell = OP1[OrdrNum].Action else BuyOrSell = 0;  // Buy = 1 Sell = 2

//print(file("c:\VctrArry.txt"), "Prn1 ", "array lngth=", UnFilledSells.Count:0:0, "   |   Order Num=", OrdrNum, "   State=", TheState:0:0, "   |  Qty Entered=", QtyUnfilled:0:0, "   |   Time=", Formattime("hh:mm:ss", TradeTimeEx));

If UnFilledSells.empty() = False then  // If the array is NOT empty, get the count of how many records
	SellsCount = UnFilledSells.Count else SellsCount = 0;  // Get  how many records are in the array

If UnFilledBuys.empty() = False then  // If the array is NOT empty, get the count of how many records
	BuysCount = UnFilledBuys.Count else BuysCount = 0;  // Get  how many records are in the array

ItsInThere = False;

If SellsCount > 0 and BuyOrSell = 2 then begin
	For iCount = 0 to UnFilledSells.Count - 1 begin // Loop through all the orders in the array
		If UnFilledSells.at(iCount) astype string = OrdrNum then // Check if current order number is in the array
		ItsInThere = True;
	End;
End;

If BuysCount > 0 and BuyOrSell = 1 then begin
	For iCount = 0 to UnFilledBuys.Count - 1 begin // Loop through all the orders in the array
		If UnFilledBuys.at(iCount) astype string = OrdrNum then // Check if current order number is in the array
		ItsInThere = True;
	end;
End;

// If the array is empty, just add the order
If (TheState = 4 or TheState = 2) and SellsCount = 0 and BuyOrSell = 2 then begin
	// If it's a SELL order, and the array is empty, then add a new element to the SELL array
	UnFilledSells.insert(0, OrdrNum);  // If state is received, sent or sending and it's not in the array, add it
	UnfilledSellOrdrs = UnFilledSells.Count;
	//print(file("c:\VctrArry.txt"), "Prn2 ", "array lngth=", UnFilledSells.Count:0:0, "   |   Order Num=", OrdrNum, "   State=", TheState:0:0, "   |  Qty Entered=", QtyUnfilled:0:0, "   |   Time=", Formattime("hh:mm:ss", TradeTimeEx), Newline);
	Return; // If the order number needed to be added to the arry, then your done.  Quit here.
End;

If (TheState = 4 or TheState = 2) and BuysCount = 0 and BuyOrSell = 1 then begin
	UnFilledBuys.insert(0, OrdrNum);  // If state is received, sent or sending and it's not in the array, add it
	UnfilledBuyOrdrs = UnFilledBuys.Count;
	//print(file("c:\VctrArry.txt"), "Prn2 ", "array lngth=", UnFilledSells.Count:0:0, "   |   Order Num=", OrdrNum, "   State=", TheState:0:0, "   |  Qty Entered=", QtyUnfilled:0:0, "   |   Time=", Formattime("hh:mm:ss", TradeTimeEx), Newline);
	Return; // If the order number needed to be added to the arry, then your done.  Quit here.
End;	

If TheState <> 4 and TheState <> 2 and BuyOrSell = 2 and ItsInThere = True then begin // If order status is anything buy sent or received
	For iCount = 0 to UnFilledSells.Count - 1 begin // Loop through all the orders in the array
		If UnFilledSells.at(iCount) astype string = OrdrNum then begin // Check if current order number is in the array
			ItsInThere = True; // The order number was found in the array
		 	// If the order in the vector has any status but 4, then delete the record
			UnFilledSells.erase(iCount);  // If it's not a status of Received, then it's been filled, or canceled, etc
			UnfilledSellOrdrs = UnFilledSells.Count;
			Return;
		End;
	End;
End;

If TheState <> 4 and TheState <> 2 and BuyOrSell = 1 and ItsInThere = True then begin
	For iCount = 0 to UnFilledBuys.Count - 1 begin // Loop through all the orders in the array
		If UnFilledBuys.at(iCount) astype string = OrdrNum then begin // Check if current order number is in the array
			ItsInThere = True; // The order number was found in the array
		 	// If the order in the vector has any status but 4, then delete the record
			UnFilledBuys.erase(iCount);  // If it's not a status of Received, then it's been filled, or canceled, etc
			UnfilledBuyOrdrs = UnFilledBuys.Count;
			Return;
		End;
	End;
End;

If (TheState = 4 or TheState = 2) and BuyOrSell = 2 and ItsInThere = False then begin // if the order number is not in the array
	UnFilledSells.insert(0, OrdrNum);  // If state is received or sending and it's not in the array, add it
	UnfilledSellOrdrs = UnFilledSells.Count;
	//print(file("c:\VctrArry.txt"), "Prn4 ", "array lngth=", UnFilledSells.Count:0:0, "   |   Order Num=", OrdrNum, "   State=", TheState:0:0, "   |  Qty Entered=", QtyUnfilled:0:0, "   |   Time=", Formattime("hh:mm:ss", TradeTimeEx), Newline);
	Return;  // Return is not needed in a VOID method, but useful to control when the execution is stopped.
End;

if (TheState = 4 or TheState = 2) and BuyOrSell = 1 and ItsInThere = False then begin
	UnFilledBuys.insert(0, OrdrNum);  // If state is received or sending and it's not in the array, add it
	UnfilledBuyOrdrs = UnFilledBuys.Count;
	//print(file("c:\VctrArry.txt"), "Prn4 ", "array lngth=", UnFilledSells.Count:0:0, "   |   Order Num=", OrdrNum, "   State=", TheState:0:0, "   |  Qty Entered=", QtyUnfilled:0:0, "   |   Time=", Formattime("hh:mm:ss", TradeTimeEx), Newline);
	Return;  // Return is not needed in a VOID method, but useful to control when the execution is stopped.
End;

End;

Share this post


Link to post
Share on other sites

If you want to compare the high of the current bar at one point in time, to the high of the current bar at another point in time, you can only do that with an array. For example, if you wanted to compare the high of the price bar when your indicator crossed a threshold, and then compare the high of the price bar when the indicator started in a new direction, and that all happened on the same price bar, you would need to store the value of the high of the bar when the indicator crossed the threshold, then capture the value of the high of the price bar when the indicator started moving the other direction, then retrieve those two values from the array in order to compare them.

 

COuld code this example by normal easylanguage and not OOO.

Share this post


Link to post
Share on other sites
COuld code this example by normal easylanguage and not OOO.

 

Regular EL also has an array. I have not used the regular array. There is probably multiple ways to compare intrabar values to each other. The time could be recorded and compared.

EL has something called 'intrabarpersist'. I find it confusing and a pain. Intrabarpersist variables will hold intrabar values differently than regular variables.

 

Do you have an example of how to do this with regular easylanguage?

 

Unfortunately I can't edit my post that you are referring to. I'd change the wording, but I can't now. I stated that there was only one way to do something, but I'm sure that isn't true.

Share this post


Link to post
Share on other sites

Tradewinds,

 

So is a vector available to different windows such that an indicator's vector values are also available to a strategy? Or is this dependent on making the values of the method global dictionary values?

Thanks,

TBB

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.