Вставь дполонительно проверку периода.
В эксперте необходимо перемещать трейлингстоп по появлению нового бара, как лучше всего узнать о появлении нового бара?
Сам додумался только до того, что запоминаю количество баров через Bars в переменную и сравниваю её с Bars. Но проблема в том, что если перекючить таймфрейм или подкачать историю, то Bars тоже меняется.
Сам додумался только до того, что запоминаю количество баров через Bars в переменную и сравниваю её с Bars. Но проблема в том, что если перекючить таймфрейм или подкачать историю, то Bars тоже меняется.
Если переключить таймфрейм, то не только bars меняется, но и эксперт перепускается, с инициализацией всех переменных.
Я для такого случая (запоминать последний бар) делал:
1. В параметры эксперта указывал для какого таймфрейма необходимо следить за барами
2. В процедуре deinit создавал гл.переменную <имя экперта+символ+отслеживаемый таймфрейм> = время последнего запомненного бара
3. В Процедуре init() проверял наличие гл.переменной и восстанавливал время последнего отслеженного бара.
4. В процедуре эксперта пользовался iTime для 0 (или 1, как удобнее) бара.
Есть один минус: несогласованность нескольких одинаковых экспертов по одному символу и бару, но имхо это врядли в встретится. :-)
А пока я на другом таймфрейме, на торгующем может ситуация изменится, а нет ли функции определяющей количество баров на нужном таймфрейме?
А пока я на другом таймфрейме, на торгующем может ситуация изменится, а нет ли функции определяющей количество баров на нужном таймфрейме?
"Особенности написания экспертов"
Forex Trader:
Если переключить таймфрейм, то не только bars меняется, но и эксперт перепускается, с инициализацией всех переменных.
Я для такого случая (запоминать последний бар) делал:
1. В параметры эксперта указывал для какого таймфрейма необходимо следить за барами
2. В процедуре deinit создавал гл.переменную <имя экперта+символ+отслеживаемый таймфрейм> = время последнего запомненного бара
3. В Процедуре init() проверял наличие гл.переменной и восстанавливал время последнего отслеженного бара.
4. В процедуре эксперта пользовался iTime для 0 (или 1, как удобнее) бара.
Есть один минус: несогласованность нескольких одинаковых экспертов по одному символу и бару, но имхо это врядли в встретится. :-)
Если переключить таймфрейм, то не только bars меняется, но и эксперт перепускается, с инициализацией всех переменных.
Я для такого случая (запоминать последний бар) делал:
1. В параметры эксперта указывал для какого таймфрейма необходимо следить за барами
2. В процедуре deinit создавал гл.переменную <имя экперта+символ+отслеживаемый таймфрейм> = время последнего запомненного бара
3. В Процедуре init() проверял наличие гл.переменной и восстанавливал время последнего отслеженного бара.
4. В процедуре эксперта пользовался iTime для 0 (или 1, как удобнее) бара.
Есть один минус: несогласованность нескольких одинаковых экспертов по одному символу и бару, но имхо это врядли в встретится. :-)
Добрый день. У вас есть пример кода по новому бару ?
Буду благодарен.
datetime Tm[1]; void OnTick() { datetime NTm[1]; CopyTime(_Symbol,_Period,0,1,NTm); if(Tm[0]!=NTm[0]) { //Выполняется на новом баре Tm[0]=NTm[0]; } return; }
Aliaksandr Yemialyanau:
Спасибо
Я всегда делаю иначе, без всяких запросов таймсерий.
datetime dtCompleteBarTime = MIN_DATETIME; // На глобальном уровне объявляем момент обработанного бара //........................ // Получаем время бара из текущего момента datetime dCurBarMoment = CTimeSeriesT::GetStartMomentOfBar(TimeCurrent,GetWorkTimeframe()); // Если момент бара не больше чем запомненное - значит, бар уже обработан, ничего не делаем if(dCurSetMoment <= dtCompleteBarTime) return; // Если мы здесь, значит, бар еще не обработан. // Обновляем время обработки dtCompleteBarTime = dCurBarMoment; // И обрабатываем бар //.... здесь код, анализа ситуации и выдачи приказов
Используется функция, которая по переданному времени и таймфрейму - возвращает начало времени бара. У меня эта функция - часть класса CTimeSeriesT, но ее вполне можно использовать и не включая в класс:
#define START_EPOCHA_DAYS 4 // Текущая эпоха времени начинается не с понедельника, есть еще 4 дня. datetime CTimeSeriesT::GetStartMomentOfBar(datetime dtCurTime,ENUM_TIMEFRAMES etBarSize) { datetime dtTmp; MqlDateTime mdtCurTime; uint uiSecsInBar; switch(etBarSize) { case PERIOD_M1: case PERIOD_M2: case PERIOD_M3: case PERIOD_M4: case PERIOD_M5: case PERIOD_M6: case PERIOD_M10: case PERIOD_M12: case PERIOD_M15: case PERIOD_M20: case PERIOD_M30: case PERIOD_H1: case PERIOD_H2: case PERIOD_H3: case PERIOD_H4: case PERIOD_H6: case PERIOD_H8: case PERIOD_H12: case PERIOD_D1: uiSecsInBar = PeriodSeconds(etBarSize); return((dtCurTime/uiSecsInBar)*uiSecsInBar); case PERIOD_W1: // Для вычисления времени начала недели используем функцию из статьи "Основы программирования на MQL5 - Время" dtTmp = dtCurTime; dtTmp += SECS_IN_DAY*START_EPOCHA_DAYS; dtTmp = (dtTmp/SECS_IN_WEEK)*SECS_IN_WEEK; dtTmp -= SECS_IN_DAY*START_EPOCHA_DAYS; return(dtTmp); case PERIOD_MN1: TimeToStruct(dtCurTime,mdtCurTime); mdtCurTime.sec = 0; mdtCurTime.min = 0; mdtCurTime.hour = 0; mdtCurTime.day = 1; return(StructToTime(mdtCurTime)); default: ASSERT(false); }; return(dtCurTime); };
Че-то не пойму проблемы. У бара есть метка времени. Проверяй метку времени последнего бара, и когда она изменилась - вот и начало нового бара. Один оператор if (T1 != T0).
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Сам додумался только до того, что запоминаю количество баров через Bars в переменную и сравниваю её с Bars. Но проблема в том, что если перекючить таймфрейм или подкачать историю, то Bars тоже меняется.