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

 
Aleksey Vyazmikin:

Прошу помощи в решении такой задачи.

Допустим у меня есть текущий тайм фрейм - M1, мне надо знать время последнего бара N заданного бара любого верхнего TF, при этом час может быть не 60 минут, а 45 или иное любое время, а кроме того есть выходные, а надо узнавать с любого TF дату последнего бара текущего TF.

Как это реализовать?

Указываете номер бара, имя символа и нужный таймфрейм:

//+------------------------------------------------------------------+ 
//| Get Time for specified bar index                                 | 
//+------------------------------------------------------------------+ 
datetime iTime(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   datetime Time[1];
   datetime time=0; // datetime "0" -> D'1970.01.01 00:00:00'
   int copied=CopyTime(symbol,timeframe,index,1,Time);
   if(copied>0)
      time=Time[0];
   return(time);
  }

Проверяете (на всякий случай) - если возвратила функция время D'1970.01.01 00:00:00' - значит ошибка.

 

Столкнулся с проблемой что ордер на продажу не выставился

2018.05.23 12:07:55.002 Trades  '50250084': market sell 0.01 EURUSD tp: 1.17397
2018.05.23 12:07:55.112 Trades  '50250084': accepted market sell 0.01 EURUSD tp: 1.17397
2018.05.23 12:07:55.113 Trades  '50250084': market sell 0.01 EURUSD tp: 1.17397 placed for execution
2018.05.23 12:07:55.114 Trades  '50250084': rejected market sell 0.01 EURUSD tp: 1.17397 (rejected)

Правильно ли я понимаю что брокер принял ордер а потом отклонил?

На каком основании тогда и почему не написал? В журналах больше ошибок нет. До этой ошибки было больше 50 ордеров и все без ошибок. После этой ошибки тоже ошибок не видно.

Можно ли избавится от этой проблемы?

 
Vladimir Karputov:

Указываете номер бара, имя символа и нужный таймфрейм:

Проверяете (на всякий случай) - если возвратила функция время D'1970.01.01 00:00:00' - значит ошибка.

Я использую эту функцию, она хуже предложенной Вами?

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime iTime(string symbol,int tf,int index)
  {
   if(index < 0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[];
   if(CopyTime(symbol,timeframe,index,1,Arr)>0)
      return(Arr[0]);
   else return(-1);
  }

Проблема в том, что если у меня текущий тайм фрейм 1 минута, я хочу узнать номер последнего бара текущего таймфрейма в выбранном тайм фрейме, но при этом прошло уже много времени (разрыв из-за выходных или из-за того что вечерняя сессия закрылась в 23-50, а открылась следующая только в 10-00), то возвращается 09:59 а не 23:49:00, запрашиваю время так

datetime         StopDt=iTime(Symbol(),TF_iDeltaP,_Shift-1)-60;

Поэтому и стал вопрос, как добыть это время последнего бара при любых комбинациях ТФ?

 
Aleksey Vyazmikin:

...

Проблема в том, что если у меня текущий тайм фрейм 1 минута, я хочу узнать номер последнего бара текущего таймфрейма в выбранном тайм фрейме, ...

На выделенной фразе мой мозг взорвался.

 
Vladimir Karputov:

На выделенной фразе мой мозг взорвался.

Там описка, мне нужна дата последнего бара текущего таймфрейма, который относится к выбранному бару верхнего таймфрейма.

Так понятно?
 
Aleksey Vyazmikin:

Там описка, мне нужна дата последнего бара текущего таймфрейма, который относится к выбранному бару верхнего таймфрейма.

Так понятно?

Нет, не понятно. Мозг продолжает бурлить и взрываться :). Один бар принадлежит только своему таймфрейму.

 
Aleksey Vyazmikin:

Там описка, мне нужна дата последнего бара текущего таймфрейма, который относится к выбранному бару верхнего таймфрейма.

Так понятно?

Если я правильно понял Ваш запрос, то:

1. Определите время закрытия нужного бара верхнего ТФ.

2. Вычислите время бара младшего ТФ, который завершается вместе с баром старшего ТФ.

3. По этому времени запросите бар младшего ТФ (запрос не строгий) - полУчите ближайший слева по временной шкале бар - тот что вам нужен.

4. Проконтролируйте, если необходимо, что данный бар находится внутри бара верхнего ТФ (исключить вариант, когда баров младшего ТФ внутри бара старшего ТФ вообще не оказалось по какой-то причине).

 
Vladimir Karputov:

Нет, не понятно. Мозг продолжает бурлить и взрываться :). Один бар принадлежит только своему таймфрейму.

Хорошо, переходим на визуализацию мыслей :)

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

Так понятней? Если нет, то прошу задавать уточняющие вопросы.

 
Aleksey Vyazmikin:

Хорошо, переходим на визуализацию мыслей :)

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

Так понятней? Если нет, то прошу задавать уточняющие вопросы.

1. Картинка малоквата - в следующий раз сразу ставьте 2 метра на два :)

2. Мысль снова не понял - Вы показали график на каком-то таймфрейме. Какая проблема запросить на этом таймфрейме бар номер N?

 
Vladimir Karputov:

1. Картинка малоквата - в следующий раз сразу ставьте 2 метра на два :)

2. Мысль снова не понял - Вы показали график на каком-то таймфрейме. Какая проблема запросить на этом таймфрейме бар номер N?

1. Могу и больше - не проблема ;)

2. Тайм фрейм указан в левом верхнем углу - M5. Я не могу запросить бар номер N так-как не знаю, как его точно узнать, особенно если сдвиг это не 1 бар верхнего ТФ, а больше баров.

Попробую для сдвига в один бар алгоритм такой:

1. Выяснить сколько прошло баров с начала текущего верхнего ТФ

2. Сдвинуть полученное число на 1 бар и узнать время через функцию iTime

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