GitHub で見る

Zigzag Candles ストラテジーのダイアグラム

このダイアグラムは、直近5本の確定した1時間足ローソク足の最高値と最安値という2つのスイング水準を常に保持し、そのいずれかに到達したローソク足に対して動作します。互いをリセットし合う2つのフラグ(Flag)ブロックにより、1つのスイングにつき動作は1回だけに制限されるため、同じ値動きの中で何度も触れられた水準からは注文が1件しか出ません。各スイングはまず、開いているポジションをすべて手仕舞います。その次のスイングが反対側のポジションを建てます。

戦略の概要

  • すべての処理は1本の1時間足ローソク足系列から供給され、この系列は確定したローソク足だけを配信します。そのため、後続のティックで取り消される可能性のある価格から水準や注文が作られることはありません。
  • 2つのコンバーター(Converter)が各ローソク足の高値と安値を取り出し、期間5のHighest(最高値)と期間5のLowest(最安値)に渡します。どちらのインジケーターも形成が完了してからしか値を出力しないため、5本のローソク足が確定するまで水準は存在しません。
  • 2つの変数(Variable)ブロックが水準を保持します。それぞれ最新のインジケーター値を取り込みますが、その時点では出力せず、ローソク足ごとに保持している値を改めて出力します。これにより水準は、それを更新した足だけでなく、毎足で比較に利用できます。
  • さらに2つのコンバーターが、いま確定したローソク足の高値と安値を取り出し、2つの比較(Comparison)ブロックがそれらを保持中の水準と突き合わせます。すなわち、上限水準に到達またはそれを超えた高値と、下限水準に到達またはそれを下回った安値です。
  • ポジション(Position)の値はローソク足ごとに1回だけ取り込まれ、ゼロと2回比較されて「ショートでない」判定と「ロングでない」判定を作ります。2つのブレイクはそれぞれ対応する判定と論理条件(Logical condition)ANDで結ばれるため、上限水準はポジションがまだショートでない場合にのみ、下限水準はまだロングでない場合にのみ処理されます。
  • 各ANDはフラグのTriggerを駆動し、反対側のブレイクがそのフラグのResetを駆動します。フラグはtrueを1回だけ通過させ、その後はリセットされるまで沈黙します。これにより、1つのスイングの中で何度も触れられた水準は、ちょうど1回の動作になります。
  • 発火したフラグは、Close positionに設定されたポジション変更(Position modify)と、Open positionに設定されたポジション変更に同時に到達します。実際に作用するのは一方だけです。既存のポジションは成行で手仕舞われ、フラットな状態であればスイングが示す側にポジションが建てられ、当てはまらないほうのブロックはシグナルを破棄します。
  • チャートパネルには、1時間足のローソク足、2本の極値ライン、3系統すべての注文、およびすべての約定が描画されるため、スイング水準とそこで取られた動作を1つの図から読み取れます。

エントリーとエグジットの条件

  • ロングエントリー: 確定したローソク足の安値が、保持されている下限水準に到達またはそれを下回り、かつポジションがロングでない場合。下側のフラグが1回だけ発火します。ショートポジションは成行で買い戻されてフラットになり、フラットな状態であればOrder Volume分のロングになります。その後フラグは、安値が何度そこに戻ってきても、上限水準が取られるまで沈黙します。
  • ショートエントリー: 確定したローソク足の高値が、保持されている上限水準に到達またはそれを超え、かつポジションがショートでない場合。上側のフラグが1回だけ発火します。ロングポジションは成行で売られてフラットになり、フラットな状態であればOrder Volume分のショートになります。このフラグは、下限水準が取られるまで沈黙します。
  • エグジット: ストップもターゲットもタイマーもありません。ポジションは反対側のスイングによって決済されます。一方の側を建てるのと同じフラグがClose positionブロックにも接続されているため、もう一方の水準に最初に触れた時点で、開いているポジションは手仕舞われます。エントリー数量が固定で、ポジションを建てるブロックはフラットな状態しか受け付けないため、完全なドテンには常に2回のスイングが必要です。1回目で手仕舞い、2回目で反対側を建てます。

パラメーター

パラメーター 既定値 説明
Candles 01:00:00 ローソク足系列の時間軸。確定したローソク足だけが配信されるため、判断は1本の足につき1回行われます。
Swing High Length 5 上側の極値を求める対象となる確定ローソク足の本数。ウィンドウを長くすると上限水準に到達しにくくなりスイングも長くなり、短くするとほとんどすべてのローソク足が新しい極値になります。
Swing Low Length 5 下側の極値を求める対象となる確定ローソク足の本数。上側とは別に指定できるようになっており、両サイドを意図的に非対称にできます。
Initial Swing High 999999999 上側のインジケーターが形成されるまで上限水準が保持する値。到達不可能な値をあえて設定してあり、ウォームアップ中はどの高値もこれに触れられず、実際の極値が存在する前にショートが建てられることはありません。
Initial Swing Low 0 下側のインジケーターが形成されるまで下限水準が保持する値。ゼロには約定価格が上から到達することはできず、同じ理由でロング側も動きません。
Order Volume 1 ポジションを建てる両方の動作で使われる数量。手仕舞いの動作は数量を必要とせず、開いているポジションをそのまま解消するため、数量を固定していればポジションは1ロットのショート、フラット、1ロットのロングの間だけを行き来します。

ダイアグラムの詳細

  • ローソク足(Candles)ブロックは確定したローソク足のみを購読しており、それが水準の正しさを担保します。インジケーターへはコンバーター(Converter)を介して値が渡されますが、コンバーターが出力するのは単なる数値であり、それは常に確定値として扱われます。そのため未確定のローソク足も完成したものとしてHighestとLowestのウィンドウに入ってしまい、極値が自分自身を含むことになります。同じ購読設定が注文の正当性も保ちます。未確定のローソク足の更新から作られた注文はその足の開始時刻を持つため、過去から届いたものとして拒否されます。
  • ブレイクは、判定対象のローソク足より前の時点における水準に対して測られます。保持用の変数はすでに持っていた値を改めて出力し、インジケーターは同じ足で新しいローソク足を取り込むため、ローソク足が突き合わされる水準は、自分自身を含むものではなく、それより前の5本のローソク足の極値になります。
  • 2つのフラグ(Flag)ブロックは互い違いに配線されています。上側のブレイクが下側のフラグをリセットし、下側のブレイクが上側のフラグをリセットします。この組み合わせがダイアグラムの記憶のすべてであり、直近のスイングがどちら向きだったか、そしてすでに処理済みかどうかを示します。フラグはどちらのソケットでもfalseを無視するため、比較ブロックがローソク足の更新ごとにfalseを出力しても影響はなく、反対側の水準に到達して初めて再び出力します。
  • 水準は変数(Variable)ブロックで保持され、その入力はトリガーとしては働きません。代わりにローソク足系列がTriggerを駆動します。同じ仕組みでポジション(Position)の値もローソク足ごとに1回取り込まれるため、2つのポジション比較(Comparison)ブロックと2つの論理条件(Logical condition)ANDブロックは、途中で変化する値ではなく、同一のスナップショットを読みます。
  • 動作するのは3つのポジション変更(Position modify)ブロックで、いずれも成行です。1つはClose positionが設定されて両方のフラグを受け取り、残りはOpen positionが設定されて各サイドに1つずつ置かれます。直前の高値を上抜き、かつ直前の安値を下抜くアウトサイドバーでは、両方のフラグが同じ処理の中で発火し、2件の成行注文が送信されることがあります。これらはポジション上では互いに相殺されますが、ログとチャートパネル(Chart panel)上には両方とも約定として表示されます。

使い方

.json ファイルを Designer に読み込み、バックテスターで過去データを使って実行し、実運用の前にパラメーターやブロック自体を自分の銘柄に合わせて調整してください。