見出し画像

【MQL4】チャート間で、水平線やフィボナッチ等のオブジェクトを同期するインジケータのソースコード



はじめに

 MT4の同一通貨ペアのチャート間で、水平線やフィボナッチ等のオブジェクトを同期(コピー)するインジケータのソースコードを公開します。
Windows版のMT4でのみ動作を確認していますのでご注意ください。

免責事項

 ソースコードの使用はご自身の責任で行ってください。本ソースコードの使用によって生じた損害等についての責任は一切負いません。著作権は筆者に帰属し、商用利用や再配布は禁止します。

対象となる読者

 自分でMQLでEAを作成したことのある方や、MQLを学習中の方を対象としています。

機能の概要

 インジケータを適用したチャートでの、オブジェクトの追加、移動、変更を検知して、同じ通貨ペアのチャートにコピーします。同期ボタンをON(緑色)にした状態での操作を他のチャートにコピーするようにしていますので、コピーしたくないものについては、同期ボタンをOFFした状態でオブジェクトの操作を行ってください。
 その他、下の画像の右側のチャートにも本インジケータを適用すれば逆方向の同期も有効になります。
 

同期ボタン(ONの状態)
同期の様子

 同期対象のオブジェクトは、下の設定画面にある種類になります。
種類毎に同期のON/OFFを切り替えることもできます。

設定画面

コードの説明

チャートイベントの検知

 チャートに水平線等のオブジェクトを新規に引いた場合や、移動させた場合、色を変更したなどの場合には、インジケータ内で、それらのイベントを検知することができます。
 チャートへの操作が行われた場合に、OnChartEvent関数呼び出されます。
OnChartEventの引数にイベントの種類や対象のオブジェクトの名前等の情報が入っていますので、引数の値を判断してオブジェクトの同期処理を行っています。

//+------------------------------------------------------------------+
//| チャートイベント                                                      
//+------------------------------------------------------------------+
void OnChartEvent(
                 const int     id,      // イベントID
                 const long&   lparam,  // long型イベント
                 const double& dparam,  // double型イベント
                 const string& sparam)  // string型イベント
{
   // ボタン押下イベント
   if(id == CHARTEVENT_OBJECT_CLICK){      
      // 同期ボタン押下?
      if(sparam == BtnNameSync){      
         PushBtnSync();
      }
   }      
   
   int x = 0;
   int y = 0;

   //オブジェクト新規作成 
   if( id == CHARTEVENT_OBJECT_CREATE) {    
      if(StringFind(sparam, const_Pref, 0) == 0){
      }else{
         if(CheckSyncType(sparam)){
            //同期中?
            if(BtnSyncOnOff){
               Print("CHARTEVENT_OBJECT_CREATE");
               //名前を変更
               ObjectSetString(0, sparam, OBJPROP_NAME, const_Pref + sparam);
               //コピー処理
               CopyObject(true, const_Pref + sparam);
            }
         }
      }
   //オブジェクト移動、変更
   }else if(id == CHARTEVENT_OBJECT_DRAG || id == CHARTEVENT_OBJECT_CHANGE){
      //同期中?
      if(BtnSyncOnOff){
         //コピー処理
         CopyObject(false, sparam);
      }
   //オブジェクト削除
   }else if(id == CHARTEVENT_OBJECT_DELETE){
      //削除処理
      DeleteObject(sparam);
   }
   
   //オブジェクト作成イベント通知を有効にする
   ChartSetInteger(0, CHART_EVENT_OBJECT_CREATE, true);
   //オブジェクト削除イベント通知を有効にする
   ChartSetInteger(0, CHART_EVENT_OBJECT_DELETE, true);

}

オブジェクトのコピー

 オブジェクトのコピーは、オブジェクトの作成と、オブジェクトの属性のコピーによって行うことができます。
 新規に水平線を引いた場合は、オブジェクトの作成と、属性のコピーを行います。水平線を移動した場合には、属性のコピーのみを行います。

ここから先は

31,968字 / 1ファイル

¥ 990

この記事が気に入ったらチップで応援してみませんか?