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

 
Andrey Sokolov:

Je vois. Merci. Quelqu'un d'autre a des conseils ?

J'ai appris avec toi, aussi.

Tampon central

//+------------------------------------------------------------------+
//|                                                  Demo_iBands.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//--- входные параметры
input int                  bands_period=20;           // период скользящей средней
input int                  bands_shift=0;             // сдвиг
input double               deviation=2.0;             // кол-во стандартных отклонений
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // тип цены
//--- переменная для хранения хэндла индикатора iBands
int    handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- создадим хэндл индикатора
   handle=iBands(_Symbol,_Period,bands_period,bands_shift,deviation,applied_price);
//--- если не удалось создать хэндл
   if(handle==INVALID_HANDLE)
     {
      //--- сообщим о неудаче и выведем номер ошибки
      PrintFormat("Не удалось создать хэндл индикатора iBands для пары %s/%s, код ошибки %d",
                  _Symbol,
                  EnumToString(_Period),
                  GetLastError());
      //--- работа индикатора завершается досрочно
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(handle!=INVALID_HANDLE)
      IndicatorRelease(handle);
//--- почистим график при удалении индикатора
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- индикаторные буферы
   double         UpperBuffer[];
   double         LowerBuffer[];
   double         MiddleBuffer[];
//--- количество копируемых значений из индикатора iBands
   int values_to_copy=2;
//--- если FillArraysFromBuffer вернула false, значит данные не готовы - завершаем работу
   if(!FillArraysFromBuffers(MiddleBuffer,UpperBuffer,LowerBuffer,bands_shift,handle,values_to_copy))
      return;
//--- сформируем сообщение
   Print("MiddleBuffer =",MiddleBuffer[0], "UpperBuffer =",UpperBuffer[0], "LowerBuffer =",LowerBuffer[0], "values_to_copy =",values_to_copy);
  }
//+------------------------------------------------------------------+
//| Заполняем индикаторные буферы из индикатора iBands               |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &base_values[],     // индикаторный буфер средней линии Bollinger Bands
                           double &upper_values[],    // индикаторный буфер верхней границы
                           double &lower_values[],    // индикаторный буфер нижней границы
                           int shift,                 // смещение
                           int ind_handle,            // хэндл индикатора iBands
                           int amount                 // количество копируемых значений
                          )
  {
//--- сбросим код ошибки
   ResetLastError();
//--- заполняем часть массива MiddleBuffer значениями из индикаторного буфера под индексом 0
   if(CopyBuffer(ind_handle,0,-shift,amount,base_values)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- заполняем часть массива UpperBuffer значениями из индикаторного буфера под индексом 1
   if(CopyBuffer(ind_handle,1,-shift,amount,upper_values)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- заполняем часть массива LowerBuffer значениями из индикаторного буфера под индексом 2
   if(CopyBuffer(ind_handle,2,-shift,amount,lower_values)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- все получилось
   return(true);
  }
//+------------------------------------------------------------------+
 
Les gars, qui n'est pas occupé et peut regarder. esquissé un EA sur l'indicateur d'hier, mais quelque chose ne fonctionne pas bien. Il semble ouvrir des transactions qui ne sont pas basées sur des signaux. J'ai essayé d'ajouter des ordres de fermeture sur le signal opposé mais les transactions sont fermées puis non. Je ne sais pas s'il y a une erreur dans la condition.
input int Magic = 000;
input double Lots = 0.1;
input int TakeProfit = 100;
input int StopLoss = 50;
input int Slippage = 5;

double vverh,vnuz,SL,TP;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  /* if (Digits == 3 || Digits == 5)
   {
      TakeProfit *=10;
      StopLoss *=10;
      Slippage *=10;
   }*/
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
           
     
      vverh = iCustom(NULL,0,"777",0,1); // стрелка вверх
      vnuz = iCustom(NULL,0,"777",1,1); // стрелка вниз
      
     //-----------------------------------------------------------
     if (CountSell() == 0 && vnuz >0)
      {
      tiket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0, Red);
      if (tiket>0)
         {
         SL=NormalizeDouble(Bid+StopLoss*Point,Digits);
         TP=NormalizeDouble(Bid-TakeProfit*Point,Digits);
         if (OrderSelect(tiket, SELECT_BY_TICKET))
            if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
               Print("Ошибка модификации ордера на продажу");
         } else Print("Ошибка открытия ордера на продажу");
      }
      
      ////////////////////////////////////////////////////////////////
    if (CountBuy() == 0 && vverh >0)
      {
      tiket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue);
      if (tiket>0)
         {
         TP=NormalizeDouble(Ask+TakeProfit*Point,Digits);
         SL=NormalizeDouble(Ask-StopLoss*Point,Digits);
         if (OrderSelect(tiket, SELECT_BY_TICKET))
           if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
           Print("Ошибка модификации ордера на покупку");
         } else 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);
}
Dossiers :
 
