up:: FX

EA
300本分ZigZagを見て、目線を把握

一本の両端を高値、安値とする
方向によって上下決める
ある一本を次と比較
Drawing 2025-02-07 15.49.58.excalidraw
次の次が決まるまで、基本的に高安は動かない
例外として、更新が起きた場合は高安の方向に応じた側を移動させる
現在相場が動いている方向と逆の値は据え置きになるはず

据え置き状態は特に特別視しなくていい
次の次を見る、やることは何も変わらないはず

380本分内で一番の高安範囲内で、ある一定以下の値幅(便宜上これをレンジ判断幅と呼ぶ)で跳ね返ることを上下二回ずつ繰り返したらレンジ
(一つ下のZigZagでわかるかも)

更新が起きても起きなくても、レンジ判断幅内で跳ね返った=一つ下のZigZagがレンジ判断幅で返ってる場合はレンジフラグを立てる
このフラグが2つ重なったらレンジ、上下をいろんな判断基準として使う

レンジを抜ける、ある一定以上離れたうえで足が確定したらレンジ抜け

一定は一旦レンジ判定幅の二倍とする
この時確定した足で、全体の動きと反対側の実体値+レンジ判定幅を損切とする

レンジ抜けからレンジ上とある一定以下の値幅まで近づいたら戻り、そこで取引

一定以下は一旦レンジ判定幅と同値とする

レンジ抜け足の始まりから、レンジ判定と同じ範囲を使用し少し離して損切
損切はレンジが始まったら、その一つ前のレンジに都度移動

利確は基本1H300本分ZigZagに基づいた、入った場所より向こう側にある高安
1Hで見えなければ4Hを使用

一定以下の値幅(ひげなし)
10500,15
4850,10
とりあえず10~15で良さそう

必要なデータ
300本分ZigZag
高安
方向
380本分高安範囲(今は使わない)
レンジ判断幅
レンジカウンター
各所レンジ位置(今は使わない)
レンジ内フラグ
レンジ抜け確定足値

必要なロジック

  • 高安とZigZagを受け、ZigZag値を比較し、新しい高安を返す
  • ZigZag比較時、レンジ判断幅内だったらレンジカウンターを上昇
  • レンジカウンターが2以上なら、レンジ内フラグを立て、レンジ位置上下値をセット
  • レンジ判定幅外に実数値が出た場合、レンジカウンターをリセット、かつレンジ抜け確定足値をセット
  • リセット後、レンジ位置上下値にレンジ判断幅まで近づいたら入る
  • 入った際、損切はレンジ抜け確定足値、利確は最も近いZigZag高安とする
    • 存在しなければ4hを見る
  • 損切利確は新たにレンジが成立するたびに書き換える
    • エントリー時の損切はレンジ抜け確定足、利確はzigzag高安
    • 次の書き換えでは損切はレンジ安値、利確はzigzag高安
stateDiagram-v2
    [*] --> 基本
    基本 --> ZigZag確定
    state inRangeJudge <<choice>>
    ZigZag確定 --> inRangeJudge
    inRangeJudge --> レンジカウンター上昇 : レンジ判断幅内
    state hasInRangeFlag <<choice>>
    inRangeJudge --> hasInRangeFlag : レンジ判断幅外
    hasInRangeFlag --> レンジカウンター初期化、レンジ内フラグ初期化、レンジ抜け確定足値セット : レンジ内フラグあり
    noRangeFlag : なにもない
    hasInRangeFlag --> noRangeFlag : レンジ内フラグなし
    noCounter : なにもない
    inRangeJudge --> noCounter : レンジ判断幅二つで囲まれた幅外
    state checkRangeCounter <<choice>>
    レンジカウンター上昇 --> checkRangeCounter
    checkRangeCounter --> レンジ内フラグセット、レンジ位置上下値セット : レンジカウンター2以上
    checkRangeCounter --> ZigZag確定 : それ以外
    state checkOneCandle <<choice>>
    レンジカウンター初期化、レンジ内フラグ初期化、レンジ抜け確定足値セット --> checkOneCandle
    checkOneCandle --> エントリー、損切をレンジ抜け確定足値にセット、利確を最も近いZigZag高安にセット : レンジ位置上下値とキャンドル値が一致
    noEntry : なにもない
    checkOneCandle --> noEntry : レンジ位置上下値とキャンドル値が不一致

これはフローのような。
それぞれの状態において、どの関数を適用するかが変わってくる。複合的に関数を使う状態もある。

なんやかんや、状態を制御してるのはレンジカウンター、レンジ内フラグ、エントリーフラグ位な気がする。
ならこれらを使ってもう一回状態図を書いたほうがよさそう。

レンジカウンター(0,1,2)、レンジ内フラグ、エントリーフラグがあり、それぞれがONOFFをもつ組合せ。
ただしレンジカウンター同士の組み合わせは排除され、0がある以上どれも選ばれない奴は存在しないから、全体から一個だけ選んでる奴だけ使う。つまり3x2^2=12通り。

ZigZag確定レンジ内レンジ抜けレンジ戻り利確損切移動
10000cc
10001ccc
10010cc
10011ccc
01000cc
01001ccc
01010cc
01011ccc
00100ccc
00101cccc
00110cc
00111ccc

zigzagは常に。
レンジ内はカウンターが2つかつレンジ外のもの。
レンジ抜けはレンジ内のもの。
レンジ戻りはレンジ内にいないもの。
レンジ抜け直後でなくていいのかというとこだが、前のレンジへ戻ってきたときに取引をするため……いやその時はレンジが出るまで一回待つから、なんか飛ばしてる。
利確損切移動はエントリーがある時。

レンジ戻りだけなんかある。レンジ抜けの後戻らずにもう一回レンジして、戻ってきたときに取引するか?しないよな。だからレンジ抜け時のフラグを用意し、レンジ戻り処理はレンジ抜けフラグがある時だけ。もう一回レンジが起きたらその時にレンジ抜けフラグを消去する必要ありそう。

レンジ抜けフラグを消去する処理は、当然レンジ抜けフラグを持つときしか使わなくていい。

レンジカウンター(0,1,2)、レンジ内フラグ、レンジ抜けフラグ、エントリーフラグ

ZigZag確定レンジ内レンジ抜けレンジ抜けフラグ消去レンジ戻り利確損切移動
100000c
100001cc
100010ccc
100011cccc
100100cc
100101ccc
100110ccc
100111cccc
010000c
010001cc
010010ccc
010011cccc
010100cc
010101ccc
010110ccc
010111cccc
001000cc
001001ccc
001010ccc
001011cccc
001100ccc
001101cccc
001110ccc
001111cccc

処理を挟むタイミング、
タイミング判定に使うフラグ、
行うべき処理
フラグにより生まれるステート
これらが纏めてフローになる
データをフローから見る方式

実際の奴、mainはコールバックの管理になりそう

  • 高安とZigZagを受け、ZigZag値を比較し、新しい高安を返す
  • 現在値とレンジ判断幅とレンジカウンターを受け、レンジ判断幅内だったらレンジカウンターを上昇
  • レンジ位置上下値リストとレンジ内フラグを受け、レンジ内フラグを立ててレンジ位置上下値をセット
  • レンジカウンターとレンジとレンジ抜け確定足値を受け、レンジカウンターをリセット、レンジ抜け確定足値をセット
  • 現在値とレンジ判断幅を受けて、エントリーするかどうかを返す
    • エントリーという外部副作用が出るが、これはしゃあなし
    • エントリーテーブル受けてエントリー追加みたいなのが正攻法だろうが、そんなのあるっけ
  • レンジ上下値と損切り利確を受け、損切り利確を書き換え
    • どの損切り利確……?
    • どのエントリーだろうと切るのに丁度いい場所は同じ、全部でいいや
      ddd
  • zigzag
  • 方向,高安
  • 現在値
  • レンジ判断幅(固定)
  • レンジカウンター
  • レンジ内フラグ
  • レンジ(複数)
    • レンジ位置上下値
  • レンジ抜け確定足値
  • エントリー(複数)
    • 損切利確

分かんなくなってきたのでプロトタイプを作る。
テストにはcsvの値を使用する。

  • new_highlow_price
    • zigzagの値が変化するたびに呼ばれる
    • 正常終了
      • zigzagは以前の高安のどちらかを超えている
        • 返り値は以前と違う高安
      • zigzagは以前の高安のどちらも超えていない
        • 返り値は以前と同じ高安
  • judge_add_range_counter
    • zigzagがレンジ内だった時にフックで発動する
    • 正常終了
      • レンジ判断幅ないなら、レンジカウンターが上昇する
      • そうでないならカウンターはそのまま