初学者的问题 MQL5 MT5 MetaTrader 5 - 页 786 1...779780781782783784785786787788789790791792793...1503 新评论 Vitaly Muzichenko 2017.10.19 01:57 #7851 如果你不介意的话,请修改代码。我写了滚动开放图表的代码,但我在同步方面遇到了困难,我不能按第一个可见条形图的时间来同步,它不考虑错过的条形图--它按所有条形图滚动,不考虑时间。//+------------------------------------------------------------------+ #property indicator_chart_window #property indicator_plots 0 long mass_id[]; datetime Time[1]; long MassID; string MassSY; int Shift=0; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTimer() { int _CHART_WIDTH_IN_BARS = (int)ChartGetInteger(0, CHART_WIDTH_IN_BARS); int BarTimeVisible = iBarShift(Symbol(), 0, TIME(_CHART_WIDTH_IN_BARS));//Print(TIME(_CHART_WIDTH_IN_BARS)); long ID=ArraySize(mass_id); // Запомним время for(int i=0; i<ID; i++) { MassID = mass_id[i]; Shift = BarTimeVisible - (int)ChartGetInteger(MassID, CHART_VISIBLE_BARS); if(GlobalVariableGet("FirstVisibleBar") != TIME((int)ChartGetInteger(MassID, CHART_FIRST_VISIBLE_BAR) + Shift)) { GlobalVariableSet("FirstVisibleBar", TIME((int)ChartGetInteger(MassID, CHART_FIRST_VISIBLE_BAR) + Shift)); break; } } // Прокрутка графиков for(int i=0; i<ID; i++) { MassID = mass_id[i]; MassSY = ChartSymbol(MassID); Shift = (BarTimeVisible - (int)ChartGetInteger(MassID, CHART_VISIBLE_BARS)); if(GlobalVariableGet("FirstVisibleBar") != TIME((int)ChartGetInteger(MassID, CHART_FIRST_VISIBLE_BAR) + Shift)) { ChartNavigate(MassID, CHART_END, (_CHART_WIDTH_IN_BARS - iBarShift(Symbol(), 0, (datetime)GlobalVariableGet("FirstVisibleBar"))) - 2); } } } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- ChartGetIDList(mass_id); EventSetMillisecondTimer(50); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ int ChartGetIDList(long &aList[]) { int i=0; long handle=0; long chartID=ChartNext(handle); while(chartID!=-1) { handle=chartID; i++; ArrayResize(aList,i); aList[i-1]=chartID; chartID=ChartNext(handle); } return(i); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ int iBarShift(string symbol,ENUM_TIMEFRAMES timeframe,datetime time,bool exact=false) { datetime LastBAR; if(!SeriesInfoInteger(symbol,timeframe,SERIES_LASTBAR_DATE,LastBAR)) { datetime opentimelastbar[1]; if(CopyTime(symbol,timeframe,0,1,opentimelastbar)==1) LastBAR=opentimelastbar[0]; else return(-1); } //--- if time > LastBar we always return 0 if(time>LastBAR) return(0); //--- int shift=Bars(symbol,timeframe,time,LastBAR); datetime checkcandle[1]; if(CopyTime(symbol,timeframe,time,1,checkcandle)==1) { if(checkcandle[0]==time) return(shift-1); else if(exact && time>checkcandle[0]+PeriodSeconds(timeframe)) return(-1); else return(shift); } return(-1); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ datetime TIME(int index=0) { return(CopyTime(Symbol(),PERIOD_CURRENT,index,1,Time)?Time[0]:WRONG_VALUE); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- //--- return value of prev_calculated for next call return(rates_total); } fxsaber 2017.10.19 15:50 #7852 Vitaly Muzichenko:如果你不介意的话,请修改代码。我写了代码来滚动浏览开放的图表,但我在同步方面遇到了困难,我不能按第一个可见的条形图的时间来同步,它不考虑错过的条形图--它滚动浏览所有的条形图,不考虑时间。我应该怎么做?从头开始写可能会比修复它更容易。 SyncChart 投票: 122016.09.16o_owww.mql5.com Синхронизация показываемых баров на всех открытых в терминале графиках. Синхронизация графиков происходит по таймеру. Без DLL! Дополнительные возможности: опция синхронизации вертикальных... Vitaly Muzichenko 2017.10.19 16:04 #7853 fxsaber:我应该怎么做?从头开始写可能会比编辑更容易。也许从头开始,但必须以某种方式实现时间同步。 fxsaber 2017.10.19 17:06 #7854 Vitaly Muzichenko:也许从头开始,如果有一个时间同步就好了该视频非常直接。这应该很容易解决。当我有空的时候,我就会把我的版本贴出来。 Vitaly Muzichenko 2017.10.19 17:08 #7855 fxsaber:该视频使这一切变得非常清楚。解决方案应该是简洁的。当我有空的时候,我就会把我的版本贴出来。只是我没有强调,在任何图表中都可以滚动,而不仅仅是在主图表中。谢谢你! Vladimir Karputov 2017.10.19 17:40 #7856 与本主题无关的评论已被移至 "MQL4 MT4 MetaTrader 4初学者的问题"。 fxsaber 2017.10.19 19:13 #7857 Vitaly Muzichenko:只是我没有强调,在任何图表中都可以滚动,而不仅仅是在主图表中。// 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 = 1 e5 ) { 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); } Vitaly Muzichenko 2017.10.19 20:10 #7858 fxsaber: 谢谢你提供的完整而详细的代码,我将试一试,稍后再向你报告! Vitaly Muzichenko 2017.10.19 21:37 #7859 fxsaber: 结果是在视频上,但没有声音。使用了你的代码,还有我的,但没有时间同步,作为一个指标贴在最后一个帖子中如何使其同步化,以便如果条形图不在时间窗口内,即非交易时间,则跳过它,使用最后的交易时间。 代码的主要任务是从具有最大条数 的窗口中很好地滚动,也就是外汇对,现在它从这些窗口中条数最少的窗口中很好地滚动,这些时间段属于外汇对的非交易时间--这是对的,在逻辑上应该是这样。请:请修改它,以便能够从一个窗口顺利地旋转外汇对。谢谢你! fxsaber 2017.10.19 21:54 #7860 Vitaly Muzichenko:结果是在视频上,但没有声音。使用了你的代码,还有我的,但没有时间同步,作为一个指标贴在最后一个帖子中如何同步,以便如果条形图不在时间窗口内,即非交易时间,则跳过它,使用最后的交易时间。 代码的主要任务是从具有最大条数 的窗口中很好地滚动,也就是外汇对,现在它从这些窗口中条数最少的窗口中很好地滚动,这些时间段属于外汇对的非交易时间--这是对的,在逻辑上应该是这样。请:请修改它,以便能够从一个窗口顺利地旋转外汇对。谢谢你!我已经理解了这个问题。我必须想一想才能很好地解决这个问题。在任何情况下,这两个功能都是基本的。// Возвращает правое время чарта datetime GetChartTimeRight( const long chartID = 0 ); // Устанавливает правое время чарта bool SetChartTimeRight( const datetime time, const long chartID = 0 );你必须与他们玩耍,以实现一个解决方案。 1...779780781782783784785786787788789790791792793...1503 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
如果你不介意的话,请修改代码。
我写了滚动开放图表的代码,但我在同步方面遇到了困难,我不能按第一个可见条形图的时间来同步,它不考虑错过的条形图--它按所有条形图滚动,不考虑时间。
如果你不介意的话,请修改代码。
我写了代码来滚动浏览开放的图表,但我在同步方面遇到了困难,我不能按第一个可见的条形图的时间来同步,它不考虑错过的条形图--它滚动浏览所有的条形图,不考虑时间。
我应该怎么做?从头开始写可能会比修复它更容易。
我应该怎么做?从头开始写可能会比编辑更容易。
也许从头开始,但必须以某种方式实现时间同步。
也许从头开始,如果有一个时间同步就好了
该视频非常直接。这应该很容易解决。当我有空的时候,我就会把我的版本贴出来。
该视频使这一切变得非常清楚。解决方案应该是简洁的。当我有空的时候,我就会把我的版本贴出来。
只是我没有强调,在任何图表中都可以滚动,而不仅仅是在主图表中。
谢谢你!
只是我没有强调,在任何图表中都可以滚动,而不仅仅是在主图表中。
谢谢你提供的完整而详细的代码,我将试一试,稍后再向你报告!
结果是在视频上,但没有声音。使用了你的代码,还有我的,但没有时间同步,作为一个指标贴在最后一个帖子中
如何使其同步化,以便如果条形图不在时间窗口内,即非交易时间,则跳过它,使用最后的交易时间。
代码的主要任务是从具有最大条数 的窗口中很好地滚动,也就是外汇对,现在它从这些窗口中条数最少的窗口中很好地滚动,这些时间段属于外汇对的非交易时间--这是对的,在逻辑上应该是这样。
请:请修改它,以便能够从一个窗口顺利地旋转外汇对。
谢谢你!
结果是在视频上,但没有声音。使用了你的代码,还有我的,但没有时间同步,作为一个指标贴在最后一个帖子中
如何同步,以便如果条形图不在时间窗口内,即非交易时间,则跳过它,使用最后的交易时间。
代码的主要任务是从具有最大条数 的窗口中很好地滚动,也就是外汇对,现在它从这些窗口中条数最少的窗口中很好地滚动,这些时间段属于外汇对的非交易时间--这是对的,在逻辑上应该是这样。
请:请修改它,以便能够从一个窗口顺利地旋转外汇对。
谢谢你!
我已经理解了这个问题。我必须想一想才能很好地解决这个问题。
在任何情况下,这两个功能都是基本的。
你必须与他们玩耍,以实现一个解决方案。