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 MQL5 (http://www.expert-advisor.com/forum/forumdisplay.php?f=221)
-   -   Einfacher SELL-Order Trailingstop klapppt nicht (http://www.expert-advisor.com/forum/showthread.php?t=7168)

Cobalt 16.03.22 06:34

Einfacher SELL-Order Trailingstop klapppt nicht
 
Hi!

Da ich aus irgendwelchen Gründen unter MT5 keinen Trailingstop setzen kann,
habe ich versucht mir ein EA zu schreiben, der dies übernimmt.
Einen für BUY- und einen für SELL-Positionen,
etwas umständlich aber besser als ohne zu arbeiten.


Im Backtest klappt alles bestens!

Live nicht...
:(

(lasse ihn beim Test eine Position eröffnen, habe diese Zeilen aber entfernt)


Code:

input int Trailingstop = 100;
input int Schrittgröße = 1;


#include<Trade\Trade.mqh>

CTrade  trade;

void OnTick()
  {
  double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
  CheckTrailingStop(Bid);   
  } 
 
 
void CheckTrailingStop(double Bid) 
  {
  if(PositionsTotal()>0)
 
      {
      double SL=NormalizeDouble(Bid+Trailingstop*_Point,_Digits);
        for(int i=PositionsTotal() -1; i>=0; i--)
 
        { 
        string symbol=PositionGetSymbol(i);
        if (_Symbol==symbol)
        if (PositionGetInteger(POSITION_TYPE)==ORDER_TYPE_SELL)
       
            {
            ulong PositionTicket=PositionGetInteger(POSITION_TICKET);
            double CurrentStopLoss=PositionGetDouble(POSITION_SL);
            if (CurrentStopLoss>SL)
 
              {
              trade.PositionModify(PositionTicket,(CurrentStopLoss-Schrittgröße*_Point),0);
              }
            }
        }             
      }
  }

Was habe ich übersehen?
:confused:

Bin für jeden Ratschlag dankbar!

Indikator-Trading 16.03.22 08:39

Du hast die Order nicht ausgewählt, dafür ist Funktion PositionSelect() vorgesehen.
Jetzt werden die Aufrufe von PositionGetInteger() auf irgend eine andere, zuvor ausgewählte Position zeigen.

Cobalt 16.03.22 10:10

Danke!


Code:

for(int i=PositionsTotal() -1; i>=0; i--)
          {
         
        PositionSelect(_Symbol);
        string symbol=PositionGetSymbol(i);
        if (_Symbol==symbol)
        if (PositionGetInteger(POSITION_TYPE)==ORDER_TYPE_SELL)
       
            {


So sollte das dann aussehen, oder?

Die Umstellung von MT4 auf MT5 verwirrt mich etwas.
War noch nie gut im Programmieren.

traderdoc 16.03.22 12:03

Könnte man so proggen.
Ich würde zu der sicheren Variante greifen:

Code:

for (uint i = PositionsTotal()-1; i >= 0; i--) {
  if ((ticket = PositionGetTicket(i)) > 0) {
      if (PositionGetString(POSITION_SYMBOL) == Symbol() && PositionGetInteger(POSITION_MAGIC) == MagicNumber){
        if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) {

        }
        if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) {

        }
      }
  }
}

Falle keine MagicNumber vergeben wurde, dann weglassen.

traderdoc

Cobalt 16.03.22 15:31

Also ohne PositionSelect?

Bin jetzt noch mehr verwirrt...


Bei MT4 war das irgendwie einfacher.

Indikator-Trading 17.03.22 08:33

Das funktioniert, da der Aufruf von PositionGetTicket(i) ebenfalls die jeweilige Position selektiert, genauso wie PositionSelect().
PositionSelect() würde allerdings auch nur dann sicher funktionieren, wenn du nur eine Position pro Symbol hättest. Die Implementierung von TraderDoc ist somit die Variante, welche sicherer und besser ist.


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:10 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