Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 193

 

Ich brauche Hilfe - ich habe Trailing-Stops - 3 Aufträge, aber das Beispiel von Trailing aus Video-Tutorials :) nur für unverknüpfte Aufträge, in meinem Fall sind sie durch Algorithmus verbunden, dh takeprofit wird durch die Summe von drei Aufträgen berechnet, oder ein, wenn ich in einen Trend bekam. Nun, ich habe an etwas gedacht, aber mein Expert Advisor hat nicht begonnen, mehr zu verdienen - es hat begonnen, die gleiche Menge von Aufträgen zu verdienen, aber ich bekomme 2-3 mal weniger Trades im Vergleich zu meinem vorherigen EA ohne Trailing. Mein Schleppen ist also kein Schleppen, sondern ein Unsinn. Kann mir jemand eine Idee geben, wie ich sie auf verknüpfte Aufträge setzen soll? Mir fällt leider nichts anderes ein. Hier ist das Ergebnis meines "Trailing" - es ist in blau dargestellt:

Das Ergebnis für 1 Test ist beigefügt. Gibt es dort einen Trailing-Stop oder nicht? Das verstehe ich nicht. Warum wurde der Gewinn im gleichen Zeitraum nicht erhöht? Nur die Zahl der Geschäfte ging um das 2-3fache zurück?

//+------------------------------------------------------------------+
//|                                     BLACKJACK&HOOKERS TrailX.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  Lots           = 0.01;
extern int     TakeProfit     = 5;
extern int     Step           = 2;

extern int     TrailingStep   = 3;
extern int     TrailingStop   = 1;

extern int     MaPeriod       = 200;
extern int     MaShift        = 1;

extern int     Magic          = 123;
extern int     Slippage       = 5;

int timeprev=0;

extern double price,op,cn,tp;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)
      TakeProfit     *= 10;
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{  if (timeprev == Time[0]) return;
   timeprev = Time[0];
   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1);
   op=CalculateProfit();
   cn=CountTrades();
   tp=TakeProfit;
   if(tp>TakeProfit)
   {
      TakeProfit+=tp;
   }

   
 

 
   if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice)
   {
      if (OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue)<0)
            Print("Не удалось открыть ордер на покупку");
            
   }
   
   if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice)
   {
      if (OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red)<0)
            Print("Не удалось открыть ордер на продажу");
            
   }
   

   
   if(cn==1 && CountBuy()==1)//CountBuy()==1 && 
   {
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на продажу");
      }
   }
   else if(cn==1 && CountSell()==1)//CountSell()==1 && 
   {
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
      }
   }
   
   
   
   if(cn==2 && CountBuy()==1 && CountSell()==1)//CountBuy() + CountSell()==2 && 
   {
      price=FindLastSellPrice();
      if((price-Bid)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   else if(cn==2 && CountSell()==1 && CountBuy()==1)//CountSell() + CountBuy()==2 && 
   {
      price=FindLastBuyPrice();
      if((Ask-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   
   Trailing();

   

   if (op>=tp)
   {
         CloseAll();    
   }
   
   

 
   
   
   
   
   
   
   






}    
//---------------------------------------------------------------------------------------
//   double Equity() //или OrderProfit() - эти идеи в работе и задуманы как автоподбор лота (без мартингейла) для снижения рисков от контрдвижения (интервенций) рынка 
//   {
//      double eqv=0;
//      eqv+=AccountEquity();
//      return(eqv);     
//   }
//---------------------------------------------------------------------------------------
void Trailing()

{
   for (int i=OrdersTotal() -1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
         {
            if (OrderType() == OP_BUY)
            
            {
               price=FindLastBuyPrice();   
               if (Bid - price > (TakeProfit+TrailingStep)*Point)
               {
                  {
                     tp=NormalizeDouble((TakeProfit+TrailingStep)*Point, Digits);
                  }
               }
               if (price - (TakeProfit-TrailingStop)*Point < Bid - (TakeProfit+TrailingStep)*Point)
               {
                  {
                     tp=NormalizeDouble((TakeProfit-TrailingStop)*Point, Digits);
                  }
               }
            }
            
            if (OrderType() == OP_SELL)
            {
               price=FindLastSellPrice();
               if (price - Ask > (TakeProfit+TrailingStep)*Point)
               {  
                  {
                     tp=NormalizeDouble((TakeProfit+TrailingStep)*Point, Digits);
                  }
               }
               if (price - (TakeProfit-TrailingStop)*Point > Ask + (TakeProfit+TrailingStep)*Point)
               {  
                  {
                     tp=NormalizeDouble((TakeProfit-TrailingStop)*Point, Digits);
                  }
               }
            }
         }
      }
   }
}
//---------------------------------------------------------------------------------------
double CalculateProfit()
  {
   double oprofit=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               oprofit+=OrderProfit();
              }
           }
        }
     }
   return(oprofit);
  }
//--------------------------------------------------------------------------------------
void CloseAll()
  {
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  Print("Не удалось закрыть ордер на покупку");
              }
            if(OrderType()==OP_SELL)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  Print("Не удалось закрыть ордер на продажу");
              }
           }
        }
     }
  }
//---------------------------------------------------------------------------------------------------
double FindLastBuyPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//---------------------------------------------------------------------------------------------------
double FindLastSellPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//----------------------------------------------------------------------------------------------
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
            count++;
        }
     }
   return(count);
  }
//----------------------------------------------------------------------------------------------
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+---------------------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
      {  
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               if(OrderType() == OP_BUY || OrderType() == OP_SELL)
                  count++; 
         }
      }
      return(count);
}
//----------------------------------------------------------------------------------+
int FindLastOrderType()
{
      for(int i = OrdersTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            return(OrderType());
         } 
      }
      return(-1);
}
//----------------------------------------------------------------------------------+



Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
geratdc:

Ich brauche Hilfe - ich habe Stop-Flips - 3 Aufträge, aber das Beispiel der Trailing nur für unverbundene Aufträge, in meinem Fall sind sie durch einen Algorithmus verbunden, dh takeprofit basiert auf der Summe der drei Aufträge, oder ein, wenn Sie in einem Trend sind. Nun, ich habe an etwas gedacht, aber mein Expert Advisor hat nicht begonnen, mehr zu verdienen - es hat begonnen, die gleiche Menge an Aufträgen zu verdienen, aber ich bekomme 2-3 mal weniger Trades im Vergleich zu meinem vorherigen EA ohne Trailing. Mein Schleppen ist also kein Schleppen, sondern Blödsinn. Kann mir jemand eine Idee geben, wie ich sie auf verknüpfte Aufträge setzen soll? Mir fällt leider nichts anderes ein, hier ist das Ergebnis meiner "Nacharbeit" - rot hervorgehoben:


Glauben Sie, dass jemand Ihren Code als Gekritzel verstehen wird?
 
Vitaly Muzichenko:
Glauben Sie, dass jemand Ihren gekritzelten Code verstehen wird?

Wie sollte sie angezeigt werden? Nun, ich kann kein Stück Code einfügen, sonst wäre es unklar, was was ist.
 
geratdc:

Wie kann man das zeigen? Nun, ich kann kein Stück Code einfügen, sonst wäre es unklar, was was ist.

Zumindest auf diese Weise:


 
Vitaly Muzichenko:

Zumindest ist es so:



Jemand hat sie umgestaltet. Das ist schon besser, danke.
 


Freunde, ich studiere MQL4 und beschloss , einen EA für Lazy Trader System zu schreiben.
Der EA ist geschrieben, aber es funktioniert nicht richtig. Der Fehler, den ich sehe, ist, dass die Aufträge nicht nach Zeit geschlossen werden. Es kann sein, dass es noch andere Fehler gibt.


Bitte helfen Sie mir, diese Fehler zu finden und geben Sie mir Feedback zu dem Code, den Sie sehen.

Hier sind die Regeln des Systems, für das ich den Expert Advisor geschrieben habe:

1/ Warten Sie zu Beginn der Woche auf den Abschluss der ersten Vier-Stunden-Kerze.
2/ Wir setzen ausstehende Buy Stop- und Sell Stop-Orders 20 Pips über dem Hoch und 20 Pips unter dem Tief dieser Kerze.
3/ Der Stop-Loss sollte auf dem Niveau des entgegengesetzten Auftrags gesetzt werden. Take Profit wird nicht platziert.
4/ Wenn die Order einen Gewinn erreicht, der dem Stop Loss entspricht, übertragen wir den Stop auf Breakeven (wir übertragen den Stop Loss der Position auf ihren Eröffnungskurs).
5/ Die zweite Bestellung nach der Aktivierung der ersten, NICHT ENTFERNEN!
6/ Am Ende der Woche entfernen/ schließen wir alle Aufträge, unabhängig von ihrem Gewinn/Verlust.

Vielen Dank für Ihre Hilfe:)

Ich hänge eine Datei mit EA-Code an

Dateien:
 
ivan-baaton:


Freunde, ich studiere MQL4 und beschloss , einen EA für Lazy Trader System zu schreiben.
Der EA ist geschrieben, aber es funktioniert nicht richtig. Der Fehler, den ich sehe, ist, dass die Aufträge nicht nach Zeit geschlossen werden. Es kann sein, dass es noch andere Fehler gibt.


Bitte helfen Sie mir, diese Fehler zu finden und geben Sie mir Feedback zu dem Code, den Sie sehen.

