Про язык программирования MQL5 - страница 4

 
eevviill:

ArraySetAsSeries и там же хороший пример. 

 

В MQL5 индикаторе элементы массивов (time[], open[],high[], low[], close[], tick_volume[], volume[] и spread[]), передаваемые в функцию OnCalculate(), имеют индексацию от начала массива к концу. Вот как это выглядит на примере графика:

Array Not Series

Рис. 6. Индексация элементов массива, если массив не таймсерия 

То есть в массиве, не являющемся таймсерией, самый правый элемент будет иметь максимальный индекс. Это нужно учитывать при математических вычислениях.

 

И ещё: вместо цены или объёма принтуйте значения из массива time[] - так сразу будет понятно. Также по коду - научитесь оформлять индикатор - потому что приведённый Вами огрызок никак не тянет на название индикатора. Ваш код даже MetaEditor по ошибке суёт в эксперты.

 

Вот образец:

//+------------------------------------------------------------------+
//|                                                         Time.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   Print(time[1]);
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Очень странно. Я пытаюсь донести то что мне кажется можно улучшить, но это воспринимается как тролинг или типа я специально ищу ошибки!

Да, ищу, но не для того чтобы насолить а чтобы улучшить.

 

Больше не буду тревожить. Пойду на англ форум. Спасибо за внимание.

Вывод. Сегодня переписывал индикатор с mql4 на mql5. Крайне не удобный для программирования язык. 

 

P.S. Индексировать таймсерии и пользовательские буфера задом наперёд это ошибка 100%. И инициализировать пользовательские буфера 0 тоже.

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

//if(open(1)>0)...

//////////////////////////////
double open(int CC)
{
double open[1]; 
CopyOpen(Symbol(),0,CC,1,open);

return(open[0]);
}
 
eevviill:

Очень странно. Я пытаюсь донести то что мне кажется можно улучшить, но это воспринимается как тролинг или типа я специально ищу ошибки!

Да, ищу, но не для того чтобы насолить а чтобы улучшить.

 

Больше не буду тревожить. Пойду на англ форум. Спасибо за внимание.

Вывод. Сегодня переписывал индикатор с mql4 на mql5. Крайне не удобный для программирования язык. 

 

P.S. Индексировать таймсерии и пользовательские буфера задом наперёд это ошибка 100%. И инициализировать пользовательские буфера 0 тоже.

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

 

 

 

Бан за непонимание ... Надо? 
 

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

Тогда подскажу, что уже больше двух лет в MetaTrader 4 все штатные индикаторы используют формат OnCalculate от MetaTrader 5.

Вот для сравнения два описания:

  • https://docs.mql4.com/ru/basis/function/events#oncalculate
    Чтобы определить направление индексации в массивах time[], open[], high[], low[], close[], tick_volume[], volume[] и spread[], необходимо вызывать функцию ArrayGetAsSeries(). Чтобы не зависеть от умолчаний, необходимо безусловно вызывать функцию ArraySetAsSeries() для тех массивов, с которыми предполагается работать.
  • https://www.mql5.com/ru/docs/basis/function/events
    Чтобы определить направление индексации в массиве price[] (и любом другом), необходимо вызывать функцию ArrayGetAsSeries(). Чтобы не зависеть от умолчаний, необходимо безусловно вызывать функцию ArraySetAsSeries() для тех массивов, с которыми предполагается работать.

То есть, давно уже индикаторы близко совместимы в обоих языках, включая одинаковые направления массивов в вызове OnCalculate(...). Мы специально с выпуском 600 билда максимально свели вместе языки, включая идеологию индикаторов.

Никакого требования менять направление массива нет - используйте любой режим, как вам захочется в обоих платформах. Если вам нравится использовать старый режим перевернутого серийного массива, то просто вызовите ArraySetAsSeries (это очень быстрый вызов, не требующий никаких ресурсов) для массива и работайте. Но лучше использовать прямой метод индексирования - он меньше запутывает.

Не вижу никакого повода, чтобы назвать это ошибкой.

 

eevviill:

Больше не буду тревожить. Пойду на англ форум. Спасибо за внимание.

Наивный... Думаешь там английский Ренат?
 
eevviill:

Вывод. Сегодня переписывал индикатор с mql4 на mql5. Крайне не удобный для программирования язык. 

 

значит так неправильно пишите.

Уже давно можно писать один код для двух платформ, используя макрос __MQL5__, __MQL4__.  И индикаторы и скрипты.

Стремитесь к универсальным алгоритмам для обеих платформ.

MQL5 удобен в равной мере как и MQL4. Просто есть некоторые специфики у каждого.

Причина обращения: