
オーダーストラテジー多目的Expert Advisor
はじめに
どのようなトレーディングストラテジーでも、最初の重要な要素はポジションを取るための価格分析とテクニカルインディケーターの分析です。それを市場分析と呼びましょう。つまり、マーケットで起こるすべてのことで、自分たちのコントロールの外あるもの。
さらに、ストラテジーには他のタイプの分析も必要になります。それを現在の取引環境の分析と呼びましょう。それはトレードポジションの分析と、有効な/無効な未処理のオーダー(ストラテジーで使用されるもの)の分析から成ります。その結果により、ポジションやオーダーに対するアクションを決定します。例えば:ポジションを閉じる、ストップロス、オーダーを出したり、取り消したりなど。言い換えれば、マーケット動向の理解や、それ(あるいはExpert Advisor)に応じたアクションや使用しているストラテジーのルールとなります。r
良く知られた、ある程度までの、トレーリングストップはトレーディングストラテジーの2つ目の要素と考えられます。次の分析について考えてみてください:もしも、設定した値よりも多く利益のあるポジションがある場合、ストップロスがセットされていない、あるいは設定されたよりも現在のプライスから離れている場合、ストップロスを移動する。
トレーリングストップは人気のあるシンプルな機能です。また、ポジション管理機能であり、トレーディオングストラテジーの全く異なるカテゴリーに分類されます。このように、トレーディングストラテジーは3つのカテゴリーに分かれる要素で構成されています:
市場分析とそれに基づくアクション。
取引環境の分析とそれに基づくアクション。
ポジション管理。
この記事では、未処理のオーダーを有効に活用するストラテジー(短くオーダーストラテジーと呼びましょう)や、それを表すためのメタ言語やそれに基づき動作する多目的ツール(ExpertAdvisor)を中心に見ていきます。
オーダーストラテジーの具体例
トレードは通常、最初のポジションを持つことから始まります。それはいくつかの方法で行うことができます:
マーケットポジションの取り方:
インディケーターが示す方向に。
Expert Advisorのプロパティウインドウのユーザーによって選択された方向に。
前回閉じたポジションの結果に応じて。このようなポジションは、最初のポジションではなく中間動作フェーズのポジションになります。
2WAYストップオーダー。どちらかのオーダーが実行された場合に、もう片方のオーダーは取り消されます。
2WAYストップオーダー。どちらかのオーダーが実行された場合に、もう片方のオーダーは取り消されます。
リミットオーダーとストップオーダーは同じ方向で出すことができます。このケースでは、図1のようにオーダーの方向を決めることが必要です、
最初にポジションを開いたら、他のストラテジーが使えるようになります。
リミットオーダーを使ったスケーリング(図 1)
ポジションを開いたら、サイズを増やしながら同じ方向にリミットオーダーを出します。リミットオーダーが実行されるとテイクプロフィットでポジションが閉じられるまで新しいリミットオーダーが実行されます。テイクプロフィットでポジションが閉じられると、残っている未処理のオーダーは取り消されます。
図 1. 指値注文を使ったスケーリング
ストップ&リバース(図 2)
ポジションを開き、ストップロスのレベルに反対のストップオーダーをロットを増やして出します。ポジションがストップロスで閉じられると、未処理のオーダーの代わりに新しいストップオーダーがストップロスのレベルで出され、テイクプロフィットでポジションが閉じられるまで続きます。テイクプロフィットでポジションが閉じられると、残っている未処理のオーダーは取り消されます
図 2. ストップ&リバース
ピラミッディング(図 3);
最初のポジションを取り、利益が出ているようであれば、ボリュームを増やし(スケールイン)ストップロスをブレークイーブンポイントに置きます。最初のポジションはテイクプロフィットで閉じられます。それまでにボリュームはかなり大きくなり、利益もそうなっていることが期待されます。それまでに、ストップロスにかかれば、それは単に利益が0になるということです。
図 3. ピラミッディング
リオープン(図. 4.)
マーケットポジションを取ります。ストップロスで閉じられると、ロットを増やしポジションが開かれ、テイクプロフィットで閉じられるまで続きます。このストラテジーはリミットオーダーで使われたスケーリングと似ています。
図 4. リオープン
以上のストラテジーすべてを合わせることも可能です。ポジションに利益が乗っている場合は、ピラミッディングが有用です。しかし、ロスが出ている場合は、リミットオーダーを使ったスケーリングが適切でしょう。とは言え、リミットオーダーを使ったスケーリングは継続する必要はありません。例えば、まず3回スケーリングを行い、何度かのストップアンドリバースの後、リミットオーダーに戻ったりということもできます。
実際には、オーダーストラテジーの開発には時間が掛かります。それは必要なコーディングの範囲だけではなく、それぞれのケースで創造的な考え方が必要になるからです。このようなストラテジーのプログラミングを、すべてのオーダーストラテジーをインプリメントする多目的Expert Advisorを作成することにより、容易にする方法を説明します。
基本原理
オーダーストラテジー開発の基本原理は、現在のストラテジー・オペレーション・フェーズの識別と、そのフェーズに応じたアクションの実行です。
次の例を見てみましょう:マーケットポジションを取りたいと思います。買いのポジションとしましょう。ポジションを開いたら2つのオーダーを設定します:ストップオーダーを上に、リミットオーダーを下にです。開始した時点では、マーケットにポジションはありません。ポジションを開くためのオペレーションフェーズを識別しなければいけません。マーケットポジションがあれば、次のオペレーションフェーズだと分かります。フェーズは次のように識別できます:
ポジションやオーダーが無い。ポジションを開く必要があります。
ポジションはあるものの、オーダーはセットされていない。ストップオーダーが必要である。
ポジションがあり、ストップオーダーがセットされている。リミットオーダーが必要である。
このルールに従えば、確実にインプリメントされますが、3つの段階が必要です。1つ目はポジションがあるかどうかの識別とポジションを開くこと、2つ目はポジションとオーダーのあるなしの識別、3つ目はポジションとオーダーの識別です。ストラテジーではこの3つのアクションが一度に実行される必要があります。
ですので、すべてのアクションを一度に行う必要があります:ポジションやオーダーが無ければ、ポジションと取る。ポジションを無事取れたら、ストップとリミットオーダーのリクエストを送信しなけれなばりません。オーダーをセットするために送られたすべてのオーダーが受け取られない場合もあります(回線の接続の問題、プライス情報の不足など。)しかし、トレードのフェーズは、ポジションを取ることのできる他のフェーズへ移行しています。これはすべての中間フェーズがカバーされるということです:
ポジションがない。ポジションを開く必要があります。ポジションを無事取れたら、ストップとリミットオーダーのリクエストを送信しなけれなばりません。
ポジションはあるものの、オーダーはセットされていない。ストップとリミットオーダーのリクエストを送信しなけれなばりません。
ポジションがあり、ストップオーダーはセットされているが、リミットオーダーはセットされていない。リミットオーダーのリクエストを送信する必要があります。
ポジションがあり、リミットオーダーはセットされているが、ストップオーダーはセットされていない。ストップオーダーのリクエストを送信する必要があります。
この例でフェーズを識別するためには、トレード状況が与えられて識別ルールに完全にマッチしなければなりません。特定のオーダーのセットがありますが、ポジションは1つだけで、他にはオーダーもポジションも何もない。ーこれ以外のものはありません。この原則を守るストラテジーオペレーションフェーズの説明はとても長く、最終的には実現不可能と分かるすべてのオプションも考慮する必要があるため全体のプロセスに時間がかかります。上記の例のオペレーションルールは、少し違うように設定することができます:
ポジションがない。ポジションを開く必要があります。ポジションを無事取れたら、ストップとリミットオーダーのリクエストを送信しなけれなばりません。
ポジションがある。この場合、マーケットには2つ未処理のオーダーがあるはずです。ストップオーダーがあるか確認して、なければ設定してください。リミットオーダーがあるか確認して、なければ設定してください。
この場合、オペレーションフェーズを識別するためのルールとそのフェーズでのトレード状況設定が最小になっています。
この原則の運用では、それが最初に取られたポジションなのか、あるいは特定のオーダーが既に実行されたのかを区別するためにポジション自身の特定が必要です。この状況では、システムは既に新しいオペレーションフェーズにあるため、2つ目のオーダーを入れる必要はありません。オーダーの識別は必要ですが、ポジションとオーダーの識別についてはもう少し後で見てみましょう。オーダーストラテジーをもう少し明確でコンパクトに説明するための原則を設定しましょう。
現在のオペレーションフェーズを、最小量の情報で識別するための方法が必要です。
すべてのオペレーションフェーズはそのフェーズに対応した状況の完全な説明が必要です。
マーケットでのアクション(ポジションを開く、閉じる、スケーリングイン、スケーリングアウトなど)や未決のオーダーがあるフェーズで必要な場合は、そのフェーズを2つのサブフェーズに分けます:マーケットアクションの前と後(すべてのアクションを一度に行い、失敗した指値注文をもう一度行うことができるように)。
マーケットでのアクション(ポジションを開く、閉じる、スケーリングイン、スケーリングアウトなど)や未決のオーダーがあるフェーズで必要な場合は、未決のオーダーはマーケットアクションが正常に完了した後で処理されなければなりません。
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. 指値注文におけるスケーリングのためのメタプログラム。
注意してください:売りと買いの方向のルールは別々に概説されています。すべての後続の指値注文のレベルはその前の注文のレベルに基づいて計算されます。オーダーのセットに失敗した時は、必要な情報が足りないため、次のオーダーはセットされません。マーケットでのポジションのプライスに基づいて計算するのは間違っています。この場合、オーダーの一部はなくなってしまいます。
ストップ&リバース
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. ストップ&リバースのためのメタプログラムのパフォーマンス
ピラミッディング
最初にポジションはインディケーターのシグナルに基づいて開かれます。これは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. ピラミッディングのためのメタプログラムのパフォーマンス
リオープン
まず最初に、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. リオープニングのためのメタプログラムのパフォーマンス
以下は、トレーディングシグナルや、トレーリングストップ、ブレイクイーブンなどの関数の動作をみるための簡単なプログラムでです。
トレーディングシグナル
エントリーとエグジットはトレーディングシグナルに基づいています。
表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. トレードシグナルのためのメタプログラムのパフォーマンス
トレーリングストップのあるトレードシグナル
表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. トレーリングストップのあるトレードシグナルのメタプログラム
ブレイクイーブン関数のあるトレードシグナル
表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. ブレイクイーブン関数のあるトレードシグナルのメタプログラムのパフォーマンス
コマンドインタプリタ
上記のオーダーストラテジーの形式化により、それらの理解と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





- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索