https://www.mql5.com/ru/code/16337
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Вопросы от начинающих MQL5 MT5 MetaTrader 5
fxsaber, 2017.10.19 21:13
// MQL4&5-code // Синхронизация всех чартов по правому времени sinput int TimerInterval = 1; // Интервал обновления в миллисекундах // Отрубает на всех чартах автоскролл и сдвиг bool AutoShiftOff( void ) { long handle = ChartFirst(); while (handle != INVALID_HANDLE) { ChartSetInteger(handle, CHART_SHIFT, false); ChartSetInteger(handle, CHART_AUTOSCROLL, false); handle = ChartNext(handle); } return(true); } const bool Init = EventSetMillisecondTimer(TimerInterval) && AutoShiftOff(); void OnTimer() { SyncCharts(); } // Возвращает true, если нет бара с таким временем ("дырка") bool IsHole( const string Symb, const ENUM_TIMEFRAMES TimeFrame, const datetime time ) { return(Bars(Symb, TimeFrame, SeriesInfoInteger(_Symbol, PERIOD_CURRENT, SERIES_FIRSTDATE), time) + Bars(Symb, TimeFrame, time, SeriesInfoInteger(_Symbol, PERIOD_CURRENT, SERIES_LASTBAR_DATE)) == SeriesInfoInteger(_Symbol, PERIOD_CURRENT, SERIES_BARS_COUNT)); } // Возвращает бар по времени int iBarShift( const string Symb, const ENUM_TIMEFRAMES TimeFrame, datetime time ) { int Res = -1; datetime LastBar; time -= time % PeriodSeconds(TimeFrame); if (SeriesInfoInteger(Symb, TimeFrame, SERIES_LASTBAR_DATE, LastBar)) { if (time > LastBar) Res = (int)((LastBar - time) / PeriodSeconds(TimeFrame)); else { const int Shift = Bars(Symb, TimeFrame, time, LastBar); if (Shift > 0) { Res = Shift - 1; if (IsHole(Symb, TimeFrame, time)) Res++; } } } return(Res); } // Возвращает время по бару datetime iBarShift( const string Symb, const ENUM_TIMEFRAMES TimeFrame = PERIOD_CURRENT, const int Pos = 0 ) { datetime Tmp[1]; CopyTime(Symb, TimeFrame, (Pos < 0) ? 0 : Pos, 1, Tmp); return(Tmp[0] - ((Pos < 0) ? Pos * PeriodSeconds(TimeFrame) : 0)); } // Возвращает правый бар чарта int ChartBarRight( const long chartID = 0 ) { return((int)(ChartGetInteger(chartID, CHART_FIRST_VISIBLE_BAR) - ChartGetInteger(chartID, CHART_WIDTH_IN_BARS) + 1)); } // Возвращает правое время чарта datetime GetChartTimeRight( const long chartID = 0 ) { return(iBarShift(ChartSymbol(chartID), ChartPeriod(chartID), ChartBarRight(chartID))); } // Устанавливает правое время чарта, возвращает установленное время datetime SetChartTimeRight( datetime time, const long chartID = 0, const ulong MaxTime = 1e5 ) { const string Symb = ChartSymbol(chartID); const ENUM_TIMEFRAMES period = ChartPeriod(chartID); const int Pos = iBarShift(Symb, period, time); const int PrevPos = ChartBarRight(chartID); if ((Pos != PrevPos) && ChartNavigate(chartID, CHART_END, -1 - Pos)) { const ulong StartTime = GetMicrosecondCount(); int NewPos = ChartBarRight(chartID); while (((NewPos != Pos)|| (NewPos == PrevPos)) && (GetMicrosecondCount() - StartTime < MaxTime) && !IsStopped()) { Sleep(0); NewPos = ChartBarRight(chartID); } } return(GetChartTimeRight(chartID)); } // Добавление элемента в конец произвольного массива template <typename T> void AddArrayElement( T &Array[], const T Value, const int Reserve = 0 ) { const int Size = ArraySize(Array); ArrayResize(Array, Size + 1, Reserve); Array[Size] = Value; } // Получает время правого бара каждого чарта int GetChartsTimeRight( datetime &RightTime[], long &Handles[] ) { ArrayFree(RightTime); ArrayFree(Handles); long handle = ChartFirst(); while (handle != INVALID_HANDLE) { AddArrayElement(RightTime, GetChartTimeRight(handle)); AddArrayElement(Handles, handle); handle = ChartNext(handle); } return(ArraySize(RightTime)); } // Устанавливает правое время на все чарты int SetChartsTimeRight( const datetime time, datetime &RightTime[], const long ExcludeHandle = 0 ) { ArrayFree(RightTime); long handle = ChartFirst(); while (handle != INVALID_HANDLE) { AddArrayElement(RightTime, (ExcludeHandle == handle) ? GetChartTimeRight(handle) : SetChartTimeRight(time, handle)); handle = ChartNext(handle); } return(ArraySize(RightTime)); } // Возвращает чарт, что время правого бара которого изменилось long GetChangeChart( const datetime &PrevRightTime[]) { datetime Handles[]; datetime RightTime[]; long Res = ArraySize(PrevRightTime) ? 0 : ChartID(); for (int i = MathMin(ArraySize(PrevRightTime), GetChartsTimeRight(RightTime, Handles)) - 1; i >= 0; i--) if (RightTime[i] != PrevRightTime[i]) { Res = Handles[i]; break; } return(Res); } // Синхронизация всех чартов по правому времени, возвращает количество синхронизированных чартов int SyncCharts() { static datetime PrevRightTime[]; const long handle = GetChangeChart(PrevRightTime); return(handle ? SetChartsTimeRight(GetChartTimeRight(handle), PrevRightTime, handle) : 0); }
Отличие от остальных - нет основного графика.
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Была такая утилита для МТ4 - кидаешь ее на графики, и если перематываешь назад, скажем, 5-минутный график, то часовой сам отматывается назад соответственно.
Нет ли такой утилиты для МТ5? Не могу найти.
Прошу прощения, сам нашел https://www.mql5.com/ru/code/677