Как получить из индикатора цену на определенном таймфрейме?

 

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

Идея следующая: мы должны сравнивать в определенном формате данные с предыдущей и предпредыдущей свечи. Сам код я написал, все работает корректно. Однако, хочу усложнить код (нет) и себе жизнь (да), чтобы один индикатор отвечал сразу за несколько таймфреймов.

Вот код условия (привет, Торговый хаос Билла Уильямса):

if (((high[1]+low[1])/2)> high[2])

         ObjectSetInteger (0,"signal"+IntegerToString(x), OBJPROP_COLOR, Green);

         else

            {

               if (((high[1]+low[1])/2)< low[2])

                  ObjectSetInteger (0,"signal"+IntegerToString(x), OBJPROP_COLOR, Red);

                  else ObjectSetInteger (0,"signal"+IntegerToString(x), OBJPROP_COLOR, Gray);

            }

 Все замечательно работает, сигналы идут так, как надо. Только надо еще, чтобы остальные объекты (которые "сигнал+х") показывали данные с других таймфреймов. Я подумал, что можно создать 4 массива:

double price_buffer_m1_high[];

double price_buffer_m1_low[];

double price_buffer_m5_high[];

double price_buffer_m5_low[];

 А также использовать функцию определения таймфрейма:

ENUM_TIMEFRAMES tf(int index)

  {

   switch(index)

     {

      case 0:return(PERIOD_M1);

      case 1:return(PERIOD_M5);

      case 2:return(PERIOD_M15);

      case 3:return(PERIOD_M30);

      case 4:return(PERIOD_H1);

      case 5:return(PERIOD_H4);

      case 6:return(PERIOD_D1);

      case 7:return(PERIOD_W1);

      case 8:return(PERIOD_MN1);

     }

   return(PERIOD_CURRENT);

  }

 Однако, я не понимаю, каким образом сопоставить таймфрейм и данные свечей, которые можно взять из high, low массивов. Подскажите, пожалуйста

 

Такое поможет?

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы от начинающих MQL4 MT4 MetaTrader 4

Renat Akhtyamov, 2016.12.06 19:23

Вот здесь:

iStochastic(NULL,15,2,3,1,MODE_SMA,0,MODE_SIGNAL,0);

меняйте период (таймфрейм) на 1,5,15,30,60,240,1440,10080,43200 //M1.M5.M30 ... и т.д.

или впишите Period() вместо 15, тогда при переключении ТФ вручную, будет автоматически задан текущий


 
Renat Akhtyamov:

Такое поможет?


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

Сюда пишите // идет переход МТ4->МТ5

https://www.mql5.com/ru/forum/6343/unread#unread

Вопросы от начинающих
Вопросы от начинающих
  • www.mql5.com
Форум трейдеров MQL5.community
 
Renat Akhtyamov:

Такое поможет?


проблема в том, что если мы работаем через индикаторы, то в вызове iиндикатор везде указывается таймфрейм, и мы можем спокойно сделать его tf(x). Но как в этом случае с ценой быть. Наверняка же можно как-то подгрузить high/low определенного бара на определенном таймфрейме
 
Эдуард Климуш:
проблема в том, что если мы работаем через индикаторы, то в вызове iиндикатор везде указывается таймфрейм, и мы можем спокойно сделать его tf(x). Но как в этом случае с ценой быть. Наверняка же можно как-то подгрузить high/low определенного бара на определенном таймфрейме
Мультивалютник или одна пара?
 
В идеале - мультивалютник+мультитайминг, но я согласен буду уже и на просто мультитайминг (но не откажусь от и мультивалютника)
 
Эдуард Климуш:
В идеале - мультивалютник+мультитайминг, но я согласен буду уже и на просто мультитайминг (но не откажусь от и мультивалютника)
double pClose[1];

string Symb="EURUSD";

CopyClose(Symb,_Period,i,1,pClose);

int i - номер бара с искомой ценой bid, меняем в цикле при нееобходимсоти

попробуйте подставить свой массив с периодами вместо _Period, а вместо Symb - строковый массив с валютными парами

//MQL5

 
Renat Akhtyamov:
double pClose[1];

string Symb;

CopyClose(Symb,_Period,i,1,pClose);

int i - номер бара с нужной ценой

попробуйте подставить массив с периодами

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

Если вот так сделать, это не слишком коряво будет?

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

   {

     switch (x)

     {

      case 0: 

               {

                  CopyHigh(Symbol(), tf(x), 0,3, price_buffer_m1_high);

                  CopyLow(Symbol(), tf(x), 0,3, price_buffer_m1_low);

               }

      case 1:  {

                  CopyHigh(Symbol(), tf(x), 0,3, price_buffer_m5_high);

                  CopyLow(Symbol(), tf(x), 0,3, price_buffer_m5_low);

               }

     }

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

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

Если вот так сделать, это не слишком коряво будет?

Это как угодно.

Тормозить будет - соптимизируете код.

 

проще будет копировать одно, нужное значение:

if (((iHigh(_Symbol,_Period, 1)+iLow(_Symbol,_Period, 1))/2)> iHigh(_Symbol,_Period, 2))
  {

 


  }

double iHigh (string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
   if(index < 0) return(-1);
   double Arr[];
   if(CopyHigh(symbol,timeframe, index, 1, Arr)>0)
      return(Arr[0]);
   else return(-1);
}

double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
   {
   if(index < 0) return(-1);
   double Arr[];
   if(CopyLow(symbol, timeframe, index, 1, Arr)>0)
      return(Arr[0]);
   else return(-1);
   }
Причина обращения: