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

  Crazynasdaq said:
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.

 

 

  Quote

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
  Tams said:
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
  Crazynasdaq said:
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
  Frank said:
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
  Crazynasdaq said:

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
  Crazynasdaq said:
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
  Tams said:
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.

 

  Quote
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
  Tradewinds said:

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
  bomberone1 said:
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

    • In Italy, I saw many of our brothers from different parts of Africa, sleeping and living in the park, the weather was very cold and its obvious that they were looked down upon. It made me want to cry and several questions overwhelmed my heart.   Is it not better to remain in Africa than to be homeless in this freezing cold weather?   I wish I have all the money in the world to rescue them...   Is this the reason why our skin color is looked down upon?   Do our government officials see this sight when they also travel outside of the country...does it hurt them or pain them like it pained me? By Frank Abah, Quora   Profits from free accurate cryptos signals: https://www.predictmag.com/   
    • ELV Elevance Health stock, watch for an upside gap breakout at https://stockconsultant.com/?ELV
    • ORLY OReilly Automotive stock, nice top of range breakout, from Stocks to Watch at https://stockconsultant.com/?ORLY
    • Date: 28th March 2025.   Market Selloff Deepens as Tariff Concerns Weigh on Investors     Global stock markets extended their losing streak for a third day as concerns over looming US tariffs and an escalating trade war dampened investor sentiment. The flight to safety saw gold prices surge to a record high, underscoring growing risk aversion. Stock Selloff Intensifies The MSCI World Index recorded its longest losing streak in a month, while Asian equities saw their sharpest decline since late February. US and European stock futures also signalled potential weakness, while cryptocurrency markets retreated and bond yields edged lower. Investors are scaling back their exposure ahead of President Donald Trump’s expected announcement of ‘reciprocal tariffs’ on April 2. His latest move to impose a 25% levy on all foreign-made automobiles has sparked fresh concerns over inflation and economic growth, prompting traders to reassess their strategies. Investor Strategies Shift Market experts are adjusting their portfolios in anticipation of heightened volatility. ‘It’s impossible to predict Trump’s next move,’ said Xin-Yao Ng of Aberdeen Investments. ‘Our focus is on companies that are less vulnerable to tariff policies while taking advantage of market dips to find value opportunities.’ Yield Curve Signals Economic Concerns In the bond market, the spread between 30-year and 5-year US Treasury yields widened to its highest level since early 2022. Investors are bracing for potential Federal Reserve rate cuts if economic growth slows further. Long-term Treasury yields hit a one-month peak as inflation risks tied to tariffs spurred demand for higher-yielding assets. Boston Fed President Susan Collins noted that while tariffs may contribute to short-term price increases, their long-term effects remain uncertain. Gold Hits Record High as Safe-Haven Demand Rises Amid market turbulence, gold prices soared 0.7% on Friday, reaching an all-time high of $3,077.60 per ounce. Major banks have raised their price targets for the precious metal, with Goldman Sachs now forecasting gold to hit $3,300 per ounce by year-end. Looking Ahead As investors digest economic data showing US growth acceleration in Q4, attention will turn to Friday’s release of the personal consumption expenditures (PCE) price index—the Federal Reserve’s preferred inflation measure. This data will be critical in shaping expectations for future Fed policy moves. With markets on edge and trade tensions escalating, investors will closely monitor upcoming developments, particularly Trump’s tariff announcement next week, which could further dictate market direction.   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 of how markets work. Click HERE to register for FREE!   Click HERE to READ more Market news.   Andria Pichidi 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 Leveraged 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.
    • Crypto hype is everywhere since it also making new riches as well, i however trade crypto little as compared to other forex trading pairs.
×
×
  • Create New...

Important Information

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