Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   OrderModify Error 1 (http://www.expert-advisor.com/forum/showthread.php?t=7291)

pascalper 30.01.23 10:04

OrderModify Error 1
 
Hallo,

Code korrekt (nur Error1), Ausführung korrekt, Ergebnis korrekt, die Modifizierung der 2 offenen Positionen wird korrekt ausgeführt, alle neuen Werte sind richtig, jedoch bekomme ich den Error 1 nicht weg, der das Log voll macht.
Alles sinnvollen Varianten mit break, continue, return probiert, keine Änderung. Mittlerweile mühe ich mich bereits 2 Wochen damit ab.

Bin für jede Hilfe, Tip dankbar!

Gruß

Code:

void PA1Order3Modify(){
  bool bres=false,sres=false;
  double PA1BuyOpen=GlobalVariableGet(Symbol()+"-PABuyOpen"); //not used
  double PA1BuyOpenTP=GlobalVariableGet(Symbol()+"-PABuyOpenTP")+NormalizeDouble(((DynSteps/100)*4),0);
  double PA1BuyOpenSL=GlobalVariableGet(Symbol()+"-PABuyOpenSL")-NormalizeDouble(((DynSteps/100)*4),0);
    for(int i = OrdersTotal()-1; i >= 0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic1){
        if(OrderType()==OP_BUY && StringFind(OrderComment(),"-1/10")==4){
        if(OrderProfit()==PA1BuyOpenTP && OrderStopLoss()==PA1BuyOpenSL) break; {
          bres=OrderModify(OrderTicket(),OrderOpenPrice(),PA1BuyOpenSL,PA1BuyOpenTP,OrderExpiration(),CLR_NONE); } }
        if(OrderType()==OP_SELL && StringFind(OrderComment(),"-2/10")==4){
        if(OrderProfit()==PA1BuyOpenSL && OrderStopLoss()==PA1BuyOpenTP) break; {
          sres=OrderModify(OrderTicket(),OrderOpenPrice(),PA1BuyOpenTP,PA1BuyOpenSL,OrderExpiration(),CLR_NONE); } }
          }
      }
      return;
    }


traderdoc 30.01.23 10:27

OrderModify() wird permanent angesprungen.
D.h. wenn versucht wird, OrderModify() mit denselben Werten
auszuführen, dann wir Error 1 geprintet.

traderdoc

pascalper 30.01.23 11:20

Vielen Dank, ich glaube ich verstehe theoretisch was du meinst, aber ich weiß nicht wie ich das ändern könnte
ich habe es auch alternativ mit continue, return probiert und auch wenn ich mit

if(!OrderProfit()==PA1BuyOpenTP && !OrderStopLoss()==PA1BuyOpenSL)

arbeite, stimmt zwar immer das Ergebnis, Error1 bleibt

D.h. der Code ist in der Syntax richtig aber nicht in der Logik, das zu ändern übersteigt jedoch mein Können, bzw. es gibt keine wirklich guten Vorlagen/Beispiele online zu finden...ausserdem verstehe ich nicht warum Metaquotes den Error1 "obligatorisch" aktiv setzt, würde der nicht das Log voll machen würde ich so lassen, das Ergebnis stimmt zu 100%.


Gibt es eine Möglichkeit den Error1 via Code abzuschalten?
Error1 -> /device Null...oder ähnliches

Nochmals vielen Dank!

Gruß

traderdoc 30.01.23 13:50

OrderProfit() kann nicht = PA1BuyOpenSL sein!
Daher wird die if-Abfrage auch nicht zum break führen.

traderdoc

pascalper 30.01.23 18:24

Zitat:

Zitat von traderdoc (Beitrag 46464)
OrderProfit() kann nicht = PA1BuyOpenSL sein!
Daher wird die if-Abfrage auch nicht zum break führen.

traderdoc

Ja das ist ein wenig verwirrend
Order#1 ist eine Buy Market Order
Order#2 ist eine Sell Market Order
Order#3 ist eine Buy_Stop Order, x Schritte von Order#1 entfernt-TP+SL entfernen sich automatisch mit
Wird nun Pending #3 exekutiert, sollen die SL+TP von Order 1+2 an Order 3 TP+SL angepasst werden

