MQL5 - Передать индикатор в качестве параметра

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


person Ramzy    schedule 11.10.2018    source источник
comment
Какая польза от передачи случайного индикатора в класс? Поскольку все индикаторы имеют разные значения, не лучше ли передать signal в класс? например MyDecider decider(signal);   -  person nicholishen    schedule 12.10.2018
comment
Обновление, извините, что не указал, я имею в виду MQL5   -  person Ramzy    schedule 12.10.2018
comment
nicholishen, это то, о чем я не подумал xD, но если подумать, у меня есть класс для каждого индикатора, меняются входные параметры и изменяется номер буфера, я собирался сделать цикл, который принимает аргумент от конструктора того, как может буферы, не подумал о различных параметрах   -  person Ramzy    schedule 12.10.2018
comment
разное количество параметров и разное количество буферов - это зло, почему не сделали массив значений для передачи, или что-то вроде MqlTradeRequest и MqlTradeResult для индикаторов   -  person Ramzy    schedule 12.10.2018


Ответы (1)


MQL4 и MQL5 отличаются индикаторами. Вы можете использовать индикатор непосредственно там, где он вам нужен, но это обычно неудобно и требует разного кода для MQL4 и MQL5.

Вы можете создать экземпляр индикатора (конечно, разные параметры означают разные экземпляры). Разные индикаторы могут иметь разное количество параметров и буферов, поэтому имеет смысл создать класс для каждого нужного вам индикатора. Этот подход хорош как для MQL4, так и для MQL5.

#include <Indicators\Custom.mqh>
class CiMyCustomIndicator : public CiCustom
   {
       string  m_indicatorName;
    public:
       int     GetResult(const int index)const//as an example, buf0[0]>buf0[1] -> 1, buf0[0]<buf0[1] -> -1, else 0
          {
           double value=GetData(0,index),
                  prevValue=GetData(0,index+1);
           if(value>prevValue)return(1);
           if(value<prevValue)return(-1);
           return(0);
          }
   };

 int OnInit(){
    CiMyCustomIndicator *myMacd=new CiMyCustomIndicator();
    //lets assume myMacd gets two params:int InpPeriod=9; double InpLine=0.0001;
    MqlParams[] myMacdInputs;
    ArrayResize(myMacdInputs,2);
    myMacdInputs[0].type=TYPE_INT;
    myMacd[0].integer_value=InpPeriod;
    myMacdInputs[1].type=TYPE_DOUBLE;
    myMacdInputs[1].double_value=InpLine;

    myMacd.Create(_Symbol,_Period,IND_CUSTOM,ArraySize(myMacdInputs),myMacdInputs);
// you can now pass myMacd as pointer into another method
// other logic

}
void OnDeinit(const int reason){delete(myMacd);}
void OnTick(){
     double value=myMacd.GetData(bufferIndex, shift);
     int customResult=myMacd.GetResult(shift);
}
person Daniel Kniaz    schedule 12.10.2018
comment
Я согласен с вашим кодом, но не думаю, что имеет смысл передавать общий индикатор, поскольку все индикаторы выводят разные значения. Было бы разумнее создать абстрактный базовый класс для общего сигнала с virtual SIGNAL method(), а затем подклассировать его с индикатором и логикой, чтобы вернуть соответствующий сигнал. ...вроде как это делают мастера MQL5. - person nicholishen; 12.10.2018
comment
не уверен, что понимаю, как связаны индикатор и сигнал. индикатор может быть фильтром, или его можно использовать для расчета SL/TP/Trail и т.д. - person Daniel Kniaz; 12.10.2018
comment
Спасибо, я уже сделал класс для каждого индикатора, что утомительно, так как я потратил целый день на создание классов для 10 индикаторов, также я добавил настройку для каждого класса, а наследование и интерфейсы не такие мощные, как C # - person Ramzy; 12.10.2018
comment
да, Ramzy они не такие уж и хорошие, но они хотя бы есть :) Рефлексия вообще недоступна :((, как и обработка/отлов ошибок или многопоточность - person Daniel Kniaz; 13.10.2018
comment
Да, я должен свести к минимуму использование MQL5 для индикаторов и рыночных ордеров, если я создам веб-сервис RESTful во Flask для обработки любых вычислений, включая прогнозирование. а мне еще предстоит помучиться на MQL5 xD - person Ramzy; 13.10.2018