Zunächst einmal weiß ich, Raptor, dass Sie dieses Problem schon einmal mit mir besprochen haben, aber ich kann mich nicht erinnern, wo Sie es geschrieben haben, und, was noch wichtiger ist, ich verstehe nicht, was ich falsch mache.
Soweit ich weiß, habe ich es richtig geschrieben, so dass der EA, der an ein entsprechendes Paar angehängt ist, immer nur auf diesem Paar arbeiten kann. Im Moment habe ich bemerkt, dass GBPCAD und GBPUSD scheinen nicht auf, was bedeutet, dass die GBPCAD Stoploss denkt, dass es die Berechnung durch das GBPUSD-Paar getan wird... so, wenn eine schwebende Bestellung ausgelöst wird, flackert der Stop Loss von GBPCAD Werte zu Kabel....
Ich verwende magicnumber==1234;
Irgendwelche Vorschläge oder Bereiche, in denen ich mich wie ein Idiot verhalte, können Sie gerne hervorheben :(
Ihr Problem ist klar, aber kann ein wenig schwer zu sehen, weil die Art und Weise Sie Klammern Einrücken und Bedingungen verwenden. . Sie tun dies:
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()); } }
Ich glaube, Sie meinten dies...
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()); } } }
Danke, dass Sie diesen Teil für mich entdeckt haben :)
Ah ok - so eine kleine Sache habe ich da übersehen. Auch, wenn die erste OrderSend() Funktion aufgerufen wird, mache ich dort etwas falsch? Ich frage das, weil ich versuche, logisch darüber nachzudenken, ob es zu diesem Zeitpunkt weiß, an welches Paar die Bestellung gesendet werden soll? Das mag eine dumme Frage sein, aber ich mache doch nichts falsch mit diesem Teil, oder? Der Teil der "BuyTicketOrder"-Sendefunktion?
Danke, dass Sie diesen Teil für mich entdeckt haben :)
//+----------------------------------------------------------------------------------------------------------------------------------------+ //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 - ich denke, das ist, was das Problem verursacht wurde. Ich habe soeben den Code auf diesem Teil aktualisiert und es scheint jetzt gestoppt zu haben Flicking auf jeden Tick von Kabel zu GBPCAD Preise... Es ist jetzt auf einem Stop-Preis stecken, bis es sich auf dieser stündlichen schließen aktualisieren wird ... so werde ich bestätigen.
Scheint das ok für Sie? Auch, weil ich diese partielle Bestellung schließt, ich nehme an, ich muss wahrscheinlich doppelt überprüfen, dass die geschweiften Klammern in der richtigen Position relativ zu "OrderSymbol()==Symbol())" sind?
if(OpenOrdersThisPair(Symbol()) == 0Wie oft wollen Sie dies aufrufen? Für jede Bestellung (Ihr Code)? Für jede schwebende Order auf dem aktuellen Chart (RaptorUKs Code)? Oder EINMAL, NACHDEM Sie die Pending-Order gespeichert und gelöscht haben?
Ok - ich glaube, das war die Ursache des Problems. Ich habe soeben den Code in diesem Teil aktualisiert und es scheint nun nicht mehr bei jedem Tick von Cable zu GBPCAD Kursen zu flicken... Es ist jetzt auf einem Stop-Preis stecken, bis es sich auf dieser stündlichen schließen aktualisieren wird ... so werde ich bestätigen.
Scheint das ok für Sie? Auch, weil ich diese partielle Bestellung schließt, ich nehme an, ich muss wahrscheinlich doppelt überprüfen, dass die geschweiften Klammern in der richtigen Position relativ zu "OrderSymbol()==Symbol())" sind?
Es sieht gut aus, ja, überprüfen Sie immer Ihre Klammern, und machen Sie sich das Leben leichter, wo immer Sie können, wenn das bedeutet, Klammern hinzuzufügen, dann tun Sie das, aber versuchen Sie, mit Klammern und Einrückungen konsistent zu sein.
Sie brauchen nicht zwei Schleifen, eine reicht aus.
//+----------------------------------------------------------------------------------------------------------------------------------------+ //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() gibt ein bool zurück, true oder false, nicht einen int . . . so SellModify wird nie kleiner als 0 sein . . . Das Gleiche habe ich gestern bei ForexFactory geschrieben.
Jedes Mal, wenn die Order gelöscht wurde - ich möchte, dass die schwebende Order JEDEN 1-Stunden-Balkenschluss gelöscht wird und dann eine neue Order entweder mit denselben Parametern ODER, falls zutreffend, mit neuen Stopps, Zielen und Losgrößen basierend auf "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "
Das Einzige, was ich für die NEUE schwebende Order (nach dem Löschen) speichern muss, ist der anfängliche Einstiegskurs für dieses bestimmte Set-up.(Gespeicherter_BuyPrice = OrderOpenPrice();)
Es ist witzig, denn der erste Teil des obigen Codes steht auch im Zusammenhang mit einem anderen Thema, das ich gerade veröffentlichen wollte. Anstatt ein neues Thema mit einer ähnlichen Frage zu eröffnen, werde ich sie hier stellen, wenn das ok ist? Schauen Sie sich den Link unten - nur ein paar Minuten Video erklärt das Problem, das ich habe und finde es schwer zu lösen ...
Ich habe so viel Code geschrieben, aber ich beginne jetzt zu erkennen, dass es ein Fall von Ineffizienz ist, den ich reparieren muss...
Video: http://screencast.com/t/4nl8AaH8Sag
Wenn ich mich mit dem wenigen Code, den ich zur Verfügung gestellt habe, nicht ganz klar ausgedrückt habe, werde ich etwas mehr hinzufügen.
Jedes Mal, wenn die Order gelöscht wurde - ich möchte, dass die schwebende Order JEDEN 1-Stunden-Balkenschluss gelöscht wird und dann eine neue Order entweder mit denselben Parametern ODER, falls zutreffend, mit neuen Stopps, Zielen und Losgrößen basierend auf "if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) "
Das Einzige, was ich für die NEUE schwebende Order (nach dem Löschen) speichern muss, ist der anfängliche Einstiegskurs für dieses bestimmte Set-up.(Gespeicherter_BuyPrice = OrderOpenPrice();)
Es ist witzig, denn der erste Teil des obigen Codes steht auch im Zusammenhang mit einem anderen Thema, das ich gerade veröffentlichen wollte. Anstatt ein neues Thema mit einer ähnlichen Frage zu eröffnen, werde ich sie hier stellen, wenn das ok ist? Schauen Sie sich den Link unten - nur ein paar Minuten Video erklärt das Problem, das ich habe und finde es schwer zu lösen ...
Ich habe so viel Code geschrieben, aber ich beginne jetzt zu erkennen, dass es ein Fall von Ineffizienz ist, den ich reparieren muss...
Video: http://screencast.com/t/4nl8AaH8Sag
Wenn ich mich mit dem wenigen Code, den ich zur Verfügung gestellt habe, nicht ganz klar ausgedrückt habe, werde ich etwas mehr hinzufügen.
Der Pullback zum 21 EMA erfolgt nur einmal. Danach sucht er nicht mehr nach weiteren Rücksetzern auf den 21 EMA. Es sollte jedoch sicherstellen, dass der aktuelle offene PENDING-Auftrag mit den Lots, Stopps und Take Profits NACH jedem Stundenschluss genau auf dem neuesten Stand ist. Ich kann mir jedoch nicht erklären, warum es manchmal einwandfrei funktioniert und die Pending Order nach jedem H1-Schluss aktualisiert, und manchmal nicht? Der Grund, warum die Pending Order sich selbst aktualisiert, ist ""if(OrderStopLoss() < iMA(NULL, 60, MA_Period, 0, 1, 0, 0) - ATR) ".
Wenn das nicht zutrifft, dann nicht - ABER es gibt zahllose Fälle, in denen das zutrifft, und dennoch wird die Order nicht gelöscht und eine neue mit den neuen Werten platziert?
Ich bin mir nicht sicher, ob Sie etwas in dem obigen Code in Bezug auf das Video sehen können? (Erster Code, den Sie korrigiert haben). Hoffe, das ist klarer?
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Soweit ich weiß, habe ich es richtig geschrieben, so dass der EA, der an ein entsprechendes Paar angehängt ist, immer nur auf diesem Paar arbeiten kann. Im Moment habe ich bemerkt, dass GBPCAD und GBPUSD scheinen nicht auf, was bedeutet, dass die GBPCAD Stoploss denkt, dass es die Berechnung durch das GBPUSD-Paar getan wird... so, wenn eine schwebende Bestellung ausgelöst wird, flackert der Stop Loss von GBPCAD Werte zu Kabel....
Ich verwende magicnumber==1234;
Irgendwelche Vorschläge oder Bereiche, in denen ich mich wie ein Idiot verhalte, können Sie gerne hervorheben :(