Come codificare? - pagina 303

 

un'altra domanda da principiante

Ciao, sono nuovo nella programmazione ma non nuovo nel trading. Non ho postato nulla per un po' e ora, da quando ho iniziato a sviluppare il mio EA, ho un sacco di domande. Ho iniziato con la costruzione di un indicatore prima, e una volta che fa quello che voglio andrò oltre. Ho letto tutti i manuali che ho potuto trovare, quindi ora è il momento di andare avanti con la codifica.

Scusate, se è un thread sbagliato - per favore fatemi sapere dove dovrei postare queste domande allora.

Ho 2, probabilmente, domande di base per ora, per favore:

1. In molti indicatori che usano MAs vedo linee che controllano quante barre ci sono sul grafico. Quindi, se ho bisogno di MA200 e il grafico ha solo, diciamo, 100 barre, iMA200 funzionerebbe allora? Penso di sì - ho controllato e qualsiasi MA viene disegnata senza problemi su qualsiasi grafico, quindi penso che questo sia un vecchio bug che Metaquotes ha risolto ora. Quindi, ha senso controllare quante barre ci sono sul grafico per disegnare la MA o usare la funzione iMA?

2. Qual è la differenza tra Close e iClose? La mia comprensione è che Close può restituire una chiusura delle barre solo sul grafico corrente, e iClose può restituire qualsiasi chiusura di qualsiasi coppia di valute e qualsiasi timeframe. E in entrambi i casi, per ottenere l'ultima barra chiusa devo usare l'indice [1]. Ho capito bene?

Grazie.

 

L'ho già fatto. Vedi evidenziato in rosso qui sotto:

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

stringa 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);

}

}

}

Ancora completamente vuoto.

Mi sto grattando la testa. So che il tuo aiuto è limitato perché non ho incollato il codice, ma il codice sopra sembra OK per te?

Anche con la prima riga qui sotto, ho bisogno di fare riferimento a LastOpenTicket con () dopo?

stringa GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

 

...

Se state chiamando quella funzione con il numero di ticket dell'ultimo ticket aperto come argomento, allora il codice dopo la linea blu non verrà mai eseguito (OrderSelect() fallisce se il numero LastOpenTicket è -1 (che in quel momento è equivalente al risultato della funzione LastOpenTicket()), e il codice non arriva ad eseguire il blocco dopo la linea blu)

crsnape@btinternet.com:
L'ho già fatto. Vedi evidenziato in rosso qui sotto:

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

stringa 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);

}

}

}

Ancora completamente vuoto.

Mi sto grattando la testa. So che il tuo aiuto è limitato perché non ho incollato il codice, ma il codice sopra sembra OK per te?

Anche con la prima linea qui sotto, ho bisogno di fare riferimento a LastOpenTicket con () dopo?

stringa GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)
 

Non sono sicuro di aver capito.

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

Quindi, poiché sto chiamando la funzione LastOpenTicket() nella linea precedente, il resto della funzione non viene eseguito e OrderSelect() fallisce. Ti sto seguendo bene?

 

...

Supponiamo quanto segue:

- non hai ordini precedenti

- LastOpenedTicket() restituisce -1 (nessun ordine precedente) come risultato

- si chiama la funzione con questo risultato

OrderSelect() fallisce perché l'ordine ticket -1 non esiste e nessuno del codice dietro l'ordine select viene eseguito. Anche nel caso in cui LastOpenTicket sia > -1, la "condizione della linea blu" che LastOpenTicket() == -1 non può mai essere vera poiché l'unico modo per arrivare a quella parte di codice è quando LastOpenTicket è > -1

Ecco perché ho suggerito il "3° stato: il "Na", poiché in effetti avete 3 stati a causa dello stato iniziale "nessun ordine precedente"

crsnape@btinternet.com:
Non sono sicuro di aver capito.

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

Quindi, dato che sto chiamando la funzione LastOpenTicket() nella linea precedente, il resto della funzione non viene eseguito e OrderSelect() fallisce. Ti sto seguendo bene?
 

alcune domande di codifica, probabilmente da principiante

Ciao, sono nuovo nella programmazione ma non nuovo nel trading. Sto costruendo il mio EA ma ho iniziato con la costruzione di un indicatore prima, e una volta che fa quello che voglio andrò oltre. Ho letto tutti i manuali che ho potuto trovare e ora lo sto codificando.

Apprezzerei qualsiasi consiglio - tutti voi avete iniziato dove sono ora...

Ho 2, probabilmente, domande di base per ora, per favore:

1. In alcuni indicatori che usano le MA vedo delle linee che controllano quante barre ci sono sul grafico. Quindi, se ho bisogno di MA200 e il grafico ha solo, diciamo, 100 barre, iMA200 funzionerebbe allora? Penso di sì - ho controllato e qualsiasi MA viene disegnata senza problemi su qualsiasi grafico, quindi penso che questo sia un vecchio problema che Metaquotes ha risolto ora. Quindi, ha senso controllare quante barre ci sono sul grafico per disegnare la MA o usare la funzione iMA?

2. Qual è la differenza tra Close e iClose? La mia comprensione è che Close può restituire una chiusura delle barre solo sul grafico corrente, e iClose può restituire qualsiasi chiusura di qualsiasi coppia di valute e qualsiasi timeframe. E in entrambi i casi, per ottenere l'ultima barra chiusa devo usare l'indice [1]. È corretto?

Grazie.

 

Come questo?

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

stringa 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)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

if (LastOpenTicket() == -1)

{

WinLossPreviousShort = "NA";

return (WinLossPreviousShort);

}

}

}

O QUESTO? cambia in rosso.

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

string GetWinLossPreviousShort (int LastOpenTicket, int LastTicket, 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)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

if (LastTicket == -1)

{

WinLossPreviousShort = "NA";

return (WinLossPreviousShort);

}

}

}

 

Ah, finalmente è scattato, non posso usare OrderSelect su un numero di biglietto che è -1 perché -1 non esiste. I biglietti vanno da 0 in su.

Devo dichiarare LastOpenTicket fuori dalla funzione OrderSend giusto?

 

...

Prova così :

string GetWinLossPreviousShort (int LastOpenTicket, int LastTicket, string WinLossPreviousShort)

{

if (LastTicket == -1)

{

WinLossPreviousShort = "NA";

return (WinLossPreviousShort);

}

//

//

// if LastTicket == -1 no need even to try to execute the code bellow

// you already have exited for case when it is -1, so the code bellow

// will be executed properly

//

//

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)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

}
 

Grazie mladen, il codice qui sotto equivale fondamentalmente allo stesso del tuo? Ho digitato questo mentre hai postato il tuo ultimo! :-)

EDITATO-

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

string GetWinLossPreviousShort (int LastOpenTicket, int LastTicket, 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)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

}

if (LastTicket == -1)

{

WinLossPreviousShort = "NA";

return (WinLossPreviousShort);

}

}

Motivazione: