MT4 EA バックテスト に関する質問です。 trekfareast様毎日のようにリクエスト…

MT4 EA バックテスト に関する質問です。

trekfareast様毎日のようにリクエストしてしまい申し訳ございません。面倒と感じた場合は迷わず無視していただければと思います。

ご迷惑をおかけいたします。

知恵袋で丁寧にお答えいただける皆様もお世話になっております。

以前
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1315297494…
という質問をしました。(未だ未解決)
=未約定注文には有効期限をつけることで、約定済み注文と未約定注文を分け、それぞれの数を取得する。それぞれの数が変動したら次のオーダーを出すプログラムを書いたところ、デモトレードではうまく動き、バックテストでは予期していない動きをしていました。

そこで自分なりに様々な 検証をしてみた結果、OrderExpiration()関数「未約定注文の有効期限を取得する関数」に問題があるのではと考えました。

デモトレードでは未約定注文が約定すると、約定されたポジションの有効期限は初期値(有効期限を設定していない時と同じ状態)に変更されるのに対し、

バックテストではなぜか約定後も有効期限を引き継いでしまっているのではないかと、

仮説を立てました。

この仮説が正しいとなると今作成しているEAの動作テストすらままなりません。(収益予測の精度が悪い程度の話ならこのような質問はしなかったのですが・・・)
このような状況なので、リアル口座で稼働させるなんてまだまだ夢のまた夢状態です。

良い解決策はありますでしょうか?宜しくお願い致します。

回答1

>未約定注文には有効期限をつけることで、約定済み注文と未約定注文を分け

たぶん、「バックテスト」と「リアル/デモ」で有効期限データの処理が異なる事が原因だと思われます。

————————————————————
まず、int OrdersTotal( )ですが、この関数は、現在生きている注文(約定待ちオーダー/約定してクローズされていないポジション)の数の合計が返されます。

ですから、約定待ちのオーダーが約定すると、約定してクローズされていないポジションになりますので、OrdersTotal( )の値に変化はありません。
(ここまでは、確認)

OrderSelect(index,SELECT_BY_POS)で選択される、生きているオーダーの種類は、int OrderType( )で取得する事ができます。オーダーの種類には

OP_BUY – 買いポジション
OP_SELL – 売りポジション
OP_BUYLIMIT – 買い指値オーダー
OP_BUYS TOP – 買い逆指値オーダー
OP_SELLLIMIT – 売り指値オーダー
OP_SELLSTOP – 買い指値オーダー

の6種類があります。

このうち、現在持っているポジションの数(ポジションサイズじゃないです)を知りたい場合は、OP_BUY と OP_SELL の数を数えれば良いと思います。
(たぶん…)

ポジション化していない、未約定オーダーの数は残りの部分です。
(まったく、デバッグしていませんが、だいたい以下のような感じのプログラムになると思います。エラーが出たら適当に修正して下さい…(^_^;)

int PositionCount=0;//生きているポジション数をカウントする変数
for(int i=0;i<OrdersTotal();i++){
if(OrderSelect(i, SELECT_BY_POS)==false)continue;
if(OrderType() == OP_BUY || OrderType() == OP_SELL)PositionCount++;
}

int OrderCount = OrdersTotal()-PositionCount;//約定していない注文数
————————————- ———————–

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA