一定時間経過での手仕舞い
fx-onに出品させていただいているSwallowにはポジションをとってから一定時間(デフォルトでは36時間)経過した際にポジションを強制決済する機能を付けています。
最後のポジション取得から36時間、ということなので、両建て状態(売り買い1つずつのポジション)になった時は、1つ目のポジション取得から強制決済までの時間は最長71時間になります。
(つまり、例えば買いポジションを取って35時間経過した後に売りのシグナルが出て売りポジションを持った場合、時間のカウントはリセットされ、強制決済の時間は売りポジションを持ってから36時間になるということ)
プログラム的にはポジション取得時間をdatetime型で記録しておいて、その時間から36時間経過したら強制決済ということにしていたのですが…
フォワードテストで走らせているとある問題に直面。
それは、ポジションが週末持ち越し状態になると当然、月曜マーケットオープン時には金曜マーケットクローズ時から36時間以上経過しているわけなので、週明けで市場が開いた瞬間に持ち越しポジションが決済されてしまうということです。
気づいてみれば当たり前なのですが、気づかないままリリースしてしまっていました(~_~;)
そういうロジックなんだと思えばそれはそれでいいのかもしれませんが、マーケットオープンの瞬間はスプレッドが開いてトレード的には不利な状態になっていますし、元々意図していた挙動ではないのでまあ直した方がいいよねという話で。
これを解決するにはどうしたらいいんだろうと思い、MQL4プログラミングのバイブル、FXメタトレーダー実践プログラミングを読んでみるとドンピシャのプログラム例を発見。
iBarShift関数を使って「バーがエントリー時から一定本数更新されたところで決済」とすればいいということらしい。
確かにこうすれば週末はバーの更新はありませんので、バーが36本更新されたら強制決済ということにすれば、マーケットが開いている間で36時間経ったら決済ということにでき、週明けでいきなりポジションが決済されてしまうという現象は防げますね。
それで早速プログラミングしてみたのですが…今度はバックテストしてみるとドローダウンが3割くらい大きくなるという問題に直面。
週末持ち越しするようにしてロジックが変わったんだから当たり前じゃね?と思われるかもしれませんが、試行錯誤する中で週末クローズ機能を付けてみても同じ結果になるんですよ。
つまり、「ポジション取得から36時間経ったら強制決済」と「週末23時に強制決済」というロジックは同じで、時間の経過をポジション取得からの秒数で判断するかバーの本数で判断するかというだけの違いなのですが、なぜかドローダウンが違うという状況。
損益は大体同じなんですけどね。
いろいろ原因を調べてはみたのですが、プログラムに間違いはなさそうだし、含み損益でドローダウンが大きく出ているわけでもなさそうだし…
Quant Analyzerを使ってポジションの保有時間を調べてみると確かにちょこちょこ違う点は見られるのですが、細かすぎて明確な違いを特定するには至らず。
どうしてなんだろうな~。
とりあえず週末決済する限りには元々の問題であった週明け決済という問題は回避できるので、プログラムとしては時間の経過は元と同じくポジション取得からの秒数で判断することにして、週末決済機能を付けることで落ち着きはしたのですが、原因がわからずどうもしっくりきません。
祝日での休場とか、そういうのが関係している可能性もあるんだろうか。
もう少し考えてみようとは思いますが、プログラミングは難しいですな(^_^;)
コメント
この記事へのトラックバックはありません。
この記事へのコメントはありません。