トップ  >  リファレンス  >  基本  >  関数  >  イベント関数
スポンサーリンク
検索
カスタム検索
リファレンスツリー
オススメ
イベント関数


mql4言語にはいくつかあらかじめ定義されたイベント処理があります。
このイベントを使う為の関数はmql4プログラムで定義しなければなりません。

関数名、戻り値型、引数の構成は、イベントハンドラ関数の記述に厳密に従わなればなりません。

クライアントターミナルのイベントハンドラは、
戻り値型と引数の型によって、イベントハンドラ関数を確認します。

引数の記述が異なっている場合、
または、対応する関数が指定された条件と一致しない、
または、他の戻り値型が記述されている場合、
その様な場合は関数がイベントハンドラとして使われません。

OnStart

OnStart()関数はstartイベントハンドラです。
スクリプト実行のためだけに使われ、自動的に発生します。
引数無し、戻り値はvoid型(またはint型)である必要があります。



書式:
void OnStart();




OnInit

OnInit関数はInitイベントハンドラです。
引数無し、戻り値はvoid型(またはint型)である必要があります。


書式:
void OnInit();




Initイベントは、EAまたはインジケータがダウンロードされた直後に発生します。
OnInit()関数は初期化の為に使用されます。

OnInit()が戻り値にint型を持つ場合、ゼロ以外の戻り値は初期化失敗を意味します。
それはREASON_INITFAILEDで定義されたコードで、Deinitイベントを発生させます。

#property strictを使用してプログラムをコンパイルすると、
OnInit()関数の実行結果は、ターミナル実行サブシステムによって分析されます。


EAの入力パラメータを最適化するには、リターンコードとしてENUM_INIT_RETCODE列挙の値を使う事を推奨します。
この値は、最適化の過程を整理(最適なエージェントを選択する事を含む)する為に使われます。


TerminalInfoInteger()関数を使用して、テスト開始前のEA初期化中にエージェントの構成とリソース(空きメモリ容量等)に関する情報を要求する事が出来ます。
得られた情報に基づいて、このテストエージェントの使用を許可するか、
このEAの最適化中に得られた情報を使用して拒否する事が出来る。


戻り値がvoid型のOnInit()関数は、常に初期化成功(初期化失敗しても)を意味します。


ENUM_INIT_RETCODE
ID 詳細
INIT_SUCCEEDED 初期化成功。
EAのテストは継続可能です。
このコードはNULL(EAはテスターで正常に初期化された)と同じ値を意味します。
INIT_FAILED 初期化は失敗しました。
致命的なエラーの為、テストを続けても意味がありません。

例えば、「EAの為に必要とされるインジケータを生成する事が出来ませんでした。」等のエラーが挙げられます。

この戻り値はゼロ以外の値(テスターはEA初期化に失敗しました)を意味します。
EAのパラメータに与えた設定では、テストは実行されません。
エージェントは新しいタスクを受けられます。
INIT_PARAMETERS_INCORRECT この値は、入力パラメータに誤った値を設定をしている事を意味します。
この戻り値を含んでいる結果のメッセージ列は、最適化テーブルで赤く強調表示されます。
ストラテジーテスターは、この値を受けると再試行を行う為、他エージェントにタスクを渡しません。
INIT_AGENT_NOT_SUITABLE 初期化中のエラーはありませんが、何らかの理由でエージェントが適切ではありません。
例えばメモリ不足等。

このコードが返された後、エージェントはこの最適化が終わるまでタスクを受け付けません。




OnDeinit

OnDeinit()関数は、初期化解除中に呼ばれるDeinitイベントハンドラです。
void型で宣言します。
1つのconst int型の引数を持ちます。

引数の値は、初期化解除理由のコードを含んでいます。
別の型で宣言されている場合、コンパイラが警告をしこの関数は呼ばれません。


書式:
void OnDeinit(const int reason);




DeinitイベントはEAとインジケータで発生します。

◆発生するケース:

 ・通貨ペアやチャート期間を変更による再初期化前に発生する。
 ・入力パラメータ変更による再初期化前に発生する。
 ・MQL4プログラムのアンロードの前に発生する。



OnTick

NewTickイベントは、EAでのみ発生します。
カスタムインジケータやスクリプトでは発生しません。

NewTickイベントは、EAが新しいtickを受信した時に発生します。
tickイベントはEAだけが使用出来ますが、EAは必ずしもOnTick関数を必要としているという意味ではありません。
EAはtickイベントだけなく、Timerイベント、Bookイベント、ChartEventイベントが発生します。

OnTick関数は、
引数無しで、void型で宣言します。


書式:
void OnTick();




OnTimer

OnTimer()関数は、Timerイベント発生時に呼ばれます。
TimerイベントはEAとインジケータのシステムタイマーによって発生します。
スクリプトでは発生しません。

イベント発生頻度はEventSetTimer()関数で登録します。
またEventKillTimer()関数を使用して、特定のEAだけタイマーイベントの受信を解除する事が出来ます。


OnTimer()関数は、
引数無しで、void型で宣言します。


書式:
void OnTimer();




OnTester

OnTester()関数は、EAのテストで使用する事が出来ます。
ストラテジーテスターでEAのバックテストが終わった後に自動的に発生するTesterイベントハンドラです。
OnTester()関数はOnDeinit()関数の前に呼び出されます。

OnTester()関数は、
引数無しで、double型で宣言します。



書式:
double OnTester();






OnChartEvent

OnChartEvent()関数は、ChartEventグループのイベントハンドラです。
OnChartEvent()はEAとインジケータで使用出来ます。

◆イベント発生するケース
 ・チャートウインドウフォーカス中にキーが押された時
 ・マウス移動又はマウスクリックされた時
 ・グラフィカルオブジェクトが作成された時
 ・プロパティダイアログでオブジェクトプロパティが変更された時
 ・グラフィカルオブジェクトが削除された時
 ・チャート上でマウスクリックされた時
 ・グラフィカルオブジェクトがクリックされた時
 ・グラフィカルオブジェクトがマウス操作で移動された時
 ・LabelEditオブジェクトの入力ボックスでテキスト編集した時
 ・チャートに変更があった時
 ・ユーザーイベント



OnChartEvent()は4つの引数と、void型の戻り値で宣言します。



書式:
void OnChartEvent(
 const int         id, // イベントID
 const long&   lparam, // long型イベント
 const double& dparam, // double型イベント
 const string& sparam  // string型イベント
);




イベント種類ごとに、OnCharEvent()関数の渡される引数の定数を持っています。
以下表は、イベント発生時に引数へ渡される値の一覧です。
イベントの種類 引数:id
イベントID
引数:lparam
long型イベント
引数:dparam
double型イベント
引数:sparam
string型イベント
キー押下 CHARTEVENT_KEYDOWN 押下されたキーの
コード
繰り返し押された回数 キー状態の
ビットマスク文字列
マウス操作
※1
CHARTEVENT_MOUSE_MOVE X座標 Y座標 マウスボタン状態の
ビットマスク文字列
オブジェクト作成
※2
CHARTEVENT_OBJECT_CREATE - - 作成された
オブジェクト名
オブジェクト
プロパティ変更
CHARTEVENT_OBJECT_CHANGE - - 変更された
オブジェクト名
オブジェクト削除
※3
CHARTEVENT_OBJECT_DELETE - - 削除された
オブジェクト名
チャート上での
マウスクリック
CHARTEVENT_CLICK X座標 Y座標 -
オブジェクトクリック CHARTEVENT_OBJECT_CLICK X座標 Y座標 クリックされた
オブジェクト名
オブジェクト移動
(マウス操作)
CHARTEVENT_OBJECT_DRAG - - 移動された
オブジェクト名
LabelEdit編集完了 CHARTEVENT_OBJECT_ENDEDIT - - LabelEdit
オブジェクト名
チャート変更 CHARTEVENT_CHART_CHANGE - - -
カスタムイベント CHARTEVENT_CUSTOM+N
(N範囲:0〜65535)
EventChartCustom()
で設定した値
EventChartCustom()
で設定した値
EventChartCustom()
で設定した値

※1 チャートプロパティCHART_EVENT_MOUSE_MOVEにtrueを設定した時に有効です。
※2 チャートプロパティCHART_EVENT_OBJECT_CREATEにtrueを設定した時に有効です。
※3 チャートプロパティCHART_EVENT_OBJECT_DELETEにtrueを設定した時に有効です。

サンプルソース(EA専用):
#define OBJNAME_TESTLINE "水平ラインオブジェクト"

int OnInit()
{
    // 水平ラインのオブジェクトを作成
    ObjectCreate( OBJNAME_TESTLINE, OBJ_HLINE, 0 , Time[0] , Close[0]);
    ObjectSet(    OBJNAME_TESTLINE, OBJPROP_COLOR, clrYellow);
    ObjectSet(    OBJNAME_TESTLINE, OBJPROP_STYLE, STYLE_SOLID);
    ObjectSet(    OBJNAME_TESTLINE, OBJPROP_WIDTH, 1);
    

    return(INIT_SUCCEEDED);
}

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 == OBJNAME_TESTLINE ) {       // "水平ラインオブジェクト"がクリックされた
            Print( OBJNAME_TESTLINE + "をクリック");
        }
    }

}

チャート上に表示される黄色の水平ライン(オブジェクト名:水平ラインオブジェクト)をクリックするとPrint処理に到達します。
正確にはクリックしたボタンが離された時にイベントが発生します。
(チャート脇の縦軸目盛をドラッグして、ドラッグしたままオブジェクトの上にカーソルを合わせてボタンを離しても反応してしまうので注意。)



OnCalculate

OnCalculate()関数はカスタムインジケータでのみ呼び出されます。
Calculateイベントによってインジケータ値が算出される時に呼ばれます。
通常、新しいtickを受信した時に発生します。

OnCalculate()はint型の戻り値で宣言します。


書式:
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[],   // Tick出来高
 const long&     volume[],        // Real出来高
 const int&      spread[]         // スプレッド
);




open[],high[],low[],close[]は、現在のタイムフレームの始値、高値、安値、終値を含んだ配列です。
time[]は、オープン時間を含んだ配列です。
spread[]は、スプレッドのヒストリーを含んだ配列です。
volume[]とtick_volumeは、tick出来高を含んだ配列です。

各配列のインデックスの方向を決めるには、ArrayGetAsSeries()関数を呼びます。
配列は無条件に動作するように期待されているので、インデックスの方向がデフォルト値に依存させない為は、
ArraySetAsSeries()関数を呼ぶ必要があります。

第1引数のrates_totalには、インジケータで計算する為の利用可能なバーの数が含まれていて、チャートで利用可能なバーの数に対応します。


第2引数のprev_calculatedと、OnCalculate()関数の戻り値に注意しなければなりません。
OnCalculate()関数を呼んでいる間、prev_calculatedは前回呼ばれたOnCalculate()が返した戻り値を含んでいます。
これはOnCalculate()関数が前回呼び出されてから変更されていないバーに対して再度同じ計算をさせない様にし、
無駄な処理を省く事を可能にします。

この為、通常は関数呼び出し時のバー数(rates_total)が含まれている値を返すだけで十分です。
OnCalculate()関数の最後の呼び出し以降に価格データが変更された(ヒストリーデータをダウンロードしたり、ヒストリーデータを消した)場合、
prev_calculatedの値はターミナルによって0が設定されます。





サンプルソース(インジケータ専用):
#property strict

#property indicator_chart_window         // インジケータの表示ウインドウ:チャートウインドウ
#property indicator_buffers 1            // インジケータバッファの数

#property indicator_label1  "25SMA"      // インジケータ1のラベル
#property indicator_type1   DRAW_LINE   // インジケータ1の種類:線
#property indicator_color1  clrYellow   // インジケータ1の色:黄色(web color)
#property indicator_style1  STYLE_SOLID // インジケータ1の線タイプ:実線
#property indicator_width1  1             // インジケータ1の線の太さ:1

//--- インジケータバッファ配列の宣言
double         SMA25_Buffer[1000];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
    //--- インジケータバッファ配列をインジケータ1に割り当て
    SetIndexBuffer( 0 , SMA25_Buffer , INDICATOR_DATA);

    return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[],  // Tick出来高
                const long&     volume[],       // Real出来高
                const int&      spread[])       // スプレッド
{
    int bars;
    bars = Bars( Symbol() , 0);         // 現在の通貨ペア・時間軸チャートに表示されているバー数を取得
    
    Print("bars = "                ,bars,                 // 現在チャートに表示されているバー数
           ", rates_total = "       ,rates_total,          // 第1引数:現在バー数
           ", prev_calculated = "   ,prev_calculated);     // 第2引数:計算済みバー数
    
    Print( "time[0] = "            ,time[0],              // 最新のバーの時間
           ",time[rates_total-1] = ",time[rates_total-1]); // 最も古いバーの時間

    //--- インジケータバッファに単純移動平均(SMA)の値を設定
    int icount , icount_end;
    
    icount_end = rates_total - prev_calculated;           // 計算済みのインジケータは更新しない

    for ( icount = 0; icount <= icount_end; icount++ ) {
        if ( icount >= 1000 ) { break; }
        // 25SMAの取得データをインジケータバッファに代入
        SMA25_Buffer[icount] = iMA( Symbol() , Period() , 25 , icount , MODE_SMA , PRICE_CLOSE , 0 );
    }

    //--- 戻り値は次回OnCalculate()関数が呼ばれた時の第2引数(prev_calculated)になる。
    return( rates_total ); 
}
スポンサーリンク



Copyright ©2015 MT4でEA自作しちゃお〜 All Rights Reserved.


Top

inserted by FC2 system