最適化(オプティマイズ)に時間が掛かるEAを効率良く最適化するTips

最適化を行う時、最適化時のデータ・モデルを[全ティック]にしなければならない場合には、EAによっては膨大な時間が掛かってしまう場合があります。

そんな時になるべく短時間でパラメータを最適化する方法を紹介します。

それは「大数の法則」を利用した方法です。

この方法では、あらかじめテスト期間を設定しておくのでは無く、取引回数から期間を計算します。

取引回数が多ければ(概ね100回以上)、「大数の法則」から信頼度が高いテスト結果と考えます。

例えば、1ヶ月間で500回程度の取引を行うようなEAの場合、1週間では約100回以上の取引を行う計算になります。

ですので、このEAでは1週間の期間だけで最適化を行います。


只、この方法には欠点もあり、テストする期間によって結果が大きく異る場合がある事です。

そのような場合には、取引回数を200-300回程度に拡大した期間で最適化を行います。


オフラインチャートにセットしたインジケータを別チャートから参照する方法

MT4で3分足や2時間足といった、標準機能では表示できない足のチャートを表示したい場合にはオフラインチャートを使う事が多いです。

このオフラインチャートにセットしたインジケータの内容を別のチャートから参照したい場合には、下記のように記述します。

iMA(NULL, PERIOD_M3, 10, 0, MODE_SMA, PRICE_CLOSE, 0);

上記では、iMA関数の第2パラメータで参照したいチャートの時間足を指定しています。(上記の例では3分足)

オフラインチャートの場合、この第2パラメータで指定出来る値は下記の通りとなっています。

PERIOD_M2
PERIOD_M3
PERIOD_M4
PERIOD_M6
PERIOD_M10
PERIOD_M12
PERIOD_M20
PERIOD_H2
PERIOD_H3
PERIOD_H6
PERIOD_H8
PERIOD_H12


上記以外の時間足を指定したい場合には、直接数値を指定する事で実現出来ます。(下記の例では18分足)

iMA(NULL, 18, 10, 0, MODE_SMA, PRICE_CLOSE, 0);

楽天証券のMT4デモ口座は他社のデモ口座のように開設出来ない

楽天証券で取り扱っているFX口座ですが、MT4に対応しているのにもかかわらず、デモ口座の開設手順が他社の方法と異なっています。

①「デモ口座の申請」ウィンドウから「RakutenSecurities-Demo」を選択し、[次へ]をクリック。

②[新しいデモ口座]を選択し、[次へ]をクリック。

通常なら「お客様情報のご入力」ウィンドウが表示されるのですが、楽天FXの場合はブラウザが起動して楽天証券のページに飛んでしまいます。

つまり、楽天証券の口座を開設しなければFXデモ口座が開設出来ないようなのです。

これって、あまり良い仕組みだとは思えませんね。

バックテストの疑似Tickは、毎回同じTickを刻むのか?

検証してみました。

EA
//+------------------------------------------------------------------+
//| TickChecker.mq4 |
//| EA作成代行 シストレパートナーズ |
//| http://sistrepertners.sakura.ne.jp/ |
//+------------------------------------------------------------------+
#property copyright "EA作成代行 シストレパートナーズ"
#property link "http://sistrepertners.sakura.ne.jp/"
#property version "1.00"
#property strict

//+------------------------------------------------------------------+
//| インクルード定義 |
//+------------------------------------------------------------------+
#include
#include

//+------------------------------------------------------------------+
//| 定数 |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| パラメータ |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| グローバル変数 |
//+------------------------------------------------------------------+
int G_TickNum;

datetime G_TickTime;

//+------------------------------------------------------------------+
//| 初期処理 |
//+------------------------------------------------------------------+
int OnInit()
{
G_TickTime = 0;

return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| 終了処理 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}

//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 足が確定したら
if (G_TickTime != Time[0])
{
// Tick数を初期化
G_TickNum = 0;
G_TickTime = Time[0];
}

// ログに出力
Print("Tick Price[" + IntegerToString(G_TickNum) + "] = " + DoubleToStr(Bid, Digits));

// Tick数をカウント
G_TickNum++;
}

結果(1回目)
2 12:57:21.631 2017.10.01 00:00:00 TickChecker test started
0 12:57:21.632 2017.10.02 00:00:00 TickChecker USDJPY,M15: Tick Price[0] = 112.649
0 12:57:21.632 2017.10.02 00:00:03 TickChecker USDJPY,M15: Tick Price[1] = 112.647
0 12:57:21.632 2017.10.02 00:00:06 TickChecker USDJPY,M15: Tick Price[2] = 112.644
0 12:57:21.632 2017.10.02 00:00:09 TickChecker USDJPY,M15: Tick Price[3] = 112.642
0 12:57:21.632 2017.10.02 00:00:12 TickChecker USDJPY,M15: Tick Price[4] = 112.639
0 12:57:21.632 2017.10.02 00:00:16 TickChecker USDJPY,M15: Tick Price[5] = 112.637
0 12:57:21.632 2017.10.02 00:00:19 TickChecker USDJPY,M15: Tick Price[6] = 112.634
0 12:57:21.632 2017.10.02 00:00:22 TickChecker USDJPY,M15: Tick Price[7] = 112.632
0 12:57:21.632 2017.10.02 00:00:25 TickChecker USDJPY,M15: Tick Price[8] = 112.630
0 12:57:21.632 2017.10.02 00:00:29 TickChecker USDJPY,M15: Tick Price[9] = 112.627
0 12:57:21.632 2017.10.02 00:00:32 TickChecker USDJPY,M15: Tick Price[10] = 112.625
:
0 12:57:21.745 2017.10.02 23:58:21 TickChecker USDJPY,M15: Tick Price[372] = 112.734
0 12:57:21.745 2017.10.02 23:58:23 TickChecker USDJPY,M15: Tick Price[373] = 112.735
0 12:57:21.745 2017.10.02 23:58:25 TickChecker USDJPY,M15: Tick Price[374] = 112.733
0 12:57:21.745 2017.10.02 23:58:27 TickChecker USDJPY,M15: Tick Price[375] = 112.734
0 12:57:21.745 2017.10.02 23:58:30 TickChecker USDJPY,M15: Tick Price[376] = 112.733
0 12:57:21.745 2017.10.02 23:58:32 TickChecker USDJPY,M15: Tick Price[377] = 112.732
0 12:57:21.745 2017.10.02 23:58:34 TickChecker USDJPY,M15: Tick Price[378] = 112.733
0 12:57:21.745 2017.10.02 23:58:36 TickChecker USDJPY,M15: Tick Price[379] = 112.731
0 12:57:21.745 2017.10.02 23:58:37 TickChecker USDJPY,M15: Tick Price[380] = 112.732
0 12:57:21.745 2017.10.02 23:58:41 TickChecker USDJPY,M15: Tick Price[381] = 112.731
0 12:57:21.745 2017.10.02 23:58:43 TickChecker USDJPY,M15: Tick Price[382] = 112.730
0 12:57:21.745 2017.10.02 23:58:44 TickChecker USDJPY,M15: Tick Price[383] = 112.739

結果(2回目)
2 12:57:48.751 2017.10.01 00:00:00 TickChecker test started
0 12:57:48.751 2017.10.02 00:00:00 TickChecker USDJPY,M15: Tick Price[0] = 112.649
0 12:57:48.751 2017.10.02 00:00:03 TickChecker USDJPY,M15: Tick Price[1] = 112.647
0 12:57:48.751 2017.10.02 00:00:06 TickChecker USDJPY,M15: Tick Price[2] = 112.644
0 12:57:48.751 2017.10.02 00:00:09 TickChecker USDJPY,M15: Tick Price[3] = 112.642
0 12:57:48.751 2017.10.02 00:00:12 TickChecker USDJPY,M15: Tick Price[4] = 112.639
0 12:57:48.751 2017.10.02 00:00:16 TickChecker USDJPY,M15: Tick Price[5] = 112.637
0 12:57:48.751 2017.10.02 00:00:19 TickChecker USDJPY,M15: Tick Price[6] = 112.634
0 12:57:48.751 2017.10.02 00:00:22 TickChecker USDJPY,M15: Tick Price[7] = 112.632
0 12:57:48.751 2017.10.02 00:00:25 TickChecker USDJPY,M15: Tick Price[8] = 112.630
0 12:57:48.751 2017.10.02 00:00:29 TickChecker USDJPY,M15: Tick Price[9] = 112.627
0 12:57:48.751 2017.10.02 00:00:32 TickChecker USDJPY,M15: Tick Price[10] = 112.625
:
0 12:57:48.866 2017.10.02 23:58:21 TickChecker USDJPY,M15: Tick Price[372] = 112.734
0 12:57:48.866 2017.10.02 23:58:23 TickChecker USDJPY,M15: Tick Price[373] = 112.735
0 12:57:48.866 2017.10.02 23:58:25 TickChecker USDJPY,M15: Tick Price[374] = 112.733
0 12:57:48.866 2017.10.02 23:58:27 TickChecker USDJPY,M15: Tick Price[375] = 112.734
0 12:57:48.866 2017.10.02 23:58:30 TickChecker USDJPY,M15: Tick Price[376] = 112.733
0 12:57:48.866 2017.10.02 23:58:32 TickChecker USDJPY,M15: Tick Price[377] = 112.732
0 12:57:48.866 2017.10.02 23:58:34 TickChecker USDJPY,M15: Tick Price[378] = 112.733
0 12:57:48.866 2017.10.02 23:58:36 TickChecker USDJPY,M15: Tick Price[379] = 112.731
0 12:57:48.866 2017.10.02 23:58:37 TickChecker USDJPY,M15: Tick Price[380] = 112.732
0 12:57:48.866 2017.10.02 23:58:41 TickChecker USDJPY,M15: Tick Price[381] = 112.731
0 12:57:48.866 2017.10.02 23:58:43 TickChecker USDJPY,M15: Tick Price[382] = 112.730
0 12:57:48.866 2017.10.02 23:58:44 TickChecker USDJPY,M15: Tick Price[383] = 112.739

全く同じTickを刻んでいる事がわかります。

良く考えると、毎回違ったTickが刻まれたりしたら「バックテスト結果が毎回違う!?」なんて事態も発生し得る訳で、当然といえば当然ですね。

1分足でEAを稼働する時に注意する事

スキャルピング系のEAを1分足で稼働するのは、あまりおすすめ出来ません。

理由は、サーバーの負荷が掛かってティックデータが欠損した場合に、意図しないシグナルが発生する事があるからです。

特に、ティックの動きに敏感なインジケータをシグナル判定に利用しているようなEAでは、上記の現象が顕著になります。

ですので、サーバーに負荷がかかりそうな経済指標の発表時等はEAを停止する勇気も必要です。

ですが、突発的な事件等で相場が急展開するような時にはそうもいきません。

そのような事態の備えとして、EA内に「相場が急展開した時には取引を停止する」というロジックを実装するのが理想となります。例えば、「過去N本の足の値幅の平均値のX倍以上の値動きが、1本の足の中で発生した」というような条件でフィルタリングするのも手段の1つとなります。

アクセスカウンター
プロフィール

大和

Author:大和
フリーランスのプログラマーです。

EA作成代行承ります
最新記事
カテゴリ
広告
最新コメント
最新トラックバック
月別アーカイブ
リンク
メールフォーム

名前:
メール:
件名:
本文:

ランキング参加中
応援よろしくお願いします。
検索フォーム
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード