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

 

В mql4 я с помощью iCustom спокойно делал индикаторы, использующие чьи-то готовые индикаторы, хоть и ничего не понимаю в программировании... хватало интуиции. А в mql5 ничего не получается, как ни пытаюсь разобраться. Помогите, пожалуйста.

Есть вот этот индикатор в ex5. Положил его в папку Downloads. Хочу брать обе его линии и рисовать на графике в других периодах, ну, то есть, сделать его мультитаймфреймным с помощью iCustom.

Поскольку с нуля написать индикатор не могу, взял код простого индикатора Bears Power. Ничего там особо не менял, кроме того, что поменял indicator_chart_window и DRAW_LINE, а также строчку, которая, в моем понимании, должна вытаскивать данные первого буфера с параметрами по умолчанию на текущем ТФ:

ExtBearsBuffer[i]=iCustom(NULL,0,"Downloads\\RSI Analytics");

Все компилируется, ничего не рисуется. Чего ему еще надо? :( 

#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Bears Power"
//--- indicator settings
#property indicator_chart_window                      //---------------------------------
#property indicator_buffers 2
#property indicator_plots   1
#property indicator_type1   DRAW_LINE                 //---------------------------------------
#property indicator_color1  Silver
#property indicator_width1  2
//--- input parameters
input int InpBearsPeriod=13; // Period
//--- indicator buffers
double    ExtBearsBuffer[];
double    ExtTempBuffer[];
//--- handle of EMA 
int       ExtEmaHandle;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBearsBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtTempBuffer,INDICATOR_CALCULATIONS);
//---
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits+1);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,InpBearsPeriod-1);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Bears("+(string)InpBearsPeriod+")");
//--- get MA handle
   ExtEmaHandle=iMA(NULL,0,InpBearsPeriod,0,MODE_EMA,PRICE_CLOSE);
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Average True Range                                               |
//+------------------------------------------------------------------+
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 &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
   int i,limit;
//--- check for bars count
   if(rates_total<InpBearsPeriod)
      return(0);// not enough bars for calculation   
//--- not all data may be calculated
   int calculated=BarsCalculated(ExtEmaHandle);
   if(calculated<rates_total)
     {
      Print("Not all data of ExtEmaHandle is calculated (",calculated,"bars ). Error",GetLastError());
      return(0);
     }
//--- we can copy not all data
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) to_copy++;
     }
//---- get ma buffers
   if(IsStopped()) return(0); //Checking for stop flag
   if(CopyBuffer(ExtEmaHandle,0,0,to_copy,ExtTempBuffer)<=0)
     {
      Print("getting ExtEmaHandle is failed! Error",GetLastError());
      return(0);
     }
//--- first calculation or number of bars was changed
   if(prev_calculated<InpBearsPeriod)
      limit=InpBearsPeriod;
   else limit=prev_calculated-1;
//--- the main loop of calculations
   for(i=limit;i<rates_total && !IsStopped();i++)
     {
      ExtBearsBuffer[i]=iCustom(NULL,0,"Downloads\\RSI Analytics"); \\--------------------------------------------
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Технический индикатор RSI ANALYTICS
Технический индикатор RSI ANALYTICS
  • отзывов: 5
  • 2013.11.01
  • STRAT ANALYTICS
  • www.mql5.com
Зачем нам RSI в отдельном окне, если его можно построить в основном окне графика, что гораздо более понятно? RSI ANALYTICS - это индикатор, следящий за рынком, созданный на основе той же идеи, что и традиционный RSI (индекс относительной силы). При этом он строится не в отдельном подокне, а в том же окне, что и график цены финансового...
 
Nilog:

В mql4 я с помощью iCustom спокойно делал индикаторы, использующие чьи-то готовые индикаторы, хоть и ничего не понимаю в программировании... хватало интуиции. А в mql5 ничего не получается, как ни пытаюсь разобраться. Помогите, пожалуйста.

Есть вот этот индикатор в ex5. Положил его в папку Downloads. Хочу брать обе его линии и рисовать на графике в других периодах, ну, то есть, сделать его мультитаймфреймным с помощью iCustom.

Поскольку с нуля написать индикатор не могу, взял код простого индикатора Bears Power. Ничего там особо не менял, кроме того, что поменял indicator_chart_window и DRAW_LINE, а также строчку, которая, в моем понимании, должна вытаскивать данные первого буфера с параметрами по умолчанию на текущем ТФ:

Все компилируется, ничего не рисуется. Чего ему еще надо? :( 

В mql5 работа с пользовательскими, да и стандартными индикаторами организована иначе чем в mql4. Если в mql4 посредством iCustom можно было получить только одно значение индикатора, то в mql5 можно получить значения индикатора на всю глубину истории в массив. Второе основное отличие, это направление индексации в буферах индикаторов.

Весь код смотреть и сверять с оригиналом утомительно, поэтому я укажу только на основные:

Файл должен находиться в папке Indicators или подпапке находящейся в той-же Indicators.

Вот строка получения хендла индикатора МА

ExtEmaHandle=iMA(NULL,0,InpBearsPeriod,0,MODE_EMA,PRICE_CLOSE);

и вот строка получения значения индикатора МА

if(CopyBuffer(ExtEmaHandle,0,0,to_copy,ExtTempBuffer)<=0)

в данном случае в дополнительный буфер или массив.

Получается что получить данные пользовательского индикатора

ExtBearsHandle=iCustom(NULL,0,"RSI Analytics");
CopyBuffer(ExtBearsHandle,0,0,to_copy,ExtTempBuffer)

И потом получив из этого дополнительного буфера значения индикатора можно их обработать каким-то образом, или не трогая ставить в индикаторный буфер не забывая о направлении индексации.

 
Alexey Viktorov:


Спасибо! Я что-то написал, как понял, и теперь при компиляции выскакивает лишь одна ошибка. В строчке

CopyBuffer(ExtBearsHandle,0,0,to_copy,ExtTempBuffer);

ошибка to_copy - undeclared identifier.

В каком разделе и как мне его объявить? 

 
Nilog:

Спасибо! Я что-то написал, как понял, и теперь при компиляции выскакивает лишь одна ошибка. В строчке

ошибка to_copy - undeclared identifier.

В каком разделе и как мне его объявить? 

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

 
В MetaTrader 5, может кардинально отличаться работа одного советника на валюте от работы, например, на индексе RTS?
 
lil_lil:
В MetaTrader 5, может кардинально отличаться работа одного советника на валюте от работы, например, на индексе RTS?

Советник будет работать так, КАК ОН НАПИСАН. И не иначе.

А вот, что касается нюансов, которые следует учитывать: RTS - это биржа, а значит НЕТТИНГОВЫЙ тип учёта позиций. Если изначально советник не рассчитан на работу на неттинге - результат работы непредсказуем.

 
Vladimir Karputov:

Советник будет работать так, КАК ОН НАПИСАН. И не иначе.

А вот, что касается нюансов, которые следует учитывать: RTS - это биржа, а значит НЕТТИНГОВЫЙ тип учёта позиций. Если изначально советник не рассчитан на работу на неттинге - результат работы непредсказуем.

Спасибо, как точно узнать по коду, рассчитан на работу на неттинге или нет.

Разнонаправленных позиций в стратегии, нет.

 
lil_lil:

Спасибо, как точно узнать по коду, рассчитан на работу на неттинге или нет.

Разнонаправленных позиций в стратегии, нет.

А, если так (в работе всегда ОДНА позиция) то разницы нет - хоть неттинг, хоть хедж.

 
Vladimir Karputov:

А, если так (в работе всегда ОДНА позиция) то разницы нет - хоть неттинг, хоть хедж.

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

 
lil_lil:

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

Искать место, где идёт команда на закрытие позиции.

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