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

 

Здравствуйте! 2017.07.07_15:55 GMT+3. Я не пойму. Вроде бы и сигнал должен быть, а в тестере стратегий его нет. Чем тогда Ваш хвалёный МТ5 тестер отличается от тестера МТ4? Я написал почти как в стандартном Moving Average.mq5 . А на демо счёте мне всё таки удалось проверить советник. Он открывал сделку, но закрыть пришлось самому. Закрытие я подправил. Но написал что-то ещё, -- советник опять перестал открывать сделки. А ноль ошибок и ноль предупреждений -- это ещё не показатель рабочего состояния советника. Вот тут я застрял. Откуда я знаю что там написано где такое, что советник не работает. Опять тревожить Карпутова. Если бы мне выдали весь список запретов, я бы и сам справился. Выкладываю файлы, хотя и не все. 16:06 GMT+3.

 

Прошу помощи!

Для получения начения индикатора в MQL4 достаточно функции простой

double CMAf(int index)
  {
   return NormalizeDouble(iMA(Symbol(),0,period_CMA,0,0,0,index),Digits);
  }
Как получить аналог для MQL5?
 
-Aleks-:

Прошу помощи!

Для получения начения индикатора в MQL4 достаточно функции простой

Как получить аналог для MQL5?

Справку iMA смотрели?

Шаг первый: в "шапке" объявляем переменную для хранения хендла индикатора iMA:

Шаг второй: в OnInit() создаём хендл индикатора.

//+------------------------------------------------------------------+
//|                                                       iMAGet.mq5 |
//|                              Copyright © 2017, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//--- input parameters
input int                  ma_period=10;                 // period of ma 
input int                  ma_shift=0;                   // shift 
input ENUM_MA_METHOD       ma_method=MODE_SMA;           // type of smoothing 
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE;    // type of price 
input ENUM_TIMEFRAMES      period=PERIOD_CURRENT;        // timeframe 
//---
int                        handle_iMA;                   // variable for storing the handle of the iMA indicator 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create handle of the indicator iMA
   handle_iMA=iMA(Symbol(),period,ma_period,ma_shift,ma_method,applied_price);
//--- if the handle is not created 
   if(handle_iMA==INVALID_HANDLE)
     {
      //--- tell about the failure and output the error code 
      PrintFormat("Failed to create handle of the iMA indicator for the symbol %s/%s, error code %d",
                  Symbol(),
                  EnumToString(Period()),
                  GetLastError());
      //--- the indicator is stopped early 
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double ma_0=iMAGet(0);
   double ma_1=iMAGet(1);

   Comment("MA #0: ",DoubleToString(ma_0,Digits()+1),"\n",
           "MA #1: ",DoubleToString(ma_1,Digits()+1));
  }
//+------------------------------------------------------------------+
//| Get value of buffers for the iMA                                 |
//+------------------------------------------------------------------+
double iMAGet(const int index)
  {
   double MA[1];
//--- reset error code 
   ResetLastError();
//--- fill a part of the iMABuffer array with values from the indicator buffer that has 0 index 
   if(CopyBuffer(handle_iMA,0,index,1,MA)<0)
     {
      //--- if the copying fails, tell the error code 
      PrintFormat("Failed to copy data from the iMA indicator, error code %d",GetLastError());
      //--- quit with zero result - it means that the indicator is considered as not calculated 
      return(0.0);
     }
   return(MA[0]);
  }
//+------------------------------------------------------------------+


И результат (перекрестие на скриншоте установлено на бар #1):

iMAGet

Файлы:
iMAGet.mq5  7 kb
 
Vladimir Karputov:

Справку iMA смотрели?

Шаг первый: в "шапке" объявляем переменную для хранения хендла индикатора iMA:

Шаг второй: в OnInit() создаём хендл индикатора.

И результат (перекрестие на скриншоте установлено на бар #1):

 

Спасибо за ответ.

В MQL4 всё объявляется в функции - таким образом существует набор функций, которые активируются в зависимости от настроек советника. Если я не ошибаюсь, то в Вашем случае память будет выделена под десятки разных индикаторов, которые допускает использовать ТС, что не рационально, или память не будет выделена?

 

Можно ли вызвать функцию класса не имея конкретного объекта этого класса? Чтобы было что-то вроде такого:

class test
  {
public:
                     test(void);
                    ~test(void);
  public: void PrintInfo (){Print ("Class test");}
  };
//---
void OnStart()
  {
      test.PrintInfo() ;
  }

Или обязательно создавать объект? Даже если эта функция относится скорее к определению самого класса, нежели к его экземпляру.

[Удален]  

Если функции не нужен доступ к переменным класса сделайте её статической.

class test
{
public:
   test();
   ~test();

   static void PrintInfo()
   {
      Print( "Class test" );
   }
};

void OnStart()
{
   test::PrintInfo();
}
 
Koldun Zloy:

Если функции не нужен доступ к переменным класса сделайте её статической.

Спасибо, то что нужно.
 

Получаю ошибки - что не так? В MQL4 работает...


   double arrFibo[17]=
     {
      0,
      0.236,
      0.382,
      0.5,
      0.618,
      0.764,
      1,
      1.236,
      1.382,
      1.5,
      1.618,
      2.0,
      2.236,
      2.382,
      2.5,
      2.618,
      2.764,
      3        //Всего уровней 17 + 0
     };
'{' - too many initializers TZ_Sky_and_Ground_V_04.mq5 2484 6
 
-Aleks-:

Получаю ошибки - что не так? В MQL4 работает...


'{' - too many initializers TZ_Sky_and_Ground_V_04.mq5 2484 6

 

Надо ставить arrFibo[18] - мол 18 элементов.
 
Vladimir Karputov:

Справку iMA смотрели?

Шаг первый: в "шапке" объявляем переменную для хранения хендла индикатора iMA:

Шаг второй: в OnInit() создаём хендл индикатора.

И результат (перекрестие на скриншоте установлено на бар #1):

 

Ещё такой вопрос, если у меня индикатор в цикле перебирается, то мне надо так же ставить double MA[1]; или больший размер массива лучше сразу запросить/получить? Я просто вообще не понимаю, зачем эти сложности нужны - в чем там преимущество по сравнению с MQL4.