Trend-Jagd

Eryomin Sergey | 10 März, 2016

Warnung

In diesem Artikel enthaltene Informationen sind nur meine Sichtweise. Als Autor rege ich Sie nicht an nach dem in diesem Artikel beschriebenen Algorithmus zu handeln. Darüber hinaus warne ich vor möglichen Verlusten, die durch die Verwendung dieser Informationen entstehen können.


Einführung

Der Artikel enthält die Beschreibung einer Trading-Methode - Volumenanhäufung von Gewinn-Trades. Ich nehme an, nur Gewinn-Trades können angehäuft werden. Der Artikel erklärt den optimalen Weg zur Umsetzung von diesem und enthält einen EA-Code, der hilft solche Trades richtig auszuführen.


Konzept des Algorithmus

Die Anhäufung des Volumens eines profitablen Trades ermöglicht maximalen Gewinn aus einer Marktbewegung, der wir begegnen, zu erzielen. Das Volumen muss allerdings so angehäuft werden, dass es nicht zu einer Erhöhung der Risiken führt. Einer der Algorithmen einer solchen Volumenanhäufung wird in diesem Artikel beschrieben.

Zunächst benötigen wir einen Bezugspunkt - den ersten Haupt-Trade. Der Haupt-Trade sollte vom Volumen her nicht größer sein als jeder der zusätzlichen Trades. Angenommen, dass Volumen des Haupt-Trades ist 0,2 Lot, das Volumen der zusätzlichen Trades wird dann 0,1 Lot sein. Der Trailing Stop wird für alle Trades verwendet, zum Beispiel 50 Punkte. Wenn der Gewinn des Haupt-Trades 00 Punkte erreicht, wird der Stop Loss +5ß Punkte betragen. In diesem Moment wird ein Trade mit 0,1 Lot in die gleiche Richtung geöffnet, mit einem Stop Loss von -50 Punkten. Geht der Kurs zurück, werden beide Trades durch die Stop Loss Order geschlossen. Der erworbene Gewinn wird gleich den 50 Punkten von 0,2 Lot sein, der Verlust -50 Punkte von 0,1 Lot. Der Gesamtgewinn ist gleich zu 50 Punkten von 0,1 Lot. Somit ist die Verlustabsicherung erreicht, während das Handelsvolumen erhöht wird.

Wenn ein Trade sich weiter in die benötigte Richtung bewegt, wird, wenn der Gewinn des zusätzlichen Trades +50 Punkte erreicht, der Trailing Stop Loss aktiviert. Wenn der Gewinn des Haupt-Trades 200 Punkte erreicht, und der des zusätzlichen 100 Punkte, wird ein weiterer zusätzlicher Trade eröffnet. SL ist wieder gleich zu -50. Und so weiter.

Diese ziemlich einfache Methode ermöglicht es gute Gewinne aus der Lot-Anhäufung zu erzielen. Gleichzeitig sind die Risiken minimiert. Tatsächlich bestehen die Risiken hier nur aus dem möglichen Verlust des Haupt-Trades, das heißt, das Risiko, dass der erste zusätzliche Trade Verlust macht. Dies ist allerdings kein Verlustrisiko, es ist das Risiko nicht den vollen Gewinn zu erhalten.

Der Standard Trailing Stop Loss ermöglicht die Verfolgung des Trades nur, wenn er Gewinn macht. Wird es aber mit einem zusätzlichen Trade gemacht, bevor der notwendige Gewinn erzielt ist, kann die Rentabilität eines solchen Ansatzes zur Lot-Anhäufung gesteigert werden. Sie können dies auch als Optimierung der Eröffnung von zusätzlichen Trades mit Mitteln von MQL4 tun.



Umsetzung

Der zu diesem Zweck geschriebene Expert Advisor basiert auf dem EA, der in dem Atikel "Komfortables Scalping" beschrieben wird. In diesem Artikel hat der EA kombinierte Funktionen: Er spielt die Rolle eines Training-Spiels und eines Werkzeugs zum Öffnen von Trades. Für diesen Trade wurde die Funktion eines Spiels entfernt. Somit zeichnet der Expert Advisor zwei Pfeile in ein Chart - Auf und Ab. Löschen von einem von ihnen ist ein Signal zum Eröffnen eines Trades in die notwendige Richtung. Zum Beispiel, beim Löschen eines Ab-Pfeils verbleibt ein Auf-Pfeil auf dem Chart. Für den EA ist dies ein Signal eine Buy-Order zu eröffnen oder eine Anzahl von Pending Ordern zu platzieren.

Eine Markt-Order ist hier die wichtigste Order. Pending Ordern haben die Funktionen zusätzlicher Ordern, die kleinere Lot haben als die Haupt-Order. Für die Berechnung der "Häufigkeit" zusätzlicher Trade-Eröffnungen und ihrer Anzahl, werden zwei Konzepte verwendet. das erste ist das endgültige Ziel, Take Profit. Es ist für alle Ordern gleich (Haupt und zusätzliche). Das zweite Konzept ist ein Schritt zum Öffnen von Pending Ordern. Abhängig von dem endgültigen Ziel, berechnet der EA wie viele Ordern er in dem Abstand zwischen dem aktuellen Preis und der Take Profit Ebene platzieren kann.

Zum Beispiel, wenn wir einen Take Profit gleich 400 Punkte verwenden und der Schritt für die Order-Öffnung ist 100 Punkte (standardmäßig), werden 4 Ordern bei Kauf geöffnet. Die erste ist eine Buy-Order zum Ask-Kurs, die Haupt-Order. Die zweite ist eine zusätzliche Buy Stop Order zum Kurs Ask+100 Punkte. Die dritte ist eine zusätzliche Buy Stop Order zu Ask+200 Punkte. Die vierte - eine zusätzliche Buy Stop Order zum Kurs von Ask+300 Punkte. Take Profit ist für alle vier gleich Ask+400 Punkte, d.h., für die erste Order werden es 400 Punkte sein, für die zweite 3400, für die dritte 300 und 100 Punkte für die vierte Order.

Der Trailing Stop Loss für den Haupt-Trade funktioniert nur, wenn der notwendige Gewinn erreicht wurde (standardmäßig 50 Punkte). Für zusätzliche Trades funktioniert er ab dem Moment der Eröffnung (d.h. der StopLoss kann im Verlustbereich nachgestellt werden). Die Trailing Stop Ebene ist für alle Trades gleich. Neben dem Trailing Stop Loss gibt es eine Stop Loss Ebene für zusätzliche Trades.

Wird die Haupt-Order geschlossen, werden alle verbleibenden Pending Ordern gelöscht. Danach werden wieder zwei Pfeile in das Chart gezeichnet. Dies zeigt die Bereitschaft des EAs wieder Trades zu öffnen.

All dies mag langwierig erscheinen, aber es kann einfach in der Praxis umgesetzt werden. Untersuchen wir den EA-Code.

//+------------------------------------------------------------------+
//|                                                   take_trend.mq4 |
//|                                       Copyright © 2008, FXRaider |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, FXRaider"
extern int gap=20;            //level at which arrows are placed 
extern int TP=400;            //Take Profit level
extern int SL=0;              //Stop Loss level
extern double Lots1=0.2;      //lot of a main trade
extern double Lots2=0.1;      //lot of auxiliary trades 
extern int slippage=2;        //level of acceptable requote
extern int MagicNumber1=5345; //magic number of the main trade
extern int MagicNumber2=4365; //magic number of auxiliary trades
extern int Open_Step=100;     //step for opening auxiliary trades
 
extern bool UseTrailing = true; //enabling/disabling T-SL
extern int TrailingStop = 50;   //Trailing Stop Loss level
extern int TrailingStep = 1;    //Trailing Stop Loss step
int start()
  {
//------------------------------       
//+----------------------------------------------------------------------------------------------+
//|                              searching open orders for a pair                                |
    int pos_sell=0;
  for (int i_op_sell=OrdersTotal()-1; i_op_sell>=0; i_op_sell--) 
  { 
   if (!OrderSelect(i_op_sell,SELECT_BY_POS,MODE_TRADES)) break; 
   if (Symbol()==OrderSymbol()
   &&OrderMagicNumber()==MagicNumber1   
   &&(OrderType()==OP_SELL))
   {
    pos_sell=1; break;   
   } 
  }
    
    int pos_buy=0;
  for (int i_op_buy=OrdersTotal()-1; i_op_buy>=0; i_op_buy--) 
  { 
   if (!OrderSelect(i_op_buy,SELECT_BY_POS,MODE_TRADES)) break; 
   if (Symbol()==OrderSymbol()
   &&OrderMagicNumber()==MagicNumber1
   &&(OrderType()==OP_BUY))
   {
    pos_buy=1; break;   
   } 
  }    
//|                              searching open orders for a pair                                |
//+----------------------------------------------------------------------------------------------+  
//+------------------------------------------------------------------------------------+
//|                                 working with objects                               |  
 
//+----------------------------------------------------------+
//|                    deleting objects                      | 
  if(iBarShift(NULL,0,ObjectGet("down",OBJPROP_TIME1))>0
     ||ObjectGet("down",OBJPROP_PRICE1)!=Open[0]-gap*Point) 
    {
     ObjectDelete("down"); 
    }  
  if(iBarShift(NULL,0,ObjectGet("up",OBJPROP_TIME1))>0
    ||ObjectGet("up",OBJPROP_PRICE1)!=Open[0]+gap*Point)            
    { 
     ObjectDelete("up"); 
    } 
//|                    deleting objects                      |   
//+----------------------------------------------------------+ 
 
//+----------------------------------------------------------+
//|                   drawing objects                        |   
   if((ObjectFind("down") != 0&&ObjectFind("up") != 0) //if no objects
   &&!pos_sell&&!pos_buy)                              //if no open orders
   {
     ObjectCreate("down", OBJ_ARROW, 0, Time[0], Open[0]-gap*Point); //draw a down arrow
     ObjectSet("down", OBJPROP_STYLE, STYLE_DOT);
     ObjectSet("down", OBJPROP_ARROWCODE, 234);
     ObjectSet("down", OBJPROP_COLOR, Red);
 
     ObjectCreate("up", OBJ_ARROW, 0, Time[0], Open[0]+gap*Point); //draw an up arrow
     ObjectSet("up", OBJPROP_STYLE, STYLE_DOT);
     ObjectSet("up", OBJPROP_ARROWCODE, 233);
     ObjectSet("up", OBJPROP_COLOR, Blue);
   }    
//|                   drawing objects                        |
//+----------------------------------------------------------+   
      
//|                                 working with objects                               |   
//+------------------------------------------------------------------------------------+
 
   
 
 
//+----------------------------------------------------------------------------------------------+ 
//|                                deleting unnecessary orders                                   | 
int cnt_del; 
if(pos_buy==0)
{               
  for (cnt_del=0; cnt_del<OrdersTotal(); cnt_del++) 
  {
    if (!(OrderSelect(cnt_del, SELECT_BY_POS, MODE_TRADES))) continue;     
    if(OrderSymbol()==Symbol())
    {
     if (OrderType()==OP_BUYSTOP && OrderMagicNumber()==MagicNumber2) OrderDelete(OrderTicket()); 
    }
  } 
 } 
 
if(pos_sell==0)
{               
  for (cnt_del=0; cnt_del<OrdersTotal(); cnt_del++) 
  {
    if (!(OrderSelect(cnt_del, SELECT_BY_POS, MODE_TRADES))) continue;     
    if(OrderSymbol()==Symbol())
    { 
    if (OrderType()==OP_SELLSTOP && OrderMagicNumber()==MagicNumber2) OrderDelete(OrderTicket()); 
    }
  } 
 }  
//|                                deleting unnecessary orders                                   |
//+----------------------------------------------------------------------------------------------+  
 
  
//+------------------------------------------------------------------------------------+ 
//|                                   opening trades                                   |
double sl_buy, sl_sell;
 if(!SL)
 { 
  sl_buy=0;
  sl_sell=0;
 }
 else
 {
  sl_buy=Ask-SL*Point;
  sl_sell=Bid+SL*Point;
 }
 int stop_positions=MathFloor(TP/Open_Step-1);
 int i, open_step_2;
  if(
     ObjectGet("up", OBJPROP_PRICE1)==Open[0]+gap*Point
     &&iBarShift(NULL,0,ObjectGet("up",OBJPROP_TIME1))==0
     &&ObjectFind("down") != 0
     &&ObjectFind("up") == 0
     &&!pos_buy  
     )
     {
      OrderSend(Symbol(),OP_BUY, Lots1,Ask,slippage,sl_buy,Ask+TP*Point,"take_trend",MagicNumber1,0,Blue); 
      for(i=stop_positions;i>=0; i--) 
      {
       open_step_2=open_step_2+Open_Step;
       OrderSend(Symbol(),OP_BUYSTOP, Lots2,
       Ask+open_step_2*Point,slippage,
       0,Ask+TP*Point,"take_trend",MagicNumber2,0,Blue);
      }          
     }
  if(
     ObjectGet("down", OBJPROP_PRICE1)==Open[0]-gap*Point
     &&iBarShift(NULL,0,ObjectGet("down",OBJPROP_TIME1))==0
     &&ObjectFind("up") != 0
     &&ObjectFind("down") == 0
     &&!pos_sell
     )
     {
      OrderSend(Symbol(),OP_SELL, Lots1,Bid,slippage,sl_sell,Bid-TP*Point,"take_trend",MagicNumber1,0,Red);
      for(i=stop_positions;i>=0; i--) 
      {
       open_step_2=open_step_2+Open_Step;
       OrderSend(Symbol(),OP_SELLSTOP, Lots2,
       Bid-open_step_2*Point,slippage,
       0,Bid-TP*Point,"take_trend",MagicNumber2,0,Red);
      }        
     }
//|                                   opening trades                                   |  
//+------------------------------------------------------------------------------------+   
 
 
//+-------------------------------------------------------------------------------------------------+ 
//|                                      trail of open orders                                       |
if (UseTrailing)
{ 
  for (int trall=0; trall<OrdersTotal(); trall++) {
    if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;       
 
    if (OrderType() == OP_BUY ) {
      if (Bid-OrderOpenPrice() > TrailingStop*Point || OrderMagicNumber()==MagicNumber2) {
        if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point, OrderTakeProfit(), 0, Blue);
       }
      }
    }
 
    if (OrderType() == OP_SELL) {
     if (OrderOpenPrice()-Ask > TrailingStop*Point || OrderMagicNumber()==MagicNumber2) {
        if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point, OrderTakeProfit(), 0, Blue);
        }
     }
    }
  }
 }
