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

 
Vladimir Pastushak:

ZeroMemory (...) initialisiert ein Array vom Typ String mit dem Wert NULL


Guten Tag. Hier ist die Frage. Ich habe einen EA geschrieben, einen Trailing-Stop angehängt, compiled.......... funktioniert nicht: ))))). Ich habe meinen Computer neu gestartet, den Quellcode angepasst und es funktioniert. Begann, es über Eingabeparameter einzustellen, wieder funktioniert es nicht, oder besser gesagt, es änderte sich einmal, und das ist alles.......... Vielleicht ist der Wind fehlerhaft oder ich habe es wieder irgendwo verbockt. Ich füge den Quellcode bei.

//+------------------------------------------------------------------+
//|                                                        test8.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.1;
extern int    TakeProfit      = 100;
extern int    StopLoss        = 50;
extern int    Magic           = 777; 
extern int    Slippage        = 3;

//-------------------------------------------------------------------
extern string TMA             = "Параметры индикатора TMA";
extern string TimeFrame       = "current time frame";
extern int    HalfLength      = 56; 
extern int    Price           = PRICE_CLOSE;
extern double ATRMultiplier   = 2.0;
extern int    ATRPeriod       = 100;
extern bool   Interpolate     = true;
extern int    TrailingStop    = 50; 
extern int    TrailingStep    = 20;
int    timeprev        = 0;
//-------------------------------------------------------------------
double PriceHigh, PriceLow, SL ,TP;
int ticket;


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if (Digits == 3 || Digits == 5);
   {
       TakeProfit   *=10;
       Slippage     *=10;
       TrailingStop *=10;
       TrailingStep *=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];
  
    PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);  
    PriceLow  = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);  
    
    if (CountSell() == 0 && Bid >= PriceHigh)
    {
        ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);  
        if (ticket > 0)
        {
            TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
            SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
            if (OrderSelect(ticket, SELECT_BY_TICKET)) 
                if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0));
                    Print("Ошибк амодификации ордера на продажу!");
        } else Print("Ошибка открытия ордера на продаду!"); 
    }
  

    if (CountBuy() == 0 && Ask <= PriceLow)
    
      {
         ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);  
         if (ticket > 0)
           { 
                SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
                TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
                if (OrderSelect(ticket, SELECT_BY_TICKET)) 
                if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0));
                  Print ("Ошибка модификации ордера на покупку!");
           }      else Print("Ошибка открытия ордера на покупкку!");
      }
     
     Trailing();    
    }
//+------------------------------------------------------------------+
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)
            {
               if (Bid - OrderOpenPrice() > TrailingStop*Point || OrderStopLoss() == 0)
               {
                   if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep)*Point || OrderStopLoss() == 0)
                   {
                      if (!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble (Bid-TrailingStop*Point, Digits), 0, 0))
                         Print ("Ошибка модификации ордера на покупку!");
                   } 
               }
            }
            
            if (OrderType() == OP_SELL)
            {
                if (OrderOpenPrice() - Ask > TrailingStop*Point || OrderStopLoss() == 0)
                {
                    if (OrderStopLoss() > Ask + (TrailingStop+TrailingStep)*Point || OrderStopLoss() == 0)
                    {
                        if (!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble( Ask + TrailingStop*Point, Digits), 0, 0))
                             Print ("Ошибка модификации ордера на родажу!"); 
                    }
                    
                }
            }
         
         }
      }
    }
}
  
//+------------------------------------------------------------------+


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 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);
  }
//-----------------------------------------------------------------------------------------------  
  
       
       
  
 

Guten Tag. Meine Frage lautet wie folgt:Ich habe einen EA geschrieben, einen Trailing-Stop daran angehängt, compiled.......... funktioniert nicht: ))))). Genauer gesagt, funktioniert der Trailing-Stop, aber der vorher vorgeschriebene Gewinn funktioniert nicht, was ist der Grund?

Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
Как самому создать советника или индикатор - Алгоритмический трейдинг, торговые роботы - Справка по MetaTrader 5
  • www.metatrader5.com
Для разработки торговых систем в платформу встроен собственный язык программирования MetaQuotes Language 5 ( MQL5 ), среда разработки MetaEditor и...
 
danil77783:

Guten Tag. Die Frage lautet wie folgt. Ich habe einen EA geschrieben, einen Trailing Stop angehängt, compiled.......... funktioniert nicht: ))))) Ich habe meinen Computer neu gestartet, den Quellcode angepasst und es funktioniert. Begann, es über Eingabeparameter einzustellen, wieder funktioniert es nicht, oder besser gesagt, es änderte sich einmal, und das ist alles.......... Vielleicht ist der Wind fehlerhaft oder ich habe es wieder irgendwo verbockt. Ich füge den Quellcode bei.


 if (timeprev == Time [0])
{
         timeprev = Time [0];
return;

}

 
Vladimir Pastushak:


immer noch keinen Strich durch die Rechnung.... Bitte schauen Sie noch einmal nach.

 
danil77783:

immer noch keinen Strich durch die Rechnung.... Bitte überprüfen Sie das noch einmal.


In der Trailing-Funktion setzen Sie den Take Profit für alle Aufträge auf 0, aber wenn Sie sie öffnen, setzen Sie den richtigen Take Profit.

Bitte lesen Sie die Logik in den Zeilen,

einen Auftrag eröffnen, einen Stop und einen Take setzen

Start Trailing Stop Take 0

Ersetzen Sie 0 in der nachgestellten Reihenfolge durch OrderTakeProfit()

 

Jetzt stellt er kein Bremslicht mehr auf.

 
danil77783:

Jetzt gibt es kein Stopplicht mehr


Zeigen Sie mir den neuen Code.

 
Vladimir Pastushak:

Den neuen Code anzeigen





//+------------------------------------------------------------------+
//|                                                        test8.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.1;
extern int    TakeProfit      = 50;
extern int    StopLoss        = 50;
extern int    Magic           = 777; 
extern int    Slippage        = 3;

//-------------------------------------------------------------------
extern string TMA             = "Параметры индикатора TMA";
extern string TimeFrame       = "current time frame";
extern int    HalfLength      = 56; 
extern int    Price           = PRICE_CLOSE;
extern double ATRMultiplier   = 2.0;
extern int    ATRPeriod       = 100;
extern bool   Interpolate     = true;
extern int    TrailingStop    = 50; 
extern int    TrailingStep    = 20;
int    timeprev        = 0;
//-------------------------------------------------------------------
double PriceHigh, PriceLow, SL ,TP;
int ticket;


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if (Digits == 3 || Digits == 5);
   {
       TakeProfit   *=10;
       Slippage     *=10;
       TrailingStop *=10;
       TrailingStep *=10;
     
       
   }  
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    if (timeprev == Time [0])
    {
         timeprev = Time [0];
         return;
  }
    PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);  
    PriceLow  = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);  
    
    if (CountSell() == 0 && Bid >= PriceHigh)
    {
        ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);  
        if (ticket > 0)
        {
            TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
           
            if (OrderSelect(ticket, SELECT_BY_TICKET)) 
                if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0));
                    Print("Ошибк амодификации ордера на продажу!");
        } else Print("Ошибка открытия ордера на продаду!"); 
    }
  

    if (CountBuy() == 0 && Ask <= PriceLow)
    
      {
         ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);  
         if (ticket > 0)
           { 
               
                TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
                if (OrderSelect(ticket, SELECT_BY_TICKET)) 
                if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0));
                  Print ("Ошибка модификации ордера на покупку!");
           }      else Print("Ошибка открытия ордера на покупкку!");
      }
     
     Trailing();    
    }
//+------------------------------------------------------------------+
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)
            {
               if (Bid - OrderOpenPrice() > TrailingStop*Point || OrderStopLoss() == 0)
               {
                   if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep)*Point || OrderStopLoss() == OrderTakeProfit())
                   {
                      if (!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble (Bid-TrailingStop*Point, Digits), 0, 0))
                         Print ("Ошибка модификации ордера на покупку!");
                   } 
               }
            }
            
            if (OrderType() == OP_SELL)
            {
                if (OrderOpenPrice() - Ask > TrailingStop*Point || OrderStopLoss() == 0)
                {
                    if (OrderStopLoss() > Ask + (TrailingStop+TrailingStep)*Point || OrderStopLoss() == OrderTakeProfit())
                    {
                        if (!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble( Ask + TrailingStop*Point, Digits), 0, 0))
                             Print ("Ошибка модификации ордера на родажу!"); 
                    }
                    
                }
            }
         
         }
      }
    }
}
  
//+------------------------------------------------------------------+


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 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);
  }
