記事"1つのツールで複数のチャートを異なる時間枠で同期させる"についてのディスカッション

 

新しい記事 1つのツールで複数のチャートを異なる時間枠で同期させる はパブリッシュされました:

取引の決定を行う際に、取引の過程で複数の時間枠でチャートを同時に分析する必要があることが多々あります。また、チャート上にはグラフィック分析のオブジェクトがあるため、すべてのチャートに同じオブジェクトを適用するのは不便です。この記事では、チャート上のオブジェクトの複製の自動化をご紹介したいと思います。

上記をすべて考慮した上で、私はプログラムの実施のために2番目の方法を選びました。このようにして、インジケータの作業は2つのブロックに分けることができます。

  1. インジケータが起動すると、開いているチャートがシンボルでフィルタリングされます。対応するツールの開いているチャート上にインジケータがあるかどうかがチェックされます。現在のチャートのすべてのオブジェクトが、選択したチャートに複製されます。
  2. 初期化プロセスのチャート

  3. チャートイベントの処理。グラフィックオブジェクトの作成または変更のイベントが出現すると、プログラムはチャートから変更されたオブジェクトに関する情報を読み取り、以前に作成されたリストのすべてのチャートにこのデータを転送します。

作者: Dmitriy Gizlyk

 
特にテクニカル分析を使用し、異なるチャートに多くのオブジェクトを作成する人にとっては、良い記事です。このトピックのさらなる発展として、異なるチャート上で作成されたインディケータを同期させることが可能です。唯一の疑問は、そのような作業が適切かどうかということだ。おそらく、同じパラメーターを持つインジケーターを 別のタイムフレームに移す 必要はなく、変更する必要があるのでしょう。また、クローンから「バインドを解除」する機能も便利だと思います。
 
つまり、ある時間枠で追加されたサポートは、他のすべての時間枠のチャートに表示される。
 
Tapani:
つまり、ある時間枠に追加された支持線が、他の時間枠のチャートすべてに表示されるようにしたいのです。


チャート上にどのようにレジスタンス・レベルを追加しましたか?水平線や長方形のボックスのようなものですか?

 

特定のタイプのオブジェクトだけをクローンし、残りは無視する方法はありますか?また、オブジェクトの可視性プロパティも クローンしたいのですが、クローンしたオブジェクトの可視性設定はコピーされず、他のチャートで再度手動で設定する必要があるようです。

ありがとうございました。

 
yousurfer:

特定のタイプのオブジェクトだけをクローンし、残りは無視する方法はありますか?また、クローンされたオブジェクトの可視性設定はコピーされず、他のチャートで再度手動で設定する必要があるようですが、オブジェクトの可視性プロパティも クローンするにはどうすればよいでしょうか?

ありがとうございました。


オブジェクトをいくつかのプロパティで選択したい場合、この関数に追加することができます。

string CCopyObject::CreateMessage(long chart)
  {
   string result = NULL;
   int total = ObjectsTotal(chart, 0);
   for(int i=0;i<total;i++)
     {
      string name = ObjectName(chart, i, 0);
//
// if(!( コピーするオブジェクトのプロパティをチェック) ) // このオブジェクトをコピーしたくない場合
// 続ける;// 次のオブジェクトに移動する
//
      switch((ENUM_OBJECT)ObjectGetInteger(chart,name,OBJPROP_TYPE))
        {
         case OBJ_HLINE:
           result+="{NAME="+name+"|TYPE="+IntegerToString(OBJ_HLINE)+"|"+HLineToString(chart, name)+"}";
           break;
         case OBJ_VLINE:
           result+="{NAME="+name+"|TYPE="+IntegerToString(OBJ_VLINE)+"|"+VLineToString(chart, name)+"}";
           break;
         case OBJ_TREND:
           result+="{NAME="+name+"|TYPE="+IntegerToString(OBJ_TREND)+"|"+TrendToString(chart, name)+"}";
           break;
         case OBJ_RECTANGLE:
           result+="{NAME="+name+"|TYPE="+IntegerToString(OBJ_RECTANGLE)+"|"+RectangleToString(chart, name)+"}";
           break;
        }
     }
   return result;
  }


Dmitriy.

 
MT4用のものを作っていただけませんか?できれば、オブジェクトによるフィルタリング(水平方向のみクローン、トレンド方向のみクローン...)があるとよいのですが。
 

例えば、描画されたばかりの正方形が他のチャートに 5~10秒遅れて表示されます。何が原因でしょうか?

ありがとうございます!

 
Kofa:
MT4用のものを作ってもらえませんか?できれば、オブジェクトのフィルタリング(水平方向のみクローン、トレンドのみクローン...) MT4用にも似たようなものがありますが、コードが閉じられており、フィルタを追加することができません。

MT4で使用するには、インジケータファイルの拡張子をmq5からmq4に変更し、インジケータを再コンパイルすれば十分です。
オブジェクトのフィルタリングを追加するには、パラメータを追加する必要があります。

sinput bool    CloneHLine     =  true;
sinput bool    CloneVLine     =  true;
sinput bool    CloneTrend     =  true;
sinput bool    CloneRectangle =  true;

を追加し、CheckToClone 関数を追加してOnChartEvent を 修正する必要があります。

//+------------------------------------------------------------------+
//| チャートイベント機能|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   string message1=NULL;
   string message2=NULL;
   int total=0;
//---
   switch(id)
     {
      case CHARTEVENT_OBJECT_CHANGE:
      case CHARTEVENT_OBJECT_CREATE:
      case CHARTEVENT_OBJECT_DRAG:
        if(!CheckToClone(sparam))
           return;
        message1=CloneObjects.CreateMessage(l_Chart,sparam,0);
        message2=CloneObjects.CreateMessage(l_Chart,sparam,1);
        total=ArraySize(ar_Charts);
        for(int i=0;i<total;i++)
          {
           EventChartCustom(ar_Charts[i],(ushort)id,0,0,message1);
           EventChartCustom(ar_Charts[i],(ushort)id,0,0,message2);
          }
        break;
//---
      case CHARTEVENT_OBJECT_DELETE:
        if(!CheckToClone(sparam))
           return;
        total=ArraySize(ar_Charts);
        for(int i=0;i<total;i++)
           EventChartCustom(ar_Charts[i],(ushort)id,0,0,sparam);
        break;
//---
      case CHARTEVENT_CUSTOM + CHARTEVENT_OBJECT_CHANGE:
      case CHARTEVENT_CUSTOM + CHARTEVENT_OBJECT_CREATE:
      case CHARTEVENT_CUSTOM + CHARTEVENT_OBJECT_DRAG:
        CloneObjects.DrawObjects(l_Chart,sparam);
        ChartRedraw(l_Chart);
        break;
//---
      case CHARTEVENT_CUSTOM + CHARTEVENT_OBJECT_DELETE:
        if(!CheckToClone(sparam))
           return;
        ObjectDelete(l_Chart,sparam);
        ChartRedraw(l_Chart);
        break;
     }
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool CheckToClone(string name)
  {
  bool result = false;
   
   if(l_Chart>=0 && ObjectFind(l_Chart,name)==0)
     {
      switch((ENUM_OBJECT)ObjectGetInteger(l_Chart,name,OBJPROP_TYPE))
        {
         case OBJ_HLINE:
           result=CloneHLine;
           break;
         case OBJ_VLINE:
           result=CloneVLine;
           break;
         case OBJ_TREND:
           result=CloneTrend;
           break;
         case OBJ_RECTANGLE:
           result=CloneRectangle;
           break;
        }
     }
   return result;
   }
 
XDiavel:

例えば、描画されたばかりの正方形が他のチャートに 5~10秒遅れて表示されます。原因は何でしょうか?

ありがとうございました!

こんにちは。

インジケーターは1つのスレッドで動作し、ターミナルに多数のインジケーターがあると動作が遅くなります。さらに、グラフィカルな要素を扱うことは、ターミナルにとってかなり労働集約的です。多数のチャートで使用する場合は、機能を損なうことなく、プログラムをExpert Advisorに再フォーマットすることをお勧めします。ただし、Expert Advisorと分析を同時に使わない場合に限る。というのも、ターミナルには1つのチャートにつきExpert Advisorは1つまでという制限があるからだ。

 
Dmitriy Gizlyk:

MT4で使用するには、インジケータファイルの拡張子をmq5からmq4に変更し、インジケータを再コンパイルするだけです。


迅速なご回答とご協力ありがとうございました。ChartIndicatorGet、CloneAllObjectsなどの関数はmq4ではサポートされていません。一般的に、コンパイル時に9つのエラーが発生します。プログラミングの知識はゼロです。よろしくお願いします。