Обсуждение статьи "Как написать индикатор в MQL5" - страница 5

 
okwh #:

for(int i=1;i<rates_total;i++)
{
MTMBuffer[i]=price[i]-price[i-1];
AbsMTMBuffer[i]=fabs(MTMBuffer[i]);
}

Зачем использовать [i-1] для вычисления [i] и начинать i=1 ? нет [0] ?

MTMBuffer[i]=price[i]-price[i-1];


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

В общем случае, если вы используете одну из родных функций индикатора mql5, которая начинается с "i", то вам не нужно обращать внимание на маршрут. Копировальный буфер сделает это за вас.

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


Посмотрите на код этого rsi , который использует Irsi, нет позиции для курса и все идет хорошо.

С другой стороны, этот Rsi не проходит через функцию.

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

Rsi code for beginners by William210
Rsi code for beginners by William210
  • www.mql5.com
Rsi beginner tutorial to learn how to code in MQL5
 
//+------------------------------------------------------------------+
//|Индекс истинной силы.mq5 |
//| Copyright 2009, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//---- сюжет TSI
#property indicator_label1  "TSI"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Blue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- входные параметры
input int      r=25;
input int      s=13;
//--- индикаторные буферы
double         TSIBuffer[];
//+------------------------------------------------------------------+
//| Пользовательская функция инициализации индикатора |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- отображение индикаторных буферов

   SetIndexBuffer(0,TSIBuffer,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Пользовательская функция итерации индикатора|
//+------------------------------------------------------------------+
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[])
  {
//---
//--- возвращаем значение prev_calculated для следующего вызова
   return(rates_total);
  }
//+------------------------------------------------------------------+

Почему в oninit
нужно возвращать 0?

 
ziyang2048 #:

Почему в oninit
нужно возвращать 0?

В MQL5 функция OnInit() вызывается при инициализации индикатора, советника (EA) или скрипта. Ожидается, что она вернет целочисленное значение, сигнализирующее об успехе или неудаче процесса инициализации.

Если OnInit() возвращает 0, это означает, что инициализация прошла успешно. Если вам нужно сигнализировать о том, что во время инициализации что-то пошло не так, вы можете вернуть ненулевое значение, которое не позволит индикатору, советнику или скрипту работать правильно.