Prima di tutto, so che Raptor ha già sollevato questo problema con me, ma non riesco a ricordare dove l'hai scritto e, soprattutto, a capire dove sto sbagliando?
Per quanto ne so lo stavo scrivendo correttamente in modo che l'EA collegato a qualsiasi coppia corrispondente potrà lavorare sempre e solo su quella coppia. Al momento, ho notato che GBPCAD e GBPUSD sembrano non andare d'accordo, nel senso che lo stoploss di GBPCAD pensa che il suo calcolo sia fatto dalla coppia GBPUSD... quindi quando viene attivato un ordine pendente, lo stop loss sfarfalla dai valori di GBPCAD a quelli di cable....
Uso magicnumber==1234;
Qualsiasi suggerimento o area in cui sto facendo l'idiota, sentitevi liberi di evidenziare :(
Il tuo problema è chiaro, ma può essere un po' difficile da vedere a causa del modo in cui usi le parentesi graffe e le condizioni. . . fai così:
for(int b=OrdersTotal()-1; b>=0; b--) { if(!OrderSelect(b,SELECT_BY_POS,MODE_TRADES))continue; if(OrderType()==OP_BUYSTOP) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) // if the symbol matches do . . . if(OrderStopLoss()<iMA(NULL,60,MA_Period,0,1,0,0)-ATR) // . . . . this { Stored_BuyPrice = OrderOpenPrice(); // and this DeleteOrder = OrderDelete(OrderTicket()); // and this } if(OpenOrdersThisPair(Symbol())==0 && DeleteOrder==True)// If there are no open orders = place a new order. // this happens even if the symbol didn't match . . . { int NewBuyOrder = OrderSend(Symbol(),OP_BUYSTOP,LotSize,Stored_BuyPrice,3,BuyStopPrice,btp,NULL,MagicNumber,0,Green); if(NewBuyOrder == -1)Print("New Buy Order Last Error = ",GetLastError()); } }
Penso che quello che volevi dire era questo . . .
for(int b=OrdersTotal()-1; b>=0; b--) { if(!OrderSelect(b, SELECT_BY_POS, MODE_TRADES)) continue; if( OrderType() == OP_BUYSTOP && OrderMagicNumber() == MagicNumber && OrderSymbol() == Symbol() ) { if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) { Stored_BuyPrice = OrderOpenPrice(); DeleteOrder = OrderDelete(OrderTicket()); } if(OpenOrdersThisPair(Symbol()) == 0 && DeleteOrder) // If there are no open orders = place a new order. { int NewBuyOrder = OrderSend(Symbol(), OP_BUYSTOP, LotSize, Stored_BuyPrice, 3, BuyStopPrice, btp, NULL, MagicNumber, 0, Green); if(NewBuyOrder == -1) Print("New Buy Order Last Error = ", GetLastError()); } } }
Grazie per avermi individuato questa parte :)
Ah ok - una piccola cosa che mi è sfuggita. Inoltre, quando la prima funzione OrderSend() viene chiamata, sto facendo qualcosa di sbagliato? Lo chiedo perché sto cercando di pensare logicamente se a quel punto sa o no a quale coppia deve essere inviato l'ordine? Potrebbe essere una domanda stupida, ma non sto facendo nulla di sbagliato con quella parte, vero? La parte della funzione di invio "BuyTicketOrder"?
Grazie per avermi individuato questa parte :)
//+----------------------------------------------------------------------------------------------------------------------------------------+ //Moving Average Trailing Stop Function //+----------------------------------------------------------------------------------------------------------------------------------------+ void MA_Trail() { double ATR = iATR(NULL,60,14,1); double MA = iMA(NULL,60,MA_Period,0,1,0,1); double BuyStopPriceMath = MA - ATR; double SellStopPriceMath = MA + ATR; double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5); double SellStopPrice = NormalizeDouble(SellStopPriceMath,5); //buy order section - This is where the stop will trail based upon a fixed point value stated on the EA. It will trail with price. for(int b=OrdersTotal()-1; b>=0; b--) { if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) if(OrderType()==OP_BUY) { if(OrderStopLoss() > BuyStopPrice)break; if(OrderStopLoss() < BuyStopPrice) bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE); if(BuyModify < 0)Print(" Buy Trailing Stop Failed: ", GetLastError()); } } //sell order section - This is where the stop will trail based upon a fixed point value stated on the EA. It will trail with price. for(int s=OrdersTotal()-1; s>=0; s--) { if(OrderSelect(s,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) if(OrderType()==OP_SELL) { if(OrderStopLoss() < SellStopPrice)break; if(OrderStopLoss() > SellStopPrice) bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE); if(SellModify < 0)Print(" Sell Trailing Stop Failed: ", GetLastError()); } } }Ok - Penso che questo sia ciò che causava il problema. Ho appena aggiornato il codice su questa parte e sembra che ora abbia smesso di lampeggiare su ogni tick dal cavo ai prezzi GBPCAD... Ora è bloccato su un prezzo di stop fino a quando non si aggiornerà da solo su questa chiusura oraria... quindi confermerò.
Ti sembra che vada bene? Inoltre, poiché ho queste chiusure parziali degli ordini, suppongo che probabilmente devo ricontrollare che le parentesi siano nella posizione corretta rispetto a "OrderSymbol()==Symbol())"?
if(OpenOrdersThisPair(Symbol()) == 0Quante volte vuoi chiamare questo? Per ogni ordine (il tuo codice)? Per ogni ordine in sospeso sul grafico corrente (codice di RaptorUK)? O UNA VOLTA, DOPO aver memorizzato e cancellato il pendente?
Ok - Penso che questo sia ciò che stava causando il problema. Ho appena aggiornato il codice su questa parte e sembra che ora abbia smesso di lampeggiare su ogni tick dal cavo ai prezzi GBPCAD... Ora è bloccato su un prezzo di stop fino a quando non si aggiornerà da solo su questa chiusura oraria... quindi confermerò.
Ti sembra che vada bene? Inoltre, poiché ho queste chiusure parziali degli ordini, suppongo che probabilmente devo ricontrollare che le parentesi siano nella posizione corretta rispetto a "OrderSymbol()==Symbol())"?
Sembra OK, sì, controlla sempre le tue parentesi, e renditi la vita più facile dove puoi, se questo significa aggiungere parentesi allora fallo, ma cerca di essere coerente con parentesi e rientri.
Non avete bisogno di due cicli, uno solo andrà bene...
//+----------------------------------------------------------------------------------------------------------------------------------------+ //Moving Average Trailing Stop Function //+----------------------------------------------------------------------------------------------------------------------------------------+ void MA_Trail() { double ATR = iATR(NULL,60,14,1); double MA = iMA(NULL,60,MA_Period,0,1,0,1); double BuyStopPriceMath = MA - ATR; double SellStopPriceMath = MA + ATR; double BuyStopPrice = NormalizeDouble(BuyStopPriceMath,5); double SellStopPrice = NormalizeDouble(SellStopPriceMath,5); for(int b=OrdersTotal()-1; b>=0; b--) { if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)) if(OrderMagicNumber()==MagicNumber) if(OrderSymbol()==Symbol()) { //buy order section - This is where the stop will trail based // upon a fixed point value stated on the EA. It will trail with price. if(OrderType()==OP_BUY) { if(OrderStopLoss() > BuyStopPrice) break; if(OrderStopLoss() < BuyStopPrice) bool BuyModify = OrderModify(OrderTicket(),OrderOpenPrice(),BuyStopPrice,OrderTakeProfit(),0,CLR_NONE); if(!BuyModify)Print(" Buy Trailing Stop Failed: ", GetLastError()); } // sell order section - This is where the stop will trail based // upon a fixed point value stated on the EA. It will trail with price. if(OrderType()==OP_SELL) { if(OrderStopLoss() < SellStopPrice) break; if(OrderStopLoss() > SellStopPrice) bool SellModify = OrderModify(OrderTicket(),OrderOpenPrice(),SellStopPrice,OrderTakeProfit(),0,CLR_NONE); if(!SellModify)Print(" Sell Trailing Stop Failed: ", GetLastError()); } } }
OrderModify() restituisce un bool, vero o falso, non un int . . . quindi SellModify non sarà mai inferiore a 0 . . . Ho scritto la stessa cosa ieri su ForexFactory
Ogni volta che l'ordine è stato cancellato - che voglio che l'ordine pendente sia cancellato OGNI 1 ora di chiusura della barra e poi un nuovo ordine aperto con gli stessi parametri, O se applicabile, nuovi stop, obiettivi e dimensionamento del lotto basato su "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "
L'unica cosa che ho bisogno di memorizzare per il NUOVO ordine pendente (dopo la cancellazione), è il prezzo di entrata iniziale su quel particolare set-up.(Stored_BuyPrice = OrderOpenPrice();)
È divertente perché il primo pezzo di codice qui sopra è anche in relazione a un altro thread che stavo per postare. Piuttosto che postare un nuovo argomento con una domanda simile chiederò qui, se questo va bene? Guarda il link qui sotto - solo un video di un paio di minuti che spiega il problema che ho e che sto trovando difficile da risolvere...
Ho scritto così tanto codice, ma ora sto iniziando a capire che è un caso di inefficienza che devo riparare...
Video: http://screencast.com/t/4nl8AaH8Sag
Se ho reso la cosa davvero ambigua fornendo solo una quantità limitata di codice, allora ne metterò ancora un po' su?
Ogni volta che l'ordine è stato cancellato - che voglio che l'ordine pendente sia cancellato OGNI 1 ora di chiusura della barra e poi un nuovo ordine aperto con gli stessi parametri, O se applicabile, nuovi stop, obiettivi e dimensionamento del lotto basato su "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "
L'unica cosa che ho bisogno di memorizzare per il NUOVO ordine pendente (dopo la cancellazione), è il prezzo di entrata iniziale su quel particolare set-up.(Stored_BuyPrice = OrderOpenPrice();)
È divertente perché il primo pezzo di codice qui sopra è anche in relazione a un altro thread che stavo per postare. Piuttosto che postare un nuovo argomento con una domanda simile chiederò qui, se questo va bene? Guarda il link qui sotto - solo un video di un paio di minuti che spiega il problema che ho e che sto trovando difficile da risolvere...
Ho scritto così tanto codice, ma ora sto iniziando a capire che è un caso di inefficienza che devo riparare...
Video: http://screencast.com/t/4nl8AaH8Sag
Se ho reso la cosa davvero ambigua fornendo solo una quantità limitata di codice, allora ne metterò ancora un po' su?
Il pullback alla 21 EMA avviene solo una volta. Da lì, smetterà di cercare qualsiasi pullback al 21 EMA. Quello che dovrebbe fare, però, è assicurarsi che l'attuale ordine aperto PENDING sia esattamente aggiornato con i lotti, gli stop e i take profit DOPO ogni ora di chiusura. Tuttavia, non riesco a capire perché a volte funziona perfettamente e aggiorna l'ordine pendente dopo ogni chiusura H1, e altre volte no? Il motivo per cui l'ordine pendente si aggiorna è dovuto a ""if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) ".
Se questo non è vero, allora non lo farà - TUTTAVIA, ci sono innumerevoli volte in cui questo è vero, eppure non cancellerà l'ordine e ne piazzerà uno nuovo con i nuovi valori?
Non sono sicuro che tu possa vedere qualcosa in quel codice sopra relativo al video? (Il primo codice che avete corretto). Spero che sia più chiaro?
- 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
Per quanto ne so lo stavo scrivendo correttamente in modo che l'EA collegato a qualsiasi coppia corrispondente potrà lavorare sempre e solo su quella coppia. Al momento, ho notato che GBPCAD e GBPUSD sembrano non andare d'accordo, nel senso che lo stoploss di GBPCAD pensa che il suo calcolo sia fatto dalla coppia GBPUSD... quindi quando viene attivato un ordine pendente, lo stop loss sfarfalla dai valori di GBPCAD a quelli di cable....
Uso magicnumber==1234;
Qualsiasi suggerimento o area in cui sto facendo l'idiota, sentitevi liberi di evidenziare :(