さて前回は、売買ルールのうち、発注ロジックプログラムの書き方について話しました。
今回は、売買ルールのうち、決済判定ロジックのプログラムの書き方について話します。
この構造にする事で、発注ロジックと同様特定の手法を追加したり、その後削除したりというのを、一部だけコメントアウトしたり元に戻したりするだけで、色々な組合せを試せる様になります。
決済ロジックが一番試行錯誤が多いのではないでしょうか?
今回の決済は、トレーリングではなく、自発的な決済に関する内容です。
●決済
関数呼び出しの流れは以下の様な感じ。
vOrderTypeは、ロングポジションの場合は1、ショートポジションの場合は-1を指定。
GetSingleTick → ToClose()→ToCloseMain() → 各種決済ロジックへ(仕掛けに応じた決済ロジック)→ToOrder(vOrderType:Integer) → ドテン判定→ToCloseAdd() → 各種決済ロジックへ(一般的なな決済ロジック)
ここは発注ロジックよりかはすっきり。
以下、関数毎に説明。
①ToClose()
決済すべきであれば、Trueを返す。ソースはこんな感じ。
ミソは、ToOrderを反対売買の判定で呼び出すことで、ドテンの手仕舞いを特別書か
なくてもよいこと。
ToCloseMain()とToCloseAdd()は本質的にはあまり違いはありません。
ToOrder()は、発注ロジックの記事で書いたものと同じです。
{-----Judge to Close ------------------------------------}function ToClose() : Boolean;varcond1,cond2,cond3:Boolean;beginresult := False;cond1 := False;cond2 := False;cond3 := False;cond1 := ToCloseMain(); // Closing logic for each order methodcond2 := ToOrder(OrderType*(-1)); // Doten(Condition of opossit order)cond3 := ToCloseAdd(); // Additional condition for closing orderif cond1 OR cond2 OR cond3 then result := True;end;
②ToCloseMain()
発注時の記事を例にとると、2SMAクロスはドテンなのでココに書く必要なし。
でも、3SMAクロスは短線が中線をクロスしたら決済するのが一般的な
ルールなのでロジックを用意。
{-----Judge to Close Main condition ---------------------------}function ToCloseMain() : Boolean;beginresult := False;result := ToCloseMain_2(); // 3SMA crossend;
③ToCloseMain_2() - 仕掛けに応じた決済ロジック例(3SMA)
ロングポジションの場合、長線<中線<短線の条件が満たされなくなったら
決済する。決済する場合は、Trueを返却
WkToOrder()は、発注ロジックの記事で書いたものと同じです。
{-----Judge to Close(System6_3) 3SMA cross --------------}function ToCloseMain_2() : Boolean;beginresult := False;result := Not(WkToOrder(OrderType,1))end;
④ToCloseAdd()
発注ルールとは直接関係無い論理の決済ロジックを記載
以下の例では、40期間モメンタムMFの0クロスでの決済と、
キーリバーサルでの決済ロジックを用意しているが、キーリバーサルは
コメントアウトして無効化。有効にするには先頭の"//"を削除すれば、
どちらの条件でも決済する様になる。
{-----Judge to Close Additional conditions ----------------}function ToClose6Add() : Boolean;beginresult := False;if Not(result) then result := ToClose_2(40); // Momentum MF 0 cross N-period//if Not(result) then result := ToClose_1(); // Key-Reversalend;
⑤ToClose_1() 個別の決済ロジックの例
以下の例はキーリバーサルでの決済ロジックの例。ロングポジションか
ショートポジションかによって、ロジックを別けていて、決済要であれば
Trueを返却する。
オリジナルのキーリバーサルからちょいアレンジして、過去10バーの
高値/安値を更新している状態という条件も付与してます。
OrderTypeはグローバル変数で、保有ポジションがロングであれば1、
ショートポジションであれば-1が格納されています。
{-----Judge to Close : Key-Reversal -------------------- }function ToClose_1() : Boolean;varatr : double;beginresult := False;if (OrderType>0) AND (High(2)>Highest(3,10))thenbeginif (Close(2)>Close(3)) AND (High(2)>High(1)) AND (Close(2)>Close(1)) thenbeginresult := True;end;end;if (OrderType<0) AND (Low(2)<Lowest(3,10))thenbeginif (Close(2)<Close(3)) AND (Low(2)<Low(1)) AND (Close(2)<Close(1)) thenbeginresult := True;end;end;end;
決済ルールは本当に難しい!!
決済ルール次第で、結果が大幅に変わってしまう!!
未だにここをメインに試行錯誤中だす。。。
なので、この試行錯誤が楽なロジック構成は重宝してます。(自画自賛)
ということで、不明点等は質問してください!
今回笑いが無くてすみません。。。
※参考:「ForexTester2ストラテジの内部設計(GetSingleTick内ロジックの流れ)」
そして、「FXシステムトレード初心者奮闘記」のストラテジプログラミング集がまたまた続くのでした。
次はトレーリングのロジックの書き方です。
0 件のコメント:
コメントを投稿