含み損に耐えられなくなった時のためのインジケーターを作る

含み損に耐えられなくなった時のためのインジケーターを作る

サムネ
こんにちは fx-on.comエンジニアの岩淵です。 含み損が大きくなると、チャートを見るのが嫌になりますよね~ そうなる前に損切りしろよって? それができたら苦労はしないです。 今日は含み損を眺めるのが嫌になった人のためのインジケーターを開発するお話です。

仕様

1.含み損が一定以上になったら、チャート上にメッセージボックスを表示する。 2.MT4を終了していいか尋ねる。 3.OKならMT4を終了 4.Cancelならインジケータをチャートから外す

問題発生

MQL4でメッセージボックスを表示してユーザーに選択を迫るには、 MessageBox関数を使えば実現できます。 しかしこの関数には1つ問題が・・・ EAでは使えるけどインジケーターでは使えない関数なのです。

解決方法

Includeフォルダにデフォルトで入っている、WinUser32.mqhを読み込みましょう。 このファイルはPCに入っているuser32.dllというファイル内の関数をインポートしています。 インポートされた関数の中に、MessageBoxW関数が存在します。 この関数を呼び出すことで、インジケーターからもメッセージボックスを表示することが可能です。 最初はこの方法に気づかなかったため、 オブジェクトの組み合わせで無理矢理似たようなUIを作ろうとして挫折しました・・・

実装

インジケーターファイルとして「Akirameyou.mq4」を作成して実装していきます。 最終的なコードは次の様になります。
#property strict
#property indicator_chart_window

#include <WinUser32.mqh>

extern double Loss = -10000; //含み損限界値

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[])
  {

   if(AccountProfit() < Loss){
      string text = "含み損が"
                  + DoubleToString(Loss, 0)
                  + AccountCurrency()
                  + "を超えました。"
                  + "\n"
                  + "現在"
                  + DoubleToString(AccountProfit(), 0)
                  + AccountCurrency()
                  + "です。"
                  + "\n"
                  + "諦めてMT4を終了しますか?";
      int mb = MessageBoxW(0, text, MQLInfoString(MQL_PROGRAM_NAME), MB_OKCANCEL);
      if(mb == IDOK){
         ChartIndicatorDelete(0, 0, "Akirameyou");
         TerminalClose(0);
      }
      else ChartIndicatorDelete(0, 0, "Akirameyou");
   }

   return(rates_total);
}
Akirameyouインジケーターの実行結果 実際にこんな感じで表示されます。

解説

パラメータとして含み損の限界値を設定していただき、 現在の含み損益がパラメータの値以下になったらメッセージボックスを表示します。
if(AccountProfit() < Loss){
   //省略
   //含み損が限界を超えた場合の処理
}
メッセージボックスは、MessageBoxW関数で表示しますが、これを使用するためにはWinUser32.mqhを読み込んでおきます。
#include <WinUser32.mqh>
メッセージボックスに表示する文言を作成して表示します。 先頭に引数が1つ増えたこと以外は、MQL4のMessageBox関数と同じような使い方です。 第2引数にメッセージボックス内に表示する文言、 第3引数にメッセージボックのタイトル、 第4引数に選択肢となるボタンを設定します。 今回はOKボタンとCancelボタンを使用しました。 より詳しい情報はこちらを参照して下さい。 https://www.mql5.com/en/docs/constants/io_constants/messbconstants#messageboxflags
string text = "含み損が"
                  + DoubleToString(Loss, 0)
                  + AccountCurrency()
                  + "を超えました。"
                  + "\n"
                  + "現在"
                  + DoubleToString(AccountProfit(), 0)
                  + AccountCurrency()
                  + "です。"
                  + "\n"
                  + "諦めてMT4を終了しますか?";
      int mb = MessageBoxW(0, text, MQLInfoString(MQL_PROGRAM_NAME), MB_OKCANCEL);
メッセージボックスで押されたボタンがOKであれば、TerminalClose関数を利用してMT4を終了しています。
TerminalClose(0);
再度立ち上げた時にまたメッセージボックスが開くと邪魔なので、終了前にこのインジケーターを外しておきます。 OKが押されなかった場合も、インジケーターを外して再度メッセージボックスが開くのを防いでいます。 ChartIndicatorDelete関数にチャートの情報と削除したいインジケーター名を渡してあげればOKです。
ChartIndicatorDelete(0, 0, "Akirameyou");

まとめ

インジケーターファイルでもメッセージボックスを表示する方法をご紹介しました。 WinUser32.mqhを読み込むことで、 他にも様々ななんのために使うのかわからない便利な関数を読み込むことができます。 興味のある方は調べてみてください。
GogoJungle Corporation
Registration Number for Financial Instruments Business: No. 1960 - Kanto Finance Bureau (Gold Trading)
A member of General Incorporated Association and Japan Investment Advisers Association
GogoJungle Corporation
Registration Number for Financial Instruments Business:
No. 1960 - Kanto Finance Bureau (Gold Trading)
A member of General Incorporated Association
Japan Investment Advisers Association
Financial Services AgencyJapan Investment Advisers AssociationFinancial Instruments Mediation Assistance CenterSecurities and Exchange Surveillance Commission

Copyright © 2025 GogoJungle Inc. All Rights Reserved.