StopLoss und TakeProfit einzeln modifizieren

 

Guten Tag,

für meine Programme habe ich bisher immer nur den StopLoss modifiziert. Nun möchte ich allerdings den StopLoss und den TakeProfit modifizieren.

Dafür verwende ich diese Methode:

#include <Trade\Trade.mqh>
CTrade trade;
trade.PositionModify(PositionTicket, StopLoss, TakeProfit);

Hierbei muss ich allerdings den StopLoss und den TakeProfit zusammen modifizieren. Wenn ich hier die Variable für z.b. den StopLoss gleich lasse und nur die für den TakeProfit ändere, gibt es eine Fehlermeldung und es wird gar nichts modifiziert! Dazu wird das Programm durch die vielen Fehlermeldungen auch langsam. Ich muss also den TakeProfit und den StopLoss getrennt modifizieren. Im Internet und im Forum konnte ich nichts finden, wodurch ich jetzt hiermit nach Rat suche.

-Danke im Voraus 

 
MariusTrading:

Guten Tag,

für meine Programme habe ich bisher immer nur den StopLoss modifiziert. Nun möchte ich allerdings den StopLoss und den TakeProfit modifizieren.

Dafür verwende ich diese Methode:

Hierbei muss ich allerdings den StopLoss und den TakeProfit zusammen modifizieren. Wenn ich hier die Variable für z.b. den StopLoss gleich lasse und nur die für den TakeProfit ändere, gibt es eine Fehlermeldung und es wird gar nichts modifiziert! Dazu wird das Programm durch die vielen Fehlermeldungen auch langsam. Ich muss also den TakeProfit und den StopLoss getrennt modifizieren. Im Internet und im Forum konnte ich nichts finden, wodurch ich jetzt hiermit nach Rat suche.

-Danke im Voraus 

Du musst nur hergehen, und zuerst den SL und den TP aus deiner Order auslesen, dann kannst du den gleichen Wert wieder eintragen ohne das ein Fehler kommt

Die Werte bekommst Du mit PositionGetDouble(POSITION_SL) bzw PositionGetDouble(POSITION_TP)

 
amando:

Du musst nur hergehen, und zuerst den SL und den TP aus deiner Order auslesen, dann kannst du den gleichen Wert wieder eintragen ohne das ein Fehler kommt

Die Werte bekommst Du mit PositionGetDouble(POSITION_SL) bzw PositionGetDouble(POSITION_TP)

Nein, eben das funktioniert nicht!

Fehlermeldungen

 
MariusTrading:

Nein, eben das funktioniert nicht!

Wie sieht dein ganzer code aus?

 
amando:

Wie sieht dein ganzer code aus?

Ich kann nicht den ganzen code posten, weil er sehr lang ist (1410 Zeilen).

Aber ich kann den wichtigen Teil posten.

void setTradeEqualFirst(){
double CurrentTakeProfit=0;
   for(int i=0;i<=PositionsTotal()-1; i++){
      string symbol=PositionGetSymbol(i);

      PositionSelectByTicket(PositionGetTicket(i));
      if(_Symbol==symbol&&PositionGetInteger(POSITION_MAGIC)==MagicNumber){
         TradeTicket=PositionGetTicket(i);
         ulong PositionTicket=PositionGetInteger(POSITION_TICKET);
         double PosPrice = PositionGetDouble(POSITION_PRICE_OPEN);
         type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
         if(GetTradeCount()==1){
            FirstTradeTicket=PositionTicket;
         } else {

            PositionSelectByTicket(FirstTradeTicket);
            
            double CurrentStopLoss = PositionGetDouble(POSITION_SL);
            if(type==POSITION_TYPE_BUY&&PositionGetDouble(POSITION_TP)>=(Bid+Ask)/2-TradeDiv){
               CurrentTakeProfit = (Bid+Ask)/2-TradeDiv;
            } else if(type==POSITION_TYPE_SELL&&PositionGetDouble(POSITION_TP)<=(Bid+Ask)/2+TradeDiv){
               CurrentTakeProfit = (Bid+Ask)/2+TradeDiv;
            } else {
               CurrentTakeProfit = PositionGetDouble(POSITION_TP);
            }
            PositionSelectByTicket(PositionTicket);
            trade.PositionModify(PositionTicket,CurrentStopLoss,CurrentTakeProfit);
         }
      }
   }
}

Ich habe den code noch nicht ordentlich strukturiert und herunter gebrochen, wodurch er ziemlich unleserlich ist.

-Die StopLossberechnung ist noch nicht implementiert..

 

Der Code ist unnötig kompliziert.

Im Netting Mode reicht:

PositionModify(_Symbol, newSL, newTP)

Und das war's auch schon.

Willst du SL oder TP beibehalten, lies ihn vorher aus und nimm den gleichen Wert.

Ich rate dir dringend zu OOP, mach dir eine erweiterte Klasse von CTrade. .....vergiss es ich schenk dir was:

Hier, im Anhang, ein Geschenk an alle:

Die Klasse CTradeExt. Es wird auch die Instanz Trade direkt definiert. Ist hier nich üblich, aber ich mach halt auch einiges anders.

In der OnTick() als erstes Trade.OnTick() aufrufen, und praktisch alle relevante Werte sind als public Variable aktualisiert.

Im Debugger lassen sich diese auch wunderbar überwachen, da dieser 'Krüppel' ja keine Funktionen auswerten kann.

Der kann nicht mal #define x = 5 auswerten.

Ist noch ein langer Weg bis MetaEditor ein vollwertiger, moderner wird. zB über ein Symbol hovern und der aktuelle Wert wird angezeigt.

Also:

#include <Trade\TradeExtSimple.mqh>

void OnTick()
{
   if(!Trade.OnTick())        // refresh all values
      return;                 // some error occured

   if(Trade.PosOpened)        // position existing
      {

      }
   else                       // no open position
      {

      }
}

switch(Trade.PosType) ist auch ein sehr mächtiges feature.

Ich hab sie TradeExtSimple genannt, da einige debug-features entfernt sind.

Die Datei in den Ordner MQL5\Include\Trade kopieren.

Dateien:
 
Otto Pauser:

Der Code ist unnötig kompliziert.

Im Netting Mode reicht:

Und das war's auch schon.

Willst du SL oder TP beibehalten, lies ihn vorher aus und nimm den gleichen Wert.

Ich rate dir dringend zu OOP, mach dir eine erweiterte Klasse von CTrade.

Ich habe es gerade ausprobiert, das ist die selbe Funktion wie ich sie gerade verwende.

-Selber Fehler wie vorher.

Wegen OOP mach ich mir schon eine Weile Gedanken.

 
Verwendest du hedge oder netting mode?
 
MariusTrading:

Ich habe es gerade ausprobiert, das ist die selbe Funktion wie ich sie gerade verwende.

-Selber Fehler wie vorher.

Wegen OOP mach ich mir schon eine Weile Gedanken.

verwende meine mqh, da funktioniert es.

um OOP kommst du nicht herum, ist in Wirklichkeit total simpel.

 

Also ich vermute, dass liegt einfach daran, dass die neuen oder alten Stopps (SL und/order TP) zu nahe oder auf der falschen Seite bezüglich der jetzt aktuellen Bid- und Ask-Preise liegen!

Druck Dir das aus inkl. der relevanten Preise wie Bid, Ask, Differenzen, minimaler Abstand, ...!

 

Auch hier wieder der Tipp:


Logs und GESAMMTEN ea posten.

Alles andere ist immer zu langwierig und quälend.

Über die länge mach dir keine Sorge,du kannst auch Datei hier anhängen.

Grund der Beschwerde: