Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1530

 
Andrey Sokolov:

Ясно. Спасибо. Может еще кто-нибудь подскажет?

заодно тоже с Вами по учился

MiddleBuffer 

//+------------------------------------------------------------------+
//|                                                  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);
  }
//+------------------------------------------------------------------+
 
Ребята, кто не занят и может посмотреть. набросал советник по вчерашнему индюку но что-то он не так работает. Вроде он открывает сделки не по сигналам. И пробовал добавлять условия закрытия сделок на обратном сигнале но сделки то закрываются то нет. помогите найти ошибку. Может в условии ошибка?
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);
}
Файлы:
 
PapaYozh:

Только не удивляйтесь, когда перестанет или будет через раз работать.

По какой причине? Чего сразу не пишите что не так?

 
Andrey Sokolov:

По какой причине? Чего сразу не пишите что не так?

Что за наезды?

 
PapaYozh:

Что за наезды?

Ясно.

Может кто-то еще подскажет что там не так, и по какой причине перестанет работать, если действительно что-то не так?

 
Andrey Sokolov:

Ясно.

Может кто-то еще подскажет что там не так, и по какой причине перестанет работать, если действительно что-то не так?

Вот ведь ответ

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

Igor Makanu, 2021.07.05 14:16

потому что индикатор еще не рассчитан

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


секция OnInit() не самое лучшее место, чтобы получать окружение терминала, думаю, что все логично и правильно работает 

 
Alexey Viktorov:
Вот ведь ответ

Спасиб.

Надо чтоб сразу при запуске делал расчеты на истории. Делаю в ините потому что необходимость вот такая.

Добавил паузу в ините, перед расчетами.  Если так, то все-равно какие-то "подводные камни"?

 
Andrey Sokolov:

Надо чтоб сразу при запуске делал расчеты на истории. Делаю в ините потому что необходимость вот такая.

Добавил паузу в ините, перед расчетами.  Если так, то все-равно какие-то "подводные камни"?

Проще и надёжней поставить флаг первого запуска в OnTick()

 
jarikn:
Ребята, кто не занят и может посмотреть. набросал советник по вчерашнему индюку но что-то он не так работает. Вроде он открывает сделки не по сигналам. И пробовал добавлять условия закрытия сделок на обратном сигнале но сделки то закрываются то нет. помогите найти ошибку. Может в условии ошибка?
Скорее всего индикатор рисует...и еще смотри ошибки в журнале
 
Andrey Sokolov:

По какой причине? Чего сразу не пишите что не так?

потому что разработчики написали, что OnInit() предназначен для инициализации, а не для чего то другого

что произойдет не буду гадать, первое, что вижу - вот Вы сделали паузу чтобы получить в OnInit() значения индикатора - что будет если в это время юзер переключит ТФ?

ЗЫ: а как поведет себя Ваш код если запустить эксперт, затем закрыть терминал и опять открыть терминал с уже запущенным советником?