2016年2月15日月曜日

【一例紹介】最適化の期間検討 

久々のブログです。ヨーロッパから帰ってきました。
ブリュッセル⇒アントワープ⇒ロッテルダム⇒デルフト⇒デン・ハーグ⇒ライデン⇒アムステルダム⇒マーストリヒト⇒デュッセルドルフ⇒ケルンと12日間、電車の旅です。

特筆すべきは完全放置していたMT4が旅費+10万ほど稼いでいてくれたことです^^
細かいことは面倒なのであれですが自作派ですので、このブログのEAがほとんどです。
(ブログを読ませるための誘導ではありませんよ)

さて今日は、バックテストの期間についてです。
いろいろな意見があります。
①長ければ長いほどいい派 バックテストの時間がかかるのが難点ですが、急落、急騰、長期レンジや連続トレンドなどなど色々な経験をした上での結果になるので長期放置には非常に良いと思います。
②1,000回以上派 これもよく聞く意見ですが、根拠に乏しいと思います。EXCELで50%の確率を1,000回実施してもかなりの確率で5%以上の誤差が出ます。
③直近のデータ派 為替は集団心理で動くからあまり昔のデーターには信頼性がないとする意見。

以前②に関して記事を書いている複数の先生方になぜ1,000回なのかメールで意見を伺った時にまともな回答、エビデンスを持っている先生はいませんでした。私は1,000回は都市伝説と考えています。

そこで直近の1ヶ月、1年、5年の最適化を行いその損益最高の条件で翌月一か月いくら稼げるかやってみました。
今回は設定条件が多い方がいいのでMACDでFastEMA,SlowEMA,Signal,StopLossの四つで最適化しました。(FastEMA 6-19,SlowEMA 19-39,Signal 4-12,StopLoss 0.01-0.2)
ソースコードは下の方に記載しておきます。

最適化の結果ですが、
1ヶ月 8/35/4/0.01
1年  6/19/4/0.01
そして5年は1年と同じ結果になりました...

その条件で、の翌月1ケ月走らせた結果ですが、
1か月    2,197
1年、5年   2,874
非常にマイナスになりがちなEAなのですが両方プラスになりました。
しかし短期より長期の方がよい結果。一例だけなのですが今回は①>③ですね。
いろいろなEAで時期を何個かやってみると面白そうです。



上が一ケ月、下が一年、五年の最高結果設定で翌月実施です。
 






#property copyright "Copyright 2016/2/15,TACA"
#property link      "http://mt4kyoto.blogspot.jp/"
#define MAGIC 11010111
extern int Fma=12;
extern int Sma=26;
extern int Sig=9;
extern double SLo=0.1;
extern double Lots=0.01;
extern int Spread=5;
string Com="MACDtest";
int d;
void start(){
if (iMACD(NULL,0,Fma,Sma,Sig,0,0,2)<iMACD(NULL,0,Fma,Sma,Sig,0,1,2)){
if(iMACD(NULL,0,Fma,Sma,Sig,0,0,1)>iMACD(NULL,0,Fma,Sma,Sig,0,1,1)){
if(iMACD(NULL,0,Fma,Sma,Sig,0,1,1)<0)
{Exit();EntryLong();}}}
if (iMACD(NULL,0,Fma,Sma,Sig,0,0,2)>iMACD(NULL,0,Fma,Sma,Sig,0,1,2)){
if(iMACD(NULL,0,Fma,Sma,Sig,0,0,1)<iMACD(NULL,0,Fma,Sma,Sig,0,1,1)){
if(iMACD(NULL,0,Fma,Sma,Sig,0,1,1)>0)
{Exit();EntryShort();}}}
}
void EntryLong()
{if (MarketInfo(Symbol(),MODE_SPREAD) <= Spread)
{d = OrderSend(Symbol(),OP_BUY,Lots,Ask,5,Ask-SLo,0,Com+"tLong",MAGIC,0,Red);}}
void EntryShort()
{if (MarketInfo(Symbol(),MODE_SPREAD) <= Spread)
{d = OrderSend(Symbol(),OP_SELL,Lots,Bid,5,Bid+SLo,0,Com+"SHORT",MAGIC,0,Blue);}}
void Exit()
{d=OrderSelect(0,SELECT_BY_POS);
d=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5,clrGold);}




0 件のコメント:

コメントを投稿