Come codificare? - pagina 297

 

...

Terrance

Volevi testare una croce su una barra chiusa. Lo shift 1 significa la prima barra chiusa e lo shift 2 significa la prima barra precedente. E se vuoi testare un incrocio su una barra chiusa queste sono le barre che devi testare

Per quanto riguarda (diff1*diff2)<0) è abbastanza semplice in realtà

diff1 è la differenza tra 2 medie sulla barra 1

diff2 è la differenza tra 2 medie sulla barra 2

Qualsiasi può essere positiva o negativa. Quello che ci interessa è quando una è positiva e l'altra negativa perché questo significa che le medie si sono incrociate. Moltiplicandole ci dà una risposta veloce se c'è un incrocio (se i segni sono diversi, allora il risultato è minore di 0, se i segni sono uguali il risultato di quella moltiplicazione è maggiore di 0)

Spero che questo abbia chiarito cosa fa quel codice

tkuan77:
Ciao Mladen, ho provato quello che mi hai detto e funziona a meraviglia. Tuttavia, non capisco bene la logica dietro i codici. perché imposti lo spostamento di iMA a 1 e 2 e perché codifichi questo: (diff1*diff2)<0)? Scusate ma al momento sono ancora in fase di apprendimento.

Grazie e saluti

Terrance
 

Come aggiungere le frecce

In allegato c'è una versione abbreviata del MA crossover EA discusso negli ultimi post.

Quando si verifica un crossover su una candela chiusa, questa versione stampa un messaggio nel file di log.

Sarebbe possibile sostituire la logica di stampa con il codice per visualizzare le frecce su/giù sul grafico?

Grazie per il vostro aiuto.

File:
 

...

Provate in questo modo ...

Disegnerà la freccia e mostrerà un commento nell'angolo in basso a destra del grafico - come questo (ho aggiunto le medie sul grafico solo per rendere evidente cosa fa):

michaelB:
In allegato una versione abbreviata del MA crossover EA discusso negli ultimi post.

Quando si verifica un crossover su una candela chiusa, questa versione stampa un messaggio nel file di log.

Sarebbe possibile sostituire la logica di stampa con del codice per visualizzare le frecce su/giù sul grafico?

Grazie per il vostro aiuto.
 

Frecce MA

Il "2MAcrossover con commenti" funziona molto bene.

Solo una domanda: una volta che una freccia appare, scompare quando si apre una nuova candela, questo era intenzionale?

Mi piace il commento nell'angolo in basso a destra del grafico.

Grazie ancora.

 
mladen:
Terrance

Volevi testare una croce su una barra chiusa. Lo shift 1 significa la prima barra chiusa e lo shift 2 significa la prima barra precedente. E se vuoi testare un incrocio su una barra chiusa queste sono le barre che devi testare

Per quanto riguarda (diff1*diff2)<0) è abbastanza semplice in realtà

diff1 è la differenza tra 2 medie sulla barra 1

diff2 è la differenza tra 2 medie sulla barra 2

Qualsiasi può essere positivo o negativo. Quello che ci interessa è quando una è positiva e l'altra negativa perché questo significa che le medie si sono incrociate. Moltiplicandole ci dà una risposta veloce se c'è un incrocio (se i segni sono diversi, allora il risultato è minore di 0, se i segni sono uguali il risultato di quella moltiplicazione è maggiore di 0)

Spero di aver chiarito cosa fa questo codice

Grazie Mladen per il tuo aiuto! Ma quando ho aggiunto questo codice, il mio EA sembra andare un po' in tilt. Di tanto in tanto si auto SL o TP da solo anche prima che l'effettivo SL o TP sia raggiunto come quello mostrato nel mio screenshot. perché è così?

Grazie e saluti

Terrance

//--- parametri di input

extern double TakeProfit=1000.0;

extern double Lots=0.1;

extern double StopLoss=1500.0;

//+------------------------------------------------------------------+

//| funzione di inizializzazione dell'esperto |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| funzione di deinizializzazione esperto |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

int mainCrossed (double mainline1 , double mainline2)

{

static int mainlast_direction = 0;

static int maincurrent_dirction = 0;

se(mainline1>mainline2)maincurrent_dirction = 1; //main su

if(mainline1<mainline2)maincurrent_dirction = 2; //main down

if(maincurrent_dirction != mainlast_direction) //main cambiato

{

mainlast_direction = maincurrent_dirction;

return (mainlast_direction);

}

else

{

return (0);

}

}

//+------------------------------------------------------------------+

//| funzione di avvio esperto |

//+------------------------------------------------------------------+

int start()

{

//----

int cnt, ticket, totale

double shortEma, longEma, mainshortEma, mainlongEma;

se(Bars<100)

{

Print("barre inferiori a 100");

return(0);

}

se(TakeProfit<10)

{

Print("TakeProfit inferiore a 10");

return(0); // controlla TakeProfit

}

int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0);

mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);

int mainisCrossed = mainCrossed (mainshortEma,mainlongEma);

se ((diff1*diff2)<0)

{

se (shortEma1>longEma1)

isCrossed = 1;

altrimenti isCrossed = 2;

}

totale = OrdiniTotali();

se(totale < 1)

{

if(isCrossed == 1 && mainshortEma > mainlongEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"Il mio EA",12345,0,Verde);

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordine BUY aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine BUY: ",GetLastError());

return(0);

}

if(isCrossed == 2 && mainshortEma < mainlongEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "My EA",12345,0,Red);

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordine SELL aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine SELL: ",GetLastError());

return(0);

}

return(0);

}

