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

    • AMZN Amazon stock, nice buying at the 187.26 triple+ support area at https://stockconsultant.com/?AMZN
    • DELL Dell Technologies stock, good day moving higher off the 90.99 double support area, from Stocks to Watch at https://stockconsultant.com/?DELL
    • MCK Mckesson stock, nice trend and continuation breakout at https://stockconsultant.com/?MCK
    • lmfx just officially launched their own LMGX token, Im planning to grab a couple of hundred and maybe have the option to stake them. 
    • Date: 2nd April 2025.   Market on Edge: Tariff Announcement and Volatility Ahead!   The US economic and employment data continues to deteriorate with the job vacancies figures dropping to a 5-month low. In addition to this, the IMS Manufacturing PMI also fell below expectations. However, both the US Dollar and Gold declined simultaneously following the release of the two figures, an uncommon occurrence in the market. Traders expect a key factor to be today’s ‘liberation day’ where the US will impose tariffs on imports. USDJPY - Traders Await Tariff Confirmation! Traders looking to determine how the USDJPY will look today will find it difficult to determine until the US confirms its tariff plan. Today is the day when Trump previously stated he would finalize and announce his tariff plan. The administration has not yet released the policy, but investors expect it to be the most expansionary in a century. President Trump is due to speak at 20:00 GMT. On HFM's Calendar the speech is stated as "US Liberation Day Tariff Announcement". Currently, analysts are expecting Trump’s Tariff Plan to impose tariffs on the EU, chips and pharmaceuticals later today as well as reciprocal tariffs. Economists have a good idea of how these tariffs may take effect, but reciprocal tariffs are still unspecified. In addition to this, 25% tariffs on the car industry will start tomorrow. The tariffs on the foreign cars industry are a factor which will particularly impact Japan. Although, traders should note that this is what is expected and is not yet finalised. Last week, President Trump stated that he would implement retaliatory tariffs but allow exemptions for certain US trade partners. Treasury Secretary Mr Bessent and National Economic Council Director Mr Hassett suggested that the restrictions would primarily target 15 countries responsible for the bulk of the US trade deficit. However, yesterday, Trump contradicted these statements, asserting that additional duties would be imposed on any country that has implemented similar measures against US products. The day’s volatility will depend on which route the US administration takes. The harshness of the policy will influence both the Japanese Yen as well as the US Dollar.   USDJPY 5-Minute Chart   US Economic and Employment Data The JOLT Job Vacancies figure fell below expectations and is lower than the previous month’s figure. The JOLT Job Vacancies read 7.57 million whereas the average of the past 6 months is 7.78 million. The ISM Manufacturing Index also fell below the key level of 50.00 and was 5 points lower than what analysts were expecting. The data is negative for the US Dollar, particularly as the latest release applies more pressure on the Federal Reserve to cut interest rates. However, this is unlikely to happen if the trade policy ignites higher and stickier inflation. In the Bank of Japan’s Governor's latest speech, Mr Ueda said that the tariffs are likely to trigger higher inflation. USDJPY Technical Analysis Currently, the Japanese Yen Index is the worst performing of the day while the US Dollar Index is more or less unchanged. However, this is something traders will continue to monitor as the EU session starts. In the 2-hour timeframe, the USDJPY is trading at the neutral level below the 75-bar EMA and 100-bar SMA. The RSI and MACD is also at the neutral level meaning traders should be open to price movements in either direction. On the smaller timeframes, such as the 5-minute timeframe, there is a slight bias towards a bullish outcome. However, this is only likely if the latest bearish swing does not drop below the 200-Bar SMA.     The key resistant level can be seen at 150.262 and the support level at 149.115. Breakout levels are at 149.988 and 149.674. Key Takeaway Points: Job vacancies hit a five-month low, and the ISM Manufacturing PMI missed expectations, adding pressure on the Federal Reserve regarding interest rate decisions. Traders await confirmation on Trump’s tariff policy, which is expected to impact the EU, chips, pharmaceuticals, and foreign car industries. The severity of the tariffs will influence both the JPY and the USD, with traders waiting for final policy details. The Japanese Yen Index is the worst index of the day while the US Dollar Index is unchanged. 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.   Michalis Efthymiou 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.
×
×
  • Create New...

Important Information

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