前回の続き、
処理の流れは、以下。
1.check_entry(index)
indexの日に、フィルターをくぐり抜けて、シグナル発生してれば仕掛け。
仕掛けがあれば、tradeを生成して仕掛けを実行。
2.set_stop(position, index)
indexの日のストップをpositionに設定。
3.check_exit(trade, index)
indexの日に、手仕舞うシグナルが発生してれば手仕舞う。
詳細を順に見てゆこう。仕掛けのところから、
1.check_entry(index)
indexの日に、フィルターをくぐり抜けて、シグナル発生してれば仕掛け。
仕掛けがあれば、tradeを生成して仕掛けを実行。
ここで、ストップ設定をする。
1-1.内部メソッドentry_through_filter(index)を呼び出し、
フィルターをかけ仕掛ける。
仕掛けが成立してなければ、それで終わり。
1-2.仕掛ければ、trade_with_first_stop(trade, index)を呼び、
初期のストップ設定。
(初期のストップ設定だけset_stopと別にしてる理由はまだ不明。)
と、さらに細分化します。
entry_through_filter(index)の内部は、
1-1-1.filter_signal(index)を呼び、
フィルターの判定を返す。仕掛け不可なら終わり。
買いないし売りが可能なら、tradeを生成。仕掛けるつもり。
両方可能なときは、買い優先。(この理由は不明、両建てはしない主義らしい)
1-1-2.check_entry_rule(long_short, index)で仕掛ける。
check_entry_ruleを呼びだす周辺は冗長な書き方であまり意味がない。
ので、そこは気にしません。
(売りと買い別にメソッド用意する意味ほぼなく、素直に引数で渡せばいいだけです。
余計なことするので、トリッキーなことしてます。ムダです。))
とにかく、全てのEntryを順次チェックして、仕掛け成立した時点で終了。
全部調べて、仕掛けないこともある。
で、trade_with_first_stop(trade, index)の内部に移ると、
1-2-1.通常はtightest_stop(trade, index)を呼び、ストップ値算出。
(tightest_stopの説明はあとで)
ただし、Stopが元々セットされてない場合はパスしてtradeを返すことで仕掛け成立。
ストップ値算出の結果が、出てなければパス。tradeを返さず仕掛け不成立とする。
それ以外は算出したストップを設定し、tradeを返し仕掛け成立。
この時trade.first_stopにも設定。初期ストップ値のことらしい。
(これを設定するために、最初だけ別のメソッドで分けたらしいと知れる。
ただし、first_stopの目的はR倍数計算する為らしい。
初日に設定されず、翌日始めて設定されても、ここには値が残らないのか、
トレーリングストップするなら、履歴は全部保存したらとも思う。)
以上が、フィルターを抜けて、仕掛けて、最初のストップを設定をするまでの流れである。
ムダに小分けにし過ぎで、理解が煩雑になってる気がする。
覚えておくことは、以下の二点。
買いと売り両方出来るときは、買い優先。
Stopがセットされていうのに、仕掛けでストップ値設定出来ないときは仕掛けない。
それだけで、いいかとも思います。
Filterの算出、Entryの順次処理、Stopの算出、Exitの順次処理。
この4つと、全Ruleを回すeach_rulesは用意して、
あとは、enter,setStop,exitって外部に向けてのメソッド3つ、いやそれも1つに纏めるかな。
position配列とindexを引数にすればいいのだから。
分岐先固有の内部メソッドを作るって、あまり発想が良くないな。
機能を提供するのがメソッドなのだから、
条件別にどう機能を使うかは、使うところで書いておきたい。
trade_with_first_stopみたいな構成にするのは、見通し悪くしそう。
残りの、ストップと手仕舞いは明日。
質問コーナー、お問い合わせは、sanpome.net@gmail.com まで。