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.


  • Topics

  • Posts

    • $EWBC East West Bancorp stock, solid breakout from Stocks To Watch , https://stockconsultant.com/?EWBC
    • $AZEK stock, tight bull flag breakout watch above 50.73 , see https://stockconsultant.com/?AZEK
    • $AMZN Amazon stock holding firm with a breakout watch , see https://stockconsultant.com/?AMZN
    • $AIZ Assurant stock nice breakout, from Stocks To Watch , see https://stockconsultant.com/?AIZ  
    • Date: 28th March 2024. The US Dollar Strengthens As Economists Believe The ECB Will Struggle To “Hold”. Early this morning, the Fed Governor advised “there is no rush to cut rates” and “the data within the upcoming months” will be vital. The US Dollar Index rises to a 1-month high. The value of the USD will largely be based on today’s data on economic growth, consumer sentiment and pending home sales. Dollar and index traders are closely monitoring tomorrow’s Core PCE Price Index which analysts expect will read 0.3%. A higher inflation reading can potentially pressure stocks and support the Dollar. Strong declines in NVIDIA and Netflix stocks pressured the NASDAQ on Wednesday. Though, buyers entered late in the session to boost the overall price. EURUSD The latest comments from members of the Federal Reserve are supporting the US Dollar. The forward guidance between members of the Federal Reserve is mainly not aligned. The Chairman advises the Fed does not need much more proof for the regulator to feel comfortable reducing rates. Whereas the Fed Governor, Mr Waller, advises there is no rush, and he wants to see a few months of data before determining the next move. Therefore, the upcoming inflation and employment data will remain vital and could even push back rate hikes further. According to economists, the Federal Reserve will cut the interest rate on 3 occasions this year, but the timing of the first cut is less certain and may change depending on upcoming data. A positive factor for traders is that EURUSD exchange is not witnessing conflicting currencies. The US Dollar is trading 0.12% higher while the Euro is declining against most currencies. The Euro is trading 0.06% lower against the Pound and the Canadian Dollar and 0.16% lower against the Japanese Yen. Yesterday, the head of the Bank of Italy, Mr Cipollone, said that the authorities were confident that inflation would return to the target of 2.0% by mid–2025. He also supports the lower of interest rate and will use this as a basis for adjusting monetary policy. The Euro is generally under pressure as investors believe the European Central Bank will struggle to avoid cuts if the Fed decide to delay their adjustments. The US Dollar will be influenced by four major economic data releases. The US Final GDP, Weekly Unemployment Claims, Pending Home Sales and Consumer Sentiment Index. If these read higher than expectations with the weekly unemployment claims dropping, the US Dollar is likely to witness further support. However, investors should note the main release will be tomorrow’s Core PCE Price Index. Traders are expecting no major news for Europe and volatility levels may fall tomorrow as European markets are closed for Easter. Technical analysis currently points towards a continued downward trend. The price is trading below the neutral on the RSI and below the 75-Bar EMA. However, investors should note this will also be dependent on upcoming US data. USA100 The price of the USA100 was under pressure throughout the whole US session but was saved by an increased volume of buyers late in the session. However, a positive point is the components held onto their value. Even though the index fell in value, only 28% of the components declined. Investors will now turn their attention towards tomorrow’s PCE Price Index and the upcoming earnings season which will start in mid-April. The price is now trading slightly above the Moving Averages but slightly below the 50.00 on the RSI. Therefore, technical analysis remains at the “neutral” level and continues to indicate a larger price range. If today’s economic data is positive the stock market can witness confidence and support as this continues to indicate a soft landing. Though, if the data is too strong, it could also trigger a hawkish Fed which is known to be negative for the USA100. Always trade with strict risk management. Your capital is the single most important aspect of your trading business. Please note that times displayed based on local time zone and are from time of writing this report. Click HERE to access the full HFM Economic calendar. Want to learn to trade and analyse the markets? Join our webinars and get analysis and trading ideas combined with better understanding on how markets work. Click HERE to register for FREE! Click HERE to READ more Market news. Michalis Efthymiou Market Analyst HFMarkets Disclaimer: This material is provided as a general marketing communication for information purposes only and does not constitute an independent investment research. Nothing in this communication contains, or should be considered as containing, an investment advice or an investment recommendation or a solicitation for the purpose of buying or selling of any financial instrument. All information provided is gathered from reputable sources and any information containing an indication of past performance is not a guarantee or reliable indicator of future performance. Users acknowledge that any investment in FX and CFDs products is characterized by a certain degree of uncertainty and that any investment of this nature involves a high level of risk for which the users are solely responsible and liable. We assume no liability for any loss arising from any investment made based on the information provided in this communication. This communication must not be reproduced or further distributed without our prior written permission.
×
×
  • Create New...

Important Information

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