Hier sind die Regeln des Systems, für das ich den Expert Advisor geschrieben habe:

1/ Warten Sie zu Beginn der Woche auf den Abschluss der ersten Vier-Stunden-Kerze.
2/ Wir setzen ausstehende Buy Stop- und Sell Stop-Orders 20 Pips über dem Hoch und 20 Pips unter dem Tief dieser Kerze.
3/ Der Stop-Loss sollte auf dem Niveau des entgegengesetzten Auftrags gesetzt werden. Take Profit wird nicht platziert.
4/ Wenn die Order einen Gewinn erreicht, der dem Stop Loss entspricht, übertragen wir den Stop auf Breakeven (wir übertragen den Stop Loss der Position auf ihren Eröffnungskurs).
5/ Die zweite Bestellung nach der Aktivierung der ersten, NICHT ENTFERNEN!
6/ Am Ende der Woche entfernen/ schließen wir alle Aufträge, unabhängig von ihrem Gewinn/Verlust.

Danke für Ihre Hilfe:)

Ich füge die Datei mit dem Code des Beraters bei.

TimeHour(TimeCurrent()) == DayTimeClose

Eine solche absolute Gleichheit dürfte sehr selten sein, und wenn Sie die Woche um 23 Uhr abschließen, wäre es besser, die Aufträge etwas früher zu schließen, zumindest für 15 Minuten. Ich habe nicht nach anderen Fehlern gesucht. Auf den ersten Blick scheint er recht genau geschrieben zu sein.

 
Alexey Viktorov:

Diese absolute Gleichheit dürfte sehr selten sein, und wenn Sie die Woche um 23 Uhr abschließen, sollten Sie die Aufträge besser etwas früher schließen, zumindest um 15 Minuten. Ich habe nicht nach anderen Fehlern gesucht. Auf den ersten Blick scheint er recht ordentlich geschrieben zu sein.

Der Wochenschluss ist um 00:00 Uhr, d.h. ich schließe die Aufträge 1 Stunde früher.


Was ist an diesem Code falsch:TimeHour(TimeCurrent()) == DayTimeClose ?


Ich glaube, es gibt irgendwo in diesem Code einen Fehler:


for (int i = OrdersTotal(); i>=0; i--)
{
if (OrderSelect(k, SELECT_BY_POS, MODE_TRADES) == true && TimeHour(TimeCurrent()) == DayTimeClose && DayOfWeek() == 5 && (OrderType() == OP_SELL || OrderType() == OP_SELLSTOP) && OrderMagicNumber() == Magic)
{
ticket_sell = OrderClose(ticket_sell, Lots, Bid, 3, Red);
if (ticket_sell == false)
Print("Verkaufsauftrag nicht geschlossen");
}

}


Dankeschön

 
ivan-baaton:

Der Wochenschluss ist um 00:00 Uhr, d.h. ich schließe die Aufträge 1 Stunde früher.


Was ist an diesem Code falsch:TimeHour(TimeCurrent()) == DayTimeClose ?


Ich glaube, es gibt irgendwo in diesem Code einen Fehler:


for(int i = OrdersTotal(); i>=0; i--)
{
if (OrderSelect(k, SELECT_BY_POS, MODE_TRADES) == true && TimeHour(TimeCurrent()) == DayTimeClose && DayOfWeek() == 5 && (OrderType() == OP_SELL || OrderType() == OP_SELLSTOP) && OrderMagicNumber() == Magic)
{
ticket_sell = OrderClose(ticket_sell, Lots, Bid, 3, Red);
if (ticket_sell == false)
Print("Verkaufsauftrag nicht geschlossen");
}

}


Danke

Das ist genau das, worauf ich hingewiesen habe. Obwohl ich jetzt sehe, dass ich unaufmerksam war. Ich sah nur TimeHour(TimeCurrent()) hervorgehoben. == DayTimeClose.

Aber die Tatsache, dass der Schleifenzähler i ist und die Reihenfolge k ausgewählt ist, habe ich nicht sofort gesehen.

 
Alexey Viktorov:

Das ist genau das, worauf ich hingewiesen habe. Obwohl ich jetzt sehe, dass ich unaufmerksam war. Ich sah nur hervorgehobene TimeHour(TimeCurrent()) == DayTimeClose.

Aber die Tatsache, dass der Schleifenzähler i ist und die Reihenfolge k ausgewählt ist, habe ich nicht sofort gesehen.


Ja, dieses K steht auch in externenVariablen in der oberen Kopfzeile... Vielleicht ist es der Rückgabewert einer Funktion...


Alexey, was können Sie zu meinem Problem sagen? Ich versuche, Trailing-Stops mit umgekehrten Aufträgen zu verbinden. Sind Sie jemals auf ein solches Problem gestoßen?