Сбор информации по разным таймфреймам

 

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

Посмотрел различия между параметрами технических индикаторов в mql5 и mql4. У меня возник вопрос: в четвертой версии есть такой параметр как таймфрейм, например:

double  iWPR(
   string       symbol,           // имя символа
   int          timeframe,        // таймфрейм
   int          period,           // период
   int          shift             // сдвиг
   );

 В пятом этот параметр отсутствует:

int  iWPR( 
   string           symbol,          // имя символа 
   ENUM_TIMEFRAMES  period,          // период 
   int              calc_period      // период усреднения 

   );

 Однако у периода тип изменен на enum_timeframes. Скажите, пожалуйста, каким образом я теперь могу, условно, через массив сделать проверку условия по всем таймфреймам, как здесь:

int period[]={1,5,15,30,60,240,1440,10080,43200}; 

for(int x=0;x<9;x++)
   {
      if(iMA(Symbol(),period[x],13,0,0,0,0)>iMA(Symbol(),period[x],24,0,0,0,0))
  }
Но только уже на MQL5?
И еще один вопрос - если я хочу обратиться не к инструменту, на котором висит индикатор, а к любому инструменту, что я должен писать в скобках в Symbol ()?
 

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

Period это и есть таймфрейм.  

 

Symbol () - это текущий символ

Если нужно обратиться к GBPUSD то пишите "GBPUSD"

например вызов МА в мт5:

ENUM_TIMEFRAMES TF=0;
double ma1_buffer[];
double ma2_buffer[];
int      h_ma1=INVALID_HANDLE;
int      h_ma2=INVALID_HANDLE;


input int                periodma1=13;
input int                periodma2=24;
input ENUM_MA_METHOD     MAmethod=MODE_SMA;
input ENUM_APPLIED_PRICE MAprice=PRICE_CLOSE;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

string symToWork=Symbol();


   for(int x=0;x<9;x++)
     {

         h_ma1=iMA(symToWork,period[x],periodma1,0,MAmethod,MAprice);
         h_ma2=iMA(symToWork,period[x],periodma2,0,MAmethod,MAprice);

      // копируем 3 последних значения (0 1 2 бары)
      if(CopyBuffer(h_ma1,0,0,3,ma1_buffer)<3) //--- и если данных меньше требуемых
         //--- выходим из функции
         return;

      //--- зададим индексацию в массиве как таймсерию                                  

      if(!ArraySetAsSeries(ma1_buffer,true))
         //--- в случае ошибки индексации выходим из функции
         return;
      // копируем 3 последних значения (0 1 2 бары)
      if(CopyBuffer(h_ma2,0,0,3,ma2_buffer)<3) //--- и если данных меньше требуемых
         //--- выходим из функции
         return;

      //--- зададим индексацию в массиве как таймсерию                                  

      if(!ArraySetAsSeries(ma2_buffer,true))
         //--- в случае ошибки индексации выходим из функции
         return;



      if(ma1_buffer[0]>ma2_buffer[0]) // что то делаем
      
      
     }

  }
//+------------------------------------------------------------------+
 
Vladislav Andruschenko:

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

Period это и есть таймфрейм.  

 

Symbol () - это текущий символ

Если нужно обратиться к GBPUSD то пишите "GBPUSD"

например вызов МА в мт5:

Так никто в MQL5 не делает. Вы же на каждом тике создаёте по два хендла индуктора! Так у компьютера через пять минут памяти не останется!
 
Vladimir Karputov:
Так никто в MQL5 не делает. Вы же на каждом тике создаёте по два хендла индуктора!
ок, но если речь идет о нескольких ТФ и символах? 
 
Vladislav Andruschenko:
ок, но если речь идет о нескольких ТФ и символах? 

Для этого нужно сразу, заранее создать в OnInit() нужные хендлы по всем нужным символам и таймфреймам.

 

Добавлено: пример DVD Level

 
Vladimir Karputov:
Для этого нужно сразу, заранее создать в OnInit() нужные хендлы по всем нужным символам и таймфреймам.

не зная сколько там символов, я не буду копипастить названия буферов, я показал лишь простой пример. 

 

да и не обязательно в OnInit заполнять и создавать хендлы.

я создаю хендлы, прямиком в Тике.

void OnTick()
  {

//--- проверим хендлы индикаторов



   if(h_ma1==INVALID_HANDLE)//--- если хэндл невалидный
     {
      //--- создадим его снова                                                      
      h_ma1=iMA(symToWork,TF,periodma1,0,MAmethod,MAprice);
      //--- выходим из функции
      
     }

}


 

 

при этом проверяю не заполнен ли он ранее.  

 

Т.е. я правильно понимаю, что в моем случае необходимо сделать следующее:

string period[]={"PERIOD_M1", "PERIOD_M5", "PERIOD_M15", "PERIOD_M30", "PERIOD_H1"};

И соответственно, дальше вызывать все по тому же алгоритму, что и в примере на mql4?

Тут дело в том, что мне рисовать индикаторы сами не нужно - мне главное создавать некое оповещение по всем парам/таймфреймам.

Скажите, а можно ли аналогично сделать для символа? EURUSD - это же та же строка? Соответственно, можно сделать что-то подобное?

string period[]={"PERIOD_M1", "PERIOD_M5", "PERIOD_M15", "PERIOD_M30", "PERIOD_H1"};

string symbol[]={"EURUSD", "EURJPY", "EURRUB", "GBPUSD", "GBPEUR"};

int start()

{

   // используем цикл, чтобы проработать все таймфреймы

   for(int x=0;x<4;x++)

   {

for(int y=0;y<4;y++) //используем цикл, чтобы проработать все инструменты

      if(iMA(symbol[y],period[x],13,0,MODE_SMA,PRICE_CLOSE)>iMA(symbol[y],period[x],130,0,MODE_SMA,PRICE_CLOSE))

        //Собственно, то, что будет происходить, если сигнал поступит

   }

 

   return(0);

 
Эдуард Климуш:

Т.е. я правильно понимаю, что в моем случае необходимо сделать следующее:

string period[]={"PERIOD_M1", "PERIOD_M5", "PERIOD_M15", "PERIOD_M30", "PERIOD_H1"};

И соответственно, дальше вызывать все по тому же алгоритму, что и в примере на mql4?

Тут дело в том, что мне рисовать индикаторы сами не нужно - мне главное создавать некое оповещение по всем парам/таймфреймам.

Скажите, а можно ли аналогично сделать для символа? EURUSD - это же та же строка? Соответственно, можно сделать что-то подобное?

string period[]={"PERIOD_M1", "PERIOD_M5", "PERIOD_M15", "PERIOD_M30", "PERIOD_H1"};

string symbol[]={"EURUSD", "EURJPY", "EURRUB", "GBPUSD", "GBPEUR"};

int start()

{

   // используем цикл, чтобы проработать все таймфреймы

   for(int x=0;x<4;x++)

   {

for(int y=0;y<4;y++) //используем цикл, чтобы проработать все инструменты

      if(iMA(symbol[y],period[x],13,0,MODE_SMA,PRICE_CLOSE)>iMA(symbol[y],period[x],130,0,MODE_SMA,PRICE_CLOSE))

        //Собственно, то, что будет происходить, если сигнал поступит

   }

 

   return(0);

И что, в МТ4 так работает? Сомневаюсь, что строковый параметр прокатит вместо таймфрейма...
 
Vitalie Postolache:
И что, в МТ4 так работает? Сомневаюсь, что строковый параметр прокатит вместо таймфрейма...
В мт4 нет енумератора, там таймфрейм задается целым числом, поэтому я и спрашиваю, как в мт5 это все реализовать по подобному алгоритму
 

Возможно, есть резон тогда создать не строковый массив, а enum?

Что-то типа такого:

 ENUM_TIMEFRAMES period[]={PERIOD_M1, PERIOD_M5, PERIOD_M15, PERIOD_M30, PERIOD_H1};

 
Эдуард Климуш:
В мт4 нет енумератора, там таймфрейм задается целым числом, поэтому я и спрашиваю, как в мт5 это все реализовать по подобному алгоритму

Да ладно? Справку-то хоть откройте (:

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