Verfeinerung der Strategie des Beraters - Seite 5

 
https://www.mql5.com/ru/code/7108 Hier gibt es auch interessantes Material über Schleppnetze
 

3. die standardmäßige "Schritt"-Anhängigkeit.

void TrailingStairs(int ticket,int trldistance,int trlstep)

Diese Art des Nachlaufs ist eine Abwandlung des Standardnachlaufs. Wenn ich mich nicht irre, wurde einmal ein ähnliches Modell vonKimIV erstellt (aber weil relativ schöner ist... :) Es unterscheidet sich vom Standard-Trailing, indem der Trailing-Stop-Loss nicht nach Punkten übertragen wird (z.B. Trailing-Stop-Loss bei einem Abstand von 30 Punkten bei +31, bei +32 - bei +2, usw.).Zum Beispiel, Trailing bei einem Abstand von 40 Pips und der Stoploss-Abstand von 10 Pips, wenn wir +40 erreichen, wird Stoploss auf +10 Pips verschoben und nichts wird sich ändern, bis wir +50 Gewinn (40 Pips + Schritt) erreichen (d.h. wir geben dem Preis eine gewisse Freiheit, was der Sinn dieses Algorithmus ist), und nur bei +50 wird Stoploss von +10 auf +20 Pips verschoben, bei +60 wird Stoploss auf +30 Pips verschoben und so weiter.

Parameter:
ticket -
die eindeutige Auftragsnummer (die vor dem Aufruf der Funktion mitOrderSelect()) gewählt wird;
trldistance - der Abstand vom aktuellen Kurs (Punkte), in dem wir "trawlen" (nicht weniger als MarketInfo(Symbol(),MODE_STOPLEVEL));
trlstep - der "Schritt" der Änderung des Stop Loss (Punkte) (nicht weniger als 1).

Isttrlstep=1, unterscheidet sich diese Funktion nicht von der Standard-Trailing-Stop-Funktion. Das Hauptmerkmal dieses Algorithmus besteht wiederum darin, dass er dem Kurs eine gewisse "Bewegungsfreiheit" einräumt - der Stop Loss wird erst dann angehoben, wenn der Kurs "umhergewandert" ist. Dieser Nachlaufalgorithmus ist mir zum ersten Mal bei der Beschreibung der Taktikregeln für "Moving Channels" begegnet, die bereits von V. Barishpolts erwähnt wurden.

=================

Dieser Punkt im Expert Advisor ist interessant

 
//+------------------------------------------------------------------+
//| ТРЕЙЛИНГ СТАНДАРТНЫЙ-СТУПЕНЧАСТЫЙ                                |
//| Функции передаётся тикет позиции, расстояние от курса открытия,  |
//| на котором трейлинг запускается (пунктов) и "шаг", с которым он  |
//| переносится (пунктов)                                            |
//| Пример: при +30 стоп на +10, при +40 - стоп на +20 и т.д.        |
//+------------------------------------------------------------------+
 
void TrailingStairs(int ticket,int trldistance,int trlstep)
   { 
   
   double nextstair; // ближайшее значение курса, при котором будем менять стоплосс
 
   // проверяем переданные значения
   if ((trldistance<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trlstep<1) || (trldistance<trlstep) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)))
      {
      Print("Трейлинг функцией TrailingStairs() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
      } 
   
   // если длинная позиция (OP_BUY)
   if (OrderType()==OP_BUY)
      {
      // расчитываем, при каком значении курса следует скорректировать стоплосс
      // если стоплосс ниже открытия или равен 0 (не выставлен), то ближайший уровень = курс открытия + trldistance + спрэд
      if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()))
      nextstair = OrderOpenPrice() + trldistance*Point;
         
      // иначе ближайший уровень = текущий стоплосс + trldistance + trlstep + спрэд
      else
      nextstair = OrderStopLoss() + trldistance*Point;
 
      // если текущий курс (Bid) >= nextstair и новый стоплосс точно лучше текущего, корректируем последний
      if (Bid>=nextstair)
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()) && (OrderOpenPrice() + trlstep*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)) 
            {
            if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
            }
         }
      else
         {
         if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      }
      
   // если короткая позиция (OP_SELL)
   if (OrderType()==OP_SELL)
      { 
      // расчитываем, при каком значении курса следует скорректировать стоплосс
      // если стоплосс ниже открытия или равен 0 (не выставлен), то ближайший уровень = курс открытия + trldistance + спрэд
      if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()))
      nextstair = OrderOpenPrice() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
      
      // иначе ближайший уровень = текущий стоплосс + trldistance + trlstep + спрэд
      else
      nextstair = OrderStopLoss() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
       
      // если текущий курс (Аск) >= nextstair и новый стоплосс точно лучше текущего, корректируем последний
      if (Ask<=nextstair)
         {
         if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()) && (OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
            {
            if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
            }
         }
      else
         {
         if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()- (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
         Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
         }
      }      
   }

Hier ist der vollständige Code, der anstelle von einzufügen ist

//+------------------------------------------------------------------+
void TrailingStairs(int ticket,int trldistance)
   {
    int Spred=Ask - Bid;
    if (OrderType()==OP_BUY)
      {
       if((Bid-OrderOpenPrice())>(Point*trldistance))
         {
          if(OrderStopLoss()<Bid-Point*trldistance || (OrderStopLoss()==0))
            {
             OrderModify(ticket,OrderOpenPrice(),Bid-Point*trldistance,OrderTakeProfit(),0,Green);
             if (PolLots)
             if (NormalizeDouble(OrderLots()/2,2)>MarketInfo(Symbol(), MODE_MINLOT))
               {
               OrderClose(ticket,NormalizeDouble(OrderLots()/2,2),Ask,3,Green);
               }
             else
               {
               OrderClose(ticket,OrderLots(),Ask,3,Green);
               }
            }
         }
       }
     else
       {
        if((OrderOpenPrice()-Ask)>(Point*trldistance))
          {
           if((OrderStopLoss()>(Ask+Point*trldistance)) || (OrderStopLoss()==0))
             {
              OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*trldistance,OrderTakeProfit(),0,Red);
             if (PolLots)
             if (NormalizeDouble(OrderLots()/2,2)>MarketInfo(Symbol(), MODE_MINLOT))
               {
               OrderClose(ticket,NormalizeDouble(OrderLots()/2,2),Bid,3,Green);
               }
             else
               {
               OrderClose(ticket,OrderLots(),Bid,3,Green);
               }
             }
          }
        }
    }


diese

 

Ich empfehle, einen EA, der Ihnen gefällt, zu modifizieren, anstatt ihn in Ihren eigenen einzufügen - das Ergebnis wird fast dasselbe sein, aber es wird weniger Ärger geben.

Außerdem wird die Fähigkeit, den Code eines anderen zu lesen und zu verstehen, sehr nützlich sein...

 
ktest0:

Ich empfehle, einen EA, der Ihnen gefällt, zu modifizieren, anstatt ihn in Ihren eigenen einzufügen - das Ergebnis wird fast dasselbe sein, aber es wird weniger Ärger geben.

Außerdem wird die Fähigkeit, den Code eines anderen zu lesen und zu verstehen, sehr nützlich sein...

Solange er haben will, kann er nicht haben!
 
borilunad:
Solange er haben will, kann er nicht haben!

))) Das ist der Punkt, an dem jeder anfängt... Und dann - je weiter man in den Wald vordringt, desto dicker werden die Partisanen...
 

Können Sie mir bitte sagen, wie man einen Code in einen EA schreibt,
Welches wäre das Hoch und Tief für einen bestimmten Zeitraum (z.B. 10.45 - 11.15 Uhr)?

Ich habe den EA um 9.00 Uhr eingeschaltet -> als es 10.45 Uhr war, schaltete er sich ein und begann mit der Überwachung. Wenn ein Balken um 11.15 Uhr geschlossen wurde (z.B. 15-Minuten-Chart), liest er und überwacht weiter, z.B. habe ich High und Low identifiziert und Orders nicht zu weit von diesen Linien entfernt platziert.

Ich danke Ihnen im Voraus für Ihr Feedback.

 
Nun, Sie können den Stadtrat....
 

Ich kann nicht herausfinden, nach welchem Prinzip die Verbindung hergestellt wird.

Es sollte eigentlich nur funktionieren

 
IRIP:

Ich kann nicht herausfinden, nach welchem Prinzip die Verbindung hergestellt wird.

Schließlich soll es ja auch einfach funktionieren.


Nichts und niemand wird "einfach funktionieren".

Sie müssen verstehen, wonach dieser spezielle Pfad sucht, unter welchen Bedingungen er durchsucht wird, mit welchem Schritt, ob es zusätzliche Bedingungen gibt.

Nimmt man den Schleppnetzcode auseinander, wird alles klar, aber das Prinzip "plug and play" führt nicht zu einem guten Ergebnis ....