2011/01/14

バックテスト(自動)時代 - ForexTester2ストラテジプログラミング⑤(決済ロジック)



さて前回は、売買ルールのうち、発注ロジックプログラムの書き方について話しました。

今回は、売買ルールのうち、決済判定ロジックのプログラムの書き方について話します。
この構造にする事で、発注ロジックと同様特定の手法を追加したり、その後削除したりというのを、一部だけコメントアウトしたり元に戻したりするだけで、色々な組合せを試せる様になります。
決済ロジックが一番試行錯誤が多いのではないでしょうか?

今回の決済は、トレーリングではなく、自発的な決済に関する内容です。

●決済
 関数呼び出しの流れは以下の様な感じ。
 vOrderTypeは、ロングポジションの場合は1、ショートポジションの場合は-1を指定。

 GetSingleTick → ToClose() 
   →ToCloseMain() → 各種決済ロジックへ(仕掛けに応じた決済ロジック)
      →ToOrder(vOrderType:Integer) → ドテン判定
   →ToCloseAdd() → 各種決済ロジックへ(一般的なな決済ロジック)
 ここは発注ロジックよりかはすっきり。
 以下、関数毎に説明

 ①ToClose()
  決済すべきであれば、Trueを返す。ソースはこんな感じ。
  ミソは、ToOrderを反対売買の判定で呼び出すことで、ドテンの手仕舞いを特別書か
  なくてもよいこと
  ToCloseMain()とToCloseAdd()は本質的にはあまり違いはありません
  ToOrder()は、発注ロジックの記事で書いたものと同じです。

{-----Judge to Close  ------------------------------------}
function ToClose() : Boolean;
var
   cond1,cond2,cond3:Boolean;
begin
     result := False;

     cond1 := False;
     cond2 := False;
     cond3 := False;

     cond1 := ToCloseMain(); // Closing logic for each order method
     cond2 := ToOrder(OrderType*(-1)); // Doten(Condition of opossit order)
     cond3 := ToCloseAdd(); // Additional condition for closing order

     if cond1 OR cond2 OR cond3 then result := True;
end;

 ②ToCloseMain()
  発注時の記事を例にとると、2SMAクロスはドテンなのでココに書く必要なし
  でも、3SMAクロスは短線が中線をクロスしたら決済するのが一般的な
  ルールなのでロジックを用意

{-----Judge to Close  Main condition ---------------------------}
function ToCloseMain() : Boolean;
begin
     result := False;

     result := ToCloseMain_2(); // 3SMA cross
end;

 ③ToCloseMain_2() -  仕掛けに応じた決済ロジック例(3SMA)
    ロングポジションの場合、長線<中線<短線の条件が満たされなくなったら
  決済する。決済する場合は、Trueを返却
  WkToOrder()は、発注ロジックの記事で書いたものと同じです。

{-----Judge to Close(System6_3)  3SMA cross --------------}
function ToCloseMain_2() : Boolean;
begin
     result := False;

     result := Not(WkToOrder(OrderType,1))
end;

 ④ToCloseAdd()
  発注ルールとは直接関係無い論理の決済ロジックを記載
  以下の例では、40期間モメンタムMFの0クロスでの決済と、
  キーリバーサルでの決済ロジックを用意しているが、キーリバーサルは
  コメントアウトして無効化。有効にするには先頭の"//"を削除すれば、
  どちらの条件でも決済する様になる。

{-----Judge to Close Additional conditions ----------------}
function ToClose6Add() : Boolean;
begin
     result := False;
 
     if Not(result) then result := ToClose_2(40); // Momentum MF 0 cross N-period
     //if Not(result) then result := ToClose_1(); // Key-Reversal

end;

 ⑤ToClose_1() 個別の決済ロジックの例
  以下の例はキーリバーサルでの決済ロジックの例。ロングポジションか
  ショートポジションかによって、ロジックを別けていて、決済要であれば
  Trueを返却する。
  オリジナルのキーリバーサルからちょいアレンジして、過去10バーの
  高値/安値を更新している状態という条件も付与してます。
  OrderTypeはグローバル変数で、保有ポジションがロングであれば1
  ショートポジションであれば-1が格納されています。

{-----Judge to Close : Key-Reversal -------------------- }
function ToClose_1() : Boolean;
var
   atr : double;
begin
     result := False;

     if (OrderType>0) AND (High(2)>Highest(3,10))
     then
     begin
          if (Close(2)>Close(3)) AND (High(2)>High(1)) AND (Close(2)>Close(1)) then
          begin
               result := True;
          end;
     end;
     if (OrderType<0) AND (Low(2)<Lowest(3,10))
     then
     begin
          if (Close(2)<Close(3)) AND (Low(2)<Low(1)) AND (Close(2)<Close(1)) then
          begin
               result := True;
          end;
     end;
end;



決済ルールは本当に難しい!!
決済ルール次第で、結果が大幅に変わってしまう!!


未だにここをメインに試行錯誤中だす。。。


なので、この試行錯誤が楽なロジック構成は重宝してます。(自画自賛)


ということで、不明点等は質問してください!


今回笑いが無くてすみません。。。


※参考:「ForexTester2ストラテジの内部設計(GetSingleTick内ロジックの流れ)」

そして、「FXシステムトレード初心者奮闘記」のストラテジプログラミング集がまたまた続くのでした。
次はトレーリングのロジックの書き方です。

0 件のコメント:

コメントを投稿