MQL5

Einloggen oder registrieren, um einen Kommentar zu schreiben
hausmannjack
174
hausmannjack  

Hallo,

seit einer Woche versuche ich vergeblich einen TrailingStop zu programmieren, der erst ab einem bestimmten Schwellenwert anfängt zu beginnen, dennoch misslingt mir die andauernd und ich weis nicht wo der Fehler liegt. Deswegen habe ich zwei Fragen:

1. Wie kann man zwei Linien auf einmal anzeigen lassen, den bei mir wird immer nur die zweiten von zwei Linien angezeigt.

2. Wo liegt der Fehler in meinem Code (Problem ist, dass der TrailingStop nicht an dem Schwellenwert beginnt und dass meine Position geöffnet wird und sofort wieder geschlossen).

#include <Trade\Trade.mqh>

CTrade m_Trade;

input double Schwellenwert=0.00005;
double TrailingStop_Wert=0;
input double StopLoss=0.00002;
double TrailingStop;

int OnInit()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   double PositionInfo=PositionGetDouble(POSITION_PRICE_OPEN);
   
   bool Buy_Opened=false;
   
   if(PositionSelect(_Symbol)==false)
   {
      m_Trade.Buy(0.1,_Symbol);
   }
   
   if(PositionSelect(_Symbol)==true)
   {
      if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
      {
         Buy_Opened=true;
         
         if(bid>TrailingStop_Wert)
         {
            if(bid>PositionInfo+Schwellenwert)
            {
               TrailingStop_Wert=bid;
               TrailingStop=TrailingStop_Wert-StopLoss;
            }
         }
         
         long cid=ChartID();
         ResetLastError();
         if(!ObjectCreate(cid,"test",OBJ_HLINE,0,0,TrailingStop) || GetLastError()!=0)
            Print("Error creating object: ",GetLastError());
         else
            ChartRedraw(cid);   
      }
   }
   
   if(bid<=TrailingStop)
   {
      m_Trade.PositionClose(_Symbol);
   }
}
Christian
3166
Christian  

Hallöchen hausmannjack ,

 

jetzt auf die schnelle nutze den Link https://www.mql5.com/de/articles/134 

Das geht es um die CTrailing klasse .

Eine nutzt du ja schon die CTrade dann macht einer mehr auch nichts mehr :-)

In der Klasse sind alle Funktionen zum "Objekt" Trailingstop schon vorgekaut.

 Lies dich mal rein, ist aber etwas komplex. Ich gucke heute Abend mir dein Code noch an .

 

Grüße

Anlegen eigener Trailing Stops
Anlegen eigener Trailing Stops
  • 2016.01.12
  • Dmitry Fedoseev
  • www.mql5.com
Die Grundregel für Händler: Lass‘ Gewinne wachsen, trenn‘ dich von Verlusten! In diesem Beitrag betrachten wir eine der grundlegenden Techniken zur Befolgung dieser Regel: die Verschiebung der schützenden Verlustbegrenzung (Stop Loss Level) nach einer Gewinnsteigerung einer Position, m. a. W.: den Trailing Stop Level, die nachlaufende Stop-Grenze. Sie finden das schrittweise Vorgehen zur Einrichtung einer Klasse zur nachlaufenden Verlustbegrenzung bei den Indikatoren SAR und NRTR. Jedermann ist in der Lage, diese Trailing Stops in die eigenen Expert-Systeme einzufügen oder sie eigenständig zur Überwachung der Positionen des eigenen Kontos zu verwenden.
Christian
3166
Christian  

So ......

 

1. Du musst nach dem die Position geschlossen wurde ( was ja funktioniert) die Variablen dazu auch wieder reseten !

So das bei neuer Öffnung der Position wieder "alte" Werte in den Variablen sind.

2. Sind deine Stoploss werte zu klein. 0.00002 ? Sonntag Abend wenn um 23:00 die Devisen Kurse starten hat selbst der Liquide EURUSD schon ein Spread von 20-30 Punkten je nach Broker.

Somit wird nach dem Öffnen die gleich wieder geschlossen. Etwas mehr Luft lassen .

Ansonsten funktioniert das so .

 

Tip , wenn du in einer Variable speicherst das die Pos. offen ist brauchst nu nicht bei jedem Tick prüfen mit 

if(PositionSelect(_Symbol)==true)
   {

 Das spart Zeit , macht sich später beim Optimieren bemerkbar.

 

Gruß Christian

hausmannjack
174
hausmannjack  

Vielen herzlichen Dank. Ich werde gleich alles ausprobieren.

Gruß JH 

hausmannjack
174
hausmannjack  
PS. Welche Variablen genau meinst du mit dem reseten und wie stelle ich das an. Danke im Vorraus
Christian
3166
Christian  

Ne , hatte mich versehen. Ist doch ok soweit.

 Reseten heißt in Grundstellung setzten. Damit sich beim Ablauf sich keine Fehler einschleichen.

Einloggen oder registrieren, um einen Kommentar zu schreiben