Gli EA devono essere codificati per recuperare. Se la corrente viene a mancare, il sistema operativo si blocca, il terminale o il grafico viene chiuso accidentalmente, al prossimo tick, qualsiasi variabile statica/globale del ticket sarà stata persa. Avrai un ordine aperto ma non lo saprai, quindi l'EA non proverà mai a chiuderlo, a seguire SL, ecc. Come farai a recuperare? Utilizzando un cicloOrderSelect per recuperare, o la memorizzazione persistente (GV/file) dei numeri di ticket richiesti.
Ciao, l'ho aggiunto cambiando il codice nel modo seguente.
//---------------------- Buy/Sell function (limit orders) int BuyCall( double BC) { if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true) { if ( BuyTicket == 0) { BuyStopLoss = BC - (StopLoss * CalcPoint1); BuyTakeProfit = BC + (TakeProfit * CalcPoint1); BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green); SellTicket = 0; // counter trade// if( Bid < BuyStopLoss && SellTicket == 0 ) { if(!OrderSelect(SellTicket, SELECT_BY_TICKET) == true) { SellStopLoss = Bid + (StopLoss * CalcPoint1); SellTakeProfit = Bid - (TakeProfit * CalcPoint1); SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red); BuyTicket = 0; } } } }
Prende ancora gli stessi ordini più volte ad ogni tick.
Inoltre, se rimuovo il segno "!", non prende nessun ordine.
Per ultimo devo rimuovere il controllo buyticket & sellticket dalla mia funzione principale?
Grazie, grazie
if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
-
Riproduci videoPer favore, modifica il tuo post.
Per grandi quantità di codice, allegalo.
- Non scrivereste mai if( (2+2 == 4) == true), vero? if(2+2 == 4) è sufficiente. Quindi non scrivere if(bool == true), usa solo if(bool) o if(! bool). Il codice diventa auto-documentante quando usi nomi di variabili significativi, come bool isLongEnabled. Long_Entry suona come un prezzo di attivazione o un numero di biglietto e "if long entry" è una frase incompleta.
- Dove controlli se BuyTicket ha chiuso? Selezionando per ticket sarà sempre vero (dato un numero di ticket valido), l'ordine potrebbe essere qualsiasi tra pendente, aperto, chiuso o cancellato.
- Hai completamente ignorato il mio suggerimento di un ciclo OrderSelect.
Ciao WHReder grazie per la tua risposta.
Sì, ho aggiunto quelli sul codice SRC. Ma non ha mostrato quando ho modificato.
Ho rimosso i termini == true come hai suggerito.
Per favore non fraintendermi, ho un punto debole nella comprensione di questo ciclo orderelect. Non l'ho ignorato. Ho provato ad aggiungerlo, ma è troppo complesso, l'esecuzione mostra 16 errori e 2 avvertimenti. In quel codice cos'è MN.Count?
// extern int Magic.Number.Base = ... // int magic.number.max; // Export to OpenOrder/MySelect // string market.pair; // Export to OpenOrder/MySelect // int init(){ // market.pair = Symbol(); // magic.number.max = Magic.Number.Base + MN.COUNT - 1;
Riguardo al controllo dell'acquisto del biglietto chiuso. Non l'ho controllato perché ho controllato se il prezzo corrente è inferiore al buystoploss, allora l'operazione di acquisto è stata chiusa, quindi ho aperto un ordine di vendita.
Bid < BuyStopLoss
Saluti
Ho sistemato il codice in qualche modo come questo...Ma mostrando 2 errori ora... "Myselect" & "MyOrdersTotal" può essere decleared solo in ambito globale.
int BuyCall( double BC) { //-----------code bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){ if(!OrderSelect(iWhat, eSelect, ePool) ) return (false); int mn = OrderMagicNumber(); if(mn < MNB1 ) return (false); if(mn > MNB2 ) return (false); if(OrderSymbol() != Pair ) return (false); if(ePool != MODE_HISTORY ) return (true); return(OrderType() <= OP_SELL); } int MyOrdersTotal(int op=-1, int ePool=MODE_TRADES){ #define OP_ALL -1 if(ePool == MODE_TRADES) iPos = OrdersTotal() - 1; else iPos = OrdersHistoryTotal() - 1; for(nOrders=0; iPos >= 0; iPos--) if( MySelect(iPos, SELECT_BY_POS, ePool)) if( op == OP_ALL || op == OrderType() ) nOrders++; return(nOrders); } if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)) { if ( BuyTicket == 0) { BuyStopLoss = BC - (StopLoss * CalcPoint1); BuyTakeProfit = BC + (TakeProfit * CalcPoint1); BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green); SellTicket = 0; // counter trade// if( Bid < BuyStopLoss && SellTicket == 0 ) { if(!OrderSelect(SellTicket, SELECT_BY_TICKET)) { SellStopLoss = Bid + (StopLoss * CalcPoint1); SellTakeProfit = Bid - (TakeProfit * CalcPoint1); SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red); BuyTicket = 0; } } } } return(BuyTicket); }
Non puoi dichiarare una funzione dentro un'altra funzione
Allora come posso farlo? Voglio dire che ho molte condizioni da controllare individualmente per aprire un ordine di acquisto/vendita.
Ecco perché ho creato una funzione buycall/sellcall per rendere il codice più semplice.
È solo che l'EA sta prendendo così tante transazioni uguali. Non so come fermarlo.
Non puoi dichiarare una funzione dentro un'altra funzione
Allora come posso farlo? Voglio dire che ho molte condizioni da controllare individualmente per aprire un ordine di acquisto/vendita.
Ecco perché ho creato una funzione buycall/sellcall per rendere il codice più semplice.
È solo che l'EA sta prendendo così tante transazioni uguali. Non so come fermarlo.
Prima di tutto non cercare di dichiarare una funzione dentro un'altra funzione.
Non sono in grado di capire cosa stai cercando di fare guardando il codice che hai postato. Quindi non posso aiutarvi.
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Ciao, ho fatto un Ea, ma quando faccio il back testing crea molti ordini pendenti uguali su ogni tick. Come fermare questo. Ho solo bisogno di un ordine alla volta, non ho bisogno della sua copia.
Se eseguo questo EA su un grafico orario con"solo prezzo aperto" allora non crea copie.
Inoltre il mio EA ha l'opzione per il commercio di inversione se il limite di acquisto fallisce allora apre il commercio di vendita. Per favore fatemi anche sapere se l'ho impostato correttamente o no. Qualsiasi aiuto sarà apprezzato.
Grazie per il vostro tempo.