Yes you can
The only limitation is that you do not run into "circular calling" when it would end with a dead loop. Other than that, no limitation for function calls at all
A question about functions, is it possible to call a function within a function? E.g. I have this function:
string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)
if (... etc
Than later I call it:
I've entered this code to retrieve the last opened order:
//--- Function to calculate ticket number of last opened Order
datetime lastTime = 0;
int lastTicket = -1; // None open.
for (pos = OrdersTotal() - 1; pos >= 0; pos--)
if (OrderSelect(pos, SELECT_BY_POS) // Only my orders w/
&& OrderMagicNumber() == MagicNumber // my magic number
&& OrderSymbol() == Symbol() // and my pair.
&& OrderOpenTime() > lastTime)
lastTime = OrderOpenTime();
lastTicket = OrderTicket();
Its a function that is called from my GetLots function - the compiler is error free but when I backtest the results section is completely clear. No trades. Is this because the first trade has no previous trade to call upon in the code above?
In the journal it gets to loading the external variables (of which it loads magic number 42, but in my code its 42552...?) but then nothing thereafter.
What is the declaration of your magic number ( it should be int MagicNumber; )
Yes it is int MagicNumber = 42557
Then I can not tell from the code you posted why is it doing wrong (why is it receiving wrong MagicNumber for example). The code should work if there is any order opened with specified MagicNumber (it is going to loop through opened orders) If there is no opened orders or the MagicNumbers and symbols do not match it will return -1 (as you expect it to) so that code is correct (tested it now, and it works as it should)
Sorry, but that as all I can do from the code you posted
What would happen in the instance that no previous order had been opened and this is the first? I know it returns -1 but would the code EA fail to run because my GetLots function relies on calling the last opened order ticket number.
If it relies on existance of at least one previously opened order, then it will fail
Add something like this in your condition :
... then you can open order if all the rest of conditions are met
... check the last opened order as before plus the rest of the conditions
(just doing a wild guessing game how you wrote your EA conditions now)
Do you know how to set open trade when the stochastic line crosses at level 20 or 80?
When Stochastic crosses each other at level 20 (oversold), Long
When Stochastic crosses each other at level 80 (overbrought), Short
Ive added a few lines to this code - this is what uses the LastOpenTicket() function but it still doesnt like it. Ive added -1 option. Does anything look wrong to you here?
//--- Deterime whether previous sell order is profitable
if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)
if (OrderProfit() > 0 && OrderType() == OP_SELL)
WinLossPreviousShort = "W";
if ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)
WinLossPreviousShort = "L";
Why don't you add one more possible result of that function : soomething like when LastOpenTicket() == -1 then WinLossPreviousShort="Na"