Richtig wäre es wenn ich für Buy und Sell jeweils komplett getrennte Variablen (BuyTP+SL und SellTP+SL=4 Variablen) verwenden würde, da aber die Werte für TP+SL immer identisch sind, egal ob Buy oder Sell, habe ich diese im OrderSend/Modify einfach umgedreht

PA1BuyOpen/TP/SL zeigt nur an das Order#1 eine Buy Order ist, wie du vielleicht erahnst gibt es auch das Gegenstück
PA2SellOpen/TP/SL wo die Order #1 eine Sell Order ist, Order#2 Buy und Pending #3 wieder Sell_Stop
d.h. es ist ein Breakout Hedge System, mit dynamischer Schrittweite abhängig von der Volatilität. Diese Werte steuern auch TP+SL. steigt die Volatilität an, werden TP+SL auch weiter, vice versa = keine zu weiten TP die nicht erreicht werden und keine zu engen SL die getriggert werden. D.h. es ist völlig egal wohin der Kurs geht, es braucht nur Volatilität

Wie erwähnt es funktioniert einwandfrei, momentan ziehe ich die TP+SL von Order1+2 mit der Maus manuell auf die TP+SL Werte von #3 nach...dieser Automatismus fehlt noch...zu meinem Glück

Aber deine Antwort hat mich auf eine andere Idee, mögliche Unlogik meinerseits gebracht, ich teste mal und melde mich.

Dank + Gruß

traderdoc 30.01.23 19:26

Was Du da schreibst, mag alles sein, aber trotzdem kann man nicht
OderProfit() - angegeben in Währung!! - mit PA1BuyOpenTP als Kursangabe!! vergleichen. Verstehst Du?
Code:

if(OrderProfit()==PA1BuyOpenTP && OrderStopLoss()==PA1BuyOpenSL) break;
und
if(OrderProfit()==PA1BuyOpenSL && OrderStopLoss()==PA1BuyOpenTP) break;

Hier liegt der Hase begraben. Und da deshalb diese Abfgrage nie true sein kann, gibt es auch keinen break, so dass der Code weiter durchlaufen wird zu den Funktionen OrderModify(), die nach Abarbeiten desselben SL und TP dann immer mit Error1 reagieren.

traderdoc

pascalper 31.01.23 10:24

Zitat:

Zitat von traderdoc (Beitrag 46466)
Was Du da schreibst, mag alles sein, aber trotzdem kann man nicht
OderProfit() - angegeben in Währung!! - mit PA1BuyOpenTP als Kursangabe!! vergleichen. Verstehst Du?
Code:

if(OrderProfit()==PA1BuyOpenTP && OrderStopLoss()==PA1BuyOpenSL) break;
und
if(OrderProfit()==PA1BuyOpenSL && OrderStopLoss()==PA1BuyOpenTP) break;

Hier liegt der Hase begraben. Und da deshalb diese Abfgrage nie true sein kann, gibt es auch keinen break, so dass der Code weiter durchlaufen wird zu den Funktionen OrderModify(), die nach Abarbeiten desselben SL und TP dann immer mit Error1 reagieren.

traderdoc

OK, jetzt glaube ich hab ich es...

Statt OrderProfit() was den G/V ohne Swaps, Comm wieder gibt
MUSS
ich OrderTakeProfit() verwenden, welche den Kurs wieder gibt zu dem die Position im Gewinn ist und geschlossen wird

OrderProfit() mit OrderTakeProfit() verwechselt

Somit wäre richtig:
if(OrderTakeProfit()==PA1BuyOpenTP) break;
beim ersten Loop hat OrderTakeProfit() noch den original Wert -> OrderModify startet
beim zweiten Loop ist OrderTakeProfit() identisch mit PA1BuyOpenTP und bricht ab

Richtig? Danke

pascalper 31.01.23 10:35

Gerade mit OrderTakeProfit() getestet
Und es funktioniert!
Was bin ich für ein Dödel :)
Kleines Malheur mit großer Wirkung...

Großartig traderdoc, du hast mich in die richtige Richtung gestellt!

Nochmals vielen Dank!

Gruß


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:39 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum