記事"MQL5 クックブック: 価格の乖離を分析するマルチシンボルインジケーターの開発"についてのディスカッション

 

新しい記事 MQL5 クックブック: 価格の乖離を分析するマルチシンボルインジケーターの開発 はパブリッシュされました:

この記事では、特定の期間における価格の分離を分析するためのマルチシンボルインジケーターの開発を紹介します。そのトピックは、「MQL5クックブック:MQL5のマルチシンボルボラティリティインジケーターの開発」と いうマルチカレンシーインジケーターのプログラミングに関する以前の記事にてすでに紹介されています。なので、今回は新しい特徴や劇的に変更された機能に ついてのみ紹介します。マルチカレンシーインジケーターのプログラミングに詳しくなければ、以前の記事をまずお読みいただくことをお勧めします。

「Vertical Line」モードにおける週間タイムフレーム

この記事では以下の質問に答えていきます。

  • チャートの属性の変更
  • CHARTEVENT_OBJECT_DRAG(チャートオブジェクトのドラッグ)とCHARTEVENT_CHART_CHANGE (チャートのサイズの再調整と、プロパティダイアログウィンドウを用いたチャートの属性の修正) などのイベントのハンドリング
  • 一色以上を用いたインジケーターバッファーの描画
  • チャートのHigh・Lowを設定するために視覚可能範囲におけるインジケーターバッファーのHigh・Lowを定義します。
  • シリーズの反転

作者: Anatoli Kazharski

 

単なるタイプミスでしょうか?

何度やっても、「コピー部隊」の関数はすべてゼロを返さず、-1か>0しか返さない。

//+------------------------------------------------------------------+
//| 全文字の使用可能なデータ数をチェックする。
//+------------------------------------------------------------------+
bool CheckAvailableData()
  {
   int attempts=100;
   
//---
   for(int s=0; s<SYMBOLS_COUNT; s++)
     {
      //--- もしそのような文字があれば
      if(symbol_names[s]!=empty_symbol)
        {
datetime time[];                    // バーの数をチェックする配列
   int      total_period_bars   =0;    // 現在の期間のバーの数
   datetime terminal_first_date =NULL; // 端末で現在の期間の利用可能なデータの最初の日付
         //--- ターミナルで現在の期間データの最初の日付を取得する
         terminal_first_date=(datetime)SeriesInfoInteger(symbol_names[s],Period(),SERIES_TERMINAL_FIRSTDATE);
         //--- 指定された日付から利用可能なバーの数を取得する
         total_period_bars=Bars(symbol_names[s],Period(),terminal_first_date,TimeCurrent());
         //--- これらのバーの準備状況をチェックする。
         for(int i=0; i<attempts; i++)
           {
            //--- 指定されたデータ量をコピーする
            if(CopyTime(symbol_names[s],Period(),0,total_period_bars,time))
              {
               //--- 必要な量がコピーされたら、ループを止める
               if(ArraySize(time)>=total_period_bars)
                  break;
              }
           }
         //--- コピーされたデータが少なければ、もう一度試行しなければならない。
         if(ArraySize(time)==0 || ArraySize(time)<total_period_bars)
           {
            msg_last=msg_prepare_data;
            ShowCanvasMessage(msg_prepare_data);
            OC_prev_calculated=0;
            return(false);
           }
        }
     }
//--- 価格差の起点が縦線モードの場合、終了する。
   if(StartPriceDivergence==VERTICAL_LINE)
      return(true);
   else
     {
      datetime time[];                    // バーの数をチェックする配列
      int      total_period_bars   =0;    // 現在の期間のバーの数
      datetime terminal_first_date =NULL; // 端末で現在の期間の利用可能なデータの最初の日付
      //--- ターミナルで現在の期間データの最初の日付を取得する
      for(int i=0; i<attempts; i++)
         if((terminal_first_date=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_FIRSTDATE))>0)
            break;
      //--- 指定された日付から利用可能なバーの数を取得する
      for(int i=0; i<attempts; i++)
         if((total_period_bars=(int)SeriesInfoInteger(Symbol(),timeframe_start_point,SERIES_BARS_COUNT))>0)
            break;
      //--- これらのバーの準備状況をチェックする。
      for(int i=0; i<attempts; i++)
         //--- 指定されたデータ量をコピーする
         if(CopyTime(Symbol(),timeframe_start_point,
            terminal_first_date+PeriodSeconds(timeframe_start_point),TimeCurrent(),time)>0)
            break;
      //--- コピーされたデータが少なければ、もう一度試行しなければならない。
      if(ArraySize(time)<=0 || total_period_bars<=0)
        {
         msg_last=msg_prepare_data;
         ShowCanvasMessage(msg_prepare_data);
         OC_prev_calculated=0;
         return(false);
        }
     }
//---
   return(true);
  }
 
Fleder:

単なるタイプミスなのだろうか?

何度やっても、「コピー班」の関数はすべてゼロを返さず、-1か>0しか返さない。

一般的には>0を 返すべきだが、この場合はその後のチェックで返さないこともできる。
 
tol64:
しかしこの場合、その後のチェックで>0に しないこともできる。

しかし、この式は常に真となる:

if(CopyTime(symbol_names[s],Period(),0,total_period_bars,time))
 
Fleder:

しかし、この式は常に真になる:

ifを 全く取り除いても構わない。この場合は重要ではない。
 
tol64:
もしそうなら、 それを取り除いてもいい。この場合、それは重要ではない。
まあ、そういうことだ。)
 

一般的に、シンボルのヒストリカルデータのロードは、ヘルプに 書かれているようには行われません。

実際には次のようになる:

mql5プログラムから、たとえば関数CopyTimeを使用して、ある時系列のデータの要求があり、そのデータがターミナルにない(まだロードされていない)場合、ターミナルはデータをダウンロードします。

このデータがターミナルにない(まだロードされていない)場合、ターミナルは要求された量(ヘルプの例では100本)ではなく、サーバーからこのデータをダウンロードする、

しかし、"Max bars in chart" (チャート内の最大バー数) パラメータによって RAM に "配置" できる数だけ、必要な時系列のバーをダウンロードします。

例えば PERIOD_W1 の ような高い期間のバーを1本だけリクエストしても、履歴全体がサーバーからダウンロードされるので 十分です

 
Fleder:

一般的に、シンボルのヒストリカルデータのロードは、ヘルプに 書かれているようには行われません。

実際には次のようになる:

mql5プログラムから、たとえば関数CopyTimeを使用して、ある時系列のデータの要求があり、そのデータがターミナルにない(まだロードされていない)場合、ターミナルはデータをダウンロードします。

このデータがターミナルにない(まだロードされていない)場合、ターミナルは要求された量(ヘルプの例では100本)ではなく、サーバーからこのデータをダウンロードする、

しかし、"Max bars in chart" (チャート内の最大バー数) パラメータによって RAM に "配置" できる数だけ、必要な時系列のバーをダウンロードします。

履歴全体がサーバーからダウンロードされるため、例えばPERIOD_W1の ような高い期間のバーを1本だけリクエストすれば十分です

ヘルプには何を書いてもよい。自由にやってください。;)

ヘルプにある例は、別の記事「他のプログラム用にMetaTrader 5のクォートを準備する方法 >>」で 説明されています。

 
tol64:

証明書はあなたが望むことを何でも言うことができる。あなたの好きなようにすればいい。;)

ヘルプの例は、別の記事「他のプログラム用にMetaTrader 5のクォートを準備する方法 >>」で 説明されています。

私がやったのはこれです。私はちょうどあなたのコードでサーバーからの残りの「アンロードされたバー」の計算を見ました。

そして、私は考えました - ターミナルは気にしない、それは形成するために必要なだけポンプします。

 

記事の最後に「このインジケーターは、より良い方向に無限に発展させることができる」と書かれていますね。

私の意見では、価格乖離の考察は人間の目にはほとんど役に立ちません。人間はロボットではありません!

しかし、ロボットにとっては興味深いトピックです。

あなたはいくつかのレンダリングオプションを提案している:

1. ラインから。

2."日"。

私は現在、"週 "モードでのみ、似たようなものに取り組んでいます。

 
Fleder:

記事の最後に「このインジケーターは、より良い方向に無限に発展させることができる」と書かれていますね。

私の意見では、価格乖離の考察は人間の目にはほとんど役に立ちません。人間はロボットではありません!

しかし、ロボットにとっては興味深いトピックです。

あなたはいくつかのレンダリングオプションを提案している:

1. ラインから。

2."日"。

私は現在、"週 "モードのみで、似たようなことに取り組んでいます。

他の問題に対処しているので、すぐに何か書けるかどうかはわからない。しかし、この記事によれば、開発はまだ多通貨計算と、その計算のキャンバス上での視覚化にあるはずだった。

そう、人間はロボットではないのだ。しかし、時には研究対象を他の方法で見てみることも必要なのだ。;)