English Русский 中文 Español Deutsch Português 한국어 Français Italiano Türkçe
オーダーストラテジー多目的Expert Advisor

オーダーストラテジー多目的Expert Advisor

MetaTrader 5トレーディング | 2 10月 2015, 17:12
805 0
Dmitry Fedoseev
Dmitry Fedoseev

はじめに

どのようなトレーディングストラテジーでも、最初の重要な要素はポジションを取るための価格分析とテクニカルインディケーターの分析です。それを市場分析と呼びましょう。つまり、マーケットで起こるすべてのことで、自分たちのコントロールの外あるもの。

さらに、ストラテジーには他のタイプの分析も必要になります。それを現在の取引環境の分析と呼びましょう。それはトレードポジションの分析と、有効な/無効な未処理のオーダー(ストラテジーで使用されるもの)の分析から成ります。その結果により、ポジションやオーダーに対するアクションを決定します。例えば:ポジションを閉じる、ストップロス、オーダーを出したり、取り消したりなど。言い換えれば、マーケット動向の理解や、それ(あるいはExpert Advisor)に応じたアクションや使用しているストラテジーのルールとなります。r

良く知られた、ある程度までの、トレーリングストップはトレーディングストラテジーの2つ目の要素と考えられます。次の分析について考えてみてください:もしも、設定した値よりも多く利益のあるポジションがある場合、ストップロスがセットされていない、あるいは設定されたよりも現在のプライスから離れている場合、ストップロスを移動する。

トレーリングストップは人気のあるシンプルな機能です。また、ポジション管理機能であり、トレーディオングストラテジーの全く異なるカテゴリーに分類されます。このように、トレーディングストラテジーは3つのカテゴリーに分かれる要素で構成されています:

  1. 市場分析とそれに基づくアクション。

  2. 取引環境の分析とそれに基づくアクション。

  3. ポジション管理。

この記事では、未処理のオーダーを有効に活用するストラテジー(短くオーダーストラテジーと呼びましょう)や、それを表すためのメタ言語やそれに基づき動作する多目的ツール(ExpertAdvisor)を中心に見ていきます。


オーダーストラテジーの具体例

トレードは通常、最初のポジションを持つことから始まります。それはいくつかの方法で行うことができます:

  1. マーケットポジションの取り方:

    • インディケーターが示す方向に。

    • Expert Advisorのプロパティウインドウのユーザーによって選択された方向に。

    • 前回閉じたポジションの結果に応じて。このようなポジションは、最初のポジションではなく中間動作フェーズのポジションになります。

  2. 2WAYストップオーダー。どちらかのオーダーが実行された場合に、もう片方のオーダーは取り消されます。

  3. 2WAYストップオーダー。どちらかのオーダーが実行された場合に、もう片方のオーダーは取り消されます。

  4. リミットオーダーとストップオーダーは同じ方向で出すことができます。このケースでは、図1のようにオーダーの方向を決めることが必要です、

最初にポジションを開いたら、他のストラテジーが使えるようになります。

リミットオーダーを使ったスケーリング(図 1)

ポジションを開いたら、サイズを増やしながら同じ方向にリミットオーダーを出します。リミットオーダーが実行されるとテイクプロフィットでポジションが閉じられるまで新しいリミットオーダーが実行されます。テイクプロフィットでポジションが閉じられると、残っている未処理のオーダーは取り消されます。

図 1. 指値注文を使ったスケーリング

図 1. 指値注文を使ったスケーリング

ストップ&リバース(図 2)

ポジションを開き、ストップロスのレベルに反対のストップオーダーをロットを増やして出します。ポジションがストップロスで閉じられると、未処理のオーダーの代わりに新しいストップオーダーがストップロスのレベルで出され、テイクプロフィットでポジションが閉じられるまで続きます。テイクプロフィットでポジションが閉じられると、残っている未処理のオーダーは取り消されます

図 2. ストップ&リバース

図 2. ストップ&リバース

ピラミッディング(図 3);

最初のポジションを取り、利益が出ているようであれば、ボリュームを増やし(スケールイン)ストップロスをブレークイーブンポイントに置きます。最初のポジションはテイクプロフィットで閉じられます。それまでにボリュームはかなり大きくなり、利益もそうなっていることが期待されます。それまでに、ストップロスにかかれば、それは単に利益が0になるということです。

図 3. ピラミッディング

図 3. ピラミッディング

リオープン(図. 4.)

マーケットポジションを取ります。ストップロスで閉じられると、ロットを増やしポジションが開かれ、テイクプロフィットで閉じられるまで続きます。このストラテジーはリミットオーダーで使われたスケーリングと似ています。

図 4. リオープン

図 4. リオープン

以上のストラテジーすべてを合わせることも可能です。ポジションに利益が乗っている場合は、ピラミッディングが有用です。しかし、ロスが出ている場合は、リミットオーダーを使ったスケーリングが適切でしょう。とは言え、リミットオーダーを使ったスケーリングは継続する必要はありません。例えば、まず3回スケーリングを行い、何度かのストップアンドリバースの後、リミットオーダーに戻ったりということもできます。

実際には、オーダーストラテジーの開発には時間が掛かります。それは必要なコーディングの範囲だけではなく、それぞれのケースで創造的な考え方が必要になるからです。このようなストラテジーのプログラミングを、すべてのオーダーストラテジーをインプリメントする多目的Expert Advisorを作成することにより、容易にする方法を説明します。


基本原理

オーダーストラテジー開発の基本原理は、現在のストラテジー・オペレーション・フェーズの識別と、そのフェーズに応じたアクションの実行です。

次の例を見てみましょう:マーケットポジションを取りたいと思います。買いのポジションとしましょう。ポジションを開いたら2つのオーダーを設定します:ストップオーダーを上に、リミットオーダーを下にです。開始した時点では、マーケットにポジションはありません。ポジションを開くためのオペレーションフェーズを識別しなければいけません。マーケットポジションがあれば、次のオペレーションフェーズだと分かります。フェーズは次のように識別できます:

  1. ポジションやオーダーが無い。ポジションを開く必要があります。

  2. ポジションはあるものの、オーダーはセットされていない。ストップオーダーが必要である。

  3. ポジションがあり、ストップオーダーがセットされている。リミットオーダーが必要である。

このルールに従えば、確実にインプリメントされますが、3つの段階が必要です。1つ目はポジションがあるかどうかの識別とポジションを開くこと、2つ目はポジションとオーダーのあるなしの識別、3つ目はポジションとオーダーの識別です。ストラテジーではこの3つのアクションが一度に実行される必要があります。

ですので、すべてのアクションを一度に行う必要があります:ポジションやオーダーが無ければ、ポジションと取る。ポジションを無事取れたら、ストップとリミットオーダーのリクエストを送信しなけれなばりません。オーダーをセットするために送られたすべてのオーダーが受け取られない場合もあります(回線の接続の問題、プライス情報の不足など。)しかし、トレードのフェーズは、ポジションを取ることのできる他のフェーズへ移行しています。これはすべての中間フェーズがカバーされるということです:

  1. ポジションがない。ポジションを開く必要があります。ポジションを無事取れたら、ストップとリミットオーダーのリクエストを送信しなけれなばりません。

  2. ポジションはあるものの、オーダーはセットされていない。ストップとリミットオーダーのリクエストを送信しなけれなばりません。

  3. ポジションがあり、ストップオーダーはセットされているが、リミットオーダーはセットされていない。リミットオーダーのリクエストを送信する必要があります。

  4. ポジションがあり、リミットオーダーはセットされているが、ストップオーダーはセットされていない。ストップオーダーのリクエストを送信する必要があります。

この例でフェーズを識別するためには、トレード状況が与えられて識別ルールに完全にマッチしなければなりません。特定のオーダーのセットがありますが、ポジションは1つだけで、他にはオーダーもポジションも何もない。ーこれ以外のものはありません。この原則を守るストラテジーオペレーションフェーズの説明はとても長く、最終的には実現不可能と分かるすべてのオプションも考慮する必要があるため全体のプロセスに時間がかかります。上記の例のオペレーションルールは、少し違うように設定することができます:

  1. ポジションがない。ポジションを開く必要があります。ポジションを無事取れたら、ストップとリミットオーダーのリクエストを送信しなけれなばりません。

  2. ポジションがある。この場合、マーケットには2つ未処理のオーダーがあるはずです。ストップオーダーがあるか確認して、なければ設定してください。リミットオーダーがあるか確認して、なければ設定してください。

この場合、オペレーションフェーズを識別するためのルールとそのフェーズでのトレード状況設定が最小になっています。

この原則の運用では、それが最初に取られたポジションなのか、あるいは特定のオーダーが既に実行されたのかを区別するためにポジション自身の特定が必要です。この状況では、システムは既に新しいオペレーションフェーズにあるため、2つ目のオーダーを入れる必要はありません。オーダーの識別は必要ですが、ポジションとオーダーの識別についてはもう少し後で見てみましょう。オーダーストラテジーをもう少し明確でコンパクトに説明するための原則を設定しましょう。

  1. 現在のオペレーションフェーズを、最小量の情報で識別するための方法が必要です。

  2. すべてのオペレーションフェーズはそのフェーズに対応した状況の完全な説明が必要です。

  3. マーケットでのアクション(ポジションを開く、閉じる、スケーリングイン、スケーリングアウトなど)や未決のオーダーがあるフェーズで必要な場合は、そのフェーズを2つのサブフェーズに分けます:マーケットアクションの前と後(すべてのアクションを一度に行い、失敗した指値注文をもう一度行うことができるように)。

  4. マーケットでのアクション(ポジションを開く、閉じる、スケーリングイン、スケーリングアウトなど)や未決のオーダーがあるフェーズで必要な場合は、未決のオーダーはマーケットアクションが正常に完了した後で処理されなければなりません。

  5. 1つのフェーズは1つのマーケットアクションと、数に限りの無い未決のオーダーのアクションに対応しています。


オーダーとポジションの識別

オーダーと注文はいくつかの方法で識別されます:オーダーコメントの使用、マジックナンバーやグローバル変数。コメントを使いましょう。コメントを使うことで発生する主な問題は、コメントサイズに制限のあることと、ブローカー自身がコメントに追加できるという事実です。ブローカーのコメントに対し十分なスペースがない場合、コメントの一部が省略されてしまいます。

ですので、コメントのスペースは可能な限り小さくし、ブローカーの入力とは別にできる方法を探しましょう。すべてのオーダーは1つだけ識別子を必要とします。実際には、1、2桁やアルファベット1文字と2桁にすることができます。識別子の最後には”=”マークを入れましょう(ブローカーの入力でそれを見たことはありませんので)。ですので、最大4文字ということになります。コメントから識別子を得るには、次の関数を使います:

//+------------------------------------------------------------------+
//|   Function for obtaining the identifier from the aComment string |
//+------------------------------------------------------------------+
string GetID(string aComment)
  {
   int    p =StringFind(aComment,"=",0); // Determine the position of the separator
   string id=StringSubstr(aComment,0,p); // Get the substring located before the separator
   return(id);
  }
//+------------------------------------------------------------------+

ポジションやオーダーを既知の識別子に対してチェックする場合は、次のように行います:

//+------------------------------------------------------------------+
//|   Checking the comment against the set identifier                |
//+------------------------------------------------------------------+
bool FitsID(string aID,string aComment)
  {
   return(StringFind(aComment,aID+"=",0)==0);
  }
//+------------------------------------------------------------------+


オーダーストラテジーの説明のためのメタ言語

オーダーストラテジーを書くための言語について定義しましょう。それは簡潔、明確、直観的であると同時にMQL5が必要のない計算をせずにコマンドを素早く実行できるようでなければいけません。その結果が成功かどうかの判断は読者に委ねたいと思います。

ストラテジーの説明はテキストファイルで行い、Expert Advisorのプロパティウインドウでそのファイル名を指定してExpert Advisorに接続します。

ファイルの1行はシステムのオペレーションフェーズの1つに対応します。1行は2つのフィールドに分けられます。1つ目のフィールドにはフェーズの識別ルールが含まれます。2つ目はアクションのリストを含みます。フィールドは垂直な線 "|"で分けられます。識別ルールとアクションリストはセミコロン”;”で区切られ分けられます。

コマンドに加え、各行の右側は”#”によりその他のテキストと区切られたコメントを書くことができます。

Nothing | Buy(M1,1,0,0) #If there is no position or order in the market, open a Buy position, mark it with "М1", lot 1, no Stop Loss, no Take Profit.

フェーズの識別

フェーズの識別には現在のマーケットポジション、未決のオーダー、最後のトレードなどの情報が必要です。ポジションの状態に加えて、いくつかの詳細が必要になることもあります。プライスや、利益、ストップロスの値など、設定されている場合。最後のトレードに関しては、その結果の情報も必要です。未決のオーダーについては、その指値や、ストップロス、テイクプロフィットの値を指定する必要がある場合があります(実行フェーズで必要になることが多いです)

この情報はトレードデータ・アクセスコマンドを使って得ることができます。コマンドの多くには2つのパラメータがあります:ポジションやオーダーの識別子と、パラメータの識別子です。パラメータ識別子が指定されていないと、コマンドや識別子で指定されているトレードオブジェクトの存在だけがチェックされます。

例えば、Buy(M1)コマンドは”M1”という識別子を持ったマーケットポジションがあることを示唆しています。Buy(M1)コマンドだけでは(あるいはシンプルにかっこなしのBuy)買いポジションの識別子は何でも良いことになります。パラメータの識別子を指定すると、パラメータの値を示すことになります、例えばBuy(M1,StopLossInPoints) - ”M1”の識別子を持った買いポジションに対して設定されたストップロス値。 識別子が指定されていない場合 - Buy(,StopLossInPoints)、すべてのの買いポジションに対するストップロス(Buyポジションがある場合)。

得られた値は状態を確認するための式で使うことができます。例えば:Buy(M1,StopLossInPoints)>=0 - ポジションはブレイクイーブンポイントにあります。ポジションがないか、異なる識別子のポジションがある場合、識別ルールでそう表されるフェーズは識別されません。- つまり、ポジションの状態とストップロスの値を確認するために、2つの条件を考慮に入れる必要はありません。しかし、この場合、ストップロスの存在は事前にチェックしなければいけません - Buy(M1,StopLossExists); Buy(M1,StopLossInPoints)>=0。

値をチェックする際、比較は次のものを使って行うことができます: ">=", "<=", "==", "!=", ">", "<". 比較の右側の値は数字か特別な変数で表されます: Var1, Var2 ... Var20. "p"を加えた数字や変数はポイント値(_Point 変数)により乗算されていることを示唆しています。

比較式の右側にはより複雑な演算式になることもあります。次のようになることもあります:X1*X2+X3*X4 (”+”は”-”に置き換えることもできます)、X1、 X2、 X3や X4は数字、変数、データアクセスコマンドなどです。以下の例は論理的には正しいと考えられます(その実用的な価値を無視すれば):

-BuyStop(BS1,StopLossInPoints)*-SellLimit(SL1,StopLossInPoints)+-SellStop(SS1,StopLossInPoints)*-BuyLimit(SL1,StopLossInPoints)

表1はすべてのアクセスコマンドの表です。

表1. データアクセスコマンド

インデックス コマンド 可能なパラメータ 目的
0 Nothing パラメータなし マーケットにはポジションも未処理のオーダーもありません
1 NoPos パラメータなし マーケットにはポジションがありません
2 Pending オブジェクト識別子、オーダーパラメーター識別子 オブジェクト識別子のある未処理のオーダーの指定。オブジェクト識別子が指定されていない場合、オブジェクト識別子の値に関係なく、すべての未処理オーダー
3 Buy オブジェクト識別子、オーダーパラメーター識別子 オブジェクト識別子のある買いポジションの指定。オブジェクト識別子が指定されていない場合、買いポジション
4 Sell オブジェクト識別子、オーダーパラメーター識別子 オブジェクト識別子のある売りポジションポジションの指定。 オブジェクト識別子が指定されていない場合、売りポジション
5 BuyStop オブジェクト識別子、オーダーパラメーター識別子 オブジェクト識別子のある買いポジションの指定。オブジェクト識別子が指定されていない場合、買いストップオーダー
6 SellStop オブジェクト識別子、オーダーパラメーター識別子 オブジェクト識別子のある売りストップオーダーの指定。オブジェクト識別子が指定されていない場合、売りストップオーダー
7 BuyLimit オブジェクト識別子、オーダーパラメーター識別子 オブジェクト識別子のある買いリミットオーダーの指定。オブジェクト識別子が指定されていない場合、買いリミットオーダー
8 SelLimit オブジェクト識別子、オーダーパラメーター識別子 オブジェクト識別子のある売りリミットオーダーの指定。オブジェクト識別子が指定されていない場合、売りストップオーダー
9 BuyStopLimit オブジェクト識別子、オーダーパラメーター識別子 オブジェクト識別子のある買いストップリミットオーダーの指定。オブジェクト識別子が指定されていない場合、買いストップリミットオーダー
10 SellStopLimit オブジェクト識別子、オーダーパラメーター識別子 オブジェクト識別子のある売りストップリミットオーダーの指定。オブジェクト識別子が指定されていない場合、売りストップリミットオーダー
11 LastDeal なし、トレードパラメータ識別子 最後のトレード
12 LastDealBuy なし、トレードパラメータ識別子 最後のトレードは買いトレード
13 LastDealSell なし、トレードパラメータ識別子 最後のトレードは売りトレード
14 NoLastDeal パラメータなし トレード履歴にデータがありません;Expert Advisorがアカウントで開始されたばかりの時に必要
15 SignalOpenBuy パラメータなし 買いポジションを取るインディケーターシグナル
16 SignalOpenSell パラメータなし 買いポジションを取るインディケーターシグナル
17 SignalCloseBuy パラメータなし 買いポジションを閉じるインディケーターシグナル
18 SignalCloseSell パラメータなし 売りポジションを閉じるインディケーターシグナル
19 UserBuy パラメータなし 買いのユーザーコマンド
20 UserSell パラメータなし 売りのユーザーコマンド
21 ビッド価格 パラメータなし ビッド価格
22 アスクプライス パラメータなし アスクプライス
23 ThisOpenPrice パラメータなし パラメータが計算されたオープニング価格。StopLimit型のオーダーを除く未決のオーダーのためのアクションコマンドで使用される
24 ThisOpenPrice1 パラメータなし パラメータが計算されたオープニング価格-1。StopLimit型のオーダーを除く未決のオーダーのためのアクションコマンドで使用される
25 ThisOpenPrice2 パラメータなし パラメータが計算されたオープニング価格-2。StopLimit型のオーダーを除く未決のオーダーのためのアクションコマンドで使用される
26 LastEADeal オブジェクト識別子、トレードパラメーター識別子 Expert Advisorにより実行された最後のトレード。コメントに"="を含む最後のトレード を過去のデータから検索し、オブジェクト識別子に対して確認する
27 LastEADealBuy オブジェクト識別子、トレードパラメーター識別子 Expert Advisorにより実行された最後の買いトレード。コメントに"="を含む最後のトレード を過去のデータから検索し、オブジェクト識別子とトレードの方向に対して確認する
28 LastEADealSell オブジェクト識別子、トレードパラメーター識別子 Expert Advisorにより実行された最後の売りトレード。コメントに"="を含む最後のトレード を過去のデータから検索し、オブジェクト識別子とトレードの方向に対して確認する
29 NoTradeOnBar パラメータなし 最後の足でのトレードがない

表1で示されたコマンドを使うことで次のいろいろな型のトレードオブジェクトにアクセスすることができます:ポジション、オーダー、トレードとオーダーのセット。異なるオブジェクトは異なるパラメータのセットがあります。

表2では、すべてのパラメータ識別子と適用されるオブジェクト型を表示しています。

表2. データアクセス識別子。

インデックス 識別子 目的 トレードのオブジェクトの型
0 ProfitInPoints プロフィットインのポイント Position
1 ProfitInValute デポジット通貨のプロフィットイン ポジション、トレード
2 OpenPrice オープニング価格 ポジション、指値注文(逆指値注文以外)
3 LastPrice Price トレード
4 OpenPrice1 逆指値から指値に移行するプライス StopLimit型の型の指値注文。オーダーがリミットに移行する時に適用されるOpenPrice識別子
5 OpenPrice2 逆指値からポジションに移行するプライス StopLimit型の型の指値注文。オーダーがリミットに移行する時に適用されるOpenPrice識別子
6 StopLossValue ストップロスの値 ポジション、指値注文
7 TakeProfitValue テイクプロフィットの値 ポジション、指値注文
8 StopLossInPoints ストップロスのポイント ポジション、指値注文
9 TakeProfitInPoints テイクプロフィットのポイント ポジション、指値注文
10 StopLossExists ストップロスの存在 ポジション、指値注文
11 TakeProfitExists テイクプロフィットの存在 ポジション、指値注文
12 Direction Direction 1 - 買い、 -1 - 売り ポジション、 指値注文、トレード

アクションの説明

マーケットのポジションのオープンとクローズ、指値注文の設定、変更、削除、管理関数の実行、トレーリングストップ、ブレイクイーブン、指値注文のトレーリングストップ(その他のポジション管理関数)などの行動。

ポジションのオープンやオーダーの設定には、これらのアクションを実行するために必要なパラメータの使用が含まれます。これらのパラメータは括弧内で関数が呼び出される方法で、指定されます。識別子はすべてのコマンドの最初のパラメータです。パラメータを指定する時には、存在するポジションやオーダーのパラメータに加え、数値、変数なども使うことができます。また、アクションコマンドのすべてのパラメータのフェーズアイデンティフィケーション・セクションで触れられているX1*X2+X3*X4のような数式を使うこともできます。

表3はすべてのアクセスコマンドの表です。

表3. アクションコマンド

インデックス コマンド 目的
0 Buy(ID,Lot,StopLoss,TakeProfit) 買いポジションを開く:
1 Sell(ID,Lot,StopLoss,TakeProfit) 売りポジションを開く:
2 Close(ID) マーケットポジションを閉じる
3 BuyStop(ID,Lot,Price,StopLoss,TakeProfit) 買い逆指値注文
4 SellStop(ID,Lot,Price,StopLoss,TakeProfit) 売り逆指値注文
5 BuyLimit(ID,Lot,Price,StopLoss,TakeProfit) 買い指値注文の設定
6 SellLimit(ID,Lot,Price,StopLoss,TakeProfit) 売り指値注文の設定
7 BuyStopLimit(ID,Lot,Price1,Price2,StopLoss,TakeProfit) 買いのストップリミットオーダーの設定
8 SellStopLimit(ID,Lot,Price1,Price2,StopLoss,TakeProfit) 売りのストップリミットオーダーの設定
9 Delete(ID) 指値注文の削除
10 DeleteAll(ID,BuyStop,SellStop,BuyLimit,SellLimit,BuyStopLimit,SellStopLimit) 特定の種類の指値注文の削除
11 Modify(ID,Price1,Price2,StopLoss,TakeProfit) ポジションやオーダーの情報
12 TrailingStop トレーリングストップ関数の動作。関数のパラメータはExpert Advisorのプロパティウインドウで定義されています
13 BreakEven ブレイクイーブン関数の動作。関数のパラメータはExpert Advisorのプロパティウインドウで定義されています

アクションコマンドパラメータの説明は表4で示されています。

表4. アクションコマンドパラメータ

パラメータ 目的
ID トレードオブジェクト(ポジション、オーダー)識別子
Lot ロットサイズをユニット単位で。ユニットの値を定義するたくさんの変数はExpert Advisorのプロパティウインドウで見ることができます
StopLoss ストップロスの値
TakeProfit テイクプロフィットの値
Price 指値注文の値(ストップリミット注文以外)
Price1 逆指値から指値に移行するプライス
Price2 逆指値からポジションに移行するプライス

それでは、新しいメタ言語で、以前レビューした古いストラテジーを書いてみましょう。


オーダーストラテジーのメタ言語による具体例

プログラムはすべてのフェーズアイデンティフィケーションとアクションコマンドが見やすく列に配置され、コメントにより注釈がつけられている表に表示されます。記事には、すべてのプログラムがExpert Advisorで使えるようにテキストファイルで添付されています。

注意事項: "+"、 "-" や "*"は識別子には使えません。シンプルに数字を使うのが良いでしょう。

指値注文を使ったスケーリング

プロパティウインドウでユーザーに指定された方向に開かれた最初のポジション。スケーリングは5回まで可能です(指値注文)。マーケットに一度に出せるのは3つの注文までです。

表5. 指値注文でスケーリング使うためのメタプログラム

