Come codificare? - pagina 302

 

...

Sì, è possibile

L'unica limitazione è che non si incorre nella "chiamata circolare" quando si finirebbe con un ciclo morto. A parte questo, nessuna limitazione per le chiamate di funzione

crsnape@btinternet.com:
Buon punto. Darò un'occhiata a questo.

Una domanda sulle funzioni, è possibile chiamare una funzione all'interno di una funzione? Ad esempio, ho questa funzione

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

se (... etc

Poi più tardi la chiamo:

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, string GetWinLossPreviousShort)
 

Ho inserito questo codice per recuperare l'ultimo ordine aperto:

//--- Funzione per calcolare il numero del biglietto dell'ultimo ordine aperto

int LastOpenTicket()

{

datetime lastTime = 0;

int lastTicket = -1; // Nessuno aperto.

int pos;

for (pos = OrdersTotal() - 1; pos >= 0; pos--)

if (OrderSelect(pos, SELECT_BY_POS) // Solo i miei ordini w/

&& OrderMagicNumber() == MagicNumber // il mio numero magico

&& OrderSymbol() == Symbol() // e la mia coppia.

&& OrderOpenTime() > lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

}

return (lastTicket);

}

È una funzione che viene chiamata dalla mia funzione GetLots - il compilatore è privo di errori ma quando faccio il backtest la sezione dei risultati è completamente chiara. Nessun trade. È perché il primo trade non ha un trade precedente da richiamare nel codice di cui sopra?

Nel diario arriva a caricare le variabili esterne (di cui carica il numero magico 42, ma nel mio codice è 42552...?) ma poi niente.

 

...

Qual è la dichiarazione del vostro numero magico (dovrebbe essere int MagicNumber; )

crsnape@btinternet.com:
Ho inserito questo codice per recuperare l'ultimo ordine aperto:

//--- Funzione per calcolare il numero del biglietto dell'ultimo ordine aperto

int LastOpenTicket()

{

datetime lastTime = 0;

int lastTicket = -1; // Nessuno aperto.

int pos;

for (pos = OrdersTotal() - 1; pos >= 0; pos--)

if (OrderSelect(pos, SELECT_BY_POS) // Solo i miei ordini w/

&& OrderMagicNumber() == MagicNumber // il mio numero magico

&& OrderSymbol() == Symbol() // e la mia coppia.

&& OrderOpenTime() > lastTime)

{

lastTime = OrderOpenTime();

lastTicket = OrderTicket();

}

return (lastTicket);

}

È una funzione che viene chiamata dalla mia funzione GetLots - il compilatore è privo di errori ma quando faccio il backtest la sezione dei risultati è completamente chiara. Nessun trade. È perché il primo trade non ha un trade precedente da chiamare nel codice di cui sopra?

Nel diario arriva a caricare le variabili esterne (di cui carica il numero magico 42, ma nel mio codice è 42552...?) ma poi niente.
 

Sì, è int MagicNumber = 42557

 

...

Allora non riesco a capire dal codice che hai postato perché sta facendo male (perché sta ricevendo MagicNumber sbagliato per esempio). Il codice dovrebbe funzionare se c'è un ordine aperto con MagicNumber specificato (sta andando in loop attraverso gli ordini aperti) Se non c'è nessun ordine aperto o i MagicNumbers e i simboli non corrispondono restituirà -1 (come ci si aspetta) quindi il codice è corretto (testato ora, e funziona come dovrebbe)

Scusa, ma questo è tutto quello che posso fare dal codice che hai postato

crsnape@btinternet.com:
Sì, è int MagicNumber = 42557
 

Cosa accadrebbe nel caso in cui nessun ordine precedente fosse stato aperto e questo fosse il primo? So che restituisce -1, ma il codice EA non riuscirebbe a funzionare perché la mia funzione GetLots si basa sulla chiamata dell'ultimo numero di biglietto d'ordine aperto.

 

Se si basa sull'esistenza di almeno un ordine aperto in precedenza, allora fallirà

Aggiungete qualcosa del genere nella vostra condizione:

if (LastOpenOrder()==-1)

... allora puoi aprire l'ordine se tutte le altre condizioni sono soddisfatte

else

... controlla l'ultimo ordine aperto come prima più il resto delle condizioni

(sto solo tirando a indovinare come hai scritto le tue condizioni EA ora)

crsnape@btinternet.com:
Cosa accadrebbe nel caso in cui nessun ordine precedente fosse stato aperto e questo fosse il primo? So che restituisce -1, ma il codice EA non riuscirebbe ad essere eseguito perché la mia funzione GetLots si basa sulla chiamata dell'ultimo numero di ticket dell'ordine aperto.
 

Ciao Mladen,

Sai come impostare il trade aperto quando la linea stocastica attraversa il livello 20 o 80?

Per esempio

Quando lo stocastico si incrocia al livello 20 (ipervenduto), Long

Quando lo stocastico si incrocia al livello 80 (ipervenduto), Short

Saluti

Ryan

 

Ho aggiunto alcune righe a questo codice - questo è quello che usa la funzione LastOpenTicket() ma ancora non gli piace. Ho aggiunto l'opzione -1. C'è qualcosa che vi sembra sbagliato qui?

//--- Determa se l'ordine di vendita precedente è redditizio

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

if (OrderProfit() > 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

return (WinLossPreviousShort);

}

if ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

}

}

 

...

Perché non aggiungete un altro possibile risultato di quella funzione: qualcosa come when LastOpenTicket() == -1 allora WinLossPreviousShort="Na"

crsnape@btinternet.com:
Ho aggiunto alcune righe a questo codice - questo è quello che usa la funzione LastOpenTicket() ma ancora non gli piace. Ho aggiunto l'opzione -1. C'è qualcosa che ti sembra sbagliato qui?

//--- Determa se l'ordine di vendita precedente è redditizio

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

if (OrderProfit() > 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

return (WinLossPreviousShort);

}

if ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

}

}