eth1m 全個体 (30体 / 稼働30 / プラス7)

← ブック一覧 / ダッシュボード — タップで資産曲線とソースを展開。取引ありをequity順、無取引・引退は下。

種 passivbot深押し(帯-0.7%)シード115.477回/勝6/建玉66%/参加08/11
115.5795.18
# 外来シード: passivbot族の変種(実証済み勝ち筋の周辺探索 2026-08-25)
def signal(window, state):
    _exec = 'maker'
    closes = [b["c"] for b in window]
    def ema(vals, n):
        k = 2 / (n + 1)
        e = vals[0]
        for v in vals[1:]:
            e = v * k + e * (1 - k)
        return e
    e_fast = ema(closes[-120:], 30)
    e_slow = ema(closes[-120:], 90)
    if closes[-1] < min(e_fast, e_slow) * 0.993:
        return 1
    return 0
種 passivbot高頻度(帯-0.15%/TP6)シード110.7727回/勝27/建玉90%/参加08/11
112.7794.97
# 外来シード: passivbot族の変種(高回転)
def signal(window, state):
    _exec = 'maker'
    closes = [b["c"] for b in window]
    def ema(vals, n):
        k = 2 / (n + 1)
        e = vals[0]
        for v in vals[1:]:
            e = v * k + e * (1 - k)
        return e
    e_fast = ema(closes[-120:], 30)
    e_slow = ema(closes[-120:], 90)
    if closes[-1] < min(e_fast, e_slow) * 0.9985:
        return 1
    return 0
種 passivbot×リーダーガードシード107.978回/勝9/建玉83%/参加08/11
119.9194.28
# 外来シード: passivbot族の変種(リーダー急落ガード)
def signal(window, state):
    _exec = 'maker'
    closes = [b["c"] for b in window]
    def ema(vals, n):
        k = 2 / (n + 1)
        e = vals[0]
        for v in vals[1:]:
            e = v * k + e * (1 - k)
        return e
    e_fast = ema(closes[-120:], 30)
    e_slow = ema(closes[-120:], 90)
    if closes[-1] >= min(e_fast, e_slow) * 0.997:
        return 0
    u = window[-1].get('u', 0.0)
    u15 = window[-15].get('u', 0.0)
    if u > 0 and u15 > 0 and u / u15 - 1 < -0.005:
        return 0
    return 1
種 逆張りOFI(投げ拾い)シード107.0063回/勝25/建玉55%/参加08/11
117.6396.17
# 逆張りOFIシード: taker売りの投げ(ofi<閾値)+SMA下方乖離で指値買い
# ラボ実測(2026-08-14): eth TUNE+2.96%(32取引・勝率65%・DD4.3%) VALID+1.94%
# (VALID期間の市場は-1.34% → βでなくタイミング)。順張りOFIは全滅(-46〜-60%)
def signal(window, state):
    _exec = 'maker'
    b = window[-1]
    c = [x["c"] for x in window]
    tb = sum(x.get("tb", 0.0) for x in window[-10:])
    ts = sum(x.get("ts", 0.0) for x in window[-10:])
    tot = tb + ts
    if tot <= 0:
        return 0
    ofi = (tb - ts) / tot
    if b["t1"] < -0.05:
        return -1
    sma = sum(c[-30:]) / 30
    th = -0.5
    if b["t1"] < 0:
        th = th - 0.1
    if ofi < th and c[-1] < sma * 0.997:
        return 1
    if c[-1] > sma * 1.004:
        return -1
    return 0
種 passivbotトレーリングシード106.91103回/勝26/建玉68%/参加08/11
112.4988.05
# 外来シード: passivbot族の変種(トレーリング)
# 手仕舞いは価格状態ベースのラチェット(index_probe安全): 高値追跡→-1%で-1
def signal(window, state):
    _exec = 'maker'
    closes = [b["c"] for b in window]
    c = closes[-1]
    hi = state.get('pb_hi', c)
    hi = max(hi, c)
    state['pb_hi'] = hi
    if c < hi * 0.99:
        state['pb_hi'] = c            # リセットして再追跡
        return -1
    def ema(vals, n):
        k = 2 / (n + 1)
        e = vals[0]
        for v in vals[1:]:
            e = v * k + e * (1 - k)
        return e
    e_fast = ema(closes[-120:], 30)
    e_slow = ema(closes[-120:], 90)
    if c < min(e_fast, e_slow) * 0.997:
        return 1
    return 0
局面推薦 種 passivbot流サイクル進化106.838回/勝7/建玉90%/参加09/14
120.1393.62
# 外来シード: passivbot流 —— EMA帯の下に指値買い、マークアップで指値売り
# 原型(v8/Rust)はグリッドDCAで平均取得を下げるが、当エンジンは単一建玉のため
# 「初回エントリー+マークアップ利確」の周期のみを移植。損切りは置かず(sl=999ATR)
# 含み損は保有で耐える(原型と同じ思想。実現損失ゼロの代わりに含みDDを負う)
def signal(window, state):
    _exec = 'maker'
    closes = [b["c"] for b in window]
    def ema(vals, n):
        k = 2 / (n + 1)
        e = vals[0]
        for v in vals[1:]:
            e = v * k + e * (1 - k)
        return e
    e_fast = ema(closes[-120:], 30)
    e_slow = ema(closes[-120:], 90)
    band_lo = min(e_fast, e_slow) * 0.997
    if closes[-1] < band_lo:
        return 1
    return 0
局面推薦 種 passivbot×トレンド適格進化106.838回/勝7/建玉90%/参加09/14
118.7593.62
# 外来シード: passivbot族の変種(トレンド適格)
def signal(window, state):
    _exec = 'maker'
    closes = [b["c"] for b in window]
    def ema(vals, n):
        k = 2 / (n + 1)
        e = vals[0]
        for v in vals[1:]:
            e = v * k + e * (1 - k)
        return e
    sma60 = sum(closes[-60:]) / 60
    sma240 = sum(closes[-120:]) / 120   # WINDOW=150制約内の近似長期
    if sma60 < sma240 * 0.997:
        return 0
    e_fast = ema(closes[-120:], 30)
    e_slow = ema(closes[-120:], 90)
    if closes[-1] < min(e_fast, e_slow) * 0.997:
        return 1
    return 0
種 lead-lag追随(taker)シード99.532回/勝0/建玉0%/参加08/11
101.4897.62
# 外来シード: lead-lag taker —— 乖離がコストを大きく超えるときだけ成行
def signal(window, state):
    c = [b["c"] for b in window]
    u = [b["u"] for b in window]
    if u[-1] <= 0 or u[-6] <= 0:
        return 0
    lead = u[-1] / u[-6] - 1
    lag = c[-1] / c[-6] - 1
    gap = lead - lag
    if gap > 0.005:
        return 1
    if gap < 0.0:
        return -1
    return 0
種 帯域×投げ売り合議シード98.3136回/勝19/建玉60%/参加08/11
110.6688.62
# 帯域×投げ売り合議シード: EMA帯の下×taker売り集中の時だけ拾う
def signal(window, state):
    _exec = 'maker'
    b = window[-1]
    closes = [x["c"] for x in window]
    def ema(vals, n):
        k = 2 / (n + 1)
        e = vals[0]
        for v in vals[1:]:
            e = v * k + e * (1 - k)
        return e
    e_fast = ema(closes[-120:], 30)
    e_slow = ema(closes[-120:], 90)
    tb = sum(x.get("tb", 0.0) for x in window[-10:])
    ts = sum(x.get("ts", 0.0) for x in window[-10:])
    ofi = (tb - ts) / max(tb + ts, 1e-9)
    if b["t1"] < -0.05:
        return -1
    dip = 0.997
    if b["t1"] < 0:
        dip = dip - 0.002
    if closes[-1] < min(e_fast, e_slow) * dip and ofi < -0.3:
        return 1
    if closes[-1] > max(e_fast, e_slow) * 1.004:
        return -1
    return 0
種 基準回帰maker k30深押し(低頻度)シード97.8918回/勝1/建玉1%/参加08/11
100.0496.68
# 外来シード: 基準回帰maker 深押し版(系統マーカー bz_)
# k15版と同構造で、乖離要求を-0.30%に上げた低頻度・高単価型。
# 適応度のedge項(1取引純益の統計的下限/往復コスト)は取引を重ねるほど
# 下限が締まるため、「深い乖離だけを待つ」ことで1取引の期待値を太らせる。
def signal(window, state):
    _exec = 'maker'
    b = window[-1]
    u = b.get('u', 0.0)
    if u <= 0:
        return 0
    bz_s = 0.0
    bz_n = 0
    for i in range(-120, 0):
        w = window[i]
        uu = w.get('u', 0.0)
        if uu > 0:
            bz_s += w['c'] / uu
            bz_n += 1
    if bz_n < 60:
        return 0
    bz_basis = b['c'] / (u * (bz_s / bz_n)) - 1
    if bz_basis >= 0.0:
        return -1
    bz_k = 0.0030
    if window[-120]['c'] > 0 and b['c'] / window[-120]['c'] - 1 < -0.003:
        bz_k = 0.0045
    u10 = window[-10].get('u', 0.0)
    if u10 <= 0 or u / u10 - 1 < -0.003:
        return 0
    if bz_basis < -bz_k:
        return 1
    return 0
R3537 c7 分岐を削除進化96.3741回/勝8/建玉1%/参加08/11
97.1494.63
# 狙い: 分岐を削除
def signal(window, state):
    _exec = 'maker'
    closes = [b['c'] for b in window]

    def ema(vals, n):
        k = 2 / (n + 1)
        e = vals[0]
        for v in vals[1:]:
            e = v * k + e * (1 - k)
        return e
    e_fast = ema(closes[-120:], 30)
    e_slow = ema(closes[-120:], 90)
    state['peak'] = max(state.get('peak', 0.0), window[-1]['c'])
    if closes[-1] < min(e_fast, e_slow) * 0.993:
        return 1
    return 0
R3285 c9 外来シード素通し(passivbot深押し(帯-0進化96.3741回/勝8/建玉1%/参加08/11
97.1494.63
# 狙い: 外来シード素通し(passivbot深押し(帯-0.7%))
# 外来シード: passivbot族の変種(実証済み勝ち筋の周辺探索 2026-08-25)
def signal(window, state):
    _exec = 'maker'
    closes = [b["c"] for b in window]
    def ema(vals, n):
        k = 2 / (n + 1)
        e = vals[0]
        for v in vals[1:]:
            e = v * k + e * (1 - k)
        return e
    e_fast = ema(closes[-120:], 30)
    e_slow = ema(closes[-120:], 90)
    if closes[-1] < min(e_fast, e_slow) * 0.993:
        return 1
    return 0

R3541 c1 分岐を削除進化95.1049回/勝14/建玉0%/参加08/11
98.8695.10
# 狙い: 分岐を削除
def signal(window, state):
    _exec = 'maker'
    b = window[-1]
    c = [x['c'] for x in window]
    u = [x['u'] for x in window]
    if u[-1] <= 0 or u[-6] <= 0:
        return 0
    need = 0.001404
    gap = u[-1] / u[-6] - 1 - (c[-1] / c[-6] - 1)
    if gap > need and window[-1]['h'] >= max((_x['h'] for _x in window[-8:])):
        return 1
    if gap < -need * 0.25:
        return -1
    return 0
種 基準回帰maker k15(理論: 価格発見収斂)シード92.52109回/勝24/建玉4%/参加08/11
105.4191.37
# 外来シード: 基準回帰maker(系統マーカー bz_)
# 理論: 価格発見はリーダー(Bybit perps)で起き、フォロワー現物は水準へ収斂する
# (cross-venue lead-lag/pairs回帰。2025-26の実証研究でも一貫)。
# bitbankがリーダー換算の適正値より安い時に指値買い=約定選択と意図が整合し、
# maker逆選択(モメンタム追い)の構造欠陥を回避する。
# 実測(2026-08-16, live40日): 前半4市場すべて正(+20〜+47bps/取引 t=1.2〜1.9)、
# 後半(下落レジーム)は負。段階ゲートを備えるが、レジーム適応は進化の仕事。
# 手仕舞いは収斂(価格状態)ベースでカウンタ不使用 → index_probe安全。
def signal(window, state):
    _exec = 'maker'
    b = window[-1]
    u = b.get('u', 0.0)
    if u <= 0:
        return 0
    # 適正比率: 過去120本の c/u 平均
    bz_s = 0.0
    bz_n = 0
    for i in range(-120, 0):
        w = window[i]
        uu = w.get('u', 0.0)
        if uu > 0:
            bz_s += w['c'] / uu
            bz_n += 1
    if bz_n < 60:
        return 0
    bz_fair = bz_s / bz_n
    bz_basis = b['c'] / (u * bz_fair) - 1
    # 収斂したら手仕舞い(指値売り)
    if bz_basis >= 0.0:
        return -1
    # 段階ゲート: 自板の中期(120分)下落中は要求を2倍
    bz_k = 0.0015
    if window[-120]['c'] > 0 and b['c'] / window[-120]['c'] - 1 < -0.003:
        bz_k = 0.0030
    # リーダー急落ガード: Bybitの10分リターンが-0.3%未満なら拾わない
    u10 = window[-10].get('u', 0.0)
    if u10 <= 0 or u / u10 - 1 < -0.003:
        return 0
    if bz_basis < -bz_k:
        return 1
    return 0
種 継続確認maker(実測2026-08-14)シード86.73195回/勝57/建玉8%/参加08/11
102.6886.26
# 外来シード: 継続確認maker(系統マーカー qk_)
# 根拠(2026-08-14実測・live 40日・5市場):
#   bitbank 1分リターンの符号相関は全時間帯で +0.22〜+0.40(通常分)。
#   フォロワー市場がリーダー(Bybit)の動きを遅れて織り込む構造で、
#   Kim&Hansen(2026)のQH境界リバーサルはbitbankでは成立しない(逆に継続)。
#   3分連続陽線+30分上昇整合のロングは5市場8セル中7セルで正、XRPが最良。
# 設計: 保有は約15分(スプレッド0.1bp級・maker往復リベートで回収)、
#   長期下落圏では要求リターンを段階的に引き上げる(二値ゲート禁止の原則)
def signal(window, state):
    _exec = 'maker'
    qk_hold = state.get('qk_hold', 0)
    if qk_hold > 0:
        state['qk_hold'] = qk_hold - 1
        if qk_hold == 1:
            return -1              # 保有満了 -> 指値売りを置く
        return 0
    if not all(window[i]['c'] > window[i]['o'] for i in (-1, -2, -3)):
        return 0
    qk_need = 0.0
    if window[-1].get('t1', 0.0) < -0.04:
        qk_need = 0.0010
    base = window[-30]['c']
    if base <= 0:
        return 0
    if window[-1]['c'] / base - 1 <= qk_need:
        return 0
    state['qk_hold'] = 15          # 約15分保有
    return 1
種 旗艦v2(全文脈統合)シード75.09521回/勝145/建玉7%/参加08/11
108.2174.79
# 複合シードv2: 旗艦に長期トレンド(t1)と資金調達率(fr)の文脈を追加
def signal(window, state):
    _exec = 'maker'
    b = window[-1]
    c = [x["c"] for x in window]
    u = [x["u"] for x in window]
    if u[-1] <= 0 or u[-6] <= 0:
        return 0
    # 深い長期下落圏(50日SMA比-8%以下)だけ買いの土俵から降りる。
    # 浅い下落圏では全面禁止ではなく「より強い乖離を要求」する段階ゲート
    # (二値ブロックだと局面次第で取引ゼロになり進化の素材にならない)
    if b["t1"] < -0.08:
        return -1
    if c[-1] / c[-31] - 1 < -0.004:
        return -1
    rng = sum(abs(c[i] - c[i - 1]) for i in range(-30, 0)) / 30 / c[-1]
    if rng < 0.0002:
        return 0
    need = 0.0008
    if b["t1"] < 0:
        need = 0.0012          # 長期下落圏では要求乖離を1.5倍に
    if b["fr"] > 0.0003:
        need = need * 1.5      # ロング過密でも同様に慎重化
    gap = (u[-1] / u[-6] - 1) - (c[-1] / c[-6] - 1)
    if gap > need:
        return 1
    if gap < -0.0002:
        return -1
    return 0
種 lead-lag+ガード(旗艦)シード74.95523回/勝145/建玉7%/参加08/11
108.2174.65
# 複合シード: lead-lag追随に、実測で判明した弱点への防御を内蔵
def signal(window, state):
    _exec = 'maker'
    c = [b["c"] for b in window]
    u = [b["u"] for b in window]
    if u[-1] <= 0 or u[-6] <= 0:
        return 0
    # 下落トレンドガード: 直近30分で-0.4%超の下げ = 逆選択地帯。買わず逃げる
    if c[-1] / c[-31] - 1 < -0.004:
        return -1
    # ボラフィルタ: 動きが死んでいるときはエッジがコストを跨げない
    rng = sum(abs(c[i] - c[i - 1]) for i in range(-30, 0)) / 30 / c[-1]
    if rng < 0.0002:
        return 0
    lead = u[-1] / u[-6] - 1
    lag = c[-1] / c[-6] - 1
    gap = lead - lag
    if gap > 0.0008:
        return 1
    if gap < -0.0002:
        return -1
    return 0
種 lead-lag追随(maker)シード65.46771回/勝221/建玉10%/参加08/11
105.0165.36
# 外来シード: lead-lag —— リーダー(u=Bybit同銘柄)が自板より先行して
# 上げたとき、追随の押し目を指値で拾う。u=0はデータ無しなので何もしない
def signal(window, state):
    _exec = 'maker'
    c = [b["c"] for b in window]
    u = [b["u"] for b in window]
    if u[-1] <= 0 or u[-6] <= 0:
        return 0
    lead = u[-1] / u[-6] - 1
    lag = c[-1] / c[-6] - 1
    gap = lead - lag
    if gap > 0.0008:
        return 1
    if gap < -0.0002:
        return -1
    return 0
種 maker BB下限拾いシード55.87589回/勝195/建玉15%/参加08/11
99.4055.83
# 外来シード: maker BB —— BB(40,2σ)下限割れで指値買い、中心線で指値売り
def signal(window, state):
    _exec = 'maker'
    closes = [b["c"] for b in window]
    n = 40
    mu = sum(closes[-n:]) / n
    var = sum((x - mu) ** 2 for x in closes[-n:]) / n
    sd = var ** 0.5
    c = closes[-1]
    if c < mu - 2 * sd:
        return 1
    if c > mu:
        return -1
    return 0
種 maker中心回帰+下落ガードシード55.70750回/勝261/建玉18%/参加08/11
98.5255.70
# 複合シード: 逆張りmakerに長期トレンドガード(下向きなら逆張り禁止)
def signal(window, state):
    _exec = 'maker'
    c = [b["c"] for b in window]
    sma20 = sum(c[-20:]) / 20
    sma60 = sum(c[-60:]) / 60
    # 下落トレンドガード: 長期が下向きの逆張りは「落ちる板に指値」になる
    if sma20 < sma60 * 0.9985:
        return -1
    if c[-1] < sma20 * 0.999:
        return 1
    if c[-1] > sma20 * 1.001:
        return -1
    return 0
種 maker中心回帰シード48.10905回/勝351/建玉27%/参加08/11
99.6847.78
# 外来シード: maker中心回帰 —— SMA20より下で指値買い、上抜けで指値売り
# taker往復0.34%では1分足の値幅を跨げない(公開モデル原型比較R1: 全モデル0取引)。
# makerはリベート(-0.02%)でコスト地形が反転する。損切りだけ成行(広め)
def signal(window, state):
    _exec = 'maker'
    closes = [b["c"] for b in window]
    sma = sum(closes[-20:]) / 20
    c = closes[-1]
    if c < sma * 0.999:
        return 1
    if c > sma * 1.001:
        return -1
    return 0
種 レジーム切替(ER判定)シード39.331461回/勝435/建玉39%/参加08/11
96.3539.25
# 複合シード: 効率比ER>0.35=トレンド(順張り+lead-lag確認)、以下=レンジ(逆張り)
def signal(window, state):
    _exec = 'maker'
    c = [b["c"] for b in window]
    u = [b["u"] for b in window]
    sma20 = sum(c[-20:]) / 20
    sma60 = sum(c[-60:]) / 60
    move = abs(c[-1] - c[-31])
    path = sum(abs(c[i] - c[i - 1]) for i in range(-30, 0)) + 1e-9
    er = move / path
    if er > 0.35:
        if u[-1] > 0 and u[-6] > 0 and sma20 > sma60 and u[-1] / u[-6] > 1:
            return 1
        if sma20 < sma60:
            return -1
    else:
        lo20 = min(b["l"] for b in window[-20:-1])
        if c[-1] < lo20 * 1.0005 and sma20 >= sma60 * 0.999:
            return 1
        if c[-1] > sma20 * 1.001:
            return -1
    return 0
種 maker RSI往復シード31.081433回/勝446/建玉40%/参加08/11
99.1731.02
# 外来シード: maker RSI —— RSI(14)<40で指値買い、>60で指値売り
def signal(window, state):
    _exec = 'maker'
    closes = [b["c"] for b in window]
    gains = losses = 1e-9
    for i in range(-14, 0):
        d = closes[i] - closes[i - 1]
        if d > 0: gains += d
        else: losses -= d
    rsi = 100 - 100 / (1 + gains / losses)
    if rsi < 40:
        return 1
    if rsi > 60:
        return -1
    return 0
種 Strategy001 EMA20/50クロスシード21.09478回/勝6/建玉10%/参加08/11
100.0021.09
# 外来シード: Strategy001 (freqtrade-strategies, GPL-3.0の論理を再表現)
def signal(window, state):
    closes = [b["c"] for b in window]
    def ema(vals, n):
        k = 2 / (n + 1)
        e = vals[0]
        for v in vals[1:]:
            e = v * k + e * (1 - k)
        return e
    e20, e50 = ema(closes[-120:], 20), ema(closes[-120:], 50)
    p20, p50 = ema(closes[-121:-1], 20), ema(closes[-121:-1], 50)
    if p20 <= p50 and e20 > e50 and closes[-1] > e20:
        return 1
    if p20 >= p50 and e20 < e50:
        return -1
    return 0
種 hlhb EMA5/10クロス+RSI50シード19.85506回/勝4/建玉9%/参加08/11
100.0019.85
# 外来シード: hlhb (freqtrade-strategies, GPL-3.0の論理を再表現)
def signal(window, state):
    closes = [b["c"] for b in window]
    tp = [(b["h"] + b["l"] + b["c"]) / 3 for b in window]
    def ema(vals, n):
        k = 2 / (n + 1)
        e = vals[0]
        for v in vals[1:]:
            e = v * k + e * (1 - k)
        return e
    e5, e10 = ema(tp[-40:], 5), ema(tp[-40:], 10)
    p5, p10 = ema(tp[-41:-1], 5), ema(tp[-41:-1], 10)
    # RSI(14)
    gains = losses = 1e-9
    for i in range(-14, 0):
        d = closes[i] - closes[i - 1]
        if d > 0: gains += d
        else: losses -= d
    rsi = 100 - 100 / (1 + gains / losses)
    # トレンド強度フィルタ(ADX>25の代替: 直近レンジに対する方向成分)
    rng = sum(b["h"] - b["l"] for b in window[-14:]) + 1e-9
    trend = abs(closes[-1] - closes[-15]) / rng
    if p5 <= p10 and e5 > e10 and rsi > 50 and trend > 0.25:
        return 1
    if p5 >= p10 and e5 < e10:
        return -1
    return 0
種 Donchian 20/10 (タートル)シード5.461001回/勝54/建玉32%/参加08/11
100.005.46
# 外来シード: Donchian breakout (20本高値ブレイクで買い/10本安値で手仕舞い)
def signal(window, state):
    hh20 = max(b["h"] for b in window[-21:-1])
    ll10 = min(b["l"] for b in window[-11:-1])
    c = window[-1]["c"]
    if c > hh20:
        return 1
    if c < ll10:
        return -1
    return 0
種 Bollinger逆張り+RSIガードシード1.001355回/勝11/建玉14%/参加08/11
98.981.00
# 外来シード: Bandtastic (BB下限タッチ+RSI過売りで買い、中心線で手仕舞い)
def signal(window, state):
    closes = [b["c"] for b in window]
    n = 20
    mu = sum(closes[-n:]) / n
    var = sum((x - mu) ** 2 for x in closes[-n:]) / n
    sd = var ** 0.5
    gains = losses = 1e-9
    for i in range(-14, 0):
        d = closes[i] - closes[i - 1]
        if d > 0: gains += d
        else: losses -= d
    rsi = 100 - 100 / (1 + gains / losses)
    c = closes[-1]
    if c < mu - 2 * sd and rsi < 30:
        return 1
    if c > mu:
        return -1
    return 0
種 Supertrend(10,3)シード0.411739回/勝49/建玉36%/参加08/11
99.670.41
# 外来シード: Supertrend (ATRバンドのトレンド反転。stateで向きを保持)
def signal(window, state):
    n, mult = 10, 3.0
    trs = []
    for i in range(-n, 0):
        b, pb = window[i], window[i - 1]
        trs.append(max(b["h"] - b["l"], abs(b["h"] - pb["c"]),
                       abs(b["l"] - pb["c"])))
    atr = sum(trs) / n
    mid = (window[-1]["h"] + window[-1]["l"]) / 2
    up, dn = mid + mult * atr, mid - mult * atr
    c = window[-1]["c"]
    st = state.get("st_dir", 0)
    ub = min(state.get("st_ub", up), up) if st <= 0 else up
    lb = max(state.get("st_lb", dn), dn) if st >= 0 else dn
    if c > ub:
        new = 1
    elif c < lb:
        new = -1
    else:
        new = st
    state["st_ub"], state["st_lb"], state["st_dir"] = ub, lb, new
    if new == 1 and st != 1:
        return 1
    if new == -1 and st != -1:
        return -1
    return 0
種 RSI-2プルバックシード0.003167回/勝6/建玉18%/参加08/11
100.000.00
# 外来シード: Connors RSI-2 (長期上昇中の深押しを拾い、短期回復で手仕舞い)
def signal(window, state):
    closes = [b["c"] for b in window]
    sma_long = sum(closes[-120:]) / 120
    gains = losses = 1e-9
    for i in range(-2, 0):
        d = closes[i] - closes[i - 1]
        if d > 0: gains += d
        else: losses -= d
    rsi2 = 100 - 100 / (1 + gains / losses)
    sma5 = sum(closes[-5:]) / 5
    c = closes[-1]
    if c > sma_long and rsi2 < 10:
        return 1
    if c > sma5:
        return -1
    return 0
種 fundingスクイーズシード100.000回/勝0/建玉0%/参加08/11
100.00100.00
# 文脈シード: 資金調達率マイナス=ショート過密。反発の初動で踏み上げに乗る
def signal(window, state):
    _exec = 'maker'
    b = window[-1]
    c = [x["c"] for x in window]
    if b["fr"] >= 0:
        # 偏りが解消したら降りる
        if c[-1] > sum(c[-10:]) / 10:
            return -1
        return 0
    sma10 = sum(c[-10:]) / 10
    sma30 = sum(c[-30:]) / 30
    if b["fr"] < -0.0001 and sma10 > sma30 and c[-1] > sma10:
        return 1
    if c[-1] < sma30 * 0.997:
        return -1
    return 0

更新: 2026-10-03 16:05 JST