OnStart
この関数はStartイベントの発生時にスクリプトとサービスで呼び出されます。この関数は、プログラムに実装されているアクションの1回限りの実行を目的としています。関数には2種類あります。
結果を返すバージョン
int OnStart(void); |
戻り値
操作ログタブで表示されるint型の値。
スクリプトの実行が完成すると「script script_name removed (result code N)」というエントリがターミナルの操作ログに作成されます。ここで、NはOnStart()関数によって返される値です。
サービスの実行が完了すると、エントリ「service service_name stopped (result code N)」がターミナル操作ログに作成されます。ここで、NはOnStart()関数によって返される値です。
実行結果を返すOnStart()の呼び出しは、スクリプトまたはサービスの実行を許可するだけでなく、プログラムの実行結果を分析するためのエラーコードまたはその他の有用なデータも返すため、使用をお勧めします。
結果を返さないバージョンは古いコードとの相互性の為のみに残されています。使用は推奨されません。
void OnStart(void); |
注意事項
OnStart()はスクリプトおよびサービス内のイベントを処理するための唯一の関数です。これらのプログラムに他のイベントは送信されません。その結果、StartイベントはEAおよびカスタム指標には渡されません。
スクリプトの例:
//— 色を使うためのマクロ |
参照
Event handling functions、Program running、Client terminal events
OnInit
この関数は、Initイベントが発生するときに指標やEAで呼び出され、実行中のMQL5プログラムを初期化するのに使用されます。この関数の型は 2 つあります。
結果を返すバージョン
int OnInit(void); |
戻り値
int型の値、ゼロは正常な初期化
実行結果を返すOnInit()を呼び出すと、プログラムを初期化できるだけでなく、プログラムが異常に終了した場合にはエラーコードが返されるため、これを使用することをお勧めします。
結果を返さないバージョンは古いコードとの相互性の為のみに残されています。使用は推奨されません。
void OnInit(void); |
注意事項
Initイベントは、EAまたは指標を読み込んだ直後に生成されます。このイベントはスクリプトでは生成されません。OnInit()関数は、MQL5プログラムを初期化するために使用されます。OnInit()の戻り値がint型の場合、ゼロ以外の戻り値は初期化が失敗したことを示し、DeinitイベントをREASON_INITFAILED初期化解除の理由コードで作成します。
void型のOnInit()関数は常に初期化が成功したことを示すので、使用は推奨されません。
EAの入力を最適化するために、リターンコードとしてENUM_INIT_RETCODE列挙体からの値を使用することがおすすめです。これらの値は、最も適切なテストエージェントの選択などの最適化プロセス管理を確立するためのものです。テストを始める前に、EAの初期化中にTerminalInfoInteger()関数を使用して、エージェントの設定とリソース(コア数、空きメモリ量など)のデータをリクエストすることができます。 取得したデータに基づいて、テストエージェントの使用を許可するか、EAの最適化を禁止することができます。
ID | 説明 |
INIT_SUCCEEDED | 初期化が成功し、EAのテストを続けることが出来ます。 このコードはゼロ値と同じ意味を持ちます。EAはテスター内で正常に初期化されています。 |
INIT_FAILED | 初期化が失敗しました。致命的なエラーが起こったのでテストを続ける理由がありません。たとえば、EAの操作に必要な指標を作成することは不可能です。 この戻り値はゼロ以外の値と同じ意味です。 テスター内でのEAの初期化は失敗しました。 |
INIT_PARAMETERS_INCORRECT | プログラマーの間違った入力パラメータを示すように設計されています。一般最適化テーブルでは、この戻りコードを含む結果文字列が赤で強調表示されます。 このようなEA入力セットのテストは実行されません。エージェントは新しいタスクを受け取る用意ができています。 この値を受け取ると、ストラテジーテスターはこのタスクを他のエージェントに再試行のために渡しません。 |
INIT_AGENT_NOT_SUITABLE | 初期化時にプログラム実行エラーはありませんでしたが、エージェントが何らかの理由でテストに適していません。例えば、RAM不足、OpenCLサポートがないなどです。 このコードが返された後は、エージェントは この最適化が終了するまでタスクを受信しません。 |
OnInit()を使用してテスターでINIT_FAILED/INIT_PARAMETERS_INCORRECTを返すと、EAの最適化の際に考慮されるべきことがあります。
- OnInit()がINIT_PARAMETERS_INCORRECTを返すのに使用したパラメータはテストには不向きとみなされ、遺伝的最適化では次世代の取得には使用されません。最適なEAパラメータを検索する際に、「廃棄された」パラメータセットが多すぎると誤った結果につながる可能性があります。検索アルゴリズムでは、最適化基準関数は滑らかで、多数の入力パラメータにギャップがないと仮定しています。
- OnInit()がINIT_FAILEDを返した場合、これはテストを起動できないことを意味するため、EAはエージェントのメモリからアンロードされます。EAは新しいパラメータのセットで次のパスを実行するために再び読み込まれます。次の最適化パスを起動すると、TesterStop()を呼び出すよりもはるかに時間がかかります。
EAのOnInit()関数の例
//— 入力パラメータ //— EAで使用される指標のハンドル |
参照
OnDeinit, Event handling functions、Program running、Client terminal events、Initialization of variables、Creating and deleting objects
OnDeinit
この関数はDeinitイベントが発生するときに指標やEAで呼び出され、実行中のMQL5プログラムの初期化を解除するのに使用されます。
void OnDeinit( |
パラメータ
reason
[in] 初期化解除の理由コード
戻り値
なし
注意事項
以下の場合、DeinitイベントがEAと指標に生成されます。
- MQL5 プログラムが接続されているシンボルまたはチャートの期間の変更に伴う再初期化の前
- 入力の変更に伴う再初期化の前
- MQL5プログラムをアンロードする前
reasonパラメータには下記の値を含むことができます。
定数 | 値 | 説明 |
REASON_PROGRAM | 0 | ExpertRemove()関数の呼び出しでEAが作動しなくなった |
REASON_REMOVE | 1 | プログラムがチャートから削除された |
REASON_RECOMPILE | 2 | プログラムが再コンパイルされた |
REASON_CHARTCHANGE | 3 | シンボルまたはチャート期間が変更された |
REASON_CHARTCLOSE | 4 | チャートが閉じられた |
REASON_PARAMETERS | 5 | ユーザが入力を変更した |
REASON_ACCOUNT | 6 | 別のアカウントが有効化されるか、アカウントの設定変更によって取引サーバへの再接続が発生した |
REASON_TEMPLATE | 7 | 他のチャートテンプレートが適用された |
REASON_INITFAILED | 8 | OnInit()ハンドラーがゼロ以外の値を返した |
REASON_CLOSE | 9 | 端末が閉じられた |
EAの初期化解除の理由コードはUninitializeReason()関数または事前定義された _UninitReason変数から受信されます。
EAのOnInit()およびOnDeinit()関数の例
input int fake_parameter=3; // 無用のパラメータ |
参照
OnInit, Event handling functions、Program running、Client terminal events、Uninitialization reason codes、Visibility scope and lifetime of variables、Creating and deleting objects
OnTick
この関数は、NewTickイベントが発生して新しい相場が処理されるときに、EAで呼び出されます。
void OnTick(void); |
戻り値
なし
注意事項
NewTickイベントは、EAが取り付けられているチャートのシンボルに対して新しいティックを受け取ったときに、EAに対してのみ生成されます。NewTickイベントが生成されていないため、カスタム指標またはスクリプトでOnTick()関数を定義することはできません。
TickイベントはEAに対してのみ生成されますが、Timer、BookEvent、およびChartEventイベントはNewTickに加えてEAに対しても生成されるため、EAにOnTick()関数を実装する必要はありません。
全てのイベントは、受信された順に次々に処理されます。キューにすでに NewTickイベントがある、またはこのイベントが処理段階にある場合、新しいNewTickイベントはMQL5アプリケーションキューには追加されません。
NewTickイベントは、自動取引が有効になっているかどうかに関係なく生成されます(自動取引ボタン)。自動取引の無効化とは、EAからの取引リクエスト送信を禁止することのみを意味します。EAの動作は停止されません。
AutoTradingボタンを押して自動取引を無効にしても、OnTick()関数の現在の実行が中断されることはありません。
OnTick()関数内の取引ロジック全体を特長とするEAの例
//+——————————————————————+ input double lots=0.1; // ロット単位のボリューム //— マジックナンバーとシンボルが一致していてポジションがすでに長くある場合 |
参照
Event handling functions、Program running、Client terminal events、OnTimer、OnBookEvent、OnChartEvent
OnCalculate
この関数は、Calculateイベントが発生して価格の変化が処理されるときに、指標で呼び出されます。この関数の型は 2 つあります。1つの指標内では1つだけ使用できます。
データ配列に基づく計算
int OnCalculate( |
現在の時間枠に基づいた計算
int OnCalculate( |
パラメータ
rates_total
[in] 計算のために指標に使用できるprice[]配列または入力系列のサイズ第2の関数タイプでは、パラメータ値は、それが開始されたチャート上の棒の数に対応します。
prev_calculated
[in] 直前の呼び出しでOnCalculate()関数によって返された値が含まれます。この関数が前回起動されて以来変更されていないバーをスキップするように設計されています。
begin
[in] price[]配列で有意義なデータが始まるインデックス。正しい値を持たない失われたデータや初期のデータをスキップすることができます。
price[]
[in] 計算のための値の配列。価格時系列または指標バッファのうちの一つがprice[]配列として渡されます。計算に渡されるデータの種類は_AppliedTo事前定義変数を使用して定義できます。
time{}
[in] バーの開いた時間の配列
open[]
[in] バーの始値の配列
high[]
[in] バーの高値の配列
low[]
[in] バーの安値の配列
close[]
[in] バーの終値の配列
tick_volume[]
[in] ティックボリューム値の配列
volume[]
[in] 取引量値の配列
spread[]
[in] バーのスプレッド値の配列
戻り値
次に関数が呼び出されるときにprev_calculatedパラメータとして渡されるint 型の値
注意事項
OnCalculate()関数がゼロに等しい場合、クライアント端末のデータウィンドウには指標値が表示されません。
OnCalculate()関数の最後の呼び出し以降に価格データが変更された場合(より長期間の履歴が読み込まれているか、履歴のギャップが埋められている場合)、 prev_calculated入力パラメータは、端末自身によってゼロに設定されます。
time[]、open[]、high[]、low[]、close[]、tick_volume[]、volume[]、spread[]配列で索引付けの方向を定義するには、ArrayGetAsSeries()関数を呼び出します。デフォルトに依存しないためには、作業する配列でArraySetAsSeries()関数を呼び出します。
最初の関数タイプを使用する場合、指標を起動するときに必要な時系列または指標がパラメータタブのprice[]配列としてユーザによって選択されます。そのためには “Apply to”(適用)フィールドのドロップダウンリストに必要な項目を指定する必要があります。
カスタム指標値を他のMQL5プログラムから取得するにはiCustom()関数が使用されます。これは、後の操作のために指標ハンドルを返します。また、必要なprice [] 配列または他の指標ハンドルを指定することも出来ます。このパラメータは、カスタム指標の入力変数のリストに最後に送信されるべきです。
OnCalculate()の戻り値とprev_calculated の2番目の入力パラメータとの関係はここで指摘される必要があります。関数が呼び出されたとき、prev_calculatedパラメータは以前のOnCalculate() 呼び出しで返された値を持ちます。これにより、この関数が前回実行されてから変更されていないバーの繰り返した計算を避けてカスタム指標を計算するためのリソース節約アルゴリズムを実装することができます。
指標の例
//+——————————————————————+ //—- 指標の設定 |
参照
ArrayGetAsSeries、ArraySetAsSeries、iCustom、Event handling functions、Program running、Client terminal events、Access to timeseries and indicators
OnTimer
この関数は、一定の時間間隔で端末によって生成されるTimerイベント中に、EAで呼び出されます。
void OnTimer(void); |
戻り値
なし
注意事項
Timerイベントは、EventSetTimer()関数を使用してタイマーを起動したEAのクライアント端末によって定期的に生成されます。. 通常この関数はOnInit()関数で呼び出されます。EAの動作が止まった場合、タイマーはEventKillTimer()を使用して破壊されるべきです。これは通常OnDeinit()関数で呼び出されます。
それぞれのエキスパートアドバイザーと指標は独自のタイマーを操作しそのタイマーのみからイベントを受信します。MQL5 プログラムが停止した場合、作成されて EventKillTimer() 関数で無効にされていないタイマーは強制的に破壊されます。
タイマーイベントを1秒間に1回よりも頻繁に受信する必要がある場合は、高解像度タイマーを作成するためにEventSetMillisecondTimer()を使用します。
ストラテジーテスターでは、最小で1000ミリ秒の間隔が使用されます。一般的に、タイマー期間が減少する際にはタイマーイベントのハンドラがより頻繁に呼び出されるようにテスト時間が増加します。リアルタイムモードで操作している場合、タイマーイベントは、ハードウェアの制約のために10〜16ミリ秒に1回以下で生成されます。
1 つのプログラムでは 1 つのタイマーのみが起動出来ます。各MQL5アプリケーションとチャートは、新たに到着したイベントが配置される独自のイベントキューを持っています。キューにすでにタイマーイベントがある、またはこのイベントが処理段階にある場合、新しいタイマーイベントは MQL5 アプリケーションキューには追加されません。
OnTimer()ハンドラーを持つEAの例
//+——————————————————————+ //— } } |
参照
EventSetTimer、EventSetMillisecondTimer、EventKillTimer、GetTickCount、GetMicrosecondCount、Client terminal events
OnTrade
この関数はTradeイベントが発生するときにEAで呼び出され、注文、ポジション、取引リストの変更を処理するためのものです。
void OnTrade(void); |
戻り値
なし
注意事項
OnTrade()はエキスパートアドバイザーでのみ呼び出されます。同じ名前と型の関数をそこに追加しても、指標やスクリプトには使用されません
指値注文の実行、ポジションの開閉、ストップの設定、指値注文の発動などの取引操作によって、注文および取引の履歴、および/またはポジションおよび現在の注文のリストが適切に変更されます。
注文を処理する際、取引サーバは、着信されるTrade イベントに関するメッセージを端末に送信します。履歴から注文と取引に関する関連データを検索するには、まずHistorySelect()を使用して取引履歴リクエストを実行する必要があります。
取引イベントは、次の場合にサーバによって生成されます。
- アクティブ注文の変更
- ポジションの変更
- 約定の変更
- 取引履歴の変更
それぞれの Tradeイベントは、1つまたは複数の取引要求の結果として表示されることがあります。取引リクエストは、 OrderSend()またはOrderSendAsync()を使用してサーバに送信されます。それぞれのリクエストは、いくつかの取引イベントにつながる可能性があります。イベントの処理はいくつかの段階で実行されることがあり、各操作によって注文、ポジション、取引履歴の状態が変更される可能性があるため、「1つのリクエスト – 1つの取引イベント」という声明に頼ることはできません。
OnTrade()ハンドラーはOnTradeTransaction()が呼び出された後で呼び出されます。一般に、OnTrade()とOnTradeTransaction()の呼び出しの数には正確な相関関係はありません。1つのOnTrade()コールは、1つまたは複数のOnTradeTransactionコールに対応します。
OnTrade()を持つEAの例
//+——————————————————————+ input int days=7; // 取引履歴の日数 //+——————————————————————+ |
参照
OrderSend、OrderSendAsync、OnTradeTransaction, Client terminal events
OnTradeTransaction
この関数はTradeTransactionイベントが発生するときにEAで呼び出され、取引リクエストの実行結果を処理するためのものです。
void OnTradeTransaction() |
パラメータ
trans
[in] MqlTradeTransaction取引口座で行われた取引を記述する型変数
request
[in] MqlTradeRequestトランザクションにつながった取引リクエストを記述する型変数で、TRADE_TRANSACTION_REQUEST型トランザクション値のみを含む
result
[in] MqlTradeResultトランザクションにつながった取引リクエストの実行結果を含む型変数で、TRADE_TRANSACTION_REQUEST型トランザクション値のみを含む
戻り値
なし
注意事項
OnTradeTransaction()は、下記の場合に取引サーバが端末に送信したTradeTransactionイベントを処理するために呼び出されます。
- OrderSend()/OrderSendAsync()関数を使ったMQL5プログラムからの取引リクエストの送信とそれに続く実行
- GUIを介した手動での取引リクエストの送信とそれに続く実行
- サーバでの指値注文やストップ注文のアクティベーション
- 取引サーバ側での操作の実行
トランザクション型のデータはtrans変数のtypeフィールドに含まれています。トランザクションの型はENUM_TRADE_TRANSACTION_TYPE列挙体に記述されています。
- TRADE_TRANSACTION_ORDER_ADD – 新規アクティブ注文の追加
- TRADE_TRANSACTION_ORDER_UPDATE – 既存注文の変更
- TRADE_TRANSACTION_ORDER_DELETE – アクティブ注文リストからの注文の削除
- TRADE_TRANSACTION_DEAL_ADD – 履歴への約定の追加
- TRADE_TRANSACTION_DEAL_UPDATE – 履歴での約定の変更
- TRADE_TRANSACTION_DEAL_DELETE – 履歴での約定の削除
- TRADE_TRANSACTION_HISTORY_ADD – 実行またはキャンセルの結果としての履歴への注文の追加
- TRADE_TRANSACTION_HISTORY_UPDATE – 注文履歴内の注文の変更
- TRADE_TRANSACTION_HISTORY_DELETE – 注文履歴内の注文の削除
- TRADE_TRANSACTION_POSITION – 取引の実行に関連していないポジション変更
- TRADE_TRANSACTION_REQUEST – 取引リクエストがサーバで処理され結果が受け取られたことの通知
TRADE_TRANSACTION_REQUEST型のトランザクションを処理するには、OnTradeTransaction()関数の第2及び第3パラメータ(request、 result)を分析し追加情報を受け取る必要があります。
買い取引リクエストを送信すると、取引口座では下記の一連の取引トランザクションが発生します。1)処理リクエストの受領、2)口座に対した適切な注文書の作成、3)注文実行、4) 実行された注文をアクティブ注文のリストから削除、5)同注文を注文履歴に追加、6)後続のトランザクションを履歴に追加、7)新しいポジションを作成これらの段階はすべて取引トランザクションです。このようなトランザクションの端末への到着がTradeTransactionイベントです。端末におけるこれらのトランザクションの到着の優先順位は保証されません。よって取引アルゴリズムを開発する際にトランザクション到着の順番を仮定すべきではありません。
EAのOnTradeTransaction()ハンドラで取引トランザクションを処理する場合、端末は新たに到着した取引トランザクションの処理を継続します。したがって、取引口座の状態は、OnTradeTransaction()操作の過程で変更される可能性があります。例えば、MQL5 プログラムが新しい注文の追加を処理している間に、注文が実行されて注文のリストから削除され、履歴に移動されることもあります。プログラムは、これらのイベントすべてを通知されます。
トランザクションキューは1,024要素を備えます。OnTradeTransaction()ハンドラーが新しいトランザクションを処理するのに長くかかりすぎると、代わりにキュー内の新しいトランザクションが処理されることがあります。
OnTrade()ハンドラーは適切なOnTradeTransaction()が呼び出された後で呼び出されます。一般に、OnTrade()とOnTradeTransaction()の呼び出しの数には正確な相関関係はありません。1つのOnTrade()コールは、1つまたは複数のOnTradeTransactionコールに対応します。
それぞれの<t1> </t1><li2>Trade</li2><t3>イベントは、1つまたは複数の取引要求の結果として表示されることがあります。取引リクエストは、OrderSend()またはOrderSendAsync()を使用してサーバに送信されます。それぞれのリクエストは、いくつかの取引イベントにつながる可能性があります。イベントの処理はいくつかの段階で実行されることがあり、各操作によって注文、ポジション、取引履歴の状態が変更される可能性があるため、「1つのリクエスト – 1つの取引イベント」という声明に頼ることはできません。
OnTradeTransaction()ハンドラーを持つEAの例
//+——————————————————————+ } PrintFormat(“MqlTradeTransaction: %s deal #%d %s %s %.2f lot %s”,EnumToString(trans_type), |
参照
OrderSend、OrderSendAsync、OnTradeTransaction、Trade request structure、Trade transaction structure、Trade transaction types、Trade operation types、Client terminal events
OnBookEvent
この関数は、BookEventイベントが発生するときに指標やEAで呼び出され、板情報の変化を処理するために設計されています。
void OnBookEvent( |
パラメータ
symbol
[in] BookEventが到着した銘柄の名称
戻り値
なし
注意事項
任意のシンボルのBookEventイベントを受け取るには、MarketBookAdd() 関数を使用してこのシンボルのBookEventイベント受信を事前に設定する必要があります。指定されたシンボルのBookEventへの購読を停止するにはMarketBookRelease()関数を呼ぶ必要があります。
BookEventはすべてのチャートにブロードキャストされます。これは、1 つのアプリケーションがMarketBookAddを使用してBookEventイベントの受信に購読した場合、同じチャートにある他のすべてのOnBookEvent() ハンドラを持っている指標とEAがこのイベントを受け取ることを意味します。よって、symbolパラメータとしてOnBookEvent()ハンドラに渡された銘柄名を分析する必要があります。
同じチャートで実行されているすべてのアプリケーションについて銘柄でソートされた個別のBookEventカウンターが提供されます。これは、各チャートが異なるシンボルに対して複数のサブスクリプションを持つことができ、各シンボルに対してカウンタが提供されることを意味します。BookEventを購読および購読解除すると、指定したシンボルの購読カウンタが1つのチャート内でのみ変更されます。言い換えれば、同じシンボルであるにもかかわらず購読カウンタの値が異なるBookEventには、2つの隣接するチャートが存在する可能性があります。
購読カウンタの初期値はゼロです。MarketBookAdd()が呼び出されるごとに、チャート上の指定されたシンボルの購読カウンタが1つ増えます(チャートシンボルと MarketBookAdd()内のシンボルは一致する必要はありません)。MarketBookRelease()を呼び出すと、チャート内の特定のシンボルに対する購読カウンタが1つ減少します。任意のシンボルのBookEventイベントは、カウンタが0になるまでチャート内でブロードキャストされます。したがって、MarketBookAdd ()の呼び出しを含むMQL5プログラムが全て、動作後にMarketBookRelease()を使用して正しくイベントの購読を解除することが重要です。これを達成するためには、MQL5プログラムの全体のライフタイムでのMarketBookAdd()とMarketBookRelease()の呼び出し数は偶数であるべきです。プログラム内でフラグやカスタム購読カウンタを使用することで、BookEventイベントを安全に扱うことができ、購読を無効にして、同じイベントのサードパーティプログラムでイベントを取得することを防ぐことができます。
BookEventイベントはスキップされることはなく、前のBookEventの処理がまだ終わっていなくても、常にキューに入れられます。
例
//+——————————————————————+ |
参照
MarketBookAdd、MarketBookRelease、MarketBookGet、OnTrade、OnTradeTransaction、OnTick、イベント処理関数、プログラムの実行、クライエント端末イベント
OnChartEvent
この関数はChartEventイベントが発生するときに指標やEAで呼び出されます。この関数は、ユーザまたはMQL5プログラムによって行われたチャートの変更を処理するためのものです。
void OnChartEvent() |
パラメータ
id
[in] ENUM_CHART_EVENT列挙体からのイベントID
lparam
[in] long型イベントパラメータ
dparam
[in] double型イベントパラメータ
sparam
[in] string型イベントパラメータ
戻り値
なし
注意事項
事前定義されたOnChartEvent()関数を使用して処理出来るイベントには11種類あります。CHARTEVENT_CUSTOMからCHARTEVENT_CUSTOM_LASTまでの65535のIDはカスタムイベントのために提供されています。カスタムイベントの作成にはEventChartCustom()関数が使用されます。
ENUM_CHART_EVENT列挙体からの短いイベントの記述
- CHARTEVENT_KEYDOWN — チャートウィンドウがフォーカスされている時のキー押下
- CHARTEVENT_MOUSE_MOVE — マウスの移動、マウスボタンクリック(チャートのCHART_EVENT_MOUSE_MOVE=trueの場合)
- CHARTEVENT_OBJECT_CREATE — グラフィックオブジェクトの作成(チャートの CHART_EVENT_OBJECT_CREATE=trueの場合)
- CHARTEVENT_OBJECT_CHANGE — プロパティダイアログを介してのオブジェクトプロパティ変更
- CHARTEVENT_OBJECT_DELETE — グラフィックオブジェクト削除(チャートのCHART_EVENT_OBJECT_DELETE=trueの場合)
- CHARTEVENT_CLICK — チャートのクリック
- CHARTEVENT_OBJECT_CLICK — チャートに属するグラフィックオブジェクトでのマウスクリック
- CHARTEVENT_OBJECT_DRAG — マウスを使用してのグラフィカルオブジェクトのドラッグ
- CHARTEVENT_OBJECT_ENDEDIT — グラフィックオブジェクトの入力ボックスのテキスト編集(OBJ_EDIT)の完成
- CHARTEVENT_CHART_CHANGE — チャート変更
- CHARTEVENT_CUSTOM+n — カスタムイベントID(nは0〜65535)CHARTEVENT_CUSTOM_LAST — カスタムイベントの最大の使用可能なID(CHARTEVENT_CUSTOM +65535)
すべてのMQL5プログラムは、アプリケーションのメインスレッド以外のスレッドで動作します。メインのアプリケーションスレッドは、すべてのWindowsシステムメッセージを処理し、この処理の結果、独自のアプリケーション用のWindowsメッセージを生成します。たとえば、チャート上でマウスを動かすと(WM_MOUSE_MOVEイベント)、後のアプリケーションウインドウでのレンダリングのためにいくつかのシステムメッセージが生成され、内部メッセージがチャート上で起動されたエキスパートや指標に送信されます。EAまたは指標が既にマウス移動イベントを受信している間に、メインアプリケーションスレッドがWM_PAINTシステムメッセージをまだ処理していない(したがって、まだ変更されたチャートをレンダリングしていない)状況が発生する可能性があります。この場合、チャートプロパティCHART_FIRST_VISIBLE_BARはチャートがレンダリングされた後にのみ変更されます。
各イベントタイプに対して、OnChartEvent()関数の入力には、そのイベントを処理するために必要な特定の値があります。この表では、パラメータを介して渡されるイベントと値が一覧できます。
イベント | ‘id’パラメータ値 | ‘lparam’パラメータ値 | ‘dparam’パラメータ値 | ‘sparam’パラメータ値 |
キーストロークイベント | CHARTEVENT_KEYDOWN | 押下されたボタンのコード | キーが長押しされた状態で生成されたキー押下の数 | キーボードのキーの状態を表すビットマスクの文字列値 |
マウスイベント(チャートのCHART_EVENT_MOUSE_MOVE=trueの場合) | CHARTEVENT_MOUSE_MOVE | X座標 | Y座標 | マウスキーの状態を表すビットマスクの文字列値 |
マウスホイールイベント(チャートのCHART_EVENT_MOUSE_WHEEL=trueの場合) | CHARTEVENT_MOUSE_WHEEL | キーとマウスボタンの状態のフラグ、カーソルのX座標とY座標。例をご覧ください。 | マウスホイールスクロールのデルタ値 | — |
グラフィックオブジェクト作成(チャートのCHART_EVENT_OBJECT_CREATE=trueの場合) | CHARTEVENT_OBJECT_CREATE | — | — | 作成したグラフィックオブジェクトの名称 |
プロパティダイアログを介してのオブジェクトプロパティ変更 | CHARTEVENT_OBJECT_CHANGE | — | — | 変更したグラフィックオブジェクトの名称 |
グラフィックオブジェクトの削除(チャートのCHART_EVENT_OBJECT_DELETE=trueの場合) | CHARTEVENT_OBJECT_DELETE | — | — | 削除したグラフィックオブジェクトの名称 |
チャート上でのマウスクリック | CHARTEVENT_CLICK | X座標 | Y座標 | — |
グラフィックオブジェクトでのマウスクリック | CHARTEVENT_OBJECT_CLICK | X座標 | Y座標 | イベントが発生したグラフィック•オブジェクトの名称 |
マウスでのグラフィックオブジェクトの移動 | CHARTEVENT_OBJECT_DRAG | — | — | 移動したグラフィックオブジェクトの名称 |
“Input field”(入力フィールド)グラフィックオブジェクトのテキスト編集の完成 | CHARTEVENT_OBJECT_ENDEDIT | — | — | テキスト編集が完成した「入力フィールド」グラフィックオブジェクトの名称 |
プロパティダイアログウィンドウでのチャートのサイズ変更やチャートのプロパティ変更 | CHARTEVENT_CHART_CHANGE | — | — | — |
N番号を使用したカスタムイベント | CHARTEVENT_CUSTOM+N | EventChartCustom()関数で定義された値 | EventChartCustom()関数で定義された値 | EventChartCustom()関数で定義された値 |
チャートイベントリスナーの例
//+——————————————————————+ if(str_keys!=“”) |
参照
EventChartCustom、Types of chart events、Event handling functions、Program running、Client terminal events
OnTester
この関数は、Testerイベントが発生してテスト後に適切なアクションを取るために、EAで呼び出されます。
double OnTester(void); |
戻り値
テスト結果を評価するためのカスタム条件最適化の値
注意事項
OnTester()関数は、EAのテスト時にのみ使用でき、主に入力パラメータの遺伝的最適化のためのカスタム最大基準として使用される値の計算のために意図されています。
遺伝的最適化では一世代内の結果は降順にソートされます。これは、最高値の結果が最適化基準の観点から最良とみなされることを意味します。このようなソーティングの最悪値は最後に配置され、その後破棄されます。したがって、それらは次世代の形成に参加しません。
したがって、OnTester()関数を使用すると、独自のテスト結果レポートが作成され保存されるだけでなく、最適化プロセスを制御してトレーディング戦略の最良のパラメータを見つけることができます。
以下はカスタム条件最適化を計算する例です。アイディアは、バランスグラフの線形回帰を計算することです。これはOptimizing a strategy using balance graph and comparing results with “Balance + max Sharpe Ratio” criterion(バランスグラフを使用した戦略の最適化と、結果の「バランス+最大シャープレシオ」基準との比較)稿で説明されています。
//+——————————————————————+ |
参照
Testing trading strategies、TesterHideIndicators、Working with optimization results、TesterStatistics、OnTesterInit、OnTesterDeinit、OnTesterPass、MQL_TESTER、MQL_OPTIMIZATION、FileOpen、FileWrite、FileLoad、FileSave
OnTesterInit
この関数は、 TesterInitイベントが発生してストラテジーテスターでの最適化に先立って必要なアクションが実行されるときに、EAで呼び出されます。この関数の型は 2 つあります。
結果を返すバージョン
int OnTesterInit(void); |
戻り値
int型の値。ゼロは、最適化が開始される前にチャート上で起動されたEAの初期化に成功したことを意味します。
実行結果を返すOnTesterInit() を呼び出すと、プログラムを初期化できるだけでなく、最適化が異常に終了した場合にはエラーコードが返されるため、これを使用することをお勧めします。INIT_SUCCEEDED (0)以外の戻り値はエラーを意味し、最適化は行われません。
結果を返さないバージョンは古いコードとの相互性の為のみに残されています。使用は推奨されません。
void OnTesterInit(void); |
注意事項
TesterInitイベントは、ストラテジーテスターにおけるEAの最適化の前に生成されます。このイベントでは、OnTesterDeInit()またはOnTesterPass()イベントハンドラを持つEAが自動的に別の端末チャートにダウンロードされます。テスターで指定されたシンボルと期間があります。
このようなイベントはTesterInit、TesterDeinit、TesterPassイベントを受信しますが、Init、Deinit、 NewTickイベントは受信されません。したがって、最適化中に各パスの結果を処理するために必要なロジックはすべて、OnTesterInit ()、OnTesterDeinit ()、OnTesterPass ()ハンドラで実装されるべきです。
戦略最適化中の各シングルパスの結果は、FrameAdd ()関数を使用してOnTester ()ハンドラからフレームを介して渡すことができます。
OnTesterInit()関数は、最適化を開始する前にエキスパートアドバイザーを起動して、最適化結果をさらに処理するために使用されます。これは常にOnTesterDeinit()ハンドラと共に使用されます。
OnTesterInit()の実行時間は制限されています。超過した場合、EAは強制的に停止され、最適化自体は取り消されます。テスター操作ログにメッセージが表示されます。
Tester OnTesterInit works too long. Tester cannot be initialized. |
例はOnTickからとられています。 OnTesterInit()ハンドラは最適化パラメータを設定するために追加されました。:
//+——————————————————————+ input double lots=0. 1; // ロット単位のボリューム //— マジックナンバーとシンボルが一致していてポジションがすでに長くある場合 |
参照
Testing trading strategies、Working with optimization results、OnTesterDeinit、OnTesterPass、ParameterGetRange、ParameterSetRange
OnTesterDeinit
この関数は、EA最適化の後にTesterDeinit イベントが発生したときに、EAで呼び出されます。
void OnTesterDeinit(void); |
戻り値
なし
注意事項
TesterDeinitイベントは、ストラテジーテスターにおけるEAの最適化の終了後に生成されます。
OnTesterDeInit()またはOnTesterPass() イベントハンドラを持つEAは、最適化開始時に別の端末チャートに自動的にダウンロードされます。テスターで指定されたシンボルと期間があります。関数はすべての最適化結果の最終処理用に設計されています。
FrameAdd()関数を使用してテストエージェントによって送信された最適化フレームはバンドルされ、配信に時間がかかることに注意してください。よって、すべてのフレームやTesterPassイベントが最適化が終わるまでに到着しOnTesterPass()で処理されるわけではありません。遅れているフレームをすべてOnTesterDeinit()で受け取る場合は、FrameNext()関数を使用してコードブロックを配置します。
参照
Testing trading strategies、Working with optimization results、TesterStatistics、OnTesterInit、OnTesterPass、ParameterGetRange、ParameterSetRange
OnTesterPass
この関数は、EA最適化中に新しいデータフレームを処理するためにTesterPassTesterPassイベントが発生するときに、EAで呼び出されます。
void OnTesterPass(void); |
戻り値
なし
注意事項
TesterPassイベントは、ストラテジーテスターでのエキスパートアドバイザーの最適化中にフレームを受け取ると自動的に生成されます。
OnTesterDeInit()またはOnTesterPass() イベントハンドラを持つEAは、最適化開始時に別の端末チャートに自動的にダウンロードされます。テスターで指定されたシンボルと期間があります。この関数は、最適化中にテストエージェントから受信したフレームを処理するためのものです。テスト結果を含むフレームは、FrameAdd()関数を使用してOnTester()ハンドラ−から送信する必要があります。
FrameAdd()関数を使用してテストエージェントによって送信された最適化フレームはバンドルされ、配信に時間がかかることに注意してください。よって、すべてのフレームやTesterPassイベントが最適化が終わるまでに到着しOnTesterPass()で処理されるわけではありません。遅れているフレームをすべてOnTesterDeinit()で受け取る場合は、FrameNext()関数を使用してコードブロックを配置します。
OnTesterDeinit()の最適化を完了すると、FrameFirst()/FrameFilterとFrameNext()関数を使用して再び、受け取ったフレームをすべて並び替えることができます。
参照
Testing trading strategies、Working with optimization results、OnTesterInit、OnTesterDeinit、FrameFirst、FrameFilter、FrameNext、FrameInputs
Originally posted 2019-07-29 23:21:08.