PapaYozh:

Ne soyez pas surpris lorsqu'il cesse de fonctionnerou fonctionnepar intermittence.

Pour quelle raison ? Pourquoi n'écrivez-vous pas ce qui ne va pas ?

 
Andrey Sokolov:

Pour quelle raison ? Pourquoi ne dites-vous pas ce qui ne va pas ?

C'est quoi ce harcèlement ?

 
PapaYozh:

C'est quoi ce délit de fuite ?

Je vois.

Quelqu'un d'autre peut-il me dire ce qui ne va pas ici, et pour quelle raison il s'arrêtera de fonctionner s'il y a vraiment un problème ?

 
Andrey Sokolov:

Je vois.

Peut-être que quelqu'un d'autre peut me dire ce qui ne va pas ici, et quelle est la raison pour laquelle il s'arrête de fonctionner s'il y a vraiment un problème ?

Voici la réponse

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Toutes questions des débutants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes.

Igor Makanu, 2021.07.05 14:16.

car l'indicateur n'est pas encore calculé.

https://www.mql5.com/ru/docs/series/barscalculated


la section OnInit() n'est pas le meilleur endroit pour obtenir l'environnement du terminal, je pense que cela fonctionne logiquement et correctement

 
Alexey Viktorov:
Voici la réponse.

Merci.

J'ai besoin qu'il effectue les calculs de l'historique immédiatement au démarrage. Je le fais dans l'inite parce que j'en ai besoin comme ça.

J'ai ajouté une pause dans l'init, avant les calculs. Si c'est le cas, y a-t-il encore des écueils ?

 
Andrey Sokolov:

Il est nécessaire de faire des calculs sur l'historique au démarrage. Je le fais dans l'inite parce que j'en ai besoin comme ça.

J'ai ajouté une pause dans l'inite, avant les calculs. Si c'est le cas, il y a encore des pièges ?

Il est plus facile et plus fiable de mettre le premier drapeau de démarrage dans OnTick()

 
jarikn:
Les gars, qui n'est pas occupé et peut regarder. esquissé un EA sur l'indicateur d'hier, mais quelque chose ne fonctionne pas bien. Il semble ouvrir des transactions qui ne sont pas basées sur des signaux. J'ai essayé d'ajouter des ordres de fermeture sur le signal opposé mais les transactions sont fermées puis non. Je crois que ça me manque.
Très probablement, l'indicateur tire ... et cherche des erreurs dans le journal
 
Andrey Sokolov:

Pour quelle raison ? Pourquoi n'écrivez-vous pas ce qui ne va pas ?

Parce que les développeurs ont écrit que OnInit() est destiné à l'initialisation, pas à autre chose

Que se passera-t-il - vous avez fait une pause pour obtenir les valeurs des indicateurs dans OnInit() - que se passera-t-il si l'utilisateur change de TF en même temps ?

SZZY : Et comment se comporterait votre code si vous exécutez une EA, puis fermez le terminal et rouvrez le terminal avec une EA en cours d'exécution ?