return(0);

}

//+------------------------------------------------------------------+

File:
ps.jpg  16 kb
 

Terrance

Quel codice non ha niente a che fare con SL o TP. Semplicemente testa 2 medie per gli incroci (vedi come michaelB ha usato lo stesso codice nel suo 2MACrosses, dato che anche quello è nan EA). Il resto del tuo codice deve essere rivisto per quegli errori di SL e TP

tkuan77:
Grazie Mladen per il tuo aiuto! Ma quando ho aggiunto questo codice, il mio EA sembra andare un po' in tilt. Di tanto in tanto si auto SL o TP da solo anche prima che l'effettivo SL o TP sia raggiunto come quello mostrato nel mio screenshot. perché è così?

Grazie e saluti

Terrance

//--- parametri di ingresso

extern double TakeProfit=1000.0;

extern double Lots=0.1;

extern double StopLoss=1500.0;

//+------------------------------------------------------------------+

//| funzione di inizializzazione dell'esperto |

//+------------------------------------------------------------------+

int init()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| funzione di deinizializzazione esperto |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

int mainCrossed (double mainline1 , double mainline2)

{

static int mainlast_direction = 0;

static int maincurrent_dirction = 0;

if(mainline1>mainline2)maincurrent_dirction = 1; //main su

if(mainline1<mainline2)maincurrent_dirction = 2; //main down

if(maincurrent_dirction != mainlast_direction) //main cambiato

{

mainlast_direction = maincurrent_dirction;

return (mainlast_direction);

}

else

{

return (0);

}

}

//+------------------------------------------------------------------+

//| funzione di avvio esperto |

//+------------------------------------------------------------------+

int start()

{

//----

int cnt, ticket, totale

double shortEma, longEma, mainshortEma, mainlongEma;

se(Bars<100)

{

Print("barre inferiori a 100");

return(0);

}

se(TakeProfit<10)

{

Print("TakeProfit inferiore a 10");

return(0); // controlla TakeProfit

}

int isCrossed = 0;

double shortEma1 = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,1);

double longEma1 = iMA(NULL,0,20,0,0,MODE_LWMA,PRICE_CLOSE,1);

double shortEma2 = iMA(NULL,0,10,0,0,MODE_LWMA,PRICE_CLOSE,2);

double longEma2 = iMA(NULL,0,20,0,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

mainshortEma = iMA(NULL,0,30,0,MODE_SMA,PRICE_CLOSE,0);

mainlongEma = iMA(NULL,0,50,0,MODE_SMA,PRICE_CLOSE,0);

int mainisCrossed = mainCrossed (mainshortEma,mainlongEma);

se ((diff1*diff2)<0)

{

se (shortEma1>longEma1)

isCrossed = 1;

altrimenti isCrossed = 2;

}

totale = OrdiniTotali();

se(totale < 1)

{

if(isCrossed == 1 && mainshortEma > mainlongEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"Il mio EA",12345,0,Verde);

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordine BUY aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine BUY: ",GetLastError());

return(0);

}

if(isCrossed == 2 && mainshortEma < mainlongEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,

Bid-TakeProfit*Point, "My EA",12345,0,Red);

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

Print("Ordine SELL aperto : ",OrderOpenPrice());

}

else Print("Errore nell'apertura dell'ordine SELL: ",GetLastError());

return(0);

}

return(0);

}

return(0);

}

//+------------------------------------------------------------------+
 

...

Sì, è intenzionale

Dato che hai fatto un EA e non un indicatore, l'aggiunta era di mostrare solo l'ultimo cross attivo e quando non c'è un cross attivo, non di mostrare una freccia. Per renderlo in grado di mostrare più frecce avrebbe bisogno di essere convertito in indicatore prima e poi l'intera cosa avrebbe bisogno di essere riscritta, ma penso che ci siano molti indicatori che stanno mostrando le medie incrociate sul grafico già

michaelB:
Il "2MAcrossover con commenti" funziona molto bene.

Solo una domanda: una volta che una freccia appare, scompare quando si apre una nuova candela, è stato intenzionale?

Mi piace il commento nell'angolo in basso a destra del grafico.

Grazie ancora.
 
mladen:
Terrance Quel codice non ha niente a che fare con SL o TP. Semplicemente testa 2 medie per gli incroci (vedi come michaelB ha usato lo stesso codice nel suo 2MACrosses, dato che anche quello è nan EA). Il resto del tuo codice deve essere rivisto per quegli errori di SL e TP

Ciao Mladen,

vuoi dire che il modo in cui ho impostato il mio TP e SL è sbagliato o?

Saluti

Terrance

 

...

Terrance

Hai visto questa sezione di TSD: Lezioni?

Penso che molte domande abbiano già trovato risposta lì e che tu possa trovare ottimi esempi per la scrittura di EA in generale. Per quanto riguarda la tua domanda: non ho testato il tuo EA quindi non lo so. Il problema di testare l'EA di qualcun altro è che bisogna conoscerne l'idea e la logica e molte volte è semplicemente impossibile "leggerle" dal codice stesso. Lo snippet di codice di cui stavamo parlando riguardava come rilevare 2 incroci di medie su una barra chiusa e quel codice sta facendo proprio questo e nient'altro che questo. Ecco perché ho detto che "non ha nulla a che fare con SL o TP".

saluti

Mladen

tkuan77:
Ciao Mladen,

vuoi dire che il modo in cui ho impostato il mio TP e SL è sbagliato o?

Saluti

Terrance
 

Thread sulle lezioni di MQL

mladen - grazie per il link!