開発:MQL開発5/バックテストと修正 | シストレの現実

シストレの現実

インフラ構築のプロが、シストレをゼロから始める記録です。
リーン・スタートアップの考えを取り込み、Expert Adviser を作っていきます。

教えるような大したものではなく、ユースケースの一つになれば幸いです。

少し本業が忙しくて出張続きなもんで、更新が滞っています。
その間に読んでいた本がこちらで、非常に参考になっています。

リーン・スタートアップ/日経BP社

PDCAの手法を具体的に考えていくとこうなるんじゃないかなぁ、と言う内容なんですが、ちょうど今回のシストレでやろうと考えていた方法にあてはまります。

今で言うと、MVS実用最小限の製品)を作っている途中なのに、先に色々くっつけようとして反省したところです。。。
まずは儲かりそうなプログラムを作ることを優先したいと思います。

そんなわけで、あとはログの処理を残すだけという状態なんですが、一旦放置することに決めました。

まずはバックテストで良い成績を出すことに注力したいと思います。

バックテストは下記の手順を見て実行しました。

バックテストをする | 詳解 MT4

もちろん100% 信用するわけではないですが、バックテストでサンプルEAより儲からないEAなんてダメですから、まずはサンプルEAを基準としてベンチ-マークを行いたいと思います。

・・・

と意気込んでバックテストを始めたわけですが、どうも動きがおかしくて、異様に遅い思ったようなタイミングで取引できない、、、と。
どうもプログラムに不具合があることは明白です。

そこでデバッグすると、やはりありました、不具合。。。

不具合の分かるグラフ

プログラマーではないとは言え、腕が落ちたなぁ。。。

そんなわけでトライアンドエラーを繰り返して、バグを特定・修正してバックテスト再開したわけです。


さて、ブログに書くべきネタとして、不具合の変更箇所ではなくチューニングした箇所を少々。
参考にしたのはこちら。

最適化を最適化する・・・//MQL4の高速化(3) 1秒でも速く - とあるMetaTraderの備忘秘録

変更前
// 買いポジション取引
if ( MarketTrend == 1 && Close[1] > maFastNow && Close[2] > maFastPre ){~}

変更後
if ( MarketTrend == 1) {
    if (Close[1] > maFastNow) {         if (Close[2] < maFastPre ) { ~         }     } }

if文は、最初の条件を判断したら、後の処理を省略する「短絡評価 (ショートサーキット)」は備えていないそうなので、分解することにしました。
どっちが良いかはもう少し計測して考えようかな、という感じです。

あと、バックテスト用に追加した処理はこちら。
if (IsTesting() || IsOptimization()) {
//--- バックテスト用処理(簡略化)
CheckForOpen();


} else {
//--- 本番用処理


//--- 状態確認:トレード可否、必要な過去データを入手可能か)
if (IsTradeAllowed()==false) return;
if (Bars <= StopLossCriteria) return;


//--- ポジション取引
    if (CheckForOpen() < 0) Print("Error: Code(",GetLastError(),")");
}

バックテストの際のチェック処理を減らしました。
でも、結果としてバックテストかどうかを判断する処理が増えたので、どうかなぁ、、、と懐疑的です。
この辺も少し調査が必要ですね。。。

そんなわけで思ったロジックが出来上がりました。
これからバックテストしまくって最適化をします。。。チューニングしたけど長い。。。

バックテスト中。。。

一ヶ月に絞っているとはいえ、あんまり利益でないなぁ、、、


更新したEAのソースコードはこちら。

GitHub: ea01/ea01.mq4