Come codificare? - pagina 298

 
mladen:
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

Ciao Mladen, scusa se ti disturbo ancora. Ho esaminato i miei codici e ho notato che non solo il mio TP e SL, a volte anche i miei ordini di acquisto e vendita sono fuori. Sono andato attraverso i link sulla lezione che mi hai dato da codersgurus e la sua stessa serie di tutorial che ho avuto e basato i miei codici. Davvero non riesco a trovare la causa del mio errore nei codici.

Gli incroci della MA funzionano come dovrebbe insieme all'ordine Long e Short, tuttavia a volte l'entrata e l'uscita sembrano andare in tilt anche quando ho fatto una funzione ASK di base per testarla. Per favore, fatemi luce qui.

Grazie e saluti

Terrance

 

...

Terrance

Primo: Il vostro broker è di tipo ECN/STP? Se sì, allora non puoi mettere stop loss e take profit insieme all'apertura dell'ordine, ma devi prima aprire un ordine con quelli impostati a 0 e poi usare OrderModify() per impostare stop loss e/o take profit su un ordine già aperto.

Secondo : Inoltre, controllate sempre se avete qualcosa di scritto nella scheda esperti della finestra del terminale (controllate se vi sono scritti degli errori: probabilmente scoprirete allora cosa sta succedendo e perché

Terzo: Potrebbe essere una buona idea mettere una linea come questa:

int err=GetLastError(); Print(err);

Dopo ogni funzione di gestione dell'ordine. Le descrizioni degli errori si trovano nel file experts/include/stderror.mqh (ci sono un sacco di errori che possono accadere (basta vedere la lista dei possibili codici di errore e le descrizioni) con gli ordini e si deve monitorare ogni possibile errore) Con i codici di errore noti (la linea di codice di cui sopra), è possibile concentrarsi sulla correzione di errori specifici invece di indovinare cosa sta succedendo

tkuan77:
Ciao Mladen, scusa se ti disturbo ancora. Ho esaminato i miei codici e ho notato che non solo i miei TP e SL, a volte anche i miei ordini di acquisto e vendita sono fuori. Sono andato attraverso i link sulla lezione che mi hai dato da codersgurus e la sua stessa serie di tutorial che ho avuto e basato i miei codici. Davvero non riesco a trovare la causa del mio errore nei codici.

L'incrocio delle MA funziona come dovrebbe insieme all'ordine Long e Short, tuttavia a volte l'entrata e l'uscita sembrano andare in tilt anche quando ho fatto una funzione ASK di base per testarla. Per favore, fatemi luce qui.

Grazie e saluti

Terrance
File:
terminal_1.gif  62 kb
 
mladen:
Terrance

Primo: Il vostro broker è di tipo ECN/STP? Se sì, allora non puoi mettere stop loss e take profit insieme all'apertura dell'ordine, ma devi prima aprire un ordine con quelli impostati a 0 e poi usare OrderModify() per impostare stop loss e/o take profit su un ordine già aperto.

Secondo : Inoltre, controllate sempre se avete qualcosa di scritto nella scheda esperti della finestra del terminale (controllate se vi sono scritti degli errori: probabilmente scoprirete allora cosa sta succedendo e perché

Terzo : Potrebbe essere una buona idea mettere una linea come questa:

int err=GetLastError(); Print(err);
Dopo ogni funzione di gestione degli ordini. Le descrizioni degli errori si trovano nel file experts/include/stderror.mqh (ci sono molti errori che possono accadere (basta vedere la lista dei possibili codici di errore e le descrizioni) con gli ordini ed è necessario monitorare ogni possibile errore) Con i codici di errore noti (la linea di codice di cui sopra), è possibile concentrarsi sulla correzione degli errori specifici invece di indovinare cosa sta succedendo

Ciao Mladen,

Grazie per avermi fatto notare la cosa dell'ECN/STP. Non sapevo di queste cose finché non ne hai parlato. Ho fatto le modifiche come hai suggerito, tuttavia ora è solo peggiorato per me. Non solo persiste il problema dell'entrata e dell'uscita, ma ora manca anche il mio SL. È più difficile di quanto pensassi.

//--- 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;

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,0,Ask+TakeProfit*Point,

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

se(ticket>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,0,Bid-TakeProfit*Point,

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

if(ticket>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);

}

for(cnt=0;cnt<totale;cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())

{

if(OrderType()==OP_BUY) // la posizione lunga è aperta

{

OrderClose(OrderTicket(),OrderLots(),Ask-StopLoss*Point,3,Violet);

// chiudere la posizione

return(0); // uscire

}

else // passa alla posizione short

{

OrderClose(OrderTicket(),OrderLots(),Bid+StopLoss*Point,3,Violet);

// chiudere la posizione

return(0); // uscire

}

}

}

return(0);

}

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

 
mladen:
Terrance

Primo: Il vostro broker è di tipo ECN/STP? Se sì, allora non puoi mettere stop loss e take profit insieme all'apertura dell'ordine, ma devi prima aprire un ordine con quelli impostati a 0 e poi usare OrderModify() per impostare stop loss e/o take profit su un ordine già aperto.

Secondo : Inoltre, controllate sempre se avete qualcosa di scritto nella scheda esperti della finestra del terminale (controllate se vi sono scritti degli errori: probabilmente scoprirete allora cosa sta succedendo e perché

Terzo: Potrebbe essere una buona idea mettere una linea come questa:

int err=GetLastError(); Print(err);
Dopo ogni funzione di gestione degli ordini. Le descrizioni degli errori si trovano nel file experts/include/stderror.mqh (ci sono molti errori che possono accadere (basta vedere la lista dei possibili codici di errore e le descrizioni) con gli ordini ed è necessario monitorare ogni possibile errore) Con i codici di errore noti (la linea di codice di cui sopra), è possibile concentrarsi sulla correzione degli errori specifici invece di indovinare cosa sta succedendo

Ehi Mladen, vorrei ringraziarti per il tuo aiuto in questi giorni. Sono riuscito a trovare l'errore nel mio codice che causa l'errore di entrata e uscita.

Saluti

Terrance

 

Aprire più di 1 trade

Ciao a tutti, ho cercato di rendere il mio EA in grado di aprire più trade, ma finora sono solo in grado di farlo limitare a 1 trade.

Il mio obiettivo è semplice:

Quando la LWMA 10 incrocia sotto la LWMA 20 il sistema andrà short a condizione che sia la LWMA 10 che la 20 incroci sotto la SMA 50 e viceversa per i trade lunghi.

Voglio limitare il mio EA ad aprire non più di 2 operazioni, tuttavia, quando cambio i codici, diventa aprire 2 operazioni alla volta invece di aprire 1 operazione per criterio.

Devo impostare un sistema di contatori o qualcosa del genere o come faccio a impostare il mio contatore per reagire quando 1 dei miei trade ha già TP o SL?

Qualcuno può farmi luce su cosa c'è di sbagliato nei miei codici.

Molte grazie e saluti

Terrance

//--- parametri di input

extern double TakeProfit=500.0;

extern double Lots=0.1;

extern double StopLoss=500.0;

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

//| funzione di inizializzazione dell'esperto |

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

int init()

{

//----

//----

return(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit()

{

//----

//----

return(0);

}

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

//| funzione di inizio 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

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

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,50,0,MODE_SMA,PRICE_CLOSE,0);

se ((diff1*diff2)<0)

{

se (shortEma1>longEma1)

isCrossed = 1;

altrimenti isCrossed = 2;

}

totale = OrdiniTotali();

se(totale < 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

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

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

}

if(total == 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

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

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

}

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

 

Domande

Mladen,

Sto provando a cercare le lezioni nel link che mi hai mostrato, ma sono lezioni generiche, io sto cercando informazioni per l'indicatore di Henderson...

Inoltre, ho esaminato le discussioni postate e voglio scoprire le seguenti cose.

-In un linguaggio semplice e facile da capire, voglio chiedere è che approssimativamente dopo quante barre passa, e il colore cambia.

In altre parole, massimo quante barre ci vogliono prima che il colore della linea cambi da blu a rosa? Purtroppo, non capisco la terminologia di fantasia e vorrei appriciated risposta molto semplice dove posso andare avanti e iniziare la strategia. Qualsiasi grafico è molto apprezzato. premalmunshaw@yahoo.com è il mio indirizzo email.

Sto cercando di pagare 39 dollari per questo pacchetto da attivare.

IN ATTESA DI UNA RISPOSTA POSITIVA!

Saluti,

Premal Munshaw

mladen:
Francamente non capisco cosa stai chiedendo

Se stai chiedendo quando cambia il colore, allora la risposta è: quando cambia la pendenza

Se stai chiedendo come è codificato per cambiare colore, allora la risposta dovresti cercarla in questa sezione: Lezioni.
 

...

Purtroppo non capisco le tue domande, quindi mi limiterò a riformularmi (la lunghezza di calcolo si riferisce alla lunghezza di calcolo del filtro di Henderson):

se la lunghezza del tuo calcolo è 5 allora le ultime 2 barre possono cambiare

se la vostra lunghezza di calcolo è 7 allora le ultime 3 barre possono cambiare

se la lunghezza di calcolo è 9 allora le ultime 4 barre possono cambiare

Più semplice di così è impossibile rispondere. E non c'è spiegazione più semplice di come viene calcolato il filtro di Henderson: sarebbe come se tentassi di spiegare la trasformata di Fourier in termini di "1+1 = 2". Per favore, esaminate i link che vi sono stati forniti

Per il resto: hai i link alla matematica che sta dietro al filtro, hai le informazioni su quante barre vengono ricalcolate, hai anche degli esempi dal thread delle notizie della sezione elite. Per quanto riguarda la strategia che utilizza quel filtro: ho detto 1000 volte in 1000 post che gli indicatori di ricalcolo (SSA, filtro di Henderson, TMA centrato, trasformate di Fourier, analisi di regressione, ...) non devono essere utilizzati in "signaling mode" ma in "estimating mode". Se siete alla ricerca di segnali dal filtro di Henderson allora siete su una strada completamente sbagliata e se è l'unica ragione per cui considerate l'abbonamento alla sezione elite, allora è meglio che non vi abboniate

PS: è una cattiva pratica rendere pubblica la tua email. In questo modo tutto ciò che otterrete è una tonnellata di messaggi di spam nella vostra casella di posta elettronica

______________________________________

Ti auguro tutto il meglio nella tua ricerca di un sistema di trading

saluti

Mladen

premalmunshaw:
Mladen,

Sto provando a cercare le lezioni sotto il link che mi hai mostrato, ma sono lezioni generiche, io sto cercando informazioni per l'indicatore di Henderson...

Inoltre, sono passato attraverso le discussioni postate e dopo questo voglio scoprire le seguenti cose.

-In un linguaggio semplice e facile da capire, voglio chiedere è che approssimativamente dopo quante barre passa, e il colore cambia.

In altre parole, massimo quante barre ci vogliono prima che il colore della linea cambi da blu a rosa? Purtroppo, non capisco la terminologia di fantasia e vorrei appriciated risposta molto semplice dove posso andare avanti e iniziare la strategia. Qualsiasi grafico è molto apprezzato. premalmunshaw@yahoo.com è il mio indirizzo email.

Sto cercando di pagare 39 dollari per questo pacchetto da attivare.

IN ATTESA DI UNA RISPOSTA POSITIVA!

Saluti,

Premal Munshaw
 

Mladen,

C'è un modo per me di impostare un contatore al mio trade in modo che quando il mio trade ha TP o SL sono in grado di attivare il salto del contatore?

Saluti

Terrance

tkuan77:
Ciao a tutti, ho cercato di rendere il mio EA in grado di aprire più trade, ma finora sono solo in grado di farlo limitare a 1 trade.

Il mio obiettivo è semplice:

Quando la LWMA 10 incrocia sotto la LWMA 20 il sistema andrà corto a condizione che sia la LWMA 10 che la 20 incroci sotto la SMA 50 e viceversa per i trade lunghi.

Voglio limitare il mio EA ad aprire non più di 2 trade, tuttavia, quando cambio i codici, diventa aprire 2 trade alla volta invece di aprire 1 trade per criterio.

Devo impostare un sistema di contatori o qualcosa del genere o come faccio a impostare il mio contatore per reagire quando 1 dei miei trade ha già TP o SL?

Qualcuno può farmi luce su cosa c'è di sbagliato nei miei codici.

Molte grazie e saluti

Terrance

//--- parametri di input

extern double TakeProfit=500.0;

extern double Lots=0.1;

extern double StopLoss=500.0;

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

//| funzione di inizializzazione dell'esperto |

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

int init()

{

//----

//----

return(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit()

{

//----

//----

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

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,20,0,MODE_LWMA,PRICE_CLOSE,0);

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,50,0,MODE_SMA,PRICE_CLOSE,0);

se ((diff1*diff2)<0)

{

se (shortEma1>longEma1)

isCrossed = 1;

altrimenti isCrossed = 2;

}

totale = OrdiniTotali();

se(totale < 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

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

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

}

if(total == 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

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

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

}

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

...

Prova questa funzione:

int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

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

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
e poi si può controllare
: se openBuys==0 aprire acquisto

se openSells==0 aprire vendita

tkuan77:
Mladen,

C'è un modo per me di impostare un contatore al mio trade in modo tale che quando il mio trade ha TP o SL sono in grado di attivare il salto del contatore?

Saluti

Terrance
 

Ciao Mladen,

Ho trovato un altro modo usando la funzione "Bars". Quando una negoziazione viene attivata, imposto un conteggio intero con la funzione barre (per esempio, una negoziazione di acquisto viene attivata nella barra 122, quindi il conteggio sarà 122) e quando il mio criterio viene attivato di nuovo, chiamo di nuovo la funzione barre e la confronto con il conteggio e la negoziazione si attiva solo se il nuovo conteggio è superiore al precedente, che in questo caso è 122.

Tuttavia, sto ancora innescando 2 trade insieme invece di 1 per criterio. Perché è così?

Per favore aiutatemi

Grazie e saluti

Terrance

//--- parametri di input

extern double TakeProfit=530.0;

extern double Lots=0.1;

extern double StopLoss=520.0;

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

//| funzione di inizializzazione dell'esperto |

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

int init()

{

//----

//----

return(0);

}

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

//| funzione di deinizializzazione esperto |

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

int deinit()

{

//----

//----

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

}

shortEma = iMA(NULL,0,10,0,MODE_LWMA,PRICE_CLOSE,0);

longEma = iMA(NULL,0,25,0,MODE_LWMA,PRICE_CLOSE,0);

int isCrossed = 0;

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

double longEma1 = iMA(NULL,0,25,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,25,0,0,MODE_LWMA,PRICE_CLOSE,2);

double diff1 = shortEma1-longEma1;

double diff2 = shortEma2-longEma2;

mainshortEma = iMA(NULL,0,113,0,MODE_EMA,PRICE_CLOSE,0);

se ((diff1*diff2)<0)

{

se (shortEma1>longEma1)

isCrossed = 1;

altrimenti isCrossed = 2;

}

int BarCounter, BarCounter2;

totale = OrdiniTotali();

se(totale < 1)

{

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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());

BarCounter = Bars;

}

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

return(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

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

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

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

BarCounter = Bars;

}

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

return(0);

}

return(0);

}

if(total == 1)

{

BarCounter2 = Bars;

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma && BarCounter2 > BarCounter)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,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());

BarCounter = BarCounter2;

}

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

return(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma BarCounter)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

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

se(biglietto>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))

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

BarCounter = BarCounter2;

}

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

return(0);

}

return(0);

}

return(0);

}

mladen:
Prova questa funzione:
int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

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

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
e poi potete controllare
:if openedBuys==0 open buy

if openedSells==0 open sell

Motivazione: