Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 276

 
Vladimir Pastushak:

ZeroMemory (...) initialise un tableau de type chaîne de caractères avec la valeur NULL


Bon après-midi. Voici la question. J'ai écrit un EA, j'y ai attaché un trailing stop, compilé.......... ne fonctionne pas : ))))). J'ai redémarré mon ordinateur, modifié le code source, ça marche. J'ai commencé à l'ajuster via les paramètres d'entrée, là encore ça ne marche pas, ou plutôt ça a changé une fois, et c'est tout........... Peut-être que le vent est défaillant ou que je me suis encore trompé quelque part. Je joins le code source.

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

Bon après-midi. Ma question est la suivante :j'ai écrit un EA, j'y ai attaché un trailing stop, compilé.......... ne fonctionne pas : ))))). Plus précisément le trailing stop fonctionne, mais le profit précédemment prescrit ne fonctionne pas, quelle est la raison ?

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

Bon après-midi. La question est la suivante. J'ai écrit un EA, j'y ai attaché un trailing stop, compilé.......... ne fonctionne pas :))))) J'ai redémarré mon ordinateur, modifié le code source, ça marche. J'ai commencé à l'ajuster via les paramètres d'entrée, là encore ça ne marche pas, ou plutôt ça a changé une fois, et c'est tout........... Peut-être que le vent est défaillant ou que je me suis encore trompé quelque part. Je joins le code source.


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

}

 
Vladimir Pastushak:


n'a toujours pas mis en place un tickprofit.... Veuillez regarder à nouveau.

 
danil77783:

n'a toujours pas mis en place un tickprofit.... Veuillez vérifier à nouveau.


Dans la fonction de suivi, vous définissez le take profit 0 pour tous les ordres, mais lorsque vous l'ouvrez, vous définissez le bon take profit.

Veuillez lire la logique ligne par ligne,

ouvrir un ordre, fixer un stop et un take

start trailing stop take 0

remplacer 0 dans l'ordre de fin par OrderTakeProfit()

 

Maintenant il ne met pas un feu rouge

 
danil77783:

Maintenant, il ne met pas un feu rouge


Montrez-moi le nouveau code.

 
Vladimir Pastushak:

Montrer le nouveau code





//+------------------------------------------------------------------+
//|                                                        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:





Je t'ai dit clairement que dans le suivi tu as mis 0 au lieu de prendre.

Cochez cette 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);
  }
//-----------------------------------------------------------------------------------------------  
 
Bonjour.
Veuillez m'aider à comparer le prix de la MA sur la première barre avec les prix de la MA sur les quatre barres précédentes. Si le prix a augmenté et que la différence est supérieure à N, remplissez le tampon. J'essaie de
    
    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;
    
       }
       }

Raison: