StopLoss und TakeProfit einzeln modifizieren

Einloggen oder registrieren, um einen Kommentar zu schreiben
MariusTrading
76
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:

#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 

amando
1654
amando  
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)

MariusTrading
76
MariusTrading  
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

amando
1654
amando  
MariusTrading:

Nein, eben das funktioniert nicht!

Wie sieht dein ganzer code aus?

MariusTrading
76
MariusTrading  
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..

Otto Pauser
1492
Otto Pauser  

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:
MariusTrading
76
MariusTrading  
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.

amando
1654
amando  
Verwendest du hedge oder netting mode?
Otto Pauser
1492
Otto Pauser  
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.

Carl Schreiber
Moderator
8038
Carl Schreiber  

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, ...!

Christian
2740
Christian  

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.

12
Einloggen oder registrieren, um einen Kommentar zu schreiben