È necessario filtrare i mestieri. if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) if (OrderSymbol()==Symbol()) if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001; // These else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01;// four else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01; // lines else PointValue = MarketInfo(OrderSymbol(), MODE_POINT); // Execute only on Symbol orders. double lots = NormalizeDouble(OrderLots() * Multiplier, 2); // This and below are always executed if (OrderType() == OP_BUY) // Symbol is irrelevant.
Con le parentesi graffe. if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) if (OrderSymbol()==Symbol()) { // Rest of code executes only on Symbol orders. if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01; else PointValue = MarketInfo(OrderSymbol(), MODE_POINT); double lots = NormalizeDouble(OrderLots() * Multiplier, 2); if (OrderType() == OP_BUY) : }
Su un broker a 4 cifre, punto = 0,0001 if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.00001) PointValue = 0.0001; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.0001) PointValue = 0.01; else if (MarketInfo(OrderSymbol(), MODE_POINT) == 0.001) PointValue = 0.01; else PointValue = MarketInfo(OrderSymbol(), MODE_POINT);
Fisso e semplificato. PointValue = MarketInfo(OrderSymbol(), MODE_POINT); if(MarketInfo(OrderSymbol(), MODE_DIGITS) % 2 = 1) PointValue *= 10;
- Poiché tutto ciò che è dentro le parentesi graffe è Symbol(), ogni MarketInfo può essere sostituito con variabili predefinite
Non codificare i numeri in modo rigido. Controlla i tuoi codici di ritornoCosa sono i valori di ritorno delle funzioni? Come si usano? -Forum MQL4 ed errori comuni nei programmi MQL4 e come evitarli - Articoli MQL4 | result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*0.0001, 0, "Original", magicNumber, 0, Blue); |
1. Grazie mille per il tuo aiuto. Ho aggiunto un tutore come suggerito, ma l'EA continua ad aprire un trade solo su una coppia di valute. Non aprirà un trade su nessuno degli altri grafici anche se le condizioni di acquisto sono state soddisfatte. Sono stato bloccato su questo per settimane, puoi per favore dare un'altra occhiata.
2. EDIT: Non è più necessario
3. Il mio codice ora assomiglia a questo
int start() { { if (OrdersTotal() == 0) if(Close[1]>Close[2]) result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } for(int i=OrdersTotal()-1; i>=0; i--) { //calculate new lotsize of hedge based on lotsize of current open trade*Multiplier double lots = NormalizeDouble(OrderLots() * Multiplier, 2); if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true) if (OrderSymbol()==Symbol()) { if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(OrdersTotal() == 1) result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", 0, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); }
if (OrdersTotal() == 0) if(Close[1]>Close[2]) result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*PointValue, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError());Se un ordine è aperto su qualsiasi coppia, non aprirà un altro ordine finché OrdersTotal()==0 di nuovo
Se un ordine è aperto su qualsiasi coppia, non ne aprirà un altro finché OrdersTotal()==0 di nuovo
Grazie per il vostro aiuto. Ho bisogno di limitare il primo ordine originale a una sola operazione. Non voglio che l'EA continui ad aprire ordini quando la condizione di acquisto è soddisfatta. Così ho aggiunto l'Orderstotal per limitare questo. Questo codice, tuttavia sembra interferire con il codice qui
else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(OrdersTotal() == 1) //<---------- result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", 0, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError());
Qui voglio che l'EA apra solo una copertura per ogni trade aperto, quindi OrderTotal ==1
Qual è allora il modo migliore per limitare il numero di trade, cioè un trade originale e uno di copertura? Grazie
Trader3000: Qual è allora il modo migliore per limitare il numero di trade, cioè un trade originale e un trade di copertura? |
|
Grazie mille per l'aiuto di tutti. Ho risolto il problema e ora l'EA aprirà un trade su tutti i grafici quando la condizione di acquisto è soddisfatta, tuttavia, nulla al di sotto di questo funziona. L'EA non chiama le funzioni Trailingstop o Hedge. Qualcuno può dare un'occhiata e farmi sapere cosa ho fatto di sbagliato perché non riesco a capirlo.
int start() { double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2); double lots = NormalizeDouble(OrderLots() * Multiplier, 2); total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; } { if(total==0 ) if(Close[1]>Close[2]) { result=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(total == 1) result=OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); }
double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2); double lots = NormalizeDouble(OrderLots() * Multiplier, 2);
Non so esattamente cosa stai facendo, ma ti suggerisco di evitare di nominare 2 variabili con l'unica differenza di una lettera maiuscola. È facile confondere le 2, specialmente quando gli altri che leggono il tuo codice potrebbero aver adottato la convenzione che le variabili che iniziano con una lettera maiuscola sono Globalscope.
Nessun ordine è stato selezionato, quindi OrderLots() potrebbe essere qualsiasi cosa
if (OrderType() == OP_BUY)
Questo userebbe i valori dell'ultimo ordine selezionato nel ciclo precedente, potrebbe non essere il numero magico o il simbolo corretto.
Grazie per la tua risposta. Quello che sto cercando di fare è che l'EA apra il primo trade originale, dove la dimensione del lotto è una percentuale del mio capitale. Se il trade va contro
Per quanto mi riguarda, l'EA deve aprire una copertura nella direzione opposta, ma qui la dimensione del lotto deve essere 3 volte la dimensione del lotto originale (OrderLots). Anche se sembra che nessun
ordine è stato selezionato, non sembra influenzare il funzionamento. Ora ho messo i Lotti direttamente nella funzione OrderSend, ma né il trailingstop né
la copertura viene attivata quando dovrebbe. Entrambi funzionavano perfettamente prima che aggiungessi questo
total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; }
int start() { double Lots = NormalizeDouble(AccountEquity()*Percentage*Lotsize/100, 2); total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; } { if(total==0 ) if(Close[1]>Close[2]) result=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } { if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) if(total == 1) result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(OrderLots() * Multiplier, 2), Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); }
Credo che le mie parentesi graffe {} non siano al posto giusto
Grazie mille per tutto l'aiuto che mi avete dato finora, sto facendo progressi. Ora ho fatto in modo che tutto sembra funzionare come dovrebbe, tranne che l'EA ignora la condizione per l'apertura di un trade di copertura. A volte (ma non sempre) apre un trade di copertura anche quando le condizioni non sono state soddisfatte. Inoltre il TrailingStop non sempre si attiva. Penso che mi manchino ancora delle parentesi graffe {} da qualche parte. Il mio codice ora assomiglia a questo. Qualcuno può dare un'occhiata per me, grazie.
int start() { total=0; for(i = OrdersTotal()-1; i >= 0 ; i--) if ( OrderSelect(i, SELECT_BY_POS) && OrderMagicNumber() == magicNumber && OrderSymbol() == Symbol()) { total++; } { if(total==0 ) if(Close[1]>Close[2]) { result=OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, Ask - StopLoss*Point*10, 0, "Original", magicNumber, 0, Blue); Print("Error setting Original order: ",GetLastError()); } if (OrderType() == OP_BUY) { if (Bid - OrderOpenPrice() > NormalizeDouble(TrailingStart *Point*10,Digits)) { if (OrderStopLoss() < Bid - NormalizeDouble(TrailingStop *Point*10,Digits)) { if (OrderModify(OrderTicket(), OrderOpenPrice(), Bid - NormalizeDouble(TrailingStop *Point*10,Digits), OrderTakeProfit(), Blue)) Print("Error setting Buy trailing stop: ",GetLastError()); } } else if (OrderOpenPrice() > Bid + NormalizeDouble(Hedge*Point*10,Digits)) //<------- THIS IS BEING IGNORED SOMETIMES (I THINK) if(total == 1) { result=OrderSend(Symbol(), OP_SELL, NormalizeDouble(OrderLots() * Multiplier, 2), Bid, 3, Bid + Stoploss*Point*10, 0, "Hedge", magicNumber, 0, Blue); Print("Error setting Sell Hedge: ", GetLastError()); } } // else if (OrderType() == OP_SELL) // ...
GumRai:
This would use the values from the last order selected in the previous loop, it may not be the correct magic number or symbol.
- 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 a tutti, ho provato tutti i consigli che ho trovato su questo forum, ma nessuno sembra funzionare. Credo che il problema stia nella mia funzione OrderTotal. Faccio trading su 10 coppie di valute, cioè ho l'EA aperto su 10 grafici. Si tratta di una semplice strategia di copertura. Voglio che l'EA apra un trade (long o short) a seconda dei segnali. Se il trade va a mio favore, Trailingstop o Take profit. Se, invece, il trade va contro di me, voglio che apra un trade nella direzione opposta. Il codice che sto usando sembra funzionare ma poi a volte si blocca, cioè non apre più nessun trade. Inoltre, quando ci sono uno o due trade aperti su una coppia, non sembra voler aprire nessun trade su altre coppie.
Ecco il mio codice