Invece di guardare programmi televisivi come seconda funzione dovresti considerare di leggere e capire il Libro. ;-)
Quello che stai cercando di ottenere è diretto e usato in molte strategie, ma il tuo codice - e le tue storie - sono confuse e parzialmente sbagliate - almeno il codice.... non sono sicuro delle storie.
//Pseudo codeif(NewBar) ResetSignals(); //Set all SignalxExecuted to falseif(SignalBuy1&&!SignalBuy1Executed&&OpenOrders()==1){
//do open buy position
SignalBuy1Executed=true; //Set Signal to exectued to prevent a reuse in the same bar
}
if(SignalBuy2&&!SignalBuy2Executed&&OpenOrders()==2){
//do open buy position
SignalBuy2Executed=true; //Set Signal to exectued to prevent a reuse in the same bar
}
SignalBuy1=CheckForOpenBull42(); //Check for Signal1 condition is true
SignalBuy2=CheckForOpenBull62(); //Check for Signal2 condition is true
if(OpenOrders()>0)CheckForClose(); //Check any order needs to be closed
//and so on.....
Perché non provi ad implementare un solo segnale per il momento e ti concentri sulla codifica delle funzioni necessarie? Se hai un buon codice per un segnale è probabilmente facile implementare gli altri segnali e molte funzioni sono già presenti.
Più tardi potresti usare Arrays e altre funzioni per semplificarlo, ma la semplificazione del tuo codice sopra non dovrebbe essere il tuo problema più grande in questo momento.
KroninSì,mi hai capito:),molte strategiein un soloEA. Devoscrivere150politiche edevonocamminareallo stesso temposullo stesso grafico, edeseguiretutte le strategiein una volta. Quando eseguo 150 EA allo stesso tempo ilmioPCesploderà-penso così.
Dopo di che,èinutileperché puoiavere un soloEA di strategia e moltigià dentro.
Naturalmente,lastrategianon puòinterferire con l'altro fuori e quando si esegue uno il secondo può eseguire anche, e posso avere eseguito strategie 1, e 3 e 5. e strategie (1,3,5) in esecuzione nello stesso momento.
Nonscriveròaltrestorie:)
Ilmiocodice èsbagliato -è noto, ho provatoa mettere ledue strategiein un unicoEA, il codicefunzionabenema latotalitànonfunziona bene
Iltuocodice è moltointeressante,lostudierò, per favoredammiun po' di tempo
Ciaoamici,dopo un lungolavoronel codice eattraverso leinformazionidaKroninil codice èstrutturato efunziona. Ilcodicepresentadue strategiein un unicoEA
1.Per una piccolacandelascenario di acquistoè contrassegnato da una freccia blu,sonodue opzioni perBUY 2. Per lacandelamediascenario diacquistoè contrassegnato dauna freccia rossa,sonotre opzioni per BUY
Hoancheunasituazionein cui 1punto=1 pipè conveniente(per risolvereil problema èper dopo) Nonutilizzare leopzionise (NewBar)ResetSignals()perché penso chenon sonola causa dell 'errore
Se si eliminauna funzionePART 2 in start()bluuna strategia funzionerà, efunziona bene Se si esegue ilcodicePART1ePART2contenentedue strategie di lancio,ma sisovrappongono. questo è l'errore
Potrestidare un'occhiataKronin
//+------------------------------------------------------------------+//+------------------------------------------------------------------+#define MAGICMA 20050610//+------------------------------------------------------------------+//| Check NEW BAR WORK AT BARS M15 |//+------------------------------------------------------------------+/*
bool New_Bar = false;
bool Fun_New_Bar()
{
static datetime New_Time=0;
New_Bar=false;
if(New_Time!=Time[0])
{
New_Time=Time[0];
New_Bar=true;
}
}
*///+------------------------------------------------------------------+//| Calculate open positions HOW MEANY OF THIS |//+------------------------------------------------------------------+int OpenOrders(string symbol)
{
int buys=0,sells=0;
//----for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
}
}
//---- return orders volumereturn(buys);
}
//+------------------------------------------------------------------+//| Calculate candle These is condidion |//+------------------------------------------------------------------+// scenario 1 / EA 1 / startegy 1 / bluebool BULL4()
{
if(Close[1]-Open[1]>=4*Point && Close[1]-Open[1]<=5*Point)
return(true);
}
// scenario 2 / EA 2 / startegy 2 / redbool BULL6()
{
if(Close[1]-Open[1]>=6*Point && Close[1]-Open[1]<=7*Point)
return(true);
}
//+------------------------------------------------------------------+//| Check for open order conditions |//+------------------------------------------------------------------+// Check for open for scenario 1 / EA 1 / startegy 1 bool OpenBULL41()
{
int res;
if(Bid==Close[1]+3*Point)
{
res=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
return (true);
}
return (false);
}
//----------------------------------- bool OpenBULL42()
{
int res;
if(Ask>OrderOpenPrice()+4*Point)
{
res=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
return;
}
}
// Check for open for scenario 2 / EA 2 / startegy 2void OpenBULL61()
{
int res;
if(Bid==Close[1]+4*Point)
{
res=OrderSend(Symbol(),OP_BUY,0.61,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
return;
}
}
//----------------------------------- void OpenBULL62()
{
int res;
if(Ask>OrderOpenPrice()+2*Point)
{
res=OrderSend(Symbol(),OP_BUY,0.62,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
return;
}
}
//----------------------------------- void OpenBULL63()
{
int res;
if(Ask>OrderOpenPrice()+2*Point)
{
res=OrderSend(Symbol(),OP_BUY,0.63,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Red);
return;
}
}
//+------------------------------------------------------------------+//| Check for close order conditions |//+------------------------------------------------------------------+void CheckForClose()
{
RefreshRates();
if(OrderOpenPrice()+4*Point< Ask)
for (int i = OrdersTotal()-1; i >= 0;i--) // I Have do -1 in "OrdersTotal()-1"
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() == Symbol())
{
bool ticket = true;
if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);
}
}
}
/*
void CheckForClose2()
{
RefreshRates();
if(OrderOpenPrice()+6*Point< Ask)
for (int i = OrdersTotal(); i >= 0;i--)
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() == Symbol())
{
bool ticket = true;
if (OrderType() == OP_BUY) ticket = OrderClose(OrderTicket(),OrderLots(),Bid,1,Black);
}
}
}
*///+------------------------------------------------------------------+//| Start function |//+------------------------------------------------------------------+void start()
{
//------------------ PART1 bool SignalBULL41Executed=false;
if(BULL4() && !SignalBULL41Executed && OpenOrders(Symbol())==0)
{
OpenBULL41();//do open buy position
SignalBULL41Executed=true;
}
bool SignalBULL42Executed=false;
if(!SignalBULL42Executed && OpenOrders(Symbol())==1)
{
OpenBULL42();//do open buy position
SignalBULL42Executed=true;
}
if(OpenOrders(Symbol())>0)CheckForClose();
//------------------ PART 2bool SignalBULL61Executed=false;
if(BULL6() && !SignalBULL61Executed && OpenOrders(Symbol())==0)
{
OpenBULL61();//do open buy position
SignalBULL61Executed=true;
}
bool SignalBULL62Executed=false;
if(!SignalBULL62Executed && OpenOrders(Symbol())==1)
{
OpenBULL62();//do open buy position
SignalBULL62Executed=true;
}
bool SignalBULL63Executed=false;
if(!SignalBULL63Executed && OpenOrders(Symbol())==2)
{
OpenBULL63();//do open buy position
SignalBULL63Executed=true;
}
// if(SignalBULL61Executed && OpenOrders(Symbol())>0)CheckForClose2();
}
//+------------------------------------------------------------------+
Nonusate leopzioniif (NewBar)ResetSignals()perché penso chenon sianola causa dell 'errore
Il modo in cui la funzione Fun_NewBar() è codificata non vi permetterà di farlo. . . dovete farlo così in modo che sia di tipo bool e restituisca un valore bool. . .
bool Fun_New_Bar()
{
staticdatetime New_Time=0;
if(New_Time!=Time[0])
{
New_Time=Time[0];
return(true); // <---- we have a new bar so the function returns true
}
return(false);
}
Sìhai ragionerestituisceboole c'èint (già fissato)non vedo prima. Grazie Maquesta funzionenon uso, è come untesto
Non credo chequestosi applichiallefunzionichemiseparaduestrategiesovrapposte. Non vedola relazione.O forsemi sbaglio?
//Pseudo codeif(NewBar) ResetSignals(); //Set all SignalxExecuted to falseif(SignalBuy1&&!SignalBuy1Executed&&OpenOrders()==1){
//do open buy position
SignalBuy1Executed=true; //Set Signal to exectued to prevent a reuse in the same bar
}
È bello vedere che hai fatto dei progressi, ma c'è ancora molta strada da fare :-)
Devi sistemare quello che RaptorUK ha detto sopra. Il reset dei segnali è importante, altrimenti l'EA si ferma abbastanza presto con l'apertura di nuovi trade. La tua implementazione è sbagliata. Se azzeri il SignalExecuted ad ogni tick, non ha senso. Forse non apre più trade, perché filtri anche gli OpenOrders. Ma, dato che la tua strategia permette di avere più ordini aperti, posso immaginare che tu voglia anche un algoritmo per chiudere gli ordini, quindi hai bisogno che il flag SignalExecuted venga resettato su una nuova barra (con la tua implementazione è inutile e non ti serve).
Se ho capito bene, non eseguirai BULL4 se anche BULL6 è vero. O in altre parole, solo la strategia blu, se la strategia rossa non è valida, o la piccola candela solo se la candela media non è valida.
if(BULL4()&&!BULL6(){ // <--- only strategy BULL4 is valid, we are looking at a 'small' bar.if(!SignalBULL41Executed && OpenOrders(Symbol())==0){
OpenBULL41();//do open buy position
SignalBULL41Executed=true;
}
if(!SignalBULL42Executed && OpenOrders(Symbol())==1){
OpenBULL42();//do open buy position
SignalBULL42Executed=true;
}
// Check for open for scenario 1 / EA 1 / startegy 1 bool OpenBULL41()
{
int res;
if(Bid==Close[1]+3*Point) // <--- equal makes no sense here and you should not compare doubles for equality.
Read (again): https://www.mql5.com/en/forum/136997
{
res=OrderSend(Symbol(),OP_BUY,0.41,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue); // <--- what is your plan with res? You are aware, it does include the ticket
number or -1, aren't you?
return (true); // <--- Even if OrderSend() fails you return true.
}
return (false);
}
//----------------------------------- bool OpenBULL42()
{
int res;
if(Ask>OrderOpenPrice()+4*Point) // <--- OrderOpenPrice() from a somewhere selected order may or may not work here
(may because only one order is open), but it is not nice coded.
{
res=OrderSend(Symbol(),OP_BUY,0.42,Ask,0,Close[1]-25*Point,0,"",MAGICMA,0,Blue);
return;
}
}
La funzione CheckForClose() ha più o meno gli stessi problemi e in più nessun filtro per il numero magico. Anche qui, OrderOpenPrice() selezionato da un ordine nel conteggio degli acquisti potrebbe finire per chiudere l'ordine sbagliato (non sono sicuro che funzioni effettivamente). Si prega di rileggere anche ciò che Raptor ha scritto nella prima pagina di questo thread.
Dai tuoi post e dai commenti nel codice, ho la sensazione che tu voglia sapere quale ordine appartiene a quale strategia. Per ottenere ciò, puoi definire un secondo numero magico per la seconda strategia, così sarà più facile chiudere gli ordini in base alla strategia in cui sono stati aperti.
Dai tuoi post e dai commenti nel codice, ho la sensazione che tu voglia sapere quale ordine appartiene a quale strategia. Per ottenere ciò, puoi definire un secondo numero magico per la seconda strategia. Allora è più facile chiudere gli ordini in base alla strategia in cui sono stati aperti
Non sarebbe più semplice eseguire 2 strategie diverse in 2 EA separati, ognuno sul proprio grafico?
RaptorUK: Non sarebbe più semplice eseguire 2 strategie diverse in 2 EA separati, ognuno sul proprio grafico?
Sì, per 2, 3, 4, 5... d'accordo. Ma secondo le storie e questo:" Devoscrivere150politiche edevonocamminareallo stesso temposullo stesso grafico, edeseguiretutte le strategiecontemporaneamente. Quando eseguo 150 EA allo stesso tempo ilmioPCesploderà-penso disì." Penso che abbia intenzione di eseguire più strategie in un solo EA....
Per coloro che ancora non capiscono il mio EA scrivere una storia: D hehehe
L'evento è candele - dispone di varie opzioni per l' acquisto e la vendita o la chiusura.
Invece di guardare programmi televisivi come seconda funzione dovresti considerare di leggere e capire il Libro. ;-)
Quello che stai cercando di ottenere è diretto e usato in molte strategie, ma il tuo codice - e le tue storie - sono confuse e parzialmente sbagliate - almeno il codice.... non sono sicuro delle storie.
Perché non provi ad implementare un solo segnale per il momento e ti concentri sulla codifica delle funzioni necessarie? Se hai un buon codice per un segnale è probabilmente facile implementare gli altri segnali e molte funzioni sono già presenti.
Più tardi potresti usare Arrays e altre funzioni per semplificarlo, ma la semplificazione del tuo codice sopra non dovrebbe essere il tuo problema più grande in questo momento.
Kronin Sì, mi hai capito :), molte strategie in un solo EA.
Devo scrivere 150 politiche e devono camminare allo stesso tempo sullo stesso grafico, ed eseguire tutte le strategie in una volta. Quando eseguo 150 EA allo stesso tempo il mio PC esploderà - penso così.
Dopo di che, è inutile perché puoi avere un soloEA di strategia e molti già dentro.
Naturalmente, la strategia non può interferire con l' altro fuori e quando si esegue uno il secondo può eseguire anche, e posso avere eseguito strategie 1, e 3 e 5. e strategie (1,3,5) in esecuzione nello stesso momento.
Non scriverò altre storie :)
Ilmio codice è sbagliato - è noto, ho provato a mettere le due strategie in un unico EA, il codice funziona bene ma la totalità non funziona bene
Iltuocodice è molto interessante, lo studierò, per favore dammi un po' di tempo
Ciao amici, dopo un lungo lavoro nel codice e attraverso le informazioni da Kronin il codice è strutturato e funziona.
Ilcodice presenta due strategie in un unico EA
1.Per una piccola candela scenario di acquisto è contrassegnato da una freccia blu, sono due opzioni per BUY
2. Per la candela media scenario diacquisto è contrassegnato da una freccia rossa, sono tre opzioni per BUY
Ho ancheuna situazione in cui 1 punto = 1 pip è conveniente (per risolvere il problema è per dopo)
Non utilizzare leopzioni se (NewBar) ResetSignals () perché penso che non sono la causa dell 'errore
Se si elimina una funzione PART 2 in start() blu una strategia funzionerà, e funziona bene
Se si esegue il codice PART1 e PART2 contenente due strategie di lancio , ma si sovrappongono. questo è l'errore
Potresti dare un'occhiata Kronin
Non usate leopzioni if (NewBar) ResetSignals () perché penso che non siano la causa dell 'errore
Il modo in cui la funzione Fun_NewBar() è codificata non vi permetterà di farlo. . . dovete farlo così in modo che sia di tipo bool e restituisca un valore bool. . .
Sì hai ragione restituisce bool e c'è int (già fissato) non vedo prima. Grazie
Ma questa funzione non uso, è come un testo
Non credo che questo si applichi alle funzioni che mi separadue strategie sovrapposte. Non vedo la relazione. O forse mi sbaglio?
È bello vedere che hai fatto dei progressi, ma c'è ancora molta strada da fare :-)
Devi sistemare quello che RaptorUK ha detto sopra. Il reset dei segnali è importante, altrimenti l'EA si ferma abbastanza presto con l'apertura di nuovi trade.
La tua implementazione è sbagliata. Se azzeri il SignalExecuted ad ogni tick, non ha senso. Forse non apre più trade, perché filtri anche gli OpenOrders. Ma, dato che la tua strategia permette di avere più ordini aperti, posso immaginare che tu voglia anche un algoritmo per chiudere gli ordini, quindi hai bisogno che il flag SignalExecuted venga resettato su una nuova barra (con la tua implementazione è inutile e non ti serve).
Se ho capito bene, non eseguirai BULL4 se anche BULL6 è vero. O in altre parole, solo la strategia blu, se la strategia rossa non è valida, o la piccola candela solo se la candela media non è valida.
I prossimi passi:
La funzione CheckForClose() ha più o meno gli stessi problemi e in più nessun filtro per il numero magico. Anche qui, OrderOpenPrice() selezionato da un ordine nel conteggio degli acquisti potrebbe finire per chiudere l'ordine sbagliato (non sono sicuro che funzioni effettivamente).
Si prega di rileggere anche ciò che Raptor ha scritto nella prima pagina di questo thread.
Dai tuoi post e dai commenti nel codice, ho la sensazione che tu voglia sapere quale ordine appartiene a quale strategia. Per ottenere ciò, puoi definire un secondo numero magico per la seconda strategia, così sarà più facile chiudere gli ordini in base alla strategia in cui sono stati aperti.
I prossimi passi:
Dai tuoi post e dai commenti nel codice, ho la sensazione che tu voglia sapere quale ordine appartiene a quale strategia. Per ottenere ciò, puoi definire un secondo numero magico per la seconda strategia. Allora è più facile chiudere gli ordini in base alla strategia in cui sono stati aperti
Non sarebbe più semplice eseguire 2 strategie diverse in 2 EA separati, ognuno sul proprio grafico?
Sì, per 2, 3, 4, 5... d'accordo. Ma secondo le storie e questo:" Devo scrivere 150 politiche e devono camminare allo stesso tempo sullo stesso grafico, ed eseguire tutte le strategie contemporaneamente. Quando eseguo 150 EA allo stesso tempo il mio PC esploderà - penso di sì."
Penso che abbia intenzione di eseguire più strategie in un solo EA....