Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1142

 

Здравствуйте!

Пожалуйста, подскажите, что нужно поправить в коде модуля торговых сигналов, чтобы исключить предупреждение компилятора в той строке, которая выделена желтым цветом.

С уважением, Владимир.

//+------------------------------------------------------------------+
//|                                             BykovTrendSignal.mqh |
//|                             Copyright © 2011,   Nikolay Kositsin | 
//|                              Khabarovsk,   farria@mail.redcom.ru | 
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, Nikolay Kositsin"
#property link      "farria@mail.redcom.ru"
//+------------------------------------------------------------------+
//| Included files                                                   |
//+------------------------------------------------------------------+
#property tester_indicator "BykovTrend.ex5"
#include <Expert\ExpertSignal.mqh>
//--- wizard description start
//+------------------------------------------------------------------+ 
//|  Declaration of constants                                        |
//+------------------------------------------------------------------+ 
#define OPEN_LONG     80  // The constant for returning the buy command to the Expert Advisor
#define OPEN_SHORT    80  // The constant for returning the sell command to the Expert Advisor
#define CLOSE_LONG    40  // The constant for returning the command to close a long position to the Expert Advisor
#define CLOSE_SHORT   40  // The constant for returning the command to close a short position to the Expert Advisor
#define REVERSE_LONG  100 // The constant for returning the command to reverse a long position to the Expert Advisor
#define REVERSE_SHORT 100 // The constant for returning the command to reverse a short position to the Expert Advisor
#define NO_SIGNAL      0  // The constant for returning the absence of a signal to the Expert Advisor
//+----------------------------------------------------------------------+
//| Description of the class                                             |
//| Title=The signals based on BykovTrend indicator                      |
//| Type=SignalAdvanced                                                  |
//| Name=BykovTrend                                                      |
//| Class=CBykovTrendSignal                                              |
//| Page=                                                                |
//| Parameter=BuyPosOpen,bool,true,Permission to buy                     |
//| Parameter=SellPosOpen,bool,true,Permission to sell                   |
//| Parameter=BuyPosClose,bool,true,Permission to exit a long position   |
//| Parameter=SellPosClose,bool,true,Permission to exit a short position |
//| Parameter=Ind_Timeframe,ENUM_TIMEFRAMES,PERIOD_H4,Timeframe          |
//| Parameter=RISK,int,4,Risk level                                      |
//| Parameter=SSP,int,9,SSP                                              |
//| Parameter=SignalBar,uint,1,Bar index for entry signal                |
//+----------------------------------------------------------------------+
//--- wizard description end
//+----------------------------------------------------------------------+
//| CBykovTrendSignal class.                                             |
//| Purpose: Class of generator of trade signals based on                |
//| BykovTrend indicator http://www.mql5.com/en/code/497/.&nbsp;              |
//|            Is derived from the CExpertSignal class.                  |
//+----------------------------------------------------------------------+
class CBykovTrendSignal : public CExpertSignal
  {
protected:
   CiCustom          m_indicator;        // the object for access to BykovTrend values

   //--- adjusted parameters
   bool              m_BuyPosOpen;       // permission to buy
   bool              m_SellPosOpen;      // permission to sell
   bool              m_BuyPosClose;      // permission to exit a long position
   bool              m_SellPosClose;     // permission to exit a short position
   
   ENUM_TIMEFRAMES   m_Ind_Timeframe;    // BykovTrend indicator timeframe
   uint              m_RISK;             // Risk level
   uint              m_SSP;              // SSP
   uint              m_SignalBar;        // bar index for getting entry signal

public:
                     CBykovTrendSignal();

   //--- methods of setting adjustable parameters
   void               BuyPosOpen(bool value)                  { m_BuyPosOpen=value;       }
   void               SellPosOpen(bool value)                 { m_SellPosOpen=value;      }
   void               BuyPosClose(bool value)                 { m_BuyPosClose=value;      }
   void               SellPosClose(bool value)                { m_SellPosClose=value;     }
   void               Ind_Timeframe(ENUM_TIMEFRAMES value)    { m_Ind_Timeframe=value;    }
   void               RISK(uint value)                        { m_RISK=value;             }
   void               SSP(uint value)                         { m_SSP=value;              }
   void               SignalBar(uint value)                   { m_SignalBar=value;        }

   //--- adjustable parameters validation method
   virtual bool      ValidationSettings();
   //--- adjustable parameters validation method
   virtual bool      InitIndicators(CIndicators *indicators); // indicators initialization
   //--- market entry signals generation method
   virtual int       LongCondition();
   virtual int       ShortCondition();

   bool              InitBykovTrend(CIndicators *indicators);   // BykovTrend indicator initializing method
  };
//+------------------------------------------------------------------+
//| CBykovTrendSignal constructor.                                   |
//| INPUT:  no.                                                      |
//| OUTPUT: no.                                                      |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
void CBykovTrendSignal::CBykovTrendSignal()
  {
//--- setting default values
   m_BuyPosOpen=true;

//--- indicator input parameters   
   m_SellPosOpen=true;
   m_BuyPosClose=true;
   m_SellPosClose=true;
   m_Ind_Timeframe=PERIOD_H4;
   m_RISK=4;
   m_SSP=4;
//---  
   m_SignalBar=1;
   m_used_series=USE_SERIES_OPEN+USE_SERIES_HIGH+USE_SERIES_LOW+USE_SERIES_CLOSE;
  }
//+------------------------------------------------------------------+
//| Checking adjustable parameters.                                  |
//| INPUT:  no.                                                      |
//| OUTPUT: true, if the settings are valid, false - if not.         |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CBykovTrendSignal::ValidationSettings()
  {
//--- checking parameters
   if(m_RISK<=0)
     {
      printf(__FUNCTION__+": Risk level must be above zero");
      return(false);
     }
     
   if(m_SSP<=0)
     {
      printf(__FUNCTION__+": SSP must be above zero");
      return(false);
     }

//--- successful completion
   return(true);
  }
//+------------------------------------------------------------------+
//| Initialization of indicators and time series.                    |
//| INPUT:  indicators - pointer to an object-collection             |
//|                      of indicators and time series.              |
//| OUTPUT: true - in case of successful, otherwise - false.         |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CBykovTrendSignal::InitIndicators(CIndicators *indicators)
  {
//--- check of pointer
   if(indicators==NULL) return(false);

//--- indicator initialization 
   if(!InitBykovTrend(indicators)) return(false);

//--- successful completion
   return(true);
  }
//+------------------------------------------------------------------+
//| BykovTrend indicator initialization.                             |
//| INPUT:  indicators - pointer to an object-collection             |
//|                      of indicators and time series.              |
//| OUTPUT: true - in case of successful, otherwise - false.         |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
bool CBykovTrendSignal::InitBykovTrend(CIndicators *indicators)
  {
//--- check of pointer
   if(indicators==NULL) return(false);

//--- adding an object to the collection
   if(!indicators.Add(GetPointer(m_indicator)))
     {
      printf(__FUNCTION__+": error of adding the object");
      return(false);
     }

//--- setting the indicator parameters
   MqlParam parameters[3];
   parameters[0].type=TYPE_STRING;
   parameters[0].string_value="BykovTrend.ex5";
   parameters[1].type=TYPE_INT;
   parameters[1].integer_value=m_RISK;
   parameters[2].type=TYPE_INT;
   parameters[2].integer_value=m_SSP;

//--- object initialization   
   if(!m_indicator.Create(m_symbol.Name(),m_Ind_Timeframe,IND_CUSTOM,3,parameters))
     {
      printf(__FUNCTION__+": object initialization error");
      return(false);
     }
     
//--- number of buffers
   if(!m_indicator.NumBuffers(2)) return(false);
   
//--- BykovTrend indicator initialized successfully
   return(true);
  }
//+------------------------------------------------------------------+
//| Checking conditions for opening                                  |
//| a long position and closing a short one                          |
//| INPUT:  no                                                       |
//| OUTPUT: Vote weight from 0 to 100                                |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
int CBykovTrendSignal::LongCondition()
  {
//--- buy signal is determined by buffer 1 of the BykovTrend indicator
   double Signal=m_indicator.GetData(1,m_SignalBar);

//--- getting a trading signal 
   if(Signal && Signal!=EMPTY_VALUE)
     {
      if(m_BuyPosOpen)
        {
         if(m_SellPosClose) return(REVERSE_SHORT);
         else return(OPEN_LONG);
        }
      else
        {
         if(m_SellPosClose) return(CLOSE_SHORT);
        }
     }

//--- searching for signals for closing a short position
   if(!m_SellPosClose) return(NO_SIGNAL);

   int Bars_=Bars(m_symbol.Name(),m_Ind_Timeframe);

   for(int bar=int(m_SignalBar); bar<Bars_; bar++)
     {
      Signal=m_indicator.GetData(0,bar);
      if(Signal && Signal!=EMPTY_VALUE) return(NO_SIGNAL);

      Signal=m_indicator.GetData(1,bar);
      if(Signal && Signal!=EMPTY_VALUE) return(CLOSE_SHORT);
     }

//--- no trading signal
   return(NO_SIGNAL);
  }
//+------------------------------------------------------------------+
//| Checking conditions for opening                                  |
//| a short position and closing a long one                          |
//| INPUT:  no                                                       |
//| OUTPUT: Vote weight from 0 to 100                                |
//| REMARK: no.                                                      |
//+------------------------------------------------------------------+
int CBykovTrendSignal::ShortCondition()
  {
//--- sell signal is determined by buffer 0 of the BykovTrend indicator
   double Signal=m_indicator.GetData(0,m_SignalBar);
   
//--- getting a trading signal
   if(Signal && Signal!=EMPTY_VALUE)
     {
      if(m_SellPosOpen)
        {
         if(m_BuyPosClose) return(REVERSE_LONG);
         else return(OPEN_SHORT);
        }
      else
        {
         if(m_BuyPosClose) return(CLOSE_LONG);
        }
     }

//--- searching for signals for closing a long position
   if(!m_BuyPosClose) return(NO_SIGNAL);

   int Bars_=Bars(Symbol(),m_Ind_Timeframe);  // ПРЕДУПРЕЖДЕНИЕ В ЭТОЙ СТРОКЕ КОДА: deprecated behavior, hidden method calling will be disabled in a future MQL compiler version
   for(int bar=int(m_SignalBar); bar<Bars_; bar++)
     {
      Signal=m_indicator.GetData(1,bar);
      if(Signal && Signal!=EMPTY_VALUE) return(NO_SIGNAL);

      Signal=m_indicator.GetData(0,bar);
      if(Signal && Signal!=EMPTY_VALUE) return(CLOSE_LONG);
     }

//--- no trading signal   
   return(NO_SIGNAL);
  }
//+------------------------------------------------------------------+
 

Здравствуйте, уважаемые разработчики языка MQL5!

Вы создали для людей не имеющих знаний в области программирования, такой прекрасный инструмент, как Мастер MQL5, способный генерировать советники на базе торговых модулей. На сайте MQL5 есть множество интересных модулей торговых сигналов, которые были написаны несколько лет назад не только специалистами MQL5, но и другими участниками данного форума. Кстати, спасибо Вам всем за Ваш труд! Однако есть маленькое "но", которое постоянно возникает и мешает в полной мере воспользоваться всей мощью Мастера MQL5.

В связи с тем, что идет постоянное развитие языка программирования, прошу Вас создать ветку, в которой были бы отображены все нюансы этих изменений и с описанием необходимых действий в плане исправления кода, например, в модулях торговых сигналов, с целью исключения подобных вопросов:

MrBrooklin:

Здравствуйте!

Пожалуйста, подскажите, что нужно поправить в коде модуля торговых сигналов, чтобы исключить предупреждение компилятора в той строке, которая выделена желтым цветом.

С уважением, Владимир.

Если мое предложение приемлемо, то ветке можно было бы дать название, например, "Ревизия модулей торговых сигналов".

С уважением, Владимир.

 
MrBrooklin:

Здравствуйте!

Пожалуйста, подскажите, что нужно поправить в коде модуля торговых сигналов, чтобы исключить предупреждение компилятора в той строке, которая выделена желтым цветом.

С уважением, Владимир.

А почему Вы в одном месте обращаетесь с объекту "m_symbol"

   int Bars_=Bars(m_symbol.Name(),m_Ind_Timeframe);

а потом вдруг к Symbol():

   int Bars_=Bars(Symbol(),m_Ind_Timeframe);  // ПРЕДУПРЕЖДЕНИЕ В ЭТОЙ СТРОКЕ КОДА: deprecated behavior, hidden method calling will be disabled in a future MQL compiler version


Так делать не нужно. 

А чтобы понят почему вдруг предупреждение о вызове скрытого метода, достаточно поставить мышку на Symbol и нажать среднюю клавишу мышки: Вы увидите, что в есть такой метод

в файле ExpertBase.


Поэтому в модуле сигналов нужно использовать m_symbol.

 
Vladimir Karputov:

А почему Вы в одном месте обращаетесь с объекту "m_symbol"

а потом вдруг к Symbol():

Так делать не нужно.

Спасибо, Владимир, за подсказку!

Всё дело в том, что этот модуль скачан с сайта и просто скомпилирован в MetaEditor. Никаких других действий (например, изменения кода и т.п.) с модулем торговых сигналов не совершалось, а предупреждение выдал сам компилятор.

С уважением, Владимир.

 
MrBrooklin:

Спасибо, Владимир, за подсказку!

Всё дело в том, что этот модуль скачан с сайта и просто скомпилирован в MetaEditor. Никаких других действий (например, изменения кода и т.п.) с модулем торговых сигналов не совершалось, а предупреждение выдал сам компилятор.

С уважением, Владимир.

Скачан где? Вот где скачивали, там и нужно написать в обсуждении кода о замеченной проблеме.

 
Vladimir Karputov:

Скачан где? Вот где скачивали, там и нужно написать в обсуждении кода о замеченной проблеме.

Скачан здесь https://www.mql5.com/ru/articles/358 из папки mysignals.zip.

Хорошо, Владимир, в дальнейшем буду писать именно в том месте, где возникнет проблема с кодом.

С уважением, Владимир.

Простейшие торговые системы с использованием семафорных индикаторов
Простейшие торговые системы с использованием семафорных индикаторов
  • www.mql5.com
Семафорные, или по-другому, сигнальные индикаторы представляют собой простейшие сигнализаторы для входа и выхода из рынка. Если на текущем баре появился сигнал для сделки, то на графике финансового инструмента возникает соответствующий значок, который и может служить в дальнейшем как условие для совершения сделки. Подобных индикаторов очень...
 
MrBrooklin:

Скачан здесь https://www.mql5.com/ru/articles/358 из папки mysignals.zip.

Хорошо, Владимир, в дальнейшем буду писать именно в том месте, где возникнет проблема с кодом.

С уважением, Владимир.

Так статья 2012 года :)

 
Vladimir Karputov:

Так статья 2012 года :)

Да, сразу обратил внимание, но не смотря на это, все-таки решил испытать, как "старые" модули торговых сигналов будут вести себя в настоящее время.

С уважением, Владимир.
 

У меня переключении точки остановки для отладки, точки начали ставиться аж в нескольких строках ниже, перед фигурными скобками

Это у меня проблемы, или это новая "фича"?

 
Roman Sharanov:

У меня переключении точки остановки для отладки, точки начали ставиться аж в нескольких строках ниже, перед фигурными скобками

Это у меня проблемы, или это новая "фича"?

Это у Вас проблема.

  1. Вы пытаетесь в режиме идущего теста добавлять код
  2. Или Ваш блок кода никогда не выполнится, поэтому редактор выбрасывает из него курсор с точкой останова.