//-----------------------------------------------------------------------------------------------  
  
       
       
  
 
danil77783:





Ich habe Ihnen deutlich gesagt, dass Sie im Trailing 0 anstelle von take einsetzen.

Aktivieren Sie diese Option.

//+------------------------------------------------------------------+
//|                                                        test8.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.1;
extern int    TakeProfit      = 100;
extern int    StopLoss        = 50;
extern int    Magic           = 777; 
extern int    Slippage        = 3;

//-------------------------------------------------------------------
extern string TMA             = "Параметры индикатора TMA";
extern string TimeFrame       = "current time frame";
extern int    HalfLength      = 56; 
extern int    Price           = PRICE_CLOSE;
extern double ATRMultiplier   = 2.0;
extern int    ATRPeriod       = 100;
extern bool   Interpolate     = true;
extern int    TrailingStop    = 50; 
extern int    TrailingStep    = 20;
int    timeprev        = 0;
//-------------------------------------------------------------------
double PriceHigh, PriceLow, SL ,TP;
int ticket;


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if (Digits == 3 || Digits == 5);
   {
       TakeProfit   *=10;
       Slippage     *=10;
       TrailingStop *=10;
       TrailingStep *=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];
  
    PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);  
    PriceLow  = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);  
    
    if (CountSell() == 0 && Bid >= PriceHigh)
    {
        ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);  
        if (ticket > 0)
        {
            TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
            SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
            if (OrderSelect(ticket, SELECT_BY_TICKET)) 
                if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0));
                    Print("Ошибк амодификации ордера на продажу!");
        } else Print("Ошибка открытия ордера на продаду!"); 
    }
  

    if (CountBuy() == 0 && Ask <= PriceLow)
    
      {
         ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);  
         if (ticket > 0)
           { 
                SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
                TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
                if (OrderSelect(ticket, SELECT_BY_TICKET)) 
                if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0));
                  Print ("Ошибка модификации ордера на покупку!");
           }      else Print("Ошибка открытия ордера на покупкку!");
      }
     
     Trailing();    
    }
//+------------------------------------------------------------------+
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)
            {
               if (Bid - OrderOpenPrice() > TrailingStop*Point || OrderStopLoss() == 0)
               {
                   if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep)*Point || OrderStopLoss() == 0)
                   {
                      if (!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble (Bid-TrailingStop*Point, Digits),OrderTakeProfit(), 0))  //          --------------------------
                         Print ("Ошибка модификации ордера на покупку!");
                   } 
               }
            }
            
            if (OrderType() == OP_SELL)
            {
                if (OrderOpenPrice() - Ask > TrailingStop*Point || OrderStopLoss() == 0)
                {
                    if (OrderStopLoss() > Ask + (TrailingStop+TrailingStep)*Point || OrderStopLoss() == 0)
                    {
                        if (!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble( Ask + TrailingStop*Point, Digits),OrderTakeProfit(), 0))   //          --------------------------
                             Print ("Ошибка модификации ордера на родажу!"); 
                    }
                    
                }
            }
         
         }
      }
    }
}
  
//+------------------------------------------------------------------+


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 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);
  }
//-----------------------------------------------------------------------------------------------  
 
Hallo.
Bitte helfen Sie mir, den Preis des MA auf dem ersten Balken mit den Preisen des MA auf den vorherigen vier Balken zu vergleichen. Wenn der Preis gestiegen ist und die Differenz größer als N ist, wird der Puffer aufgefüllt. Ich versuche, die
    
    MA_1  = iMA(NULL, 0, ma_period, 0, ma_method,applied_price, i+1);
    MA_2  = iMA(NULL, 0, ma_period, 0, ma_method,applied_price, i+2);
    MA_3  = iMA(NULL, 0, ma_period, 0, ma_method,applied_price, i+3);
    if(MA_1>MA_2)
    {
    double N_=0.005;
    BarCount=4;
    BUL=false;
   for(int il=i+1;il<=BarCount;il++)
     {
      if(iMA(NULL, 0, ma_period, 0, ma_method,applied_price, i)-iMA(NULL, 0, ma_period, 0, ma_method,applied_price, i+il)>=N_ )
      {BUL=true;break;}
     }
     RefreshRates();
      if(BUL)
       {
      BufferUP[i+1]=low[i+1]-distance*MyPoint;
      BUL=false;
    
       }
       }