Come codificare? - pagina 312

 

...

Come è dichiarato il vostro LastProfitHigh?

Se è dichiarata all'interno del corpo della funzione (start() per esempio) cambierà sempre valore se non la dichiari come statica. Quindi, se è dichiarata come locale (all'interno della funzione) provate a dichiararla nell'ambito globale o come variabile statica e in questo modo "erediterà" i valori tra due tick.

aud4xtrader:
Ciao a tutti,

Sono nuovo nella codifica e sto lentamente imparando il linguaggio e la sintassi, ma ho una domanda su come MT4 aggiorna le variabili.

Ho provato a codificare un semplice EA che mostra il profitto più alto che un trade attualmente aperto ha avuto e dovrebbe aggiornarsi solo se viene raggiunto un nuovo massimo, ma quello che sta succedendo è che l'importo si sta muovendo verso il basso e verso l'alto come fa il profitto, non riesco a vedere il mio errore nella logica del codice.

Controllo per assicurarmi che il trade selezionato sia ancora aperto

t_CloseTime=OrderCloseTime(); //restituisce 0 se l'ordine non è chiuso

if(t_CloseTime==0) //l'ordine è chiuso se non è zero.

{

if(OrderProfit() > LastProfitHigh) LastProfitHigh=OrderProfit();

if(LastProfitHigh >= MinProfit && MinProfitReached==false) MinProfitReached=true;

}//endif

Quindi se la logica è corretta perché questa variabile "LastProfitHigh" va su e giù....

Grazie per il vostro aiuto.
 

Nuovo alla codifica

mladen:
Come è dichiarato il tuo LastProfitHigh? Se è dichiarato all'interno del corpo della funzione (start() per esempio) cambierà sempre valore se non lo dichiari come statico. Quindi, se è dichiarata come locale (all'interno della funzione) prova a dichiararla allo scope globale o come variabile statica e in questo modo "erediterà" i valori tra due tick.

Ciao mladen,

Ora ho spostato la variabile al di fuori della func start() e l'ho dichiarata "static double", grazie per la risposta e incrociamo le dita perché venga visualizzata correttamente.

La logica del codice è dichiarata correttamente?

 

aud4xtrader

La logica è OK

Se spostate la variabile fuori dall'inizio non avete bisogno di dichiararla statica (è automaticamente una variabile globale quando è fuori da qualsiasi corpo di funzione - ed è "visibile" attraverso tutto il codice) Se volete che la variabile rimanga locale a qualche funzione e mantenga lo stato precedente di essa (lo stato su un tick precedente, per esempio) allora la dichiarate come statica

Ecco due esempi che finiscono con lo stesso risultato

double previousProfit=0;

int start()

{

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

[/PHP]

or the same thing but with static variable

[PHP]

int start()

{

static double previousProfit=0;

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

aud4xtrader:
Ciao mladen,

Ora ho spostato la variabile al di fuori della func start() e l'ho dichiarata "static double", grazie per la risposta e incrociamo le dita perché venga visualizzata correttamente.

La logica del codice è dichiarata correttamente?
 

Come codificare?

Funziona benissimo, grazie ancora per l'eccellente aiuto.

mladen:
aud4xtrader

La logica è OK

Se spostate la variabile al di fuori dell'inizio, allora non avete bisogno di dichiararla statica (è automaticamente una variabile globale quando è al di fuori di qualsiasi corpo di funzione - ed è "visibile" attraverso tutto il codice) Se volete che la variabile rimanga locale a qualche funzione e mantenga ancora lo stato precedente di essa (lo stato su un tick precedente, per esempio) allora la dichiarate come statica

Ecco due esempi che porteranno allo stesso risultato

double previousProfit=0;

int start()

{

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

[/PHP]

or the same thing but with static variable

[PHP]

int start()

{

static double previousProfit=0;

...

if (OrderProfit()>previiousProfit) previousProfit = OrderProfit();

}

 

Perfetto! Grazie.

mladen:
Prova queste 2 funzioni
: la prima serve a scoprire se c'è già un ordine con lo stesso identico prezzo aperto
, la

seconda a controllare se c'è un ordine che si trova entro nnn punti dal prezzo desiderato

Entrambe restituiscono true se il prezzo è uguale o se la distanza dal prezzo di alcuni ordini aperti attualmente è compresa nella distanza specificata

bool existsAtSamePrice(int magicNumber, double price)

{

for (int i=OrdersTotal()-1; i>=0 ; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol()!=Symbol()) continue;

if (OrderMagicNumber()!=magicNumber) continue;

if (CompareDouble(OrderOpenPrice(),price)) return(true);

}

return(false);

}

//

//

//

//

//

bool existsAtApproximatePrice(int magicNumber, double price, double distance)

{

for (int i=OrdersTotal()-1; i>=0 ; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol()!=Symbol()) continue;

if (OrderMagicNumber()!=magicNumber) continue;

if (MathAbs(OrderOpenPrice()-price)< distance) return(true);

}

return(false);

}

//

//

//

//

//

bool CompareDouble(double val1, double val2)

{

return(NormalizeDouble(val1,Digits)==NormalizeDouble(val2,Digits));

}

 

Come codificare?

Ciao Pip,

Grazie per gli snippet di codice, è fantastico il modo in cui le persone possono condividere idee e stili di codifica, man mano che la mia conoscenza cresce posso trarre lezioni da persone come te e mladen.

Pip:
Perfetto! Grazie.
 

Salve,

ho una richiesta.

Se voglio cancellare tutti gli oggetti che contengono nel nome la parola "esempio" con il comando ObjectDelete come devo scrivere il codice?

Per Esempio

Nome dell'oggetto

"Esempio13241"

"Esempio453623"

Voglio cancellare tutti gli oggetti che contengono la parola "Esempio".

Grazie mille

 

...

Usa qualcosa del genere (questo cancellerà tutti gli oggetti che hanno nomi che iniziano con "Esempio"):

string lookFor = "Example";

int lookForLength = StringLen(lookFor);

for (int i=ObjectsTotal()-1; i>=0; i--)

{

string objectName = ObjectName(i);

if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);

}

dasio:
Ciao,

Ho una richiesta.

Se voglio cancellare tutti gli oggetti che contengono nel nome la parola "esempio" con il comando ObjectDelete come devo scrivere il codice?

Per Esempio

Nome dell'oggetto

"Esempio13241"

"Esempio453623"

Voglio cancellare tutti gli oggetti che contengono la parola "Esempio".

Grazie mille
 
mladen:
Usa qualcosa del genere (questo cancellerà tutti gli oggetti che hanno nomi che iniziano con "Esempio"):
string lookFor = "Example";

int lookForLength = StringLen(lookFor);

for (int i=ObjectsTotal()-1; i>=0; i--)

{

string objectName = ObjectName(i);

if (StringSubstr(objectName,0,lookForLength) == lookFor) ObjectDelete(objectName);

}

Grazie, è perfetto.

Ho un'altra domanda ^^.

Creo un segmento di linea di tendenza nel grafico con lunghezza dichiarata. Posso impostare il colore e va bene. Vorrei sapere se è possibile impostare più di 1 colore nella stessa linea di tendenza.

Per esempio per la prima parte 1/3 un colore, per la parte 2/3 un altro colore e per la parte 3/3 un altro.

È possibile?

Grazie^^

 

..

In breve, se vi riferite agli oggetti, la risposta è no. Dovresti creare 3 oggetti per questo

Se stai usando i buffer per questo, allora avresti bisogno di 5 buffer di disegno per una linea a 3 colori non ridipinta, e dato che ci sono solo 8 buffer di disegno, questo ti limita notevolmente

dasio:
Grazie, è perfetto.

Ho un'altra domanda ^^.

Creo un segmento di linea di tendenza nel grafico con lunghezza dichiarata. Posso impostare il colore e va bene. Vorrei sapere se è possibile impostare più di 1 colore nella stessa linea di tendenza.

Per esempio per la prima parte 1/3 un colore, per la parte 2/3 un altro colore e per la parte 3/3 un altro.

È possibile?

Grazie^^