EAの基本 P71
ポジション会計システム P71
MetaTrader5にはnettingとhedgingという2つのポジションアカウンティングシステムがあります。NettingシステムはMetaTrader5で使用される元のポジションアカウンティングシステムです。トレーダーはシンボル内に1つの集約ポジションしか持つことができません。後続の売買注文は現在のポジションに追加して始値を平均化するかポジションの一部または全部を決済または反転します。設定されたストップロスまたはテイクプロフィットの価格は、ポジション全体に適用されます。部分的なポジションのクローズが必要な場合は希望する価格でストップオーダーを設定する必要があります。
hedgingシステムはMetaTrader4ユーザーには馴染みのあるものです。トレーダーはシンボルに対して一度に複数の売買ポジションを開くことができ、それぞれに独自のストップロスまたはテイクプロフィット価格があります。各取引は個別にクローズする必要があります。hedgingは2016年にMetaTrader5に追加され、以前のMetaTrader4ユーザーにとって非常に望ましい機能でした。
nettlingポジションシステム P71
前述のようにnettingポジションアカウンティングシステムはもともとMetaTrader5のデフォルトのポジションアカウンティングシステムでした。これはMetaTrader5を外国為替以外の商品で使用できるようにするために行われました。nettingシステムでは、証券で一度にオープンできるポジションは1つだけです。ポジションに注文を追加したり、反対方向に注文を開いたりしてポジションの方向も減らしたり、変更したりすることができます。また、いつでもストップロスを調整したり、ポジションの利益を得ることができます。
例で説明しましょう。EURUSDで1.00ロットの買い注文が開かれました。これにより、EURUSDで1ロットのネットロングポジションが得られます。その後、0.5ロットの売り注文を開くと結果は0.5ロットのネットロングポジションになります。売り注文は既存のロングポジションの一部を効果的に決済しました。0.5ロットの2番目の売り注文を開くと残りのロングポジションは決済されポジションがなくなります。
別の例を次に示します。EURUSDに1ロットのロングポジションがあります。次に、2.00ロットの売り注文を出します。その結果、1ロットのネットショートポジションになります。1回の取引でポジションがロングからショートに変わりました。したがって、既存のポジションを決済し、1回の取引で反対方向に新しいポジションを開くことが可能です。
同じ方向の複数の注文がポジションに追加されると、ポジションの価格が変更されます。新しいポジションの価格は、加重平均として計算されます。例えば、1.35712でEURUSDに1ロットのネットロングポジションがあり、1.35825で0.5ロットの2番目の買い注文を追加すると、新しいポジションの価格は1.357496になります。既存のポジションの一部を決済するために反対方向に注文が開かれた場合、ポジションの価格は変わりません。
注文タイプと市場執行タイプに応じて、注文時にストップロスとテイクプロフィットを設定できます。それ以外の場合はポジションをいつでも変更してストップロスを追加または変更し、利益を得ることができます。別のストップロスおよび/またはテイクプロフィットで別の注文が発注された場合、新しいストップロスおよび/またはテイクプロフィットの価格がポジション全体に適用されます。
たとえば、0.75ロットの買いポジションはEURUSDで1.35674で開かれ、ストップロスは1.3517でテイクプロフィットはありません。2番目の0.25ロットの買い注文は1.3532のストップロスト1.3632のテイクプロフィットで出されます。ポジション全体のストップロスを1.3532に変更し、テイクプロフィットを1.3632に変更します。
nettingシステムを使用して、異なるロットサイズとストップロスおよび/またはテイクプロフィット価格で複数のオープン注文を持つことはできませんが、未決注文を使用して、所定の価格レベルでポジションをスケールアウトすることができます。これについては、第13章で詳しく説明します。
hedgingポジションシステム P72
逆にhedgingシステムではここのロットサイズ、ストップロス、テイクプロフィットの価格を設定して、異なる始値で複数の売買注文を行うことができます。注文はお互いに独立してクローズする必要があります。hedgingポジションを部分的にクローズすることは可能ですが、異なる終値で複数のポジションをずらしてクローズする可能性があるため、そうすることは望ましくありません。hedgingされたポジションを管理するプロセスはnettingポジションを管理するプロセスとは異なります。本書の残りの部分ではhedgingポジションの処理とnettingポジションの処理の違いについて説明します。
成行注文 P72
成行注文は現在の市場価格で取引を開始するリクエストです。注文タイプは、買いまたは売りです。買い注文は現在のask価格で開かれ、売り注文は現在のbid価格で開かれます。逆に、ポジションがクローズされると、買いポジションは現在のbid価格でクローズされ、売りポジションは現在のask価格でクローズされます。
注文が実行されるプロセスは取引サーバーの実行タイプによって異なります。MetaTrader5には4つの実行タイプがあります。実行タイプはブローカーによって決定され【新規注文】ダイアログボックスの【タイプ】フィールドに示されます。ほとんどの外国為替ブローカーは市場又は即時実行のいずれかを使用します。ECNブローカーは取引所執行を使用します。リクエスト実行タイプは外国為替以外の手段を対象としており、一般的には使用されていません。
図8.1-NewOrderダイアログ。このブローカーは即時実行を使用します。
即時実行はMetaTrader4ユーザーになじみのある古典的な実行モードです。トレーダーは取引タイプ、取引するシンボル、取引量、ストップロスとテイクプロフィットの価格、およびポイントの偏差を指定します。現在の市場価格が、偏差フィールドで指定されたポイント数だけ前回の見積もり価格から逸脱した場合、再見積もりがトリガーされ、トレーダーは新しい価格を受け入れるか拒否するかを尋ねられます。それ以外の場合、取引は現在の市場価格で行われます。
即時約定の利点の一つはトレーダーが注文時にストップロスを指定して利益を得ることができる事です。これにより、手動で取引する際のステップが節約されます。価格が急速に変動し、大幅な価格偏差(スリッページ)が発生した場合、トレーダーは注文を拒否し、市場の状況が落ち着くのを待つことができます。
即時約定のデメリットはスリッページです。スリッページが所定の偏差を超えると、注文が発注されなくなり、自動取引が困難になります。注文が発注された場合でも、ストップロスとテイクプロフィットの価格は注文の約定価格に対して数ポイントオフになります。
ほとんどのブローカーは現在、市場または取引所の執行を使用しています。成行執行タイプでは、トレーダーは取引量と条約ポリシーを指定します。取引は現在の市場価格で実行され、リクオートはありません。市場実行タイプでは、ストップロスやテイクプロフィットは設定されません。トレーダーはポジションを変更してストップロスを追加し、注文が約定された後に利益を得る必要があります。
取引所執行はECNブローカーによって使用され、トレーダーは中間ディーリングデスクで取引を執行することができます。全ての意図と目的に置いて、交換実行タイプは市場実行タイプと同様に機能します。
リクエスト実行タイプの場合、トレーダーは取引量、ストップロス、テイクプロフィットを最初に指定する必要があります。次に、端末は取引サーバーに現在の市場価格を要求します。
Fill policyは、市場に十分な流動性が無い場合にとるべきアクションを決定します。FillまたはKillとは、取引サーバーが指定された価格で全取引量の注文を出すことができない場合、注文がキャンセルされることを意味します。約定又はキャンセル(即時又はキャンセル)は取引サーバーが注文を部分的に約定しようとすることを意味します。満たされていない残りのボリュームはキャンセルされます。Returnは取引サーバーが常に満たされていないボリュームを埋めようとすることを意味します。
通常、約定ポリシーの設定について心配する必要はありません。これは、取引サーバーがディフォルトで適切な設定になる為です。必要に応じて、自動取引時に約定ポリシーを設定できます。必要に応じてトレーダーがこれを調節できるようにします。
EAイベントハンドラ P74
前の章の最後で、MQL5プログラムの構造について説明し、リーダーにイベントハンドラを紹介しました。EAプログラムで使用されるイベントハンドラについて説明します。
OnInit() P74
Initイベントが発生すると、OnInit()イベントハンドラが実行されます。Initイベントは、プログラムが初期化されるときに発生します。通常OnInit()イベントハンドラは、プログラムの開始時に1回実行されます。EAのプロパティに変更がある場合、または現在のチャートシンボル又は期間が変更された場合、EAは再初期化されOnInit()関数が再度実行されます。
プログラムの開始時に一度だけ実行したいアクションがある場合はそれらをOnInit()イベントハンドラに配置します。プログラムでOnInit()イベントハンドラは必須ではありませんが、推奨されます。OnInit()を使用して、特定の変数を初期化し、1回限りのアクションを実行します。
OnDelnit() P74
Deinitイベントが発生すると、OnDeinit()イベントハンドラが実行されます。Deinitイベントは、プログラムが初期化解除されるときに発生します。EAのプロパティが変更された場合、現在のチャートシンボル又は期間が変更された場合、またはプログラムが終了した場合、OnDinit()イベントが実行されます。
プログラムの終了時に実行したいアクションがある場合は、それらをOnDeinit()イベントハンドラに配置します。OnDeinit()イベントハンドラはプログラムでは必要ではありません。OnDeinit()イベントハンドラの1つの用途はオブジェクトを配置したインジケータまたはプログラムを削除するときにチャートからオブジェクトを削除することです。
OnTick() P75
NewTick()イベントが発生すると、OnTick()イベントハンドラが実行されます。NewTickイベントはサーバーから価格変更を受信したときに発生します。現在の市場活動に応じて、価格の変化は1分間に数回、または1秒間に数回発生する可能性があります。価格変更が発生する度にOnTick()イベントハンドラが実行されます。
OnTick()イベントハンドラは、プログラムで最も重要なイベントハンドラであり、EAで必要です。ほとんどすべてのトレーディングシステムロジックはOnTick()イベントハンドラで発生し、この本のコード例の多くはOnTick()イベントハンドラ内に入ります。
OnTrade() P75
OnTrade()イベントハンドラは、Tradeイベントが発生したときに実行されます。Tradeイベントは注文プールに変更があるたびに発生します。これには、注文の発注と変更、ポジションの決済と変更、指値注文のトリガーが含まれます。注文ステータスの変更が発生したときに実行したいアクションがある場合はそれらをOnTrade()イベントハンドラに配置します。OnTrade()イベントハンドラはオプションです。
OnTimer() P75
OnTimer()イベントハンドラはTimerイベントが発生したときに実行されます。TimerイベントはEventSetTimer()関数によって定義されたタイマーがアクティブになると発生します。これにより、指定した間隔でアクションを実行できます。OnTimer()イベントハンドラはオプションです。OnTimer()イベントハンドラの使用法については第18章で説明します。
Meta EditorでEAを作る P75
MetaEditorでEAファイルを作成する最も簡単な方法はMQL5ウィザードを使用することです。EAの作成に使用したいテンプレート(ソースコードのダウンロードに含まれているもの)がある場合は、ファイルを開いて別の名前で\MQL5\Expertsディレクトリに保存できます。残念ながらMQL5のMetaEditorでは定義済みのテンプレートファイルを使用できません。
MetaEditorツールバーの新規ボタンをクリックして、MQL5ウィザードを開きます。EA(テンプレート)が選択されていることを確認し【次へ】をクリックします。【プロパティ】ダイアログではファイル名とプログラムに関する説明情報を入力できます。必要に応じて【パラメータ】ウィンドウに入力変数を追加できます。¥MQL5¥Expertsフォルダへのパスはファイル名に既に含まれています。その前の「Experts\」パスを保持してEAの名前を入力します。図8.2は【プロパティ】を示しています。
図8.2-ウィザードのEAプロパティダイアログ
【次へ】をクリックすると追加のイベントハンドラを挿入するよう求められます。OnTrade()イベントハンドラはデフォルトでチェックされています。プログラムイベントハンドラを追加する必要がある場合は、それをチェックして下部にある【完了】をクリックすると新しいEA MQ5ファイルが\MQL5\Expertsフォルダに作成され、そのファイルがMetaEditorで開かれます。
図8.3-MQL5ウィザードのイベントハンドラーダイアログ
以下は、基本的なイベントハンドラが追加された空のEAテンプレートの外観です。
//+--------------------------------------------------------------------------------+
//| シンプルEA.mq5|
//| アンドリュー・R・ヤング|
//| https://www.リンク先|
//+--------------------------------------------------------------------------------+
#property copyright “Andrew Young”
#property Link “http://www.~~”
#property version “1.00”
//+--------------------------------------------------------------------------------+
//|エキスパート初期化関数 |
//+--------------------------------------------------------------------------------+
int OnInit()
{
//-------
//-------
return(0)
}
//+---------------------------------------------------------+
//|エキスパートの初期化解除関数 |
//+---------------------------------------------------------+
void OnDeinit(const int reason)
{
//-----
}
//+----------------------------------------------------------+
//|エキスパートTick関数 |
//+----------------------------------------------------------+
void OnTick()
{
//----
}
//+---------------------------------------------------+
MQL5ウィザードによって生成されたエキスパートアドバイザファイルには3つの記述的な#propertyディレクティブとデフォルトでOnInit()、OnDeinit()、およびOnTick()関数が含まれています。MQL5ウィザードで追加のイベントハンドラまたは入力パラメータを指定した場合、それらもここに表示されます。