//|                                      trail of open orders                                       |
//+-------------------------------------------------------------------------------------------------+
     
   return(0);
  }
//+------------------------------------------------------------------+

Der Code enthält alle notwendigen Kommentare.

Variablen:

gap – level, on which arrows are placed;
TP – Take Profit level;
SL – Stop Loss level;
Lots1 – lot of a main trade;
Lots2 – lot of auxiliary trades;
slippage – level of acceptable requote;
MagicNumber1 – magic number of the main trade;
MagicNumber2 – magic number of auxiliary trades;
Open_Step – step for opening auxiliary trades;


UseTrailing – enabling/disabling T-SL;
TrailingStop – Trailing Stop Loss level;
TrailingStep – Trailing Stop Loss step.

Wenn der Expert Advisor an ein Chart angehangen ist, zeichnet er zwei Pfeile:

Der übrige Pfeil bleibt auf dem Chart bis zur nächsten Kerze:

Sofort nachdem einer der Pfeile gelöscht wurde, öffnet der EA Trades:

Sie sehen, der verbleibende Pfeil ist auf dem Screenshot nicht zu sehen - wie früher geschrieben, wurde er bei der nächsten Kerze gelöscht und Pfeile erscheinen nicht, bis alle Trades geschlossen sind. Sobald der Gewinn des ersten Trades den notwendigen Gewinn erreicht, beginnt der T-SL zu arbeiten (er funktioniert immer für zusätzliche Trades). In diesem Beispiel wurde nur der erste Trade durch den Rollback geschlossen. Zusammen mit diesem werden alle anderen Ordern gelöscht:



Fazit

Abschließend möchte ich hinzufügen, das Trailing Stop Loss Ebene, Take Profit und die Ebene zum Öffnen zusätzlicher Trades für jedes Paar individuell gewählt werden sollte. Außerdem sollte beachtet werden, dass für eine effiziente Verwendung die Ebene zum Öffnen zusätzlicher Trades höher sein muss als die T-SL Ebene. Für den Haupt-Trade ist es empfehlenswert eine höhere Lot-Größe zu verwenden als bei zusätzlichen Trades.