フェーズ番号 フェーズの識別 アクション コメント
1 Nothing;
UserBuy
Buy(1,1,0,Ask+Var1p);
BuyLimit(2,2,Buy(1,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(3,4,BuyLimit(2,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(4,8,BuyLimit(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
マーケットにオーダーやポジションが無ければ、Expert Advisorのプロパティで買いの方向が設定され、初期ロットでポジションが開かれます。ポジションを無事取れたら、3つの指値注文の設定を試みます。すべての後続のオーダーの価格は、その前のオーダーの価格に基づいて設定されるため、前のオーダーが設定されていないと、設定することができません。
2 Buy(1) BuyLimit(2,2,Buy(1,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(3,4,BuyLimit(2,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(4,8,BuyLimit(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
ポジションがフェーズ1で無事開かれているものの、すべての指値注文がセットされていない場合、その注文をセットする試みは継続されます。
3 Buy(2) BuyLimit(3,4,Buy(2,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(4,8,BuyLimit(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(5,16,BuyLimit(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
もしも最初の指値注文(識別子2)がセットされると、前のフェーズでセットされるはずだった(しかしセットに失敗した)残りの2つのオーダーのセットは、絶えずマーケットに3つのオーダーが出ているように、継続されます。
4 Buy(3) BuyLimit(4,8,Buy(3,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(5,16,BuyLimit(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(6,32,BuyLimit(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
もう1つの指値注文のトリガーが引かれ、前のフェーズのように、3つのオーダーがマーケットに存在しているかを確認しなければなりません。
5 Buy(4) BuyLimit(5,16,Buy(4,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p);
BuyLimit(6,32,BuyLimit(5,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p)
このフェーズでは、オーダーの数はその最大数に近い為、2つの指値注文の存在だけを保証します。
6 Buy(5) BuyLimit(6,32,Buy(5,OpenPrice)-Var2p,0,ThisOpenPrice+Var3p) このフェーズでは最後の1つのオーダーだけがあります。
7 Buy(6) Modify(6,,,Buy(6,OpenPrice)-Var4p,) 最後のオーダーが実行されたら、ストップロスを設定します。
8 Nothing;
UserSell
Sell(1,1,0,Var1p); SellLimit(2,2,Sell(1,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(3,4,SellLimit(2,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(4,8,SellLimit(3,OpenPrice)+Var2p,0,ThisOpenPrice-Var3pます
フェーズ1と似ていますが、売りの方向です。
9 Sell(1) SellLimit(2,2,Sell(1,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(3,4,SellLimit(2,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(4,8,SellLimit(3,OpenPrice)+Var2p,0,ThisOpenPrice-Var3pます
フェーズ2と似ていますが、売りの方向です。
10 Sell(2) SellLimit(3,4,Sell(2,OpenPrice)+Var2p,0,Var3);
SellLimit(4,8,SellLimit(3,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(5,16,SellLimit(4,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
フェーズ3と似ていますが、売りの方向です。
11 Sell(3) SellLimit(4,8,Sell(3,OpenPrice)+Var2p,0,Var3);
SellLimit(5,16,SellLimit(4,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p);
SellLimit(6,32,SellLimit(4,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
フェーズ4と似ていますが、売りの方向です。
12 Sell(4) SellLimit(5,16,Sell(4,OpenPrice)+Var2p,0,Var3);
SellLimit(6,32,SellLimit(5,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p)
フェーズ5と似ていますが、売りの方向です。
13 Sell(5) SellLimit(6,32,Sell(5,OpenPrice)+Var2p,0,ThisOpenPrice-Var3p) フェーズ6と似ていますが、売りの方向です。
14 Sell(6) Modify(6,,,Sell(6,OpenPrice)+Var4p,) フェーズ7と似ていますが、売りの方向です。
15 NoPos;
Pending
DeleteAll(,0,0,1,1,0,0) 指値注文がありますが、ポジションはありません。これはポジションのテイクプロフィットが実行された時に起こります。 この場合、オーダーは削除しなければなりません。オーダーの削除の後、システムはフェーズ1かフェーズ9に切り替わります。システムの動作中に初期方向を無効にしていると、アクションは起こりません。

変数の使用: Var1 - 初期のオーダーのテイクプロフィット、 Var2 - 前のオーダーのプライスに関連してセットされる指値注文のレベル Var3 - 最後のオーダーのストップロス。

図5はこのメタプログラムのパフォーマンスをしめすチャートです。

 図 5. 指値注文におけるスケーリングのためのメタプログラム。
図 5. 指値注文におけるスケーリングのためのメタプログラム。

注意してください:売りと買いの方向のルールは別々に概説されています。すべての後続の指値注文のレベルはその前の注文のレベルに基づいて計算されます。オーダーのセットに失敗した時は、必要な情報が足りないため、次のオーダーはセットされません。マーケットでのポジションのプライスに基づいて計算するのは間違っています。この場合、オーダーの一部はなくなってしまいます。

ストップ&リバース

2つのストップオーダーを出すところから始まります。最大5つのリバースを持つことができます。

表 6. ストップ&リバースのためのメタプログラム。

フェーズ番号 フェーズの識別 アクション コメント
1 Nothing BuyStop(1,1,Ask+Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellStop(1,1,Bid-Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
マーケットにポジションあるいはオーダーがありません;識別子1を持つ2つの逆指値注文を出そうと試みます。
2 NoPos;
BuyStop(1)
SellStop(1,1,Bid-Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) マーケットにポジションはありませんが、識別子1を持つBuyStopがあります。これは識別子1を持つSellStopがあるはずだということです。
3 NoPos;
SellStop(1)
BuyStop(1,1,Ask+Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) [参考] マーケットにポジションはありませんが、識別子1を持つSellStopがあります。これは識別子1を持つBuyStopがあるはずだということです。
4 Buy(1) Delete(1);
SellStop(2,2,Buy(1,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
マーケットには識別子1を持つ買いポジションがあります;この場合、識別子1を持つオーダーはありませんが、識別子2を持つSellStopがあるはずです。
5 Sell(1) Delete(1);
BuyStop(2,2,Sell(1,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p)
フェーズ4に似ていますが、最初のSellStopのトリガーが引かれました。
6 Buy(2) SellStop(3,4,Buy(2,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) 2つ目のBuyStopが実行されたので、3つ目のSellStopをセットしなければなりません。 should be set.
7 Sell(2) BuyStop(3,4,Sell(2,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) 2つ目の SellStop が実行されたので、3つ目のBuyStop をセットしなければなりません。
8 Buy(3) SellStop(4,8,Buy(3,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) 3つ目のBuyStopが実行されたので、4つ目のSellStopをセットしなければなりません。
9 Sell(3) BuyStop(4,8,Sell(3,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) 3つ目の SellStop が実行されたので、4つ目のBuyStop をセットしなければなりません。
10 Buy(4) SellStop(5,16,Buy(4,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) 4つ目のBuyStopが実行されたので、5つ目のSellStopをセットしなければなりません。
11 Sell(4) BuyStop(5,16,Sell(4,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) 4つ目のSellStopが実行されたので、5つ目のBuyStopをセットしなければなりません。
12 Buy(5) SellStop(6,32,Buy(5,StopLossValue),ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) 5つ目のBuyStopが実行されたので、6つ目のSellStopをセットしなければなりません。
13 Sell(5) BuyStop(6,32,Sell(5,StopLossValue),ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) 5つ目のSellStopが実行されたので、6つ目のBuyStopをセットしなければなりません。
14 NoPos;
BuyStop(2)
Delete(2) マーケットにポジションはありませんが、BuyStopがまだあります;これはポジションがテイクプロフィットでクローズされた時に起こります。この場合、残りのオーダーは削除され、システムはフェーズに1に切り替わります。
15 NoPos;
SellStop(2)
Delete(2) フェーズ14と同じ。
16 NoPos;
BuyStop(3)
Delete(3) フェーズ14と同じ。
17 NoPos;
SellStop(3)
Delete(3) フェーズ14と同じ。
18 NoPos;
BuyStop(4)
Delete(4) フェーズ14と同じ。
19 NoPos;
SellStop(4)
Delete(4) フェーズ14と同じ。
20 NoPos;
BuyStop(5)
Delete(5) フェーズ14と同じ。
21 NoPos;
SellStop(5)
Delete(5) フェーズ14と同じ。
22 NoPos;
BuyStop(6)
Delete(6) フェーズ14と同じ。
23 NoPos;
SellStop(6) |
Delete(6) フェーズ14と同じ。

変数の使用: Var1 - 最初のオーダーがマーケットプライスからセットされたレベル、Var2 - ストップロス、 Var3 - テイクプロフィット。

図 6はこのメタプログラムのパフォーマンスをしめすチャートです。

図. 6. ストップ&リバースのためのメタプログラムのパフォーマンス
図. 6. ストップ&リバースのためのメタプログラムのパフォーマンス

ピラミッディング

最初にポジションはインディケーターのシグナルに基づいて開かれます。これは5回まで行うことができます。

表7. ピラミッディングのためのメタプログラム”

フェーズ番号 フェーズの識別 アクション コメント
1 Nothing;
SignalOpenBuy
Buy(1,1,Ask-Var1p,Ask+Var2p*6) マーケットにポジションあるいはオーダーはありませんが、インジケーターから買いポジションをオープンするシグナルを得、ポジションを開きます。テイクプロフィットはまず、Var2p*6と等しい距離でセットされ、次にVar2p*5と、テイクプロフィットが同じプライスレベルになるようにセットされます。
2 Buy(1);
Buy(1,ProfitInPoints)>=Var3
Buy(2,1,Ask-Var1p,Ask+Var2p*5) 良い利益がある買いポジションがあるので、スケールインします。
3 Buy(2) Modify(2,,,Buy(2,OpenPrice),) マーケットのポジションはインデックス2を持っています。これはポジションは最初のポジションではないということを示しているの、スケールインされていないといけません;ストップロスはブレイクイーブンポイントに置きます。
4 Buy(2);
Buy(2,ProfitInPoints)>=Var3
Buy(3,1,Ask-Var1p,Ask+Var2p*4) The position is again winning so we scale in.
5 Buy(3) Modify(3,,,Buy(3,OpenPrice),) ストップロスはスケールインするたびにブレイクイーブンから動かされます。
6 Buy(3);
Buy(3,ProfitInPoints)>=Var3
Buy(4,1,Ask-Var1p,Ask+Var2p*3) フェーズ4と同じ。
7 Buy(4) Modify(4,,,Buy(4,OpenPrice),) フェーズ5と同じ。
8 Buy(4);
Buy(4,ProfitInPoints)>=Var3
Buy(5,1,Ask-Var1p,Ask+Var2p*2) フェーズ4と同じ。
9 Buy(5) Modify(5,,,Buy(5,OpenPrice),) フェーズ5と同じ。
10 Buy(5);
Buy(5,ProfitInPoints)>=Var3
Buy(6,1,Ask-Var1p,Ask+Var2p) フェーズ4と同じ。
11 Buy(6) Modify(6,,,Buy(6,OpenPrice),) フェーズ5と同じ。
12 Nothing;
SignalOpenSell
Sell(1,1,Bid+Var1p,Bid-Var2p*6) フェーズ1と同じですが、売りポジションです。
13 Sell(1);
Sell(1,ProfitInPoints)>=Var3
Sell(2,1,Bid+Var1p,Bid-Var2p*5) フェーズ2と同じですが、売りポジションです。
14 Sell(2) Modify(2,,,Sell(2,OpenPrice),) フェーズ3と同じですが、売りポジションです。
15 Sell(2);
Sell(2,ProfitInPoints)>=Var3
Sell(3,1,Bid+Var1p,Bid-Var2p*4) フェーズ4と同じですが、売りポジションです。
16 Sell(3); Modify(3,,,Sell(3,OpenPrice),) フェーズ5と同じですが、売りポジションです。
17 Sell(3);
Sell(3,ProfitInPoints)>=Var3
Sell(4,1,Bid+Var1p,Bid-Var2p*3) フェーズ6と同じですが、売りポジションです。
18 Sell(4); Modify(4,,,Sell(4,OpenPrice),) フェーズ7と同じですが、売りポジションです。
19 Sell(4);
Sell(4,ProfitInPoints)>=Var3
Sell(5,1,Bid+Var1p,Bid-Var2p*2) フェーズ8と同じですが、売りポジションです。
20 Sell(5); Modify(5,,,Sell(5,OpenPrice),) フェーズ9と同じですが、売りポジションです。
21 Sell(5);
Sell(5,ProfitInPoints)>=Var3
Sell(6,1,Bid+Var1p,Bid-Var2p) フェーズ10と同じですが、売りポジションです。
22 Sell(6); Modify(6,,,Sell(6,OpenPrice),) フェーズ11と同じですが、売りポジションです。

変数の使用: Var1 - 最初のストップロス, Var2 - 最後のオーダーのテイクプロフィット、 Var3 -スケールインしストップロスをブレイクイーブンに移動するプロフィットインポイント。

図 7はこのメタプログラムのパフォーマンスをしめすチャートです。

図. 7. ピラミッディングのためのメタプログラムのパフォーマンス
図. 7. ピラミッディングのためのメタプログラムのパフォーマンス

リオープン

まず最初に、2つの指値注文をセットします。そのうちの1つのトリガーが引かれると、もう1は削除されます。そして、ストップロスが実行されると、新しいポジションが開かれ、テイクプロフィットか、ポジションの数の最大値(5)が使用されるまで開かれたままになります。

図 8. リオープンのためのメタプログラム。

フェーズ番号 フェーズの識別 アクション コメント
1 Nothing;
NoLastDeal
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellLimit(1,1,Bid+Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
マーケットにはポジションやオーダーが無く、アカウントの過去データがこの通貨に対するトレードがまだないことを示しています。これは、まだシステム動作の初期段階だということを示しています。2つの指値注文が最初のアクションとしてセットされます。
2 Nothing;
LastDeal(,ProfitInValute)>0
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellLimit(1,1,Bid+Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
マーケットにはポジションやオーダーがありませんが、アカウントの過去データはこの通貨に対するトレードがクローズされたことを示しています。これは、前のフェーズが完了したため、また初めから開始し、2つの指値注文をフェーズ1でセットする必要があることを示しています。
3 Nothing;
LastEADeal(5)
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p);
SellLimit(1,1,Bid+Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p)
マーケットにはポジションやオーダーがありませんが、アカウントの過去データには最後の識別子を持つトレードが含まれています。この場合、フェーズは完了したと考えられますので、トレードで得られた利益は重要ではありません;また最初から、フェーズ1で2つの指値注文を出すことから始めます。
4 NoPos;
BuyLimit(1)
SellLimit(1,1,Bid+Var1p,ThisOpenPrice-Var2p,ThisOpenPrice+Var3p) マーケットにはポジションがありませんが、1つの指値注文があることが分かっています。これは2つ目の注文があることを意味します。
5 NoPos;
SellLimit(1)
BuyLimit(1,1,Ask-Var1p,ThisOpenPrice+Var2p,ThisOpenPrice-Var3p) フェーズ4と同じ。
6 Buy(1);
SellLimit(1)
Delete(1) 識別子1を持つポジションがあります。これは、どちらかのオーダーが実行された場合に、もう片方のオーダーは取り消されることを意味します。
7 Sell(1);
BuyLimit(1)
Delete(1) フェーズ6と同じ。
8 Nothing;
LastDeal(1,ProfitInValute)<=0;
LastEADeal(1,Direction)==1
Buy(2,2,Ask-Var2p,Ask+Var3p) ポジションはなく、最後のトレードで利益は出ていません。Expert Advisorにより実行された最後のトレードの方向を確認します; もしも買いトレードであれば、次に取るべきポジションも買いポジションです。
9 Nothing;
LastDeal(1,ProfitInValute)<=0;
LastEADeal(1,Direction)==-1
Sell(2,2,Bid+Var2p,Bid-Var3p) ポジションはなく、最後のトレードで利益は出ていません。Expert Advisorにより実行された最後のトレードの方向を確認します; もしも売りトレードであれば、次に取るべきポジションも売りポジションです。
10 Nothing;
LastDeal(2,ProfitInValute)<=0;
LastEADeal(2,Direction)==1
Buy(3,4,Ask-Var2p,Ask+Var3p) フェーズ8と同じ。
11 Nothing;
LastDeal(2,ProfitInValute)<=0;
LastEADeal(2,Direction)==-1
Sell(3,4,Bid+Var2p,Bid-Var3p) フェーズ9と同じ。
12 Nothing;
LastDeal(3,ProfitInValute)<=0;
LastEADeal(3,Direction)==1
Buy(4,8,Ask-Var2p,Ask+Var3p) フェーズ8と同じ。
13 Nothing;
LastDeal(3,ProfitInValute)<=0;
LastEADeal(3,Direction)==-1
Sell(4,8,Bid+Var2p,Bid-Var3p) フェーズ9と同じ。
14 Nothing;
LastDeal(4,ProfitInValute)<=0;
LastEADeal(4,Direction)==1
Buy(5,16,Ask-Var2p,Ask+Var3p) フェーズ8と同じ。
15 Nothing;
LastDeal(4,ProfitInValute)<=0;
LastEADeal(4,Direction)==-1
Sell(5,16,Bid+Var2p,Bid-Var3p) フェーズ9と同じ。

変数の使用: Var1 - 指値注文がセットされたマーケットプライスのレベル、 Var2 - ストップロス、 Var3 - テイクプロフィット。

図8はこのメタプログラムのパフォーマンスをしめすチャートです。

図 8. リオープニングのためのメタプログラムのパフォーマンス
図 8. リオープニングのためのメタプログラムのパフォーマンス

以下は、トレーディングシグナルや、トレーリングストップ、ブレイクイーブンなどの関数の動作をみるための簡単なプログラムでです。

トレーディングシグナル

エントリーとエグジットはトレーディングシグナルに基づいています。

表9. トレードシグナルのためのメタプログラム

フェーズ番号 フェーズの識別 アクション コメント
1 Nothing;
SignalOpenBuy;
NoTradeOnBar
Buy(1,1,0,0) マーケットにはポジションやオーダーがありませんが、買いポジションを開くためのシグナルがあります。最新の足で行ったトレードはなく、買いオプションを開きます。
2 Nothing;
SignalOpenSell;
NoTradeOnBar
Sell(1,1,0,0) マーケットにはポジションやオーダーがありませんが、売りポジションを開くためのシグナルがあります。最新の足で行ったトレードはなく、売りオプションを開きます。
3 SignalCloseBuy;
Buy(1)
Close(1); 買いポジションとそれを閉じるシグナルがあります;買いポジションが閉じられます。
4 SignalCloseSell;
Sell(1)
Close(1); 売りポジションとそれを閉じるシグナルがあります;売りポジションが閉じられています。

図9はこのメタプログラムのパフォーマンスをしめすチャートです。

図 9. トレードシグナルのためのメタプログラムのパフォーマンス
図 9. トレードシグナルのためのメタプログラムのパフォーマンス

トレーリングストップのあるトレードシグナル

表10. トレーリングストップのあるトレードシグナルのメタプログラム。

フェーズ番号 フェーズの識別 アクション コメント
1 Nothing;
SignalOpenBuy;
NoTradeOnBar
Buy(1,1,0,0) マーケットにはポジションやオーダーがありませんが、買いポジションを開くためのシグナルがあります。最新の足で行ったトレードはなく、買いオプションを開きます。
2 Nothing;
SignalOpenSell;
NoTradeOnBar
Sell(1,1,0,0) マーケットにはポジションやオーダーがありませんが、売りポジションを開くためのシグナルがあります。最新の足で行ったトレードはなく、売りオプションを開きます。
3 SignalCloseBuy;
Buy(1)
Close(1); 買いポジションとそれを閉じるシグナルがあります;買いポジションが閉じられます。
4 SignalCloseSell;
Sell(1)
Close(1); 売りポジションとそれを閉じるシグナルがあります;売りポジションが閉じられます。
5 Buy(1) TrailingStop マーケットには買いポジションがあります;トレーリングストップ関数を有効化する必要がります。
6 Sell(1) TrailingStop マーケットには売りポジションがあります;トレーリングストップ関数を有効化する必要がります。

図10はこのメタプログラムのパフォーマンスをしめすチャートです。

 図 10. トレーリングストップのあるトレードシグナルのメタプログラム
図 10. トレーリングストップのあるトレードシグナルのメタプログラム

ブレイクイーブン関数のあるトレードシグナル

表11. ブレイクイーブン関数のあるトレードシグナルのメタプログラム。

フェーズ番号 フェーズの識別 アクション コメント
1 Nothing;
SignalOpenBuy;
NoTradeOnBar
Buy(1,1,0,0) マーケットにはポジションやオーダーがありませんが、買いポジションを開くためのシグナルがあります。最新の足でのトレードはないため、買いポジションが開かれます。
2 Nothing;
SignalOpenSell;
NoTradeOnBar
Sell(1,1,0,0) マーケットにはポジションやオーダーがありませんが、売りポジションを開くためのシグナルがあります。最新の足でのトレードはないため、売りポジションが開かれます。
3 SignalCloseBuy;
Buy(1)
Close(1); 買いポジションとそれを閉じるシグナルがあります;買いポジションが閉じられます。
4 SignalCloseSell;
Sell(1)
Close(1); 売りポジションとそれを閉じるシグナルがあります;売りポジションが閉じられます。
5 Buy(1) BreakEven マーケットには買いポジションがあります;ブレイクイーブン関数を有効化する必要がります。
6 Sell(1) BreakEven マーケットには売りポジションがあります;ブレイクイーブン関数を有効化する必要がります。

図11はこのメタプログラムのパフォーマンスをしめすチャートです。

図 11. ブレイクイーブン関数のあるトレードシグナルのメタプログラムのパフォーマンス

図 11. ブレイクイーブン関数のあるトレードシグナルのメタプログラムのパフォーマンス


コマンドインタプリタ

上記のオーダーストラテジーの形式化により、それらの理解とExpert Advisorでのさらなる実装のためのアルゴリズムの開発や直接的なインタープリットや精緻化ルールに従うことが可能になりました。Expert AdviosrのeInterpretatorはこの目的を念頭に置いて(添付ファイル参照)作成されました。Expert Advisorのパラメータとその説明は表12で見ることができます。

表12. eInterpretator Expert Advisorのパラメータ

パラメータ 目的
Lots 係数が1と等しい時のオーダーのボリューム。
UserTradeDir ユーザーにより指定されたトレードの方向( UserBuyやUserSellコマンドを実行する時のフェーズアイデンティフィケーションでチェックされます)。
ProgramFileName メタプログラムのファイル名(アカウントで作業する場合。)テストや最適化を行う時は、メタプログラムはTesterMetaProgram.txtファイル内に置かなければなりません
DeInterpritate コマンドの逆インタプリテーション完了すると、”De_”が頭に付いたファイルがファイルフォルダに表れます。Expert AdvisorがどのようにProgramFileNameファイルのメタプログラムを”理解”したかを見ることができます。

ユーザー変数
Var1 - Var20 ユーザー変数
トレーリングストップ
TR_ON トレーリングストップ関数の有効化。
TR_Start トレーリングストップが動き始めるポイントでのポジションの利益。
TR_Level トレーリングストップのレベル現在のマーケットプライスから ストップロスのポイントまでの距離。
TR_Step ストップロスの変更ためのポイントのステップ。
ブレイクイーブン
BE_ON ブレイクイーブン関数の有効化。
BE_Start ブレイクイーブンが動き始めるポイントでのポジションの利益。
BE_Level ブレイクイーブンのトリガーが引かれた時に、ストップロスが移動するレベル。The BE_Start-BE_Level of profit points is fixed.
シグナルのオープン
OS_ON シグナルのオープンの有効化。
OS_Shift インディケーターがチェックされた足:0 - 新、 1 -完了。
OS_TimeFrame インディケーターのタイムフレーム
OS_MA2FastPeriod 早いMA期間。
OS_MA2FastShift 早いMAシフト。
OS_MA2FastMethod 早いMAメソッド。
OS_MA2FastPrice 早いMAプライス。
OS_MA2SlowPeriod 遅いMA期間。
OS_MA2SlowShift 遅いMAシフト。
OS_MA2SlowMethod 遅いMAメソッド。
OS_MA2SlowPrice 遅いMAプライス。
シグナルのクローズ
CS_ON シグナルのクローズの有効化。
CS_Shift インディケーターがチェックされた足:0 - 新、 1 -完了。
CS_TimeFrame インディケーターのタイムフレーム
CS_CCIPeriod CCI period.
CS_CCIPrice CCI price.
CS_CCILevel アッパーCCIレベル(買いポジションを閉じるため)。買いポジションを閉じるためのシグナルは下落中の交差で現れます。売りポジションを閉じる場合は、そのちょーど逆です。

Expert Advisorの動き方

まず初めに、ファイルからメタプログラムをロードして調べ、分析します。グロスエラーがメタプログラムで見つかった場合、エラーの警告がポップアップ表示されます。メタプログラムを分析し、Expert Advisorは最大のパフォーマンスを行うためにデータ構造をテキストコマンドに対応する数字の値で埋めます。メタプログラムの分析に成功すると、次のメッセージがログに印刷されます:”インタプリタの初期化が完了”.

DeInterpritateの変数が含まれる場合、Expert Advisorはコマンドを逆に解釈するテストを行います(それにより、チャートから切断されStrategy Testerにありその時に実行されているテストは中止されます)。逆解釈をする時には、ストラクチャ内の数字をテキストコマンドに変形します。ファイルのコマンドエントリは違いますが、メタプログラムの逆解釈によりExpert Advisorがどのようにコマンドを分析するのかを知ることができます。

次の文字列をメタプログラムのファイルから使っているのを見てみましょう:

Buy(6) | Modify(6,,,ThisOpenPrice-Var4p,)

次の逆解釈により、この文字列は次のようになります:

Buy(6)==1*1+0*0; | Modify(6,,,ThisOpenPrice()*1-0.0025*1,)

ご覧のとおり、 シンプルなBuy(6)コマンドが不等式の形に変換され右側のX1*X2+X3*X4の計算の答えは1になります。アクションフィールドでは、ユーザー変数は数字に置き換えられます。


Expert Advisorのカスタマイズヒント

Expert Advisorに自分のコマンドやポジションを管理する関数を分析フェーズやコマンド実行に加えることでカスタマイズしたい人もいるかもしれません。Expert Advisorの構造により、そういったカスタマイズはとても分かりやすいものです。そうでなければ、Expert Advisorに対して行われたことが全く実践的価値のないものになってしまいます。

データコマンドの追加

データを取得するコマンドのリストはInfoCommand配列の中にあります。コマンドは行に5つずつ並べて配置されますので、コマンドの追加は数を数えてインデックス値を追加することで簡単に行うことができます。

InfoCommand配列にコマンドを追加した後は、 SetValue() 関数の中にあるスイッチ構造に新しいコマンドに対応する新しいケースを追加します。値を得るには、値を得るオブジェクトを選択します。その時に限り値を得ます。データを得るオブジェクトのタイプにより、異なる関数を使いオブジェクトを選択します。これらの関数は表13で示されています。

表 13. トレードオブジェクトを選択するためのExpert Advisorの

関数 目的とパラメータ
Pos.Select(_Symbol) ポジション選択。PositionSelect()関数に似た標準クラスメソッド.
SelectOrder(long aType,string aID,bool & aSelected) 通貨ペアのExpert Advisor、型 (aType)識別子(aID)によりオーダーを選択する関数。オブジェクトが見つかり選択された場合、参照によるaSeleted変数は真を返します。
bool SelectLastDeal(int aType,bool & aSelected) Expert Advisor、型 (aType)識別子(aID)により最後のトレードを選択する関数。オブジェクトが見つかり選択された場合、参照によるaSeleted変数は真を返します。
SelectLastEADeal(int aType,string aID,bool & aSelected) シンボルのExpert Advisorと型 (aType)により、Expert Advisorにより実行された最後のトレードを選択する関数。オブジェクトが見つかり選択された場合、参照によるaSeleted変数は真を返します。

最後のトレードとExpert Advisorにより最後に実行されたトレードの違いは、最後のトレードは ストップロスとテイクプロフィットトレードを含むということです。最後のトレードのデータは最後のポジションをクローズした時の結果を決定するために必要になるかもしれません。Expert Advisorによって実行された取引の情報は最後のトレードの方向やExpert Advisorのオペレーションフェーズを識別するために必要になるかもしれません。

トレードオブジェクトデータに加え、マーケットデータに対するアクセス、プライスなども得ることができます。データが得られることを確認することです。次のオブジェクトを選択した後には、オブジェクトが本当に選択されたかを確認 (aSelectedの値を確認することで)しなければいけません。必要なパラメータを取得し、その値をVal.Value変数に割り当て、真を返します。

図 14 では、様々さなトレードオブジェクトのパラメータを得るために使う関数を表示しています。

表14. 選択されたトレードオブジェクトのパラメータを得るためのExpert Advisorの関数

関数 目的とパラメータ
double SelPosParam(int aIndex) aIndexインデックスのセットからポジションパラメータを得る
double SelOrdParam(int aIndex) aIndexインデックスのセットからオーダーパラメータを得る
double SelDealParam(int aIndex) aIndexインデックスのセットからトレードパラメータを得る

得られたデータの識別子インデックスは関数に渡されます。インデックス値はVal.InfoIdentifierIndex変数に格納されています。

新しいアクセスコマンドを追加する時には、得られるデータの識別子を追加するか、あるいは得られるデータの識別子を追加するだけで良いかもしれません。

データ識別子の追加

InfoIdentifier配列の中に識別子のリストがあります。配列に新しい識別子を追加する必要があります。そのインデックスを見つけSelPosParam()、 SelOrdParam() やSelDealParam() 関数をアップデートします。新しい識別子がすべてのトレードオブジェクトに適用されるかどうかによって、アップデートが関係する関数も変わります。関数のアップデートは、スイッチ構造に新しい識別子に対応する新しいケースを追加することで構成されています。

アクションコマンドの追加

アクションコマンドはActCommand配列に追加されます。コマンドは配列内で文字列で配置されているので、必要なインデックスを見つけるのが少し難しいです。コマンドを追加することに加え、そのパラメータの数と型を指定しなければいけないため、それぞれの要素は文字列を表しています。パラメータの数はActCmndPrmCnt配列内で指定され、型は ActCmndType配列内で表示されています。可能なタイプは次のものです:0-マーケットアクション、1-指値注文に関するアクション、2-ポジション管理。

コマンドが配列に追加されると、DoAction() 関数が見つかり、スイッチを呼び出すための新しい関数に他のケースを追加します。新しい関数はブール型で、正しく実行された場合は真を、エラーの場合は偽を返します。関数のパフォーマンスチェックが必要でない場合、トレーリングストップ関数と同様に、ただ真を返します。

未決のオーダーを扱う関数、その設定を行う関数などは、オーダーの存在の予備チェックが必要です。

トレードシグナル関数の変更

Expert Advisorで取引シグナルを得るために必要なすべてのことは2つずつの関数で行われます(ポジションを閉じるための2つの関数とポジションを取るための2つの関数)

CloseSignalsInit() 関数(ポジションを閉じるためのシグナルの初期化)とOpenSignalsInit()関数(ポジションを取るためのシグナルの初期化)はExpert AdvisorのOnInit() 関数から呼び出されます。これらの関数はインディケーターのロードを担当します。主な関数 - CloseSignalsMain() (ポジションを閉じるためのシグナルの識別) and OpenSignalsMain() (ポジションを取るためのシグナルの識別)は、ティックの度にOnTick()関数から呼び出されます。

関数の実行の最初に、GlobalCloseBuySignal、 GlobalCloseSellSignal (ポジションを閉じるための)やGlobalOpenBuySignal、 GlobalOpenSellSignal (ポジションを取るため)は偽を割り当てられ、対応するインディケータの読み込みに応じて真を返します。

さらに、Expert AdvisorのOnDeinit() 関数では、IndicatorRelease()を実行する必要があります。


付録

  • eInterpretator.mq5 - ターミナルデータディレクトリのMQL5/Expertsに入れて置くExpert Advisorです。

  • LimitAdd.txt - リミットオーダーでのスケーリングのためのメタプログラム。

  • StopRev.txt - ストップ&リバースのためのメタプログラム。

  • Piramiding.txt - ピラミッディングのためのメタプログラム。

  • ReOpen.txt.txt - リオープンのためのメタプログラム。

  • TradeSignals.txt - トレードシグナルのためのメタプログラム。

  • TradeSignalsTR.txt - トレーリングストップのあるトレードシグナルのメタプログラム。

  • TradeSignalsBE.txt - ブレイクイーブン関数のあるトレードシグナルのメタプログラム。

  • limitadd.set - リミットオーダーを使たスケーリングのためのパラメータのファイル。

  • stoprev.set - ストップ&リバースのためのパラメータのファイル。

  • piramiding.set - ピラミッディングのパラメータのファイル。

  • reopen.set - リオープンのためのパラメータのファイル。

  • tradesignals.set - トレードシグナルのパラメータのファイル。

  • tradesignalstr.set - トレーリングストップのあるトレードシグナルのパラメータのファイル。

  • tradesignalsbe.set -ブレイクイーブン関数のあるトレードシグナルのパラメータのファイル。

注意トレードシグナル、トレーリングストップやブレイクイーブンのあるプログラムを使う時は、Expert Advisorのプロパティウインドウで対応する関数を有効にすることを忘れないで下さい。ストラテジーテスターでストラテジーをテストすると時にはメタプログラムをファイルをTesterMetaProgram.txt file (リモートテストAgent を使うときに必要です。)にコピーしてください。ファイルはターミナルデータディレクトリ(ファイル>データフォルダを開く、でターミナルからファイルを開くことができます)のMQL5/Filesに置いてください。

メタ言語セクションのオーダーストラテジーの例でチャート上に表示されているプログラムのパフォーマンスはパラメータファイルで指定されているパラメータに基づいています。テストは過去数か月間(2012年8月29日現在)EURUSDの1時間、1分足で行われました。


まとめ

多くの場合、オーダーストラテジーの開発を始めた時に最初に感じる感情は混乱です。- 何から始めて、何に注意し、実際の環境でのExpert Advisorの安定性はどう確保したら良いのか、トレーディングストラテジーのアルゴリズムとそのオペレーションの信頼性をどう結合したら良いのか?

この記事が、ストラテジーを形式化するためにEAの開発を望む開発者やトレーダーが、ストラテジー開発を段階を踏んで理解し、そこで何を学び、何を注意したら良いかを理解する助けに少しでもなれば幸いです。 EInterpretator Expert Advisorを使うことで、オーダーストラテジーを実験を最小の時間と努力で可能にします。

また、Meta Trader 5に対する賞賛を控えることは不可能であると申し上げておきます。ストラテジーテスターでのEInterpretatorのExpert Advisorの動作スピードは私の想像の範囲外でした!

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/495

添付されたファイル |
files__4.zip (23.39 KB)
初心者のためのクイックスタート、あるいはショートガイド 初心者のためのクイックスタート、あるいはショートガイド
読者の皆さんこんにちは!この記事では、Expert Advisorsの作成やインディケーターの使い方などの基本的なコツを簡単に素早く掴めるように説明していきたいと思います。初心者対象で難しいサンプルの紹介は行いません。
MQL5でのトレードオペレーション - 簡単です MQL5でのトレードオペレーション - 簡単です
ほとんどすべてのトレーダーは利益をあげるためにマーケットに参加しますが、中にはそのプロセス自体を楽しむトレーダーもいます。しかし、手動のトレードだけが、エキサイティングな体験をさせてくれるわけではありません。自動トレードシステムの開発も非常に興味深いものです。トレードロボットの作成は面白いミステリー小説を読むのと同じくらい面白いものです。
プライスヒストグラム(マーケット特性)とMQL5への導入 プライスヒストグラム(マーケット特性)とMQL5への導入
「マーケットプロファイル」は非常に優秀な思索家、 ピーター・スタイドルマイヤー氏によって展開されました。氏は全く異なるモデルセットに導く『水平的な』また『垂直的な』マーケットの動きに関する情報の別の解釈の仕方を提案しました。潜在するマーケットの拍動、または均衡と不均衡の周期と呼ばれる基本パターンがある、と仮定したのです。本記事では、プライスヒストグラムについて考察していきたいと思います。それは、マーケットプロファイルの最も単純なモデルです。また、その MQL5への導入について述べていきたいと思います。
MQL5 で多色インジケーターを作成する MQL5 で多色インジケーターを作成する
この記事では、多色のインジケーターを作成する方法あるいは既存のものを多色に変える方法を検討する。MQL5 は情報を便利な形で提示することを可能にする。さてインジケーターの付いた十を越えるチャートを見て RSI (相対力指数)あるいは統計レベルの解析を行う必要はない、インジケーターの値に異なった色でローソク足を塗ればよい。