注文クラス修正版FX-ON様に作成したEAを送付しました。現在フォワードテスト中。取引が発生していませんが、そのうち効果がでてくるかと。公開が近くなったら紹介記事を書いていきたいと思います。注文クラスを修正したので、またアップしておきます。シグナルによる単純な売買に対応した注文クラスです。カウントダウン方式に対応したのと、ModifyOrderにストップロス値が消えてしまう障害があったのを修正しています。うーんバグが残るもんですね。バックテスト的には動作しているので、いったんこれでOKかなぁと思っているのですが・・。全ポジションを成行き決済を行う。すべての注文を変更する。マジックナンバーを取得する。現在のポジション数を取得する。現在のポジション数を取得する。最大ポジション数を取得する。最大ポジション数を取得する。最大ポジション数を取得する。指定番号のチケットを取得する。指定番号の現在利益を取得する。1pipsあたりの値を取得する。指定pipsあたりの値を取得する。ポジションリストを更新する。スプレットが大きすぎる場合は取引しない。bid;//pips値からストップロス値、利益確定値を取得する。リトライしても仕方がないエラーの時は終了してしまう。オーダーが選択できない状態(すでに存在しない)場合は、リストから削除して終了する。リトライしても仕方がないエラーの時は終了してしまう。全ポジションを成行き決済を行う。オーダーが選択できない状態(すでに存在しない)場合は、リストから削除して終了する。bid;//pips値からストップロス値、利益確定値を取得する。注文ストップ値は下方方向への変更は許可しない。変更がない場合はコマンドを実行しない。リトライしても仕方がないエラーの時は終了してしまう。すべての注文を変更する。ポジションリストを更新する。指定番号のチケットを取得する。指定番号の現在利益を取得する。※こちらの記事もご覧ください。バックテスト時のiCloseは1000本前までに限定される。http://mt4program.blogspot.jp/2015/10/mt4-iclose1000.htmlEA開発時にバックテストをおこないますが、バックテスト時の独自挙動が存在します。開発時に注意する点として特に問題となることを自分向けのメモとしてまとめます。■OnTimerが動作しない。EventSetTimerで設定してもOnTimerは動作しません。EAとしてOnTimerで何かするのはやめておいた方がよさそうです。私はEA稼働時のコメントの更新の為だけに使用してポジションの状態に影響しないようにしました。ポジションの状態に時間ごとに影響させたい場合OnTick内で、定期的に呼び出すしか方法はなさそうです。これも気配値の更新タイミングで呼び出し時間がずれますが、通常は大きな影響はないと思われます。60秒ごとに呼び出す場合はこんな感じ。TimeCurrent();}}■TimeGMTが機能しない。TimeGMT・・・GMTが取れる超便利な関数ですよね。ところが、バックテストだとTimeCurrentと同じ値が取れてきます。バックテスト用データのチャート時間の値であってGMTではありません。バックテスト用にGMTを補正する必要があります。MT4でよく採用されているGMT+2ですが、アメリカ夏時間帯になると+3になるデータが多い為、夏時間の判定も必要です。アメリカ夏時間を判定するプログラムを使って夏時間かどうかを判定した上でバックテストを行う必要が出てきます。こんな感じで、バックテスト中のみGMTに対するオフセット値を適用するコードが必要です。バックテストの場合TimeGMTの値はサーバータイムが帰ってくる。おかしくなるが日曜日早朝切り替えの為//EA動作には影響しない。ONEHOUR;}バックテスト用のパラメータコードとしてGMT補正が必要になるのではれば、結局のところTimeGMTいらないという結果に・・・(バックテストせずにEA動かす人なんてそうそういないですよね?)IsTestingはバックテスト中かどうかをbool値で返してくれる関数です。このようにバックテスト時だけどうしても動作を変える必要がある部分などでは重宝します。■初値で判断するなら、初値時しか動かない判定が必要。バックテストで、初値のみでテストしている場合、実運用上で正しく初値のみでしか動作しないようにしないといけません。全チックでやっても初値のみでやってもテスト結果としては大差ないのが基本です。(実際やってみると判定式を入れていたとしてもずれることがあるので、何かしらのアルゴリズムが入っているのかもしれませんが・・・)切り替え時だけ動作させる判定式はこんな感じになります。currentTime;■最適化をする場合は、利益だけを見てはいけない。最適化を何回かやっていると最大の利益が出るように調整していく事になるかと思います。利益の差が大きいEAの場合、たまたま引っかかったでかい利益のポジションの影響を受けることがあります。そのため、ドローダウンや勝率、取引数などを含めて確認することが必要と感じました。期間をいくつかに分けて確認することも重要で、長い期間だとうまくいっても実は直近NGだったりすることが多々ありました。■履歴データを追いかけるときは注意バックテストでは普通に全履歴がとれますが、実運用では取れません。MT4「ターミナル」内「口座履歴」のタブにて表示期間を「全期間」に指定する必要があります。■最後は力技ただ今デバッグ中ですが、デバッグになると割と力技です。チャートとインジケータを見比べて取引がアルゴリズム通りかどうか結局一個一個見ていく必要がありました。バグがある・・・・・泣このあたりは、まだまだ人の手による目視確認が有効でした。この場合も、切り分けて確認する必要があります。私の場合、売りだけ・買いだけといったモードをEAに組み込み買いのアルゴリズムのみを確認・売りのアルゴリズムを確認といった形で行いました。チャートの確認だけなら長い時間は必要ないため、ひと月ぐらいのスパンで何回も実行することが重要でした。今自作EAをFX-ON様に登録すべく全ティックでのバックテストを実施中です。この休み複雑すぎるだろ!イースターの計算さて、EAを作成していると休みの日は取引したくない!ってことありませんか?その場合、コツコツと計算していくわけですが、大概の休みは決まった日か月の何番目の何曜日とか割と簡単な計算で求めることができます。ところが、イースターだけは別格です。ふざけてるんですか???と言いたくなる法則です。それでもネットの海を検索するとガウスさん(ガウス平面とか最小二乗法とかのガウスさんです!)が考えてくれた数式が見つかりました。それ以降さまざまな数学者が公式を出しています。こんな超有名数学者じゃないと作れない式を使わないと計算できない恐ろしい休日なのです。イギリス国立天文台のサイトから式を拾ってアルゴリズムにしてみました。1900-2099まで適用可能のようです。EAで使う分には十分ですよね。使えない子のCArrayDoubleを改造する。Build600からオブジェクト指向に対応しているMQL4です。オブジェクト指向対応版の配列クラスCArrayDoubleがコードも合わせてMT4に添付されています。配列操作が便利にはなるのですが、標準関数であるiMAOnArrayの引数が当然のごとくdouble[]を要求してくるのでCArrayDoubleで値を保持してしまうと移動平均が取れないといった問題があります。オブジェクト指向の機能として継承という機能があります。CArrayDbouleを拡張してiMAOnArrayによる移動平均を計算できるようにしたいと思います。継承についてはWikiの説明を見てください。