MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1900 1...189318941895189618971898189919001901190219031904190519061907...1953 新しいコメント Mihail Matkovskij 2022.02.13 19:49 #18991 Vitaly Muzichenko #: ここでは、その方法をご紹介します。 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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[]) { int H=100; double b, a; if(prev_calculated==0) { ArrayInitialize(Buffer1,EMPTY_VALUE); ArrayInitialize(Buffer2,EMPTY_VALUE); } b=SymbolInfoDouble(Symbol(),SYMBOL_BID); a=SymbolInfoDouble(Symbol(),SYMBOL_ASK); if(rates_total-prev_calculated==1) { Buffer1[H+1]=EMPTY_VALUE; Buffer2[H+1]=EMPTY_VALUE; } else if (rates_total == prev_calculated) { // сдвигаем данные только когда количество баров не поменялось (в случае появления нового бара они сдвигаются системой терминала) for(int j=H; j>0; j--) { Buffer1[j]=Buffer1[j-1]; Buffer2[j]=Buffer2[j-1]; } } // записываем новые данные Buffer1[0]=b; Buffer2[0]=a; return(rates_total); } Mihail Matkovskij 2022.02.13 20:07 #18992 JRandomTrader 循環バッファとして 使用し、最初の要素の現在位置を記憶させるのはどうでしょうか。 なんて素晴らしいアイデアなんだ誰が考え出し、どのように実用化したのか。スライディングウィンドウチャート専用に使われているのか疑問ですが...。 Mihail Matkovskij 2022.02.13 20:11 #18993 Mihail Matkovskij #:なんて素晴らしいアイデアなんだ誰が考え出し、どのように実用化したのか。スライディングウィンドウチャート専用に使うのはどうかと思いますが...。 確かに、ロールバックできるデータの量を知っておくことは無理なことではありません。この円形バッファーは、長さが限られているため、「自分の足で踏んでいる」ことになるからです...。 Vitaly Muzichenko 2022.02.13 20:17 #18994 Mihail Matkovskij #: ここでは、その方法をご紹介します。 この製品は、私が所有することになりました。 しかし、ArrayCopyが 機能するかどうかを確認したい。 --- グラフをちぎるのは気持ち悪いので、この方法にしました。 #property indicator_separate_window #property indicator_buffers 2 #property indicator_plots 2 #property indicator_type1 DRAW_LINE #property indicator_color1 clrDodgerBlue #property indicator_label1 "Bid" #property indicator_type2 DRAW_LINE #property indicator_color2 clrRed #property indicator_label2 "Ask" double Buffer1[]; double Buffer2[]; int H; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnInit() { SetIndexBuffer(0,Buffer1); ArraySetAsSeries(Buffer1,true); SetIndexBuffer(1,Buffer2); ArraySetAsSeries(Buffer2,true); ArrayInitialize(Buffer1,EMPTY_VALUE); ArrayInitialize(Buffer2,EMPTY_VALUE); IndicatorSetInteger(INDICATOR_DIGITS,Digits()); IndicatorSetString(INDICATOR_SHORTNAME,"Tick:"); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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[]) { H=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR); if(prev_calculated==0) { ArrayInitialize(Buffer1,EMPTY_VALUE); ArrayInitialize(Buffer2,EMPTY_VALUE); } double b=SymbolInfoDouble(Symbol(),SYMBOL_BID); double a=SymbolInfoDouble(Symbol(),SYMBOL_ASK); if(rates_total-prev_calculated==1) { Buffer1[H+1]=EMPTY_VALUE; Buffer2[H+1]=EMPTY_VALUE; } else if(rates_total == prev_calculated) { // сдвигаем данные только когда количество баров не поменялось (в случае появления нового бара они сдвигаются системой терминала) for(int j=H; j>0; j--) { Buffer1[j]=Buffer1[j-1]; Buffer2[j]=Buffer2[j-1]; } } // записываем новые данные Buffer1[0]=b; Buffer2[0]=a; return(rates_total); } //+------------------------------------------------------------------+ void OnChartEvent(const int id, // идентификатор события const long& lparam, // параметр события типа long const double& dparam, // параметр события типа double const string& sparam // параметр события типа string ) { if(id==CHARTEVENT_CHART_CHANGE) { H=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR); int B=Bars(Symbol(),0); for(int j=H; j<B; j++) { Buffer1[j]=EMPTY_VALUE; Buffer2[j]=EMPTY_VALUE; } } } //+------------------------------------------------------------------+ Mihail Matkovskij 2022.02.13 20:17 #18995 JRandomTrader リングバッファとして 使用する場合はどうでしょうか。 Vitaliの例では、このような考え方ができるのです。しかし、(それにとって重要な)ループを回避する方法はないのです。いずれにしても、ループやArrayCopy関数を使って、リングバッファからインジケータバッファにデータを転送する必要があります。そして、何が変わるのか? JRandomTrader 2022.02.13 20:19 #18996 Mihail Matkovskij #:なんて素晴らしいアイデアなんだ誰が考え出し、どのように実用化したのか。スライディングウィンドウチャート専用に使うのはどうかと思いますが...。 誰が考え出したのか......キリがない、何度も再発明されていると思う、発想は至極当然である。 私などは、履歴が残らない、瞬間的な値しかないデータの移動平均を計算するのに使っています。 古くからデータ通信に利用されている。 JRandomTrader 2022.02.13 20:21 #18997 Mihail Matkovskij #:Vitaliの例では、このような考え方ができるのです。しかし、(それにとって重要な)ループを回避する方法はないのです。いずれにしても、ループやArrayCopy関数を使って、リングバッファからインジケータバッファにデータを転送する必要があります。そして、何が違うのでしょうか? 新しい値を挿入して、すぐに目的の場所からコピーできること。コピーサイクルは残りますが、シフトサイクルはありません。 Mihail Matkovskij 2022.02.13 20:25 #18998 Vitaly Muzichenko #:この製品は、私が所有することになりました。ただ、やはりArrayCopyの 動作は確認したいですね。 ArrayCopyでは、他のアレイからのデータ転送のみ可能です。でも、ずらすことはできません。リングバッファを使い、そこからデータをシフトする...。でも、円運動があるのに、どうやってArrayCopyで やるんだ...。理解できない。そして、原則的に理解する必要はありません。ループを使った通常の変位は、速度の面ではそれほど重要ではありません。少なくとも、私はもっと早いのを知らない。もっと速いのはアセンブラだけ?とにかく、そのままにしておいてください。きっとうまくいく。 Vitaly Muzichenko 2022.02.13 20:25 #18999 JRandomTrader #:新しい値を挿入して、正しい位置からすぐにコピーできること。コピーサイクルは残りますが、シフトサイクルはありません。 例をあげれば、それは バージョンアップ用の コードは Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам 2022.02.13www.mql5.com В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н... Vitaly Muzichenko 2022.02.13 20:28 #19000 Mihail Matkovskij #:ArrayCopyでは、他のアレイからのデータ転送のみ可能です。しかし、それをずらすことはできない。円形バッファを使い、そこからデータを転送する...。でも、ArrayCopyで円運動がある場合、どうしたらいいのか...。理解できない。そして、原則的に理解する必要はありません。ループを使った通常の変位は、速度の面ではそれほど重要ではありません。少なくとも、私はもっと早いのを知らない。もっと速いのはアセンブラか?とにかく、そのままにしておいてください。うまくいくよ。 今現在、コードは動作していますが、ループがあるためスピードに疑問があります。 どうするんですか? アービトラージ用のキッチンをテストしたいのですが、インジケータは値の差を描画し、100msごとにタイマーで実行されます。このような状況では、コードの実行遅延は致命的です。 1...189318941895189618971898189919001901190219031904190519061907...1953 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
なんて素晴らしいアイデアなんだ誰が考え出し、どのように実用化したのか。スライディングウィンドウチャート専用に使われているのか疑問ですが...。
なんて素晴らしいアイデアなんだ誰が考え出し、どのように実用化したのか。スライディングウィンドウチャート専用に使うのはどうかと思いますが...。
確かに、ロールバックできるデータの量を知っておくことは無理なことではありません。この円形バッファーは、長さが限られているため、「自分の足で踏んでいる」ことになるからです...。
ここでは、その方法をご紹介します。
この製品は、私が所有することになりました。
しかし、ArrayCopyが 機能するかどうかを確認したい。
---
グラフをちぎるのは気持ち悪いので、この方法にしました。
Vitaliの例では、このような考え方ができるのです。しかし、(それにとって重要な)ループを回避する方法はないのです。いずれにしても、ループやArrayCopy関数を使って、リングバッファからインジケータバッファにデータを転送する必要があります。そして、何が変わるのか?
なんて素晴らしいアイデアなんだ誰が考え出し、どのように実用化したのか。スライディングウィンドウチャート専用に使うのはどうかと思いますが...。
誰が考え出したのか......キリがない、何度も再発明されていると思う、発想は至極当然である。
私などは、履歴が残らない、瞬間的な値しかないデータの移動平均を計算するのに使っています。
古くからデータ通信に利用されている。
Vitaliの例では、このような考え方ができるのです。しかし、(それにとって重要な)ループを回避する方法はないのです。いずれにしても、ループやArrayCopy関数を使って、リングバッファからインジケータバッファにデータを転送する必要があります。そして、何が違うのでしょうか?
新しい値を挿入して、すぐに目的の場所からコピーできること。コピーサイクルは残りますが、シフトサイクルはありません。
この製品は、私が所有することになりました。
ただ、やはりArrayCopyの 動作は確認したいですね。
ArrayCopyでは、他のアレイからのデータ転送のみ可能です。でも、ずらすことはできません。リングバッファを使い、そこからデータをシフトする...。でも、円運動があるのに、どうやってArrayCopyで やるんだ...。理解できない。そして、原則的に理解する必要はありません。ループを使った通常の変位は、速度の面ではそれほど重要ではありません。少なくとも、私はもっと早いのを知らない。もっと速いのはアセンブラだけ?とにかく、そのままにしておいてください。きっとうまくいく。
新しい値を挿入して、正しい位置からすぐにコピーできること。コピーサイクルは残りますが、シフトサイクルはありません。
例をあげれば、それは
バージョンアップ用の コードは
ArrayCopyでは、他のアレイからのデータ転送のみ可能です。しかし、それをずらすことはできない。円形バッファを使い、そこからデータを転送する...。でも、ArrayCopyで円運動がある場合、どうしたらいいのか...。理解できない。そして、原則的に理解する必要はありません。ループを使った通常の変位は、速度の面ではそれほど重要ではありません。少なくとも、私はもっと早いのを知らない。もっと速いのはアセンブラか?とにかく、そのままにしておいてください。うまくいくよ。
今現在、コードは動作していますが、ループがあるためスピードに疑問があります。
どうするんですか?
アービトラージ用のキッチンをテストしたいのですが、インジケータは値の差を描画し、100msごとにタイマーで実行されます。このような状況では、コードの実行遅延は致命的です。