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

こんにちは
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);
}
実際にこんな感じで表示されます。
解説
パラメータとして含み損の限界値を設定していただき、 現在の含み損益がパラメータの値以下になったらメッセージボックスを表示します。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");



