皆さん、ミーでございます。
自作サインツールを作る際、アラート機能って欲しくなりますよね。今までご紹介してきた自作サインツールは、インジケーターを使用してサインを出すものでしたが、今回は、アラート機能を実装したサインツールの作り方についてご紹介します。
サインツールの作成が初めてという方は、以下の記事を読んでから見ていただけると更に分かり易いです。
アラート機能とは
アラート機能は以下のような画面を出すものですね。アラート機能はその名の通り、ちゃんと音が発生します。
MT4のデフォルトだと、ピコーンといった感じの音ですかね(笑)
アラート画面には、色々な情報を表示させることが可能ですが、サインツールで一般的なものとしては、通貨と時間軸、そしてHigh/Lowエントリーの表示を行うものが多いですね。
もしピコーンという音じゃなくて、別の音を表示させたい場合は、MT4の「ツール」→「オプション」を選択してオプション画面を表示し、その中にある「音声設定」タブで設定を行います。この「音声設定」タブではMT4で使用している様々な音の変更が可能となり、一覧の中にある「Alert」という項目のファイル名を変更する事でアラート時の音を変更することが出来ます。ただしこの変更はMT4の全てのアラート音が対象となり、プログラムごとにアラート音を変更することは出来ませんので、ご注意を。
アラート機能の実装方法
アラート機能の実装方法について説明しますね。
使用するMQL4の関数は、「Alert」です。
void Alert( argument, // 最初の値 ... // 他の値 );
Alert関数はパラメーターの数が固定じゃありません。なので、
Alert(“H”,”i”,”g”,”h”);
みたいな感じで、カンマを付けることで、複数の文字列を指定することが可能です。
アラート機能の実装で気を付けること
アラート機能は「Alert」で簡単に実現できるのですが、注意が必要です。
①音が鳴りっぱなしになる対策をすること
何も考えずに、「Alert」を使用すると、ピコーン、ピコーンと鳴りっぱなしになりますし、たまにMT4が固まります。
あと気を付けたいこととしては、通常サインツールは、サインが確定するまで表示されたり消えたりします。サインが表示される度はアラートを出していては、これもピコーン、ピコーンと鳴りっぱなしになりますので、一度表示したアラートは、次のエントリー(ローソク足の本数が増える)まで、アラートを出さない工夫も結構重要です。
②日本語が表示できません!
Alert関数の引数に日本語(マルチバイト文字)を指定した場合、文字化けが発生するため内容を正しく表示することが出来ません。Alert関数の引数に指定する文字は半角英数字のみで構成するようにしましょう。
アラート機能のサンプル
アラート機能で気を付けることもお分かりいただけたと思います。
サンプルとして、
①アラート機能のON/OFFを指定できる
②RSIの条件を満たした場合にサインとアラートを出力
③次のエントリーの足までアラートを出さない
のプログラムを準備しましたので、コピーしてお使いください。
#property indicator_chart_window extern bool AlertON = true; extern int RSI_Period= 5; extern double RSI_High = 60.0; extern double RSI_High_prev= 55.0; extern double RSI_Low = 35.0; extern double RSI_Low_prev= 40.0; double DrawReverseLowBuffer[]; double DrawReverseHighBuffer[]; static datetime time = Time[0]; static int alertFlag = 0; int init() { SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1,clrMagenta); SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1,clrRed); SetIndexArrow(0,234); SetIndexArrow(1,233); SetIndexBuffer(0,DrawReverseLowBuffer); SetIndexBuffer(1,DrawReverseHighBuffer); return(INIT_SUCCEEDED); } int start() { int counted_bars=IndicatorCounted(); int limit = Bars - counted_bars; double iResultRSI,iResultRSI_prev; int signLevel; for (int i=limit-1;i>=0;i--){ signLevel = 0; if(i == 0){ DrawReverseLowBuffer[i] = EMPTY_VALUE; DrawReverseHighBuffer[i] = EMPTY_VALUE; } // RSIの判定 iResultRSI = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i); iResultRSI_prev = iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i+1); if(iResultRSI_prev < RSI_High_prev && iResultRSI >= RSI_High){ signLevel = 1; DrawReverseLowBuffer[i]=High[i]; } else if(iResultRSI_prev > RSI_Low_prev && iResultRSI <= RSI_Low){ signLevel = 1; DrawReverseHighBuffer[i]=Low[i]; } // アラート表示 if(AlertON && i == 0 && signLevel >= 1 && alertFlag == 0){ alertFlag = 1; if (DrawReverseHighBuffer[i] != 0.0) { Alert("High Symbol=",Symbol()," Period=",Period()); } else { Alert("Low Symbol=",Symbol()," Period=",Period()); } } } if(Time[0] != time){ time = Time[0]; alertFlag = 0; } return(0); }
ポイントのみ説明を行います。
extern bool AlertON = true;
アラート機能を使うかどうかを指定するものです。
static datetime time = Time[0]; static int alertFlag = 0;
アラート鳴りっぱなし防止で使用する変数です。
// アラート表示 if(AlertON && i == 0 && signLevel >= 1 && alertFlag == 0){ alertFlag = 1; if (DrawReverseHighBuffer[i] != 0.0) { Alert("High Symbol=",Symbol()," Period=",Period()); } else { Alert("Low Symbol=",Symbol()," Period=",Period()); } }
アラートの実装部分です。AlertON が指定されていて、「i==0」は最新のローソク足の場合、そして、alertFlag が「0」のときです。
以下のようなアラートが出ますよ!
alertFlagが「1」のときは、既にアラートを一度表示していますので、次のローソク足が表示される間はアラートを表示させないようにしています。これがアラート鳴りっぱなしの対策です。
if(Time[0] != time){ time = Time[0]; alertFlag = 0; }
最新のローソク足の時間が変わったら、今の最新の時間を保存しておき、alertFlag を「0」に戻します。
アラートを出す方法は簡単なのですが、以外に考えないといけないことも多いですよね。
コメントを残す