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

 
Pineapple88:

Доброго дня!

Пытаюсь разобраться с массивами и возник следующий вопрос.

Для чего в данном примере использовать ArraySetAsSeries  и устанавливать флаг true, если в CopyRates отсчет ведется от настоящего к прошлому?

Я так понимаю что функция ArraySetAsSeries  необходима для перебора массива от настоящего к прошлому. 

Хочу понять цель данной функции в этом примере.

После 

ArraySetAsSeries(rates,true); 

rates[0] будет соответствовать САМОМУ ПРАВОМУ БАРУ на графике. Это самое простое объяснение, без запутывающих терминов "настоящее" и "будущее".

 
Vladimir Karputov:

После 

rates[0] будет соответствовать САМОМУ ПРАВОМУ БАРУ на графике. Это самое простое объяснение, без запутывающих терминов "настоящее" и "будущее".

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

Но если мы не будем использовать ArraySetAsSeries , то CopyRates также присвоит rates[0] самому правому бару на графике.

Просто пытаюсь понять зачем функция ArraySetAsSeries если без нее все работает также?

Или это просто принятая форма написания кода?     

 
Pineapple88:

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

Но если мы не будем использовать ArraySetAsSeries , то CopyRates также присвоит rates[0] самому правому бару на графике.

Просто пытаюсь понять зачем функция ArraySetAsSeries если без нее все работает также?

Или это просто принятая форма написания кода?     

вы ошибаетесь, CopyRates присвои rate[0] самое старое значение, обусловленное размером массива rate[].
https://www.mql5.com/ru/docs/series/copyrates
 
Anatolii Zainchkovskii:
вы ошибаетесь, CopyRates присвои rate[0] самое старое значение, обусловленное размером массива rate[].

Спасибо!

Теперь понял, был не прав)

 

Доброго дня!

Еще раз прошу помощи!

Написал код условие которого выдать принт "buy" когда MA(20) пересечет снизу вверх MA(50)

input int SmallMovingAverage = 20;
input int BigMovingAverage   = 50;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   string signal = "";

   double SmallMovingAverageArray[], BigMovingAverageArray[];

   int SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   int BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

   CopyBuffer(SmallMovingAverageDefinition,0,0,3,SmallMovingAverageArray);
   CopyBuffer(BigMovingAverageDefinition,0,0,3,BigMovingAverageArray);

   if(BigMovingAverageArray[1] < SmallMovingAverageArray[1])
   if(BigMovingAverageArray[2] > SmallMovingAverageArray[2])
        {
         Print("buy");
        }
  }

А по факту выполнение происходит вот так

Файлы:
n2b3h1.png  140 kb
 
Pineapple88:

Доброго дня!

Еще раз прошу помощи!

Написал код условие которого выдать принт "buy" когда MA(20) пересечет снизу вверх MA(50)

А по факту выполнение происходит вот так

Грубейшая ошибка: Вы на каждом тике создаёте по два хендла индикатора. Правильно делать так: блок

   int SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   int BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

переместить в OnInit, добавить проверку корректности хендла.


Также массивам, которые принимают значения от IMA необходимо сделать    

ArraySetAsSeries(SmallMovingAverageArray,true);  
ArraySetAsSeries(BigMovingAverage,true)
Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает усталости, сомнений и страха,  ему не ведомы психологические проблемы. Достаточно четко формализовать торговые правила и реализовать их в виде алгоритмов, и робот готов неустанно трудиться. Но прежде...
 

Огромное спасибо за оперативный ответ!

Насчет  ArraySetAsSeries  понятно.

Буду разбираться как перенести индикатор в OnInit, и проверить хендл.

***

 
Pineapple88:

Огромное спасибо за оперативный ответ!

Насчет  ArraySetAsSeries  понятно.

Буду разбираться как перенести индикатор в OnInit, и проверить хендл.

***

Всё есть изначально

  • в документации: iMA
  • в редакторе MetaEditor - советник [data folder]MQL5\Experts\Examples\Moving Average\Moving Average.mq5
Документация по MQL5: Технические индикаторы / iMA
Документация по MQL5: Технические индикаторы / iMA
  • www.mql5.com
//|                                                     Demo_iMA.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Перечисление способов создания хэндла                            |  Creation             type=Call_iMA;                ...
 
Vladimir Karputov:

Всё есть изначально

  • в документации: iMA
  • в редакторе MetaEditor - советник [data folder]MQL5\Experts\Examples\Moving Average\Moving Average.mq5

Спасибо, буду изучать

 

Исправил, вроде все работает!)

Перенес два индикатора МА в функцию OnInit

Я так понимаю мы в функции OnInit создаем только хендл индикатора, а все остальные манипуляции с массивами заносим в функцию OnTick и проверяем на каждом тике?

int SmallMovingAverageDefinition = 0;
int BigMovingAverageDefinition   = 0;
input int SmallMovingAverage = 20;
input int BigMovingAverage   = 50;


int OnInit()
  {
//---
   SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

   if(SmallMovingAverageDefinition==INVALID_HANDLE  || BigMovingAverageDefinition==INVALID_HANDLE)
     {
      Print("Ошибка создания хендла");
     }
//---
   return(INIT_SUCCEEDED);
  }


void OnDeinit(const int reason)
  {
//---

  }


void OnTick()
  {

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   string signal = "";

   double SmallMovingAverageArray[], BigMovingAverageArray[];

   ArraySetAsSeries(SmallMovingAverageArray,true);
   ArraySetAsSeries(BigMovingAverageArray, true);

   CopyBuffer(SmallMovingAverageDefinition,0,0,3,SmallMovingAverageArray);
   CopyBuffer(BigMovingAverageDefinition,0,0,3,BigMovingAverageArray);

   if(SmallMovingAverageArray[1] > BigMovingAverageArray[1])
      if(SmallMovingAverageArray[2] < BigMovingAverageArray[2])
        {
         Print("buy");
        }
  }
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
Причина обращения: