
「新しいトレーディングの特質」に基づいたエキスパートアドバイザー : Bill Williams著
はじめに
この記事ではエキスパートアドバイザーの開発について論じる、これは私の著作 "New Trading Dimensions: How to Profit from Chaos in Stocks, Bonds, and Commodities" (新しいトレーディングの次元 : 株式、ボンド、商品の混沌から儲ける方法) by Bill Williams に基づいている。戦略そのものはよく知られているが、その使用はいまだにトレーダーたちの間でも議論の的である。
新参者たちはすぐにでも使える種々のシグナルの研究に惹かれるがそれらは主観的なもので「ほとんど完全に」貧しいものである、一方、例えばエリオットの波動理論の解釈もある。これは一見しただけのことであり、あるところでは決定はいまだにトレーダーによって行う必要がある。このことはこの記事でさらに論じられる。
この記事の目的- 開発には OOP パラダイム (オブジェクト指向プログラミング)かつ B. Williamsの戦略に基づいてトレードに実用されている EA のあるクラスを用いる。これをC_TS_BWと呼ぼう;
- クラス C_TS_BW の中で、可能な場合 Standard Library から出来合いのコードを使うとよい。
- クラス C_TS_BW を用いた EA を書く;
- 開発した EA をいくつかのForex と CFD 商品上で戦略テスター によりテストする;
- 最後に、この戦略の適正を現在の市場の状況で確認あるいは反論する。
1. インジケーター
トレードシステムの基礎に4つのインジケーターからのシグナルがある。
1.1. アリゲータ;
Alligator 技術インジケーター はフラクタル幾何学を使うバランスライン (Balance Lines) (移動平均)と非線形ダイナミックスの組合せである。
- 青ライン (アリゲーターの顎) - はチャートを作るのに使われる期間のバランスラインである (13期間の平滑化移動平均、将来方向に8バー分シフト);
- 赤ライン (アリゲーターの歯) - は所定期間のバランスラインであるオーダーによって下げたもの (8期間の平滑化移動平均、将来方向に5バー分シフト);
- 緑ライン (アリゲーターの唇) - は所定期間のバランスラインでもう1つのオーダーによって下げたもの (5期間の平滑化移動平均、将来方向に3バー分シフト);
アリゲーターの唇、歯と顎ラインは異なった期間の相互作用を示している。市場のトレンドは時間の15-30パーセントの間だけ同定されているので、トレンドに従うべきで、ある価格に期間内でのみ変動する市場では働くべきではない。
もし顎、歯と唇が接近、あるいは捩れていれば、アリゲーターは眠る、あるいは既に寝ている状態である。それが眠ると、空腹が募り、そしてさらに眠る、目覚めたときにはさらに空腹である。目覚めたとき、最初にすることは口を開け、あくびを始める。そして食べ物の匂いをかぎ始める:牛か熊の肉、そして狩を始める。アリゲーターが空腹を満たすと、食べ物(価格)に関心がなくなる (バランスラインが寄り集まり)。これは利益を固定するときである。
1.2. フラクタルズ;
全ての市場は、大半の時間、価格は大きく変動することはないが、短期間(15-30パーセント)に変化が見られる。利益を抽出するのに最も好ましい期間は市場の価格があるトレンドに従って変化するときである。フラクタルズ - は Bill William のトレーディングシステムの4つのインジケーターの一つであり、これは底と頂上を検出することができる。上向きフラクタルの技術的定義は最低5つの連続したバーの順列に最高の最大値の前後に2バーの低めの最大値があるものである。反対の形 (5バーの順列で、最低の最小値の前後に2バーの高めの最小値がある) は下向きフラクタルである。、チャート上でフラクタルズはHighとLowの値を持ち、上向きと下向きの矢印で示される。
技術的インジケーターのフラクタルズのシグナルは技術的インジケーターのアリゲーターを用いてフィルターされる必要がある。言い換えると、フラクタルがアリゲーターの歯より下にあれば、買いの取引を閉じるべきではなく、フラクタルがアリゲーターの歯より上にあれば、売りの取引を閉じるべきではない。フラクタル信号が出て、アリゲーターの顎より上と決まり、有効となれば、当たるまであるいはさらに最近のフラクタルシグナルが出現するまでシグナルに留まる。
1.3. AO (オーサム・オシレーター)
Bill Williams によるオーサム・オシレーター の技術的インジケーター (オーサム・オシレーター, AO) - は34期間の単純な移動平均で、バーの中点(H + L)/2を元にした5期間の単純移動平均からバーの平均点 (H + L)/2 を引いたもので構成されている。これは市場の駆動力に現時点で何が起こっているのかを教えるものである。
1.4. AO (加速オシレータ)
価格は変化する最後の要素である。価格が変化する前に、市場の駆動力が変化し、その駆動力が方向を変える前に、駆動力の加速が弱まりゼロとなる。そして加速が始まり、価格が方向を変えるまで続く。
加速/減速技術インジケーター (加速/減速 インジケーター, AC) は現在の駆動力の加速と減速を測る。このインジケーターは駆動力の変化が起こる前に方向を変え、そして今度は価格の変化が起こる前に方向を変える。ACは早期の警告シグナルであることを理解すると、明らかに役立つ。
2. シグナル
B. Williamsの著作本 "New Trading Dimensions" に記述されているトレーディングシステムは5つのトレーディング次元からのシグナルを用いる。
- 第1の次元:アリゲーターの顎を越えるフラクタルを乗り越える;
- 第2の次元:AOインジケーター (オーサム・オシレーター) からのシグナル
- 第3の次元:ACインジケーター (加速オシレーター) からのシグナル;
- 第4の次元:ゾーンの中のトレード;
- 第5の次元:バランスライン・トレード。
各次元からのシグナルの詳細
2.1. 第1次元のシグナルによるトレーディングの説明
"A" フラクタル (買いシグナル) は、価格の崩れはアリゲーターの顎ラインの下で起こるので、false である。"B" フラクタルは実行され、そして、オープンの短期ポジションを持つ。"C" フラクタルが出現すると、短期ポジションを閉じ、そして既に正味長期ポジションを持っている。
"D" フラクタルが現れるとポジションを買いから売りに切り替える。"E" フラクタルの到来は買い、市場は再びポジションは売りから買いに変える必要があると教えている。"G" と "J" フラクタルからのシグナルの実行で、もう一つの長期ポジションの契約を加える。
図 1. 第1次元のシグナルでのトレードの例
2.2. 第2次元のシグナルによるトレーディングの説明
2つの第2次元のシグナルが実装されている。これはAO (オーサム・オシレーター) インジケーターのゼロライン交差と「受け皿」シグナルである。 時系列として MetaTrader 5で行っているバーの番号付けを受け入れよう。シグナルのチェックはゼロ番のバーで行われる。
「ゼロライン交差」パターンの形成のために、インジケーターの2つのバーがなければならない。
買いシグナルはインジケーターの第2バーがゼロラインの下に、第1バーがゼロラインの上にあるときに形成される。第1バーの最大価格がシグナルとなり、それが越えると、現在の価格で買いオーダーがサーバーに送られる。売りシグナルは反対のケースの交差で形成される。
「受け皿」パターンの形成には、3つの連続したバーがあることが必要、そして第2がゼロラインの上の赤色、第1が緑で第2より高くなければならない。シグナルとする価格は第1バーの最高の価格で、現在の価格で越されるまであるいは新しい買いシグナルが形成されるまで有効である。「受け皿」パターンの売りシグナルは同様にしかしインジケーターの反対側で形成される。
「受け皿」パターンの形成には、3つの連続したバーがあることが必要、そして第2がゼロラインの上の赤色、第1が緑で第2より高くなければならない。シグナルとする価格は第1バーの最高の価格で、現在の価格で越されるまであるいは新しい買いシグナル形成されるまで有効である。「受け皿」パターンの売りシグナルは同様にしかしインジケーターの反対側で形成される。
「双子のピーク」と「双子の底」シグナルはこの記事では考察せず、 EAにもプログラムされない。それはその形成はいつもアリゲーターの反対側で起こると言う事実によるためである:双子の底は顎ラインの下、双子のピークはこのラインの上となる。システムに矛盾するこのようなシグナルのトレーディングは、アリゲーターに食わせないために、顎より下で買うことはできず、アリゲーターの顎より上で売ることもできない。
シグナルのより詳しい説明は元本を参照することを勧める。
図 2. 第2次元のシグナルでのトレードの例
2.3. 第3次元のシグナルによるトレーディングの説明
第3次元には AC インジケーター (加速 オシレーター) で形成される「ゼロラインの上の買い」と「ゼロラインの下の買い」がある。
まず図3に示されたパターンを見る。ゼロ番のバーをチェックする。ヒストグラムでもし第1バーがゼロラインの上で ("A" のケース)、2つの緑と1つの赤から成る場合。ここで、ゼロラインに対して第2と第3のバーの位置は問題としない。
買いのシグナルの形成には、第1バーがゼロラインの下にあり ("B"のケース)、 3つの緑と1つの赤のバーを必要とする。これもまたゼロラインに関して残りのバーは問題としない。第3次元の売りシグナルは逆にしたものと同じである。
もっと詳しい説明と例は元本を参照。
図 3. 第3次元シグナルのトレードの例
2.4. 第4次元 (「ゾーントレード」)トレードシグナルの説明
2つのインジケーター (AO+AC) があるバーに対して緑である場合、緑のゾーンが形成される。
トレーディングシグナルの形成には、2つの連続した緑ゾーンが要求され、第1バーの終値は第2バーの終値より高くなければならない。
一旦新しいバーが開くと実行が行われる。オリジナルにおいては、バーが閉じるとき実行がオーダーとなる。バーが閉じられる最後のチックで AO や AC の色が変わる状況があり、もしそれが起これば、緑ゾーンのシグナルに従う買いが falseと成る。このような理由により、新しいバーの始まりを買いに用いた。
また、第4の次元では、長期ポジションに対して継続に対する停止オーダーがある。
これには5つの連続した緑のゾーンを要求する。第1ゾーンの価格の最小値がStop Loss を設定するのに使われる。次のバーでストップオーダーが発されるのでなければ (そのクローズの後)、新しいバーの開始と共に前のバーのゾーンの色に関わりなく最後に終了したバーの最小価格で Stop Loss を設定する (ストップオーダーより高くなければならない)。
また、連続した緑ゾーンの数によってオープンしている長期ポジションへの追加に制限をする。この後、灰色(これは AO と AC が異なる列の色であるときである)あるいは赤色のゾーンの出現を待たなければならない 、それで再び緑色ゾーンから買いのポジションを埋めることが許される。
売るためのシグナルは「赤色ゾーン」を形成する - 緑色ゾーンの鏡像である。ゾーンの色はまた「バランスライントレード」(第5次元) からシグナルを形成するバーの数に影響を与える。このラインには、B. Williams がアリゲーターの「歯」を選んだ。
このシグナルには、ゼロ番のバーのOHLC 価格がシグナルの形成に関与する。
図 4. 第4次元シグナルのトレードの例
2.5. 第5次元のシグナルによるトレードの説明
「バランスラインより上の買い」パターン (もし緑色ゾーンなら) が2バーで形成される。もしゼロバーの開始価格 (またこの瞬間のバーの最高価格) がそのバーの最後の最高価格より低い (数バー戻ってもよい)ならば、 そこに見つかる最大価格が、緑ゾーンでの買いポジションをオープンする価格となる。
赤色あるいは灰色ゾーンは緑ゾーンに入る価格より高いもう一つの最大値を要求する。それを見つけるとすぐに (通常10バー以下戻りそしてアリゲーターの歯より上 [私は著者のテキストでそのようなパターンを探すのにどれだけのバー戻るのかを見つけられなかった] )それを赤色あるいは灰色ゾーンで買いの方向で入るための価格として思い出す。
「バランスラインを上回る買い」シグナルによってポジションをオープンするために、(緑色/赤色/灰色のための) 各新規バー上の価格を越える現在価格をチェックする。
図 5. 第5次元シグナルのトレードの例
3. The C_TS_BW クラス
3.1. クラスの目的:- もし可能であれば Standard Library クラスを使う;
- 大量の "類似データ" 構造の中に保存されているはずである;
- カスタム化の設定;
- 解析のためにインジケーターから必要な数の計算したデータを獲得する;
- 新バーに際して, 5つのトレード次元からのシグナルをチェックする;
- 新チックに際して、ポジションをオープンするためのシグナルをチェックする;
- ロットを計算する、固定あるいは「ピラミッド式」(このクラスのメソッド CalcLot にあるこのアルゴリズムについて学ぶだろう);
- 各シグナルのために EA のロットを直接変更することを許す;資金管理アルゴリズムのカスタムなニーズを実装する。
- オープンポジションのストップオーダーを追跡する。必要であれば、EA からユーザーが計算して、ストップロスの価格を変更する;
- トレードサーバーにオーダーを送り、もしエラーがあれば第2の要求を行う;
- トレードシグナルの重複を禁止する (1シグナルにつき一度だけ入れる);
- パブリックなクラスメソッドの数を最小化する;
...もし可能であれば、Standard library からのクラスとメソッドを用いる;
このタスクを実行するため、まず Standard Libraryから適切なファイルをインクルードする。
これは下のコードで実装される。
#include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\PositionInfo.mqh> #include <Trade\HistoryOrderInfo.mqh
クラスのprivate section で、trading requests の組織化のためのオブジェクトを宣言し、 シンボルとオープンなポジションの情報を獲得し、オーダーの来歴にアクセスする。
CTrade exp_trade; // trading methods from the Standard Library CSymbolInfo s_info; // methods of accessing the information on symbol CPositionInfo pos_info; // methods of obtaining the information on position CHistoryOrderInfo h_info; // methods of accessing the history of orders
... 大量の "類似データ" がストラクチャー内に保存されている;
このクラスは4つの構造を使う、その2つは private sectionの中で宣言する。以下がその構造である:
struct l_signals // structure of signals and time of the bar, on which they appeared struct l_trade // structure of the time of the last triggered signals
また public sectionに2つの構造がある:
struct s_input_parametrs // structure of the tuning parameters struct s_actual_action // structure of the appropriate trading order
このタイプの構造のオブジェクト:
l_signals last_signals; // signals l_trade last_trade; // processed signals s_input_parametrs inp_param; // internal structure of the accepted settings s_input_parametrs inp_param_tmp; // receiving structure of the settings (received through a link with the initialization of the class) s_actual_action actual_action; // orders on the serve
この構造のコードについての詳細は添付したヘッダーファイルにて見つけることができる。
...カスタム化の設定;
このタスクはpublic セクションの Init メソッドを使って実装できる。...EA から呼び出すためのパラメーター:
string Symbol_for_trade // symbol, on which the class will trade ENUM_TIMEFRAMES Period_for_trade // the period of the chart symbol, on which the search for signals and its processing will occur s_input_parametrs &inp_param_tmp // receiving structure of the class settings
このメソッドはまた関与するインジケーターの初期化と、そこから受け取るデータのための必要なバッファーの整備も行う。
...解析のためにインジケーターから必要な数の計算したデータを獲得する;
これは privateセクションからの CopyIndValue メソッドを使って行える。
int type // what we request (0- Alligator, 2 - АО, 3 - АС ) int countValue // amount of data
パラメーターtypeによって、受信バッファーは自動的に計算された値に置き換えられ、クラス初期化のための時系列として整備される。
... 新しいバーを開く間 ...
シグナルのサーチは新しいバーを開いた後一度だけ実行される。これを行うため、その瞬間を決定する必要がある。NewBar メソッドがこれを行う、それは入力パラメーターを持たず、受け取ったチックが新しいバーを開くと true を、そうでなければ false を戻す。
...5つのトレード次元からのシグナルをチェックする;
各トレーディング次元に対して、別々のメソッドを始める。第1次元のシグナルが FindSignal_1_dimension によってチェックされる。
呼び出しのパラメーター:
int type // direction of the fractal for the search (0- to buy, 1 to sell) double &price_out[] // this array, after a successful search, will contain the fractal price datetime &time_out[] // in this array, after a successful search, will contain the time of the bar on which the fractal is found
第2次元の解析がFindSignal_2_dimensionメソッドによって行われる。呼び出しのパラメーター:
int type // direction of the search (0-in the direction of to buy, 1-in the direction to sell) int sub_type // subtype of the search (0- signal of transferring the zero line, 1- sign "saucer") double &price_out[] // this array, after a successful search, will contain the signal price datetime &time_out[] // this array, after a successful search, will contain the time of the bar signal
第3次元の解析が FindSignal_3_dimensionメソッドによって行われる、これには入力/出力のパラメーターがある。
int type // direction of the search (0-in the direction of to buy, 1-in the direction of to sell) int sub_type // subtype of the search (0- signal on two identical bars, 1- signal for "three identical bars) double &price_out[] // this array, after a successful search, will contain the signal price datetime &time_out[] // this array, after a successful search, will contain the time of the bar signal
第4次元の解析が FindSignal_4_dimensionメソッドによって、入出力パラメーターを伴って行われる。
int type // direction of the search (0-in the direction to buy, 1-in the direction to sell) int sub_type // what we are looking for (0- signal from the zones, 1- tailing stop for five consecutive zones of one color) double &price_out[] // this array, after a successful search, will contain the signal price datetime &time_out[] // this array, after a successful search, will contain the time of the signal bar
第5次元が FindSignal_5_dimensionによってモニターされる。このメソッドのためのパラメーター:
int type // direction of the search (0-in the direction to buy, 1-in the direction to sell) int sub_type // subtype of the search (0- signal for two bars, 1- signal for three bars) double &price_out[] // this array, after a successful search, will contain the signal price datetime &time_out[] // this array, after a successful search, will contain the time of the bar signal
チェックの全体が CheckSignal メソッドによって統合され、これは入力パラメーターと制御を持っていない。
- インジケーターからのデータをコピーする。
- アリゲーターのあるラインに対してもし使われているならポジションのクロージングをチェックする。
- 前のバーのシグナルをリセットする;
- 両方向にアクティブなフラクタルをサーチする。
- ポジションの利用可能性によって、オープンポジションの方向で第2と第5次元のシグナルをサーチする。
このメソッドは public セクションで宣言され、EA から呼び出される必要がある。
- …新しいチックの到着で、ポジションを開けるためのシグナルの発動の可能性をチェックする。
このクラスで CheckForTradeSignal メソッドが実装され、現在の価格でポジションに入る可能性のサーチを実行する。
呼び出しのパラメーター:
int dimension // number of the dimension (from the first to the fifth) int type // direction of the trade (0- buy, 1- sell) int sub_type // signal subtype from the trading dimension (described in the signal search) double &price_out[] // signal price datetime &time_out[] // time of the signal bar
シグナル活性化のための全ての規制が守られていると、trueを、そうでなければ falseを返す。
全てのシグナルの処理の可能性のチェックが CheckActionOnTickメソッドに纏められていて、publicセクションで告知されている、これはEA から呼び出す必要がある。呼び出しのパラメーターはない。成功したシグナルは actual_actionオブジェクトに保存され、 それらは後ほど TradeActualSignalsメソッドで処理される。
…ロットの計算;固定あるいは「ピラミッド式」
CalcLotメソッド は public セクションで宣言され、EA から呼び出すことができる。それはロットの計算とさらにクラスの private セクションで宣言された変数 Lot のさらなる修正を意図している。呼び出しのパラメーター:
bool external // for the installation of the external calculated lot, you need to direct to this variable true, // then the lot will be set by the value ext_lot. // Inside this class (calculate the lot), the method is called with the parameter false. double ext_lot // external size of the lot int type // type of lot calculation //(0- starting lot (use the value that was transferred during the initialization of the class, //-1 turn over lot (the sum of the lot of the current position and the starting lot), // the values from 5 to 2 are used if the aggressive trading mode is turned on (meaning "pyramiding"). // In this mode: 5 – starting, multiply by 5, // 4 – starting, multiply by 4, // 3 – starting, multiply by 3, // 2 – starting, multiply by 2, // 1 - the filling lot is equal to the starting lot
ここで固定のロットを考察し、「ピラミッド式」ロットについてさらに紹介する。
買い指示のロットを 0.1 に等しいとしよう。例えば、アリゲーターの顎の外でフラクタルからのシグナルに対する開始時ロットをオープンし、トータルのポジションは 0.1 ロットである。そのあと、第2から第5次元の入ってくるシグナルの解析を始める。シグナルが始動すると直ちに、開いているポジションに0.5 ロットを投入する (開始、5倍されている) 、するとそのポジションの総計は 0.6 ロットになる。オープンしているポジションの方向の次のシグナルの間、0.4 ロットを投入し、そして総計 1.0 ロットになる。
そのポジションの方向の次のシグナルで追加の 0.3 ロットを与え、額は 1.3 ロットになる。第5番目の投入は 0.2 ロットで、ポジションの総額は 1.5 ロットとなる。次のポジションの方向の投入は 0.1 ロットだけである。
資金管理 (MM) のこのアルゴリズムは B. Williams によってTrading Chaosに記述されている。ユーザーのロットの導入の可能性は、我々に実際どのような資金管理でも組み込むことができる。
取引の注文の順序の正しい決定のために、私は種々の魔法の数を使う。
数 | オーダーの説明 |
---|---|
999 | 引継ぎのオーダー |
1000 | 開始のオーダー |
1001 | 埋め込みオーダー (開始 Х 1) |
1002 | 埋め込みオーダー (開始 Х 2) |
1003 | 埋め込みオーダー (開始 Х 3) |
1004 | 埋め込みオーダー (開始 Х 4) |
1005 | 埋め込みオーダー (開始 Х 5) |
必要な数を計算したクラス ( CalcMagic メソッド)は、後で新しいオーダーを送る前にサーバー上のトレード操作を決めることになる。
...各シグナルのタイプのために EA のロットを直接変更することを許す。
希望するなら、EA の中に構造 actual_action の問い合わせを組み込むことができ、そこでトレードシグナルは論理変数の型で保存される。各タイプと方向は変数によって対応付けられる。もし true の値を持てば、このチックに対して、クラスは特定のトレードシグナルによって取引操作を起こし、その後でこのシグナルに対するロットを変更できる。価格が変わる各チックに対して、クラスはオープンなポジションあるいは埋め込みに対して1つのオーダーのみを送る。
ロットの設定はEA において CheckActionOnTick メソッドの呼び出しの後 でかつ TradeActualSignals の呼び出しの前に可能である。現在のチックでいくつかのシグナルが実行を待っているかもしれないが、ただ1つが選択される。
シグナルの実行順序
- ポジションのクローズ;
- フラクタルからの信号 (オープン、再充填、ポジションの転覆) の一つの実行;
- 「受け皿」シグナル;
- 「ゼロライン交差」シグナル;
- AC 「2つの同じ色のバー」;
- AC 「3つの同じ色のバー」;
- トレードイン・ゾーン;
- バランスライン (2 バーのシグナル);
- バランスライン (3 バーのシグナル);
従って、「ユーザー」のロットサイズを組み込む時にこの順位を考慮する必要がある。
... オープンポジションのストップを追跡する。必要であれば、EA からユーザーが計算して、Stop Lossの価格を変更する;
説明したクラスで、Trailing StopメソッドによってStop Loss を引き上げることでポジションのストップ価格の保守があり、これはこの価格で起動されてポジションに利益を増す方向にのみ行われる。保守には5つのモデルがある:
- アリゲーターの唇ラインによる;
- アリゲーターの歯のラインによる;
- アリゲーターの顎のラインによる;
- 同色の5つの連続したゾーン (緑色のゾーンは買い、赤色は売り);
- 外部設定によるストップ価格。
Stop Lossの第5のオプションの組み込みはdouble & stoplossパラメーターで SetStopLossメソッドによって行われる。 この呼び出しは EA から、 TrailingStop メソッドの実行の前に行う、これはポジション変更の価格のチェックを行い、その要求をサーバーに送る。この処理が成功裏に行われると、内部変数 StopLoss の値は -1 にリセットされる。
...サーバーへの取引を開くオーダーの送達を制御し、成功しなければ、第2の要求を行う。
オープンのトレードオーダーを送るために、ポジションを閉じあるいは転覆し boolSendOrder メソッドを使う。呼び出しのパラメーター:
ENUM_ORDER_TYPE type // direction of the trading operation double &price_out[] // pointer to the signal price, after a successful execution of the operation, set in -1; datetime &time_out[] // the pointer to the signal time, after a successful execution of the operation, set in -1; string comment // the commentary for the order
全てのトレーディングシグナルのテストは TradeActualSignalsメソッドに纏められている。構造 actual_action がトレードのオーダーを保存する。サーバーにオーダーを送るのが成功すると (SendOrder が true を戻す)、構造 actual_actionのトレードシグナルをリセットする。トレードシグナルは送ったものに良い応答が得られるまでアクティブに留まる。
構造 actual_action の中にパラメーターなしのファンクションinit があり、現在の全てのシグナルをリセットする。この処理は新しいポジションを開けるか既存のポジションを転覆するときに使われる。
...トレードシグナルの重複を禁止する (1シグナルにつき一度だけ入れる);
last_trade 構造は各タイプと方向の最後のトレードシグナルの時刻を保存している。トレードオーダー actual_action 構造にセットする前に、このシグナルが既に last_trade 構造にあるかチェックし、もしそうならば、これを無視する。こうして、これがトレード状況で「廃棄可能」実行の制御を組み込むことになる。
パブリックなクラスメソッドの数を最小化する;
ここに EA から呼び出して使えるクラスメソッドのリストがある:
void C_TS_BW(); // Constructor bool Init(string Symbol_for_trade, ENUM_TIMEFRAMES Period_for_trade, s_input_parametrs &inp_param_tmp); // Initialization of the class bool NewBar(); // Check for a new bar on the current symbol\time-frame void CheckSignal(); // Search for signals void CheckActionOnTick(); // Collecting the desired actions on the current tick void TrailingStop(); // Trailing Stop void TradeActualSignals(); // Trading by the current signals void SetStopLoss(double &stoploss); // Set Stop Loss void CalcLot(bool external,double ext_lot,int type); // Calculation of the lot
これらがその構造である:
actual_action // Current trading orders for execution inp_param_tmp; // Reception of the structure of settings // (receives the data by the link during the initialization of the class)
4. クラス C_TS_BW の実装
最初に行われるべきことはh_TS_BW.mqh ファイルをエキスパートアドバイザーにインクルードすることである。
#include <h_TS_BW.mqh>
この後、C_TS_BW クラスのオブジェクトを宣言する。これを EA_TS_BW としよう。
また例えば input_parametrs のような調節可能なパラメーターの構造s_input_parametrsを必要とする。
ここにこの構造に組み込まれているパラメータの説明がある。
input_parametrs.alligator_jaw_period // The Alligator: period of the Jaws line input_parametrs.alligator_jaw_shift // The Alligatpr: shift of the Jaws line input_parametrs.alligator_teeth_period // Alligator: period of the Teeth line input_parametrs.alligator_teeth_shift // Alligator: shift of the Teeth line input_parametrs.alligator_lips_period // Alligator: period of the Lips line input_parametrs.alligator_lips_shift // Alligator: shift of the Lips line input_parametrs.add_1_dimension // Allow the addition by Fractals input_parametrs.add_2_dimension_bludce // Allow the addition by the "Saucer" (АО) signal input_parametrs.add_2_dimension_cross_zero // Allow the addition by the "Crossing the zero line" (АО) signal input_parametrs.add_3_dimension_use_2_bars // Allow the addition by the "АС 2 bars" signal input_parametrs.add_3_dimension_use_3_bars // Allow the addition by the "АС 3 bars" signal input_parametrs.add_4_dimension_zone // Allow the addition by the red or the green zone input_parametrs.add_5_dimension // Allow the addition by the Balance Line input_parametrs.max_4_dimension_zone // The maximum amount of consecutive bars of zones of the same color input_parametrs.trall_4_dimension // Allow a trail position using 5 consecutive bars of zones of the same color input_parametrs.agress_trade_mm // Aggressive style of filling in an open position input_parametrs.support_position // Type of trailing stop of the position input_parametrs.lot // Trading lot
EA のOnInit() セクションで必要なこと:
- このクラスに渡されるinput_parametrs 構造のデータに必要な全ての値を埋める。
- クラスのInit メソッドを用いて、 その初期化を行う。例:
expert_TS_BW.Init(Symbol(),PERIOD_CURRENT,input_parametrs)
この場合、EA が現在のシンボル/期間にそれが組み込まれている場所で働きかける。
エキスパートアドバイザー OnTick() セクションの例
// double Sl[1]; if(expert_TS_BW.NewBar()) // new bar on the chart { expert_TS_BW.CheckSignal(); // signal search } expert_TS_BW.CheckActionOnTick(); // check for the required actions on the current tick //---******************* the place of the beginning of external control of the lot, the stop //--- example of setting the lot for trade by the signal from the zones // if(expert_TS_BW.actual_action.zone_buy || expert_TS_BW.actual_action.zone_sell) // {expert_TS_BW.CalcLot(true,0.11,0);} //--- setting the stop by the parabolic // CopyBuffer(h_parabolic,0,0,1,Sl); // if (Sl[0]>0){expert_TS_BW.SetStopLoss(Sl[0]);} //---*******************the place of the end of external control of the lot, the stop expert_TS_BW.TrailingStop(); // pulling-up the stop (if necessary) expert_TS_BW.TradeActualSignals(); // trading of current signals
このケースでは、クラスの実行のために、ストップ価格とトレードロットの外部制御の例はコメントがつけられている。
5. 来歴でのいくつかのテスト
EAが書かれた元と成った本の著者は、このシステムは株式と商品市場に焦点を合わせていると論じている。
最初に CFD 上のエキスパートアドバイザーをチェックしよう。テストは IBMの歴史の一部となると想定し、システムは見積りのトレンドに乗った区分を対象としている。最初に得られる区分を取った、そこではトレンドが肉眼でも見て取れる。
図 6. IBM チャート
この区分に書いたエキスパートアドバイザーを走らせ、ここにオーダーとして得られたものがある。
図 7. Bill Williams のトレードシグナル(IBM)
一見して、トレンドによって多くのトレードがあり、良いものであった。ここに戦略テスターで作成されたチャートがある。
トレードは 0.1 ロットでなされ、アリゲーターのラインでクローズされることは無く、1色の5連続ゾーンを使った継続ストップも無く、攻撃的トレードも無い。
図 8. テスト結果
一般的に、利益が得られた。
さて、だらだらと続き、傾斜の少ないトレンドのものを取る。
図 9. IBM チャート(断片 2)
これを同じシンボルと 13ヶ月の期間 (2008年12月から2010年1月まで)とする。
ここに戦略テスターからのチャートがある。
図 10. この歴史 (断片 2) でのシステムのテスト結果
これは「満足ではない」あるいは「期待にそぐわない」と言える。
次に通貨のペアでの仕事をチェックしたい。
よく知られた EURUSD を取りチャートの H1 期間を取る。歴史の深さは2010年を取ることにする。
図 11. この歴史でのシステムのテスト結果、EURUSD, H1, 2010年
同じ年 (2010)でEURUSDの日々のバーで試してみる。
テスターのレポートはこのようなものである。
図 12. この歴史でのシステムのテスト結果、EURUSD, D1, 2010年
結論
この論説の目的は株式市場と商品取引だけでなく Forex 市場も含め、よく知られたBill Williams によるトレード戦略の性能をチェックすることであった。このシステムは過去の年の EURUSD 日毎チャートでは、「ほどほど」に働き、しかし短い期間では最適化の試みも無く利益を生むものではなかった。
システムの市場参入シグナルはかなり正確 (日チャートを見ると)であったが、しかしその半分以上の利益は固定されなかったので、明らかに遅れが存在する。 この分野にはこのシステムの短期間向けの最適化に関する改良が残されている。
クラスの完全なコードは、添付のファイルに見つけられる。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/139



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