
一般的トレーディングシステムを基にした Expert Advisors と売買ロボット最適化の錬金術(パート4)
はじめに
私の先行記事 No. 2 および 3 では、バックテストの基本について説明しました。私見では、バックテストの主な目的は、EA のパラメータがときどき変化すると仮定して、特定の期間を持たず EA の動作を定量的に分析することです。この過程で最適化結果を使用する戦略は、各最適化結果として受け取られる全バリアントからパラメータを選択する厳格なルールとなります。たとえば、最大収益性と最小ドローダウンを持つバリアントです。
そのようなバリアントは、前回の最適化で何があったにせよ、個別の最適化の全バリアントから選択されます。そのような戦略がある期間で収益性があり、ある期間が損益分岐点に近ければ、最適化されたパラメータを使う戦略を持つそのトレーディングシステムは将来特定の期間で収益性がある可能性があると結論づけることができます。
これは完璧なケースです。ですが、一見、非常に合理的な動作ロジックを持つ EA が、バックテストの半数で絶望的に損失を出すようならどうすればよいのでしょうか?実際、個別に各最適化内部での EA パラメータ選択を基にした戦略は唯一可能性のある方法ではありません。統計的分析を行い、異なる最適化からのものと EA パラメータを比較する方がおもしろいものです。
また、バックテストの最適化には時間がかかり、バックテストのためだけにそういった最適化を行うことは妥当ではありません。たとえば、最適化とともに、 Microsoft Excel.のようなプログラムで利用可能なテーブルの統計分析方法で簡単に処理できる表形式で1件のファイルにすべての収益性ある最適化実行を保存することができます。MetaTrader 4 ターミナルは HTML テーブル形式で最適化結果を保存する機能を提供します。
それは簡単に Microsoft Excel にアップロードすることができます。ただし処理には、最適化実行の最終結果のみが表形式で出されます。Expert Advisor の外部パラメータはその表には含まれません。
また、それはただ1つの最適化にすぎません。分析するには、1件のファイルにレコードされた全最適化結果が必要です。実際、これはすべてMQL4 によって実装可能です。そのため、本稿で私独自のソリューションのバリアントを提供したいと思います。
1件のファイルに HTML テーブル形式で EA 最適化結果をレコードする
そのようなレコードを1ファイルに実装するのに、私は以下の関数を書きました。
void Write_Param_htm ( bool ToResolveWrite_Up, int Timeframe_Up, string ExtrVarblsNemes_Up, string ExtrVarblsVelues_Up, bool ToResolveWrite_Dn, int Timeframe_Dn, string ExtrVarblsNemes_Dn, string ExtrVarblsVelues_Dn )
この関数により1ペアに対して1タイムフレームで1トレード方向で行われた全最適化の収益性ある実行結果をレコードすることができます。この関数呼び出しは EA 再初期化ブロック(deinit() 関数内部)に入れます。
int deinit() { //----+ //---- Recording EA parameters into a text file if (IsOptimization()) { //---- +------------------------------------------+ //Here is the code of external variables initialization of the Write_Param_htm() function //---- +------------------------------------------+ //---- RECORDING STRINGS INTO A HTML FILE Write_Param_htm(Test_Up, Timeframe_Up, ExtVarNemes_Up, ExtVarVelues_Up, Test_Dn, Timeframe_Dn, ExtVarNemes_Dn, ExtVarVelues_Dn); //----+ +-------------------------------------------------------+ } //---- End of the EA deinitialzation return(0); //----+ }
この関数は C:\ directory にファイルを3件書きます。その2件は最適化結果(それぞれロングポジション、ショートポジション)、1件はログファイル(MetaTraderTester.log)で、そこに2件のファイルのパスと名前が書かれます。2件のファイル名は以下のように表記されます(OptReport_Exp_5_2_GBPUSD_240_Long.htm)。
Write_Param_htm() 関数は次の命令によってファイルにインクルードされます。
#include <TestReport.mqh>
これは EA 外部変数宣言前にした方がよいとされます。この関数以外に、ファイルには関数Write_Param_htm() のコードで使用される別の関数があります。その意味については後ほど説明します。このファイルにはまた、バックテストの外部変数を持つすでに知っている関数 IsBackTestingTime() も入っています(この関数は前稿で説明されています)。関数呼び出しは start() 関数のブロックに作成されます。
//----+ Execution of backtesting conditions if (!IsBackTestingTime()) return(0);
この TestReport.mqh ファイルのもっともシンプルな使用は完全に前稿にある IsBackTestingTime.mqh の使用に類似していますが、この場合、EA のコンパイル中には別の EA 関数はすべて使用されません。Write_Param_htm() 関数内の外部パラメータとして8個の変数が使用されます。これら変数は2つのグループに分けられます。EA の最適化結果を _Up で終わるロングポジションファイルにレコードするもの、_Dnで終わるショートポジションを持つファイルにレコードするものです。
このうちの1グループを分析します。2番目のものはそれに類似しています。ToResolveWrite_Up パラメータは関数にファイルへのレコード許可または禁止を渡します。Timeframe_Up パラメータはタイムフレームを渡します。そこでEA の長いアルゴリズムが動作します。ExtrVarblsNemes_Up パラメータは関数にロングポジションに対する EA の外部パラメータ名で構成される文字列を渡します。ExtrVarblsVelues_Up parameter は同様に使用され、ロングポジションに対する EA の外部パラメータの値で構成される文字列を渡します。
後の2つの変数初期化についてお話します。ロングポジションに対して以下のような外部変数があるとします。
n_ExternParam_1, n_ExternParam_2, d_ExternParam_3, n_ExternParam_4, b_ExternParam_5, d_ExternParam_6, d_ExternParam_7, n_ExternParam_8
接頭辞 "n_" はパラメータが integer タイプであることを示し、 "d_" はパラメータが double タイプ、 "b_" はパラメータが bool タイプであることを意味します。ExtrVarblsNemes_Up および ExtrVarblsVelues_Up の初期化前に、一組の追加文字列変数を宣言し、 html-code 部にて初期化します。
string n_Width = "</td><td><center>"; string d_Width = "</td><td class=mspt><center>";
その後、必要な文字列を組み立てます。外部変数 ExtrVarblsNemes_Up については、このコードは以下のような表記となります。
ExtVarNemes_Up = StringConcatenate ( n_Width, "n_ExternParam_1", n_Width, "n_ExternParam_2", n_Width, "d_ExternParam_3", n_Width, "n_ExternParam_4", n_Width, "b_ExternParam_5", n_Width, "d_ExternParam_6", n_Width, "d_ExternParam_7", n_Width, "n_ExternParam_8" );
外部変数 ExtVarVelues_Up の初期化はやや複雑です。
ExtVarVelues_Up =
StringConcatenate
(
n_Width, n_ExternParam_1,
n_Width, n_ExternParam_2,
d_Width, d_ExternParam_3,
n_Width, n_ExternParam_4,
n_Width, b_ExternParam_5,
d_Width, d_ExternParam_6,
d_Width, d_ExternParam_7,
n_Width, n_ExternParam_8
);
このコードでは外部 EA パラメータの前に、つねに d_Width 変数が入り、その他全パラメータの前に n_Width が書かれます。最終文字列をそのように配置する際、double タイプの全パラメータが小数点の後に4つの記号を伴い Write_Param_htm() 関数に渡されます。それ以外の量の記号が必要な場合は、以下の関数を使用します。
DoubleToStr( double value, int digits)
これら文字列は255個以上のシンボルは持てないことに注意が必要です。文字列がそれ以上に長い場合は、超過するシンボルは省略され、コンパイラがこれに対応するアラートを表示します。そのような場合の解決法は1つです。ExtVarNemes_Up で外部変数名を短くし、 ExtVarVelues_Up で文字列組み立てへの変数の数を減らすのです。Tただし、ほとんどのタスクにとって255個のシンボルは十分すぎます。
以下は例 Exp_5_2.mq4 での HTML ファイルへのレコード実装のバリアントです。
//+==================================================================+ //| expert deinitialization function | //+==================================================================+ int deinit() { //----+ //---- Recording EA parameters into a text file if (IsOptimization()) { string ExtVarNemes_Up, ExtVarVelues_Up; string ExtVarNemes_Dn, ExtVarVelues_Dn, n_Width, d_Width; //---- INITIALIZATION OF STRINGS FOR THE Write_Param_htm FUNCTION //----+ +-------------------------------------------------------+ n_Width = "</td><td><center>"; d_Width = "</td><td class=mspt><center>"; //---- ExtVarNemes_Up = StringConcatenate( n_Width, "IndLevel_Up", n_Width, "FastEMA_Up", n_Width, "SlowEMA_Up", n_Width, "SignalSMA_Up", n_Width, "STOPLOSS_Up", n_Width, "TAKEPROFIT_Up", n_Width, "TRAILINGSTOP_Up", n_Width, "PriceLevel_Up", n_Width, "ClosePos_Up"); ExtVarVelues_Up = StringConcatenate( d_Width, DoubleToStr(IndLevel_Up, Digits), // 9 n_Width, FastEMA_Up, // 10 n_Width, SlowEMA_Up, // 11 n_Width, SignalSMA_Up, // 12 n_Width, STOPLOSS_Up, // 13 n_Width, TAKEPROFIT_Up, // 14 n_Width, TRAILINGSTOP_Up, // 15 n_Width, PriceLevel_Up, // 16 n_Width, ClosePos_Up); // 17 //----+ +-------------------------------------------------------+ ExtVarNemes_Dn = StringConcatenate( n_Width, "IndLevel_Dn", n_Width, "FastEMA_Dn", n_Width, "SlowEMA_Dn", n_Width, "SignalSMA_Dn", n_Width, "STOPLOSS_Dn", n_Width, "TAKEPROFIT_Dn", n_Width, "TRAILINGSTOP_Dn", n_Width, "PriceLevel_Dn", n_Width, "ClosePos_Dn"); ExtVarVelues_Dn = StringConcatenate( d_Width, DoubleToStr(IndLevel_Dn, Digits), // 9 n_Width, FastEMA_Dn, // 10 n_Width, SlowEMA_Dn, // 11 n_Width, SignalSMA_Dn, // 12 n_Width, STOPLOSS_Dn, // 13 n_Width, TAKEPROFIT_Dn, // 14 n_Width, TRAILINGSTOP_Dn, // 15 n_Width, PriceLevel_Dn, // 16 n_Width, ClosePos_Dn); // 17 //---- RECORDING STRINGS INTO HTML FILE Write_Param_htm (Test_Up, Timeframe_Up, ExtVarNemes_Up, ExtVarVelues_Up, Test_Dn, Timeframe_Dn, ExtVarNemes_Dn, ExtVarVelues_Dn); //----+ +-------------------------------------------------------+ } //---- End of the EA deinitialization return(0); //----+ }
以下は、Microsoft Excel で開かれたこの EA に対するパラメータの結果 HTML テーブルです。
このテーブルには、行われた最適化すべての結果が入っています。テーブル自体は以下の形式です(最初の8行は EA のトレード結果です)。
パラメータ Drawdown $ および Drawdown % はクローズ済みのトレードに対してのみ計算され、そのためストラテジーテスタで有効なものとは異なることに注意が必要です。また、「プロフィットファクター」パラメータは、少なくとも損失トレードが1件ある場合にのみ意味があり、損失トレードが全くなければ意味がないことに配慮します。そもそも、このテーブルには損失トレードはありません。まったく損失がない状況に対してはこのパラメータがゼロになるのはそのためです。
EA トレード結果の右側には、最適化された EA パラメータがあります。
よって、テーブル形式では各最適化実行に必要なすべての値とすべての最適化を同時に取得するのです。これにより、テスターやターミナルをしばらく離れ、テーブルコンテンツの最新プログラムアナライザーで使用できるひじょうに効率的な方法により1件の html ファイルに入っている情報を基に統計的分析を行うことができます。
もう一つ。説明されている、この方法でレコードされた html ファイルのコードは不完全なものとなります。というのもファイルにはつねにデータが追加されるためです。あとでファイルにデータを追加するつもりがなければ、html コード(なんらかのテキストエディタで開きます)の末尾に次の行を書きます。
</table> </body></html>
TestReport.mqh コンテンツの説明Contents
HTMLテーブルにデータのエキスポートを行う MQL4 コードを書くのに使用したこのファイルには数多くのユニバーサルなユーザー定義関数が入っています。すぐに使える形式のこれら関数は、どんな EA プログラマ―にとっても便利なものです。よって、これら関数について詳しく考察したいと思います。
ファイルはバックテスト用外部変数宣言および前稿で説明されている IsBackTestingTime() で始まります。その後、ファイルの関数の一部で使用され特殊関数 CountTime() の宣言に移りますが、この関数は読者のみなさんはまず使用することのないものです。
命令
#include <Read_Write_File.mqh>
は TestReport.mqh ファイルに Read_Write_File.mqh ファイルのコンテンツをインクルードします。オペレーションシステムのモジュールからの任意のディレクトリ内ファイルをレコードおよび読むための関数のインポートです。
#include <WinUser32.mqh> #import "kernel32.dll" int _lopen (string path, int of); int _lcreat (string path, int attrib); int _llseek (int handle, int offset, int origin); int _lread (int handle, int& buffer[], int bytes); int _lwrite (int handle, string buffer, int bytes); int _lclose (int handle); #import
この関数使用の意味は、このファイルに入っている、4つのユーザー定義ユニバーサル関数のコードから理解できます。
int _FileSize ( string path ) bool WriteFile ( string path, string buffer ) bool ReadFile ( string path, string&amp; StrBuffer[] ) SpellFile ( string path, string& SpellBuffer[] )
こういった関数には、テキストファイルへのパスとその名前を持つ文字列を導入する変数パスが入っています。
_FileSize() 関数はバイトでファイルサイズを返します。
WriteFile() 関数は「バッファ」文字列のコンテンツの末尾をファイルにレコードします。各文字列を新しい行から書く必要があれば、各行の終わりに "\n" を追加します。
buffer = buffer + "\n";
ReadFile() 関数は文字列バッファ StrBuffer[] のサイズを変更し、そこに4文字1バッファセルで構成される文字列によるファイルコンテンツをアップロードします。
SpellFile() は文字列バッファのサイズを変更し、ファイルコンテンツを一文字ずつアップロードします。
TestReport.mqh ファイルには、#include <Read_Write_File.mqh> 命令のあと、いわゆる最適化パラメータを計算するのに使われるユニバーサルなユーザー定義関数のグループがあります。
CountProfit(int cmd) CountMaxDrawdownPrs(int cmd) CountMaxDrawdown(int cmd) CountAbsDrawdown(int cmd) CountProfitFactor(int cmd) CountProfitTrades(int cmd) CountTotalTrades(int cmd) CountExpectedPayoff(int cmd)
これらはストラテジーテスタの「最適化結果」タブに表示されるものに類似しています。こういった関数はクローズ済みトレードのデータにのみ基づき計算を行います。関数 CountMaxDrawdownPrs()、CountMaxDrawdown()、CountAbsDrawdown() がストラテジーテスタで取得されるものと異なる値を返すのはそのためです。'cmd' 変数が値OP_BUY を受け取る場合、全関数の計算はクローズ済みのロングポジションに対してのみ行われ、OP_SELL を受け取る場合は、ショートポジションについてのみ行われます。この変数のその他の値はクローズされたトレード処理すべてに対して計算を行います。
これら関数のあと、あと4つの関数がファイル内で宣言されます。最適化結果および最適化パラメータをファイルにレコードするためのものです。
void Write_Param_htm ( bool ToResolveWrite_Up, int Timeframe_Up, string ExtrVarblsNemes_Up, string ExtrVarblsVelues_Up, bool ToResolveWrite_Dn, int Timeframe_Dn, string ExtrVarblsNemes_Dn, string ExtrVarblsVelues_Dn ) void Write_Param_1htm ( int Timeframe, string ExtrVarblsNemes, string ExtrVarblsVelues ) void Write_Param_txt ( bool ToResolveWrite_Up, int Timeframe_Up, string ExtrVarblsVelues_Up, bool ToResolveWrite_Dn, int Timeframe_Dn, string ExtrVarblsVelues_Dn ) void Write_Param_1txt ( int Timeframe, string ExtrVarblsVelues )
Write_Param_htm() については、上記にあります。
Write_Param_1htm() 関数は前出の関数の完全な類似体ですが、それは Expert Advisor 向けに作成されています。そこでは外部パラメータはロングポジション、ショートポジション用に分割されません。ToResolveWrite 関数はここでは必要ないため、削除されています。
Write_Param_txt() 関数は Write_Param_htm() の類似関数で、同様のデータをレコードしますが html の表示はレコードしません。最適化結果と最適化パラメータで構成される文字列組み立てのための追加変数は次のように初期化されます。
Width = " ";
新規文字列はすべて新しい行からファイルにレコードされ、各文字列の末尾でテキストファイルに ";" が書かれます。1文字列の外部変数値の間にはテキストファイルにスペースが書かれます。
Write_Param_1txt() 関数はWrite_Param_txt() 関数の完全な類似体ですが、それは Expert Advisor 向けに作成されています。そこでは外部パラメータはロングポジション、ショートポジション用に分割されません。
最後の2つの関数です。
void Write_Param_htm_B ( bool ToResolveWrite_Up, int Timeframe_Up, string ExtrVarblsNemes_Up, string ExtrVarblsVelues_Up, bool ToResolveWrite_Dn, int Timeframe_Dn, string ExtrVarblsNemes_Dn, string ExtrVarblsVelues_Dn ) void Write_Param_1htm_B ( int Timeframe, string ExtrVarblsNemes, string ExtrVarblsVelues )
これらは Write_Param_htm() および Write_Param_1htm の完全な類似関数ですが、それによって受け取られるファイルの色は反転しています。以下がその一例です。
おそらく、そのようなファイルで作業することを好む方がいらっしゃるでしょう。私は個人的にこの種の情報表示を好みます。
パラボリックなトレーディングシステム
このシステムの作業インディケータは、Forex や株式市場で作業する一般的な取引プラットフォームすべてにインクルードされています。
ここで、買い指値および売り指し値タイプの未決注文を持つシステムを紹介します。
以下は買い指し値注文のアルゴリズム実装のバリアントです。
売り指し値注文のアルゴリズムバリアントも同様です。
以下は Expert Advisorへのプログラムコードの実装です。
//+==================================================================+ //| Exp_8.mq4 | //| Copyright © 2008, Nikolay Kositsin | //| Khabarovsk, farria@mail.redcom.ru | //+==================================================================+ #property copyright "Copyright © 2008, Nikolay Kositsin" #property link "farria@mail.redcom.ru" //----+ +------------------------------------------------------------+ //---- EA INPUT PARAMETERS FOR BUY TRADES extern bool Test_Up = true;//filter of trade calculations direction extern int Timeframe_Up = 240; extern double Money_Management_Up = 0.1; extern double Step_Up = 0.02; extern double Maximum_Up = 0.2; extern int STOPLOSS_Up = 50; // stop loss extern int TAKEPROFIT_Up = 100; // take profit extern int TRAILINGSTOP_Up = 0; // trailing stop extern int PriceLevel_Up =40; // difference between the current price and // pending order triggering price extern bool ClosePos_Up = true; // forced position closing //is allowed //----+ +------------------------------------------------------------+ //---- EA INPUT PARAMETERS FOR SELL TRADES extern bool Test_Dn = true;//filter of trade calculations direction extern int Timeframe_Dn = 240; extern double Money_Management_Dn = 0.1; extern double Step_Dn = 0.02; extern double Maximum_Dn = 0.2; extern int STOPLOSS_Dn = 50; // stop loss extern int TAKEPROFIT_Dn = 100; // take profit extern int TRAILINGSTOP_Dn = 0; // trailing stop extern int PriceLevel_Dn = 40; // difference between the current price and // pending order triggering price extern bool ClosePos_Dn = true; // forced position closing //is allowed //----+ +------------------------------------------------------------+ //---- Integer variables for the minimum of calculation bars int MinBar_Up, MinBar_Dn; //+==================================================================+ //| TimeframeCheck() functions | //+==================================================================+ void TimeframeCheck(string Name, int Timeframe) { //----+ //---- Checking the correctness of Timeframe variable value if (Timeframe != 1) if (Timeframe != 5) if (Timeframe != 15) if (Timeframe != 30) if (Timeframe != 60) if (Timeframe != 240) if (Timeframe != 1440) Print(StringConcatenate("Parameter ",Name, " cannot ", "be equal to ", Timeframe, "!!!")); //----+ } //+==================================================================+ //| Custom Expert functions | //+==================================================================+ #include <Lite_EXPERT1.mqh> //+==================================================================+ //| Custom Expert initialization function | //+==================================================================+ int init() { //---- Checking the correctness of Timeframe_Up variable value TimeframeCheck("Timeframe_Up", Timeframe_Up); //---- Checking the correctness of Timeframe_Dn variable value TimeframeCheck("Timeframe_Dn", Timeframe_Dn); //---- Initialization of variables MinBar_Up = 5; MinBar_Dn = 5; //---- end of initialization return(0); } //+==================================================================+ //| expert deinitialization function | //+==================================================================+ int deinit() { //----+ //---- End of the EA deinitialization return(0); //----+ } //+==================================================================+ //| Custom Expert iteration function | //+==================================================================+ int start() { //----+ Declaring local variables double SAR1, SAR2, CLOSE1, CLOSE2; //----+ Declaring static variables //----+ +---------------------------------------------------------------+ static datetime StopTime_Up, StopTime_Dn; static int LastBars_Up, LastBars_Dn; static bool BUY_Sign, BUY_Stop, SELL_Sign, SELL_Stop; //----+ +---------------------------------------------------------------+ //----++ CODE FOR LONG POSITIONS 1 if (Test_Up) { int IBARS_Up = iBars(NULL, Timeframe_Up); if (IBARS_Up >= MinBar_Up) { if (LastBars_Up != IBARS_Up) { //----+ Initialization of variables BUY_Sign = false; BUY_Stop = false; LastBars_Up = IBARS_Up; StopTime_Up = iTime(NULL, Timeframe_Up, 0) + 60 * Timeframe_Up; //----+ CALCULATING INDICATOR VALUES AND UPLOADING THEM TO BUFFERS SAR1 = iSAR(NULL, Timeframe_Up, Step_Up, Maximum_Up, 1); SAR2 = iSAR(NULL, Timeframe_Up, Step_Up, Maximum_Up, 2); //--- CLOSE1 = iClose(NULL, Timeframe_Up, 1); CLOSE2 = iClose(NULL, Timeframe_Up, 2); //----+ DEFINING SIGNALS FOR TRADES if (SAR2 > CLOSE2) if (SAR1 < CLOSE1) BUY_Sign = true; if (SAR1 > CLOSE1) BUY_Stop = true; } //----+ EXECUTION OF TRADES if (PriceLevel_Up == 0) { if (!OpenBuyOrder1(BUY_Sign, 1, Money_Management_Up, STOPLOSS_Up, TAKEPROFIT_Up)) return(-1); } else { if (!OpenBuyLimitOrder1(BUY_Sign, 1, Money_Management_Up, STOPLOSS_Up, TAKEPROFIT_Up, PriceLevel_Up, StopTime_Up)) return(-1); } if (ClosePos_Up) if (!CloseOrder1(BUY_Stop, 1)) return(-1); if (!Make_TreilingStop(1, TRAILINGSTOP_Up)) return(-1); } } //----+ +---------------------------------------------------------------+ //----++ CODE FOR SHORT POSITIONS 1 if (Test_Dn) { int IBARS_Dn = iBars(NULL, Timeframe_Dn); if (IBARS_Dn >= MinBar_Dn) { if (LastBars_Dn != IBARS_Dn) { //----+ Initialization of variables SELL_Sign = false; SELL_Stop = false; LastBars_Dn = IBARS_Dn; StopTime_Dn = iTime(NULL, Timeframe_Dn, 0) + 60 * Timeframe_Dn; //----+ CALCULATING INDICATOR VALUES AND UPLOADING THEM TO BUFFERS SAR1 = iSAR(NULL, Timeframe_Dn, Step_Dn, Maximum_Dn, 1); SAR2 = iSAR(NULL, Timeframe_Dn, Step_Dn, Maximum_Dn, 2); //--- CLOSE1 = iClose(NULL, Timeframe_Dn, 1); CLOSE2 = iClose(NULL, Timeframe_Dn, 2); //----+ DEFINING SIGNALS FOR TRADES if (SAR2 < CLOSE2) if (SAR1 > CLOSE1) SELL_Sign = true; if (SAR1 < CLOSE1) SELL_Stop = true; } //----+ EXECUTION OF TRADES if (PriceLevel_Dn == 0) { if (!OpenSellOrder1(SELL_Sign, 2, Money_Management_Dn, STOPLOSS_Dn, TAKEPROFIT_Dn)) return(-1); } else { if (!OpenSellLimitOrder1(SELL_Sign, 2, Money_Management_Dn, STOPLOSS_Dn, TAKEPROFIT_Dn, PriceLevel_Dn, StopTime_Dn)) return(-1); } if (ClosePos_Dn) if (!CloseOrder1(SELL_Stop, 2)) return(-1); if (!Make_TreilingStop(2, TRAILINGSTOP_Dn)) return(-1); } } //----+ +---------------------------------------------------------------+ //----+ return(0); } //+------------------------------------------------------------------+
トレード実行ブロックはこの EA はでやや複雑です。ここでは市場参入の関数 OpenBuyOrder1() および OpenSellOrder1() と、未決注文を出す関数 OpenBuyLimitOrder1() および OpenSellLimitOrder1() が共に使用されています。これは外部変数 PriceLevel_Up および PriceLevel_Dn がゼロの場合に備え、そうなっているのです。そのような場合、EA は市場からトレードをオープンします。同時に未決注文のみ処理する EA はこういった注文を市場から最小距離に設定します。
ブレイクアウト トレーディングシステム
ブレイクアウトレベルを基にしたトレーディングシステムは数多くあり、つねに別のブレイクアウト システムを考え出すものです。本稿では、ブレイクアウト レベルが移動に基づき構築されるチャンネル側で定義されるシステムについて説明します。
ブレイクアウトはクローズ済みバー上に定義されます。また、私はブレイクアウトに続いていくらかの利バウントがあるブレイクアウト トレーディングシステムを使用するつもりです。以下は、買い指値注文を持つこのトレーディングシステムのバリアントです。
同じく売り指し値注文のものです。
EA コードは構造になんら特殊なところはありません。そのため本稿にはその部分を盛り込んでいません。コードは EA にアタッチされたもの(Exp_9.mq4)を参照できます。EA には強制的なポジションのクローズはありません。EA の初期化ブロックで新しいグローバル変数が初期化されます。
dMovLevel_Up = MovLevel_Up * Point; dMovLevel_Dn = MovLevel_Dn * Point;
これら変数はUpMovLeve1 および DownMovLevel1 レベルの値を計算するのに使用されます。
ニュース発表における取引
市場では、常に同時に強い動きがあるという状況が頻繁に発生します。どの方向に変動が現れるか前もって確実に言うことは困難です。ですが、そのような変動があるであろうことは事前に述べることができるものです。たとえば、そのような激しい変動は非農業部門雇用からの結果である可能性があります。トレーダーの多くはそういった激しい変動を捕まえたいと思うものです。そのようはトレーディングシステムが妥当であるかどうか確認するのは興味を引かれるものでしょう。システムの考えは、逆指値いと逆指値売りの2種類の未決注文を出し、激しい変動でそのうちの1つがトレードを開始しテイクプロフィットによってクローズするのを待ちます。
これはブレイクアウトシステムのもう一つのバリアントです。プログラムコードにそのシステムを実装することは、あまりむつかしいことではありません。
//+==================================================================+ //| Exp_10.mq4 | //| Copyright © 2008, Nikolay Kositsin | //| Khabarovsk, farria@mail.redcom.ru | //+==================================================================+ #property copyright "Copyright © 2008, Nikolay Kositsin" #property link "farria@mail.redcom.ru" //----+ +------------------------------------------------------------+ //---- EA INPUT PARAMETERS FOR PLACING PENDING ORDERS extern int NewsWeekDay = 5; // Weekday for news release // if parameter is less than 1 or more than 5 any working day is used extern int NewsHour = 15; // hour of news release extern int NewsMinute = 0; // minute of news release extern int OrderLife = 30; // Number of minutes of pending order validity //----+ +------------------------------------------------------------+ //---- ea INPUT PARAMETERS FOR CLOSING POSITIONS extern int PosLife = 120; // Number of minutes of an opened position validity //from news release time //----+ +------------------------------------------------------------+ //---- EA INPUT PARAMETERS FOR BUY TRADES extern bool Test_Up = true;//filter of trade calculations direction extern double Money_Management_Up = 0.1; extern int STOPLOSS_Up = 50; // stop loss extern int TAKEPROFIT_Up = 100; // take profit extern int TRAILINGSTOP_Up = 0; // trailing stop extern int PriceLevel_Up =40; // difference between the current price and // the price of pending order triggering extern bool ClosePos_Up = true; // forced position closing //is allowed //----+ +------------------------------------------------------------+ //---- EA INPUT PARAMETERS FOR SELL TRADES extern bool Test_Dn = true;//filter of trade calculations direction extern double Money_Management_Dn = 0.1; extern int STOPLOSS_Dn = 50; // stop loss extern int TAKEPROFIT_Dn = 100; // take profit extern int TRAILINGSTOP_Dn = 0; // trailing stop extern int PriceLevel_Dn = 40; // difference between the current price and // the price of pending order triggering extern bool ClosePos_Dn = true; // forced position closing //is allowed //+==================================================================+ //| Custom Expert functions | //+==================================================================+ #include <Lite_EXPERT1.mqh> //+==================================================================+ //| Custom Expert initialization function | //+==================================================================+ int init() { //---- if (NewsHour > 23) NewsHour = 23; if (NewsMinute > 59) NewsMinute = 59; //---- end of initialization return(0); } //+==================================================================+ //| expert deinitialization function | //+==================================================================+ int deinit() { //----+ //---- End of the EA deinitialization return(0); //----+ } //+==================================================================+ //| Custom Expert iteration function | //+==================================================================+ int start() { //----+ Declaring static variables //----+ +---------------------------------------------------------------+ static datetime StopTime, PosStopTime; static bool BUY_Sign, SELL_Sign, BUY_Stop, SELL_Stop; //----+ +---------------------------------------------------------------+ //----+ DEFINING SIGNALS FOR TRADES if (DayOfWeek() == NewsWeekDay || NewsWeekDay < 1 || NewsWeekDay > 5) if (Hour() == NewsHour) if (Minute() == NewsMinute) { StopTime = TimeCurrent() + OrderLife * 60; PosStopTime = TimeCurrent() + PosLife * 60; BUY_Sign = true; SELL_Sign = true; } //----+ +---------------------------------------------------------------+ //----++ CODE FOR LONG POSITIONS 1 if (Test_Up) { //----+ EXECUTION OF TRADES if (!OpenBuyStopOrder1(BUY_Sign, 1, Money_Management_Up, STOPLOSS_Up, TAKEPROFIT_Up, PriceLevel_Up, StopTime)) return(-1); if (TimeCurrent() >= PosStopTime) if (ClosePos_Up) if (!CloseOrder1(BUY_Stop, 1)) return(-1); if (!Make_TreilingStop(1, TRAILINGSTOP_Up)) return(-1); } //----+ +---------------------------------------------------------------+ //----++ CODE FOR SHORT POSITIONS 1 if (Test_Dn) { //----+ EXECUTION OF TRADES if (!OpenSellStopOrder1(SELL_Sign, 2, Money_Management_Dn, STOPLOSS_Dn, TAKEPROFIT_Dn, PriceLevel_Dn, StopTime)) return(-1); if (TimeCurrent() >= PosStopTime) if (ClosePos_Dn) if (!CloseOrder1(SELL_Stop, 2)) return(-1); if (!Make_TreilingStop(2, TRAILINGSTOP_Dn)) return(-1); } //----+ +---------------------------------------------------------------+ //----+ return(0); } //+------------------------------------------------------------------+
おわりに
本稿では、表形式で最適化結果の多様な情報をエクスポートするユニバーサルな方法を提供しました。それはこの情報を深く分析し、自動化された取引で Expert Advisor によって使用される取引結果を大きく改善する幅広い機会を広げるものです。EA プログラマ―のみなさんにとって私の方法が有用なものとなることを願っております。
MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1523




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