初心者の方からの質問 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: 結果は映像に出ますが、音は出ません。あなたのコードが使用され、私のコードも使用されましたが、時間の同期をとらずに、指標として最後の投稿に投稿されました。もしバーがタイムウィンドウに該当しない場合、つまり非取引時間に該当する場合、それをスキップして最後の取引時間を使用するように同期させるにはどうしたらよいでしょうか。 コードの主なタスクは、バーの 最大数を 持つウィンドウからよくスクロールすることです、つまり、外国為替ペア、それは今、それらのウィンドウ上のバーの最小数を持つウィンドウからよくスクロールし、ペアの非取引時間に落ちる期間 - これは正しいですし、論理的にする必要があります。要望:1つのウィンドウからスムーズにFXペアを回転させることができるように修正をお願いします。ありがとうございました。 fxsaber 2017.10.19 21:54 #7860 Vitaly Muzichenko:結果は映像に出ますが、音は出ません。あなたのコードが使用され、私のコードも使用されましたが、時間の同期をとらずに、指標として最後の投稿に投稿されました。もしバーがタイムウィンドウに該当しない場合、つまり非取引時間に該当する場合、それをスキップして最後の取引時間を使用するように同期させるにはどうしたらよいでしょうか。 コードの主なタスクは、バーの 最大数を 持つウィンドウからよくスクロールすることです、つまり、外国為替ペア、それは今、それらのウィンドウ上のバーの最小数を持つウィンドウからよくスクロールし、ペアの非取引時間に落ちる期間 - これは正しいですし、論理的にする必要があります。要望:1つのウィンドウからスムーズにFXペアを回転させることができるように修正をお願いします。ありがとうございました。問題点を把握した。考えないときれいに解けないんです。いずれにせよ、この2つの機能は基本中の基本です。// Возвращает правое время чарта datetime GetChartTimeRight( const long chartID = 0 ); // Устанавливает правое время чарта bool SetChartTimeRight( const datetime time, const long chartID = 0 );遊びながら解決していくのです。 1...779780781782783784785786787788789790791792793...1503 新しいコメント 理由: キャンセル 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
差し支えなければ、コードの修正をお願いします。
私はオープンチャートをスクロールするためのコードを書いたが、私は同期で行き詰まった、私は最初の可視バーの時間で同期することはできません、それは逃したバーを考慮していない - それは時間を考慮せずに、すべてのものによってスクロールします。
差し支えなければ、コードの修正をお願いします。
オープンチャートをスクロールするコードを書きましたが、同期化で行き詰まりました。最初の可視バーの時間で同期化できず、見逃したバーを考慮しません。
どうしたらいいのでしょうか?直すより、一から書いた方が楽かもしれませんね。
どうしたらいいのでしょうか?編集するよりも、一から書く方が楽かもしれませんね。
ゼロからかもしれませんが、何らかの方法で時間を同期させる必要があります。
時間の同期さえあれば、ゼロからかもしれない
動画を見れば一目瞭然です。簡単に解けるはずです。暇な時に、私のバージョンを投稿します。
動画を見れば一目瞭然です。解決策は簡潔であるべきだ。暇なときに、私のバージョンを投稿します。
ただし、メインのチャートだけでなく、どのチャートからもスクロールできることを強調していませんでした。
ありがとうございました。
ただし、メインのチャートだけでなく、どのチャートからもスクロールできることを強調していませんでした。
完全かつ包括的なコードをありがとうございます!試してみて、後で報告します。
結果は映像に出ますが、音は出ません。あなたのコードが使用され、私のコードも使用されましたが、時間の同期をとらずに、指標として最後の投稿に投稿されました。
もしバーがタイムウィンドウに該当しない場合、つまり非取引時間に該当する場合、それをスキップして最後の取引時間を使用するように同期させるにはどうしたらよいでしょうか。
コードの主なタスクは、バーの 最大数を 持つウィンドウからよくスクロールすることです、つまり、外国為替ペア、それは今、それらのウィンドウ上のバーの最小数を持つウィンドウからよくスクロールし、ペアの非取引時間に落ちる期間 - これは正しいですし、論理的にする必要があります。
要望:1つのウィンドウからスムーズにFXペアを回転させることができるように修正をお願いします。
ありがとうございました。
結果は映像に出ますが、音は出ません。あなたのコードが使用され、私のコードも使用されましたが、時間の同期をとらずに、指標として最後の投稿に投稿されました。
もしバーがタイムウィンドウに該当しない場合、つまり非取引時間に該当する場合、それをスキップして最後の取引時間を使用するように同期させるにはどうしたらよいでしょうか。
コードの主なタスクは、バーの 最大数を 持つウィンドウからよくスクロールすることです、つまり、外国為替ペア、それは今、それらのウィンドウ上のバーの最小数を持つウィンドウからよくスクロールし、ペアの非取引時間に落ちる期間 - これは正しいですし、論理的にする必要があります。
要望:1つのウィンドウからスムーズにFXペアを回転させることができるように修正をお願いします。
ありがとうございました。
問題点を把握した。考えないときれいに解けないんです。
いずれにせよ、この2つの機能は基本中の基本です。
遊びながら解決していくのです。