MQL4 ボタンのドラッグ

MQL4の標準ライブラリにあるCAppDialog(ダイアログ)にボタンを載せると、マウスでドラッグして動かせるボタンが簡単に作れます。

ボタン(CButton)単体をドラッグ対応にするのは手間がかかりますが、ダイアログはタイトルバーをつかんで動かす機能を最初から持っているためです。

[PR]


ボタンのドラッグ

やることは次の3つだけです。

  • ボタンをダイアログに Add() する
  • OnChartEvent() の中でダイアログの ChartEvent() を呼ぶ(これでドラッグと最小化が動きます)
  • OnDeinit() でダイアログの Destroy() を呼ぶ(EAを外したときにチャートに残さないため)

CAppDialogは、MT4のデータフォルダ内にある MQL4\Include\Controls\Dialog.mqh に定義されています。

本格的に作るならCAppDialogを継承した専用クラスを作るのが定番ですが、この記事では仕組みをつかみやすくするため、継承せずにCAppDialogをそのまま使います。

 

Dialog作成

まずはダイアログを作り、その中にボタンを1つ載せます。

ボタンの座標(10, 10)は、チャート上の位置ではなくダイアログの中での位置として扱われます。

ダイアログの中にボタンを載せたUIができました。

ただし、このコードには OnChartEvent() がないため、まだドラッグはできません。次のサンプルで対応します。

 

サンプルコード(ドラッグ対応)

ボタンをクリックすると、MT4のターミナルの「エキスパート」タブに「Button Pressed」と表示されるようにします。

OnChartEvent() の中で testDialog.ChartEvent() を呼ぶと、ダイアログのドラッグと最小化ができるようになります。

ダイアログのサイズをボタンに合わせたので、ボタンだけのダイアログになりました。タイトルバーをつかむと、ボタンごと好きな位置へ動かせます。

 

トレードパネルへの展開

ダイアログにボタンを増やしていけば、トレードパネルのように展開できます。

 

注意点とつまずきやすいところ

  • ドラッグできない、最小化・閉じるボタンが反応しない
    OnChartEvent() の中で ChartEvent() を呼んでいるか確認してください。これを呼ばないと、ダイアログはマウス操作を受け取れません。
  • EAを外してもパネルが残る
    OnDeinit() で Destroy(reason) を呼んでいないと、ダイアログやボタンのオブジェクトがチャートに残ることがあります。
  • ボタンの名前は重複させない
    Create() に渡した名前(例: “TestButton”)は、チャート上のオブジェクト名としても使われます。クリック判定もこの名前で行うので、他のオブジェクトと被らない名前にしてください。
  • 作成の失敗に気づけるようにする
    サンプルでは省略していますが、実際に使うときは if(!testDialog.Create(...)) return(INIT_FAILED); のように、Create() の戻り値を確認しておくと安心です。
  • ボタンが増えてきたら継承する
    ボタンが多くなると OnChartEvent() の中の条件分岐が長くなります。その場合は、CAppDialogを継承したクラスを作り、EVENT_MAP_BEGIN ~ ON_EVENT でクリック処理を書く方法が見通しやすくなります(MetaQuotesの公式サンプル「Controls」もこの書き方です)。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする