← ブック一覧 / ダッシュボード — タップで資産曲線とソースを展開。取引ありをequity順、無取引・引退は下。
# 外来シード: 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
# 外来シード: 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
# 複合シード: 効率比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
# ☆リーダー安定押し目: 自板が投げ売りで急落・リーダーはほぼ無傷の瞬間だけ拾う
# 理論: フォロワー市場のローカルな投げ(需給イベント)はリーダー水準へ回帰する。
# 「押し目の質」をリーダーで判定する — lead-lag makerの核を最も直接に実装。
def signal(window, state):
_exec = 'maker'
b = window[-1]
u = b.get('u', 0.0)
if u <= 0 or window[-15]['c'] <= 0:
return 0
u15 = window[-15].get('u', 0.0)
if u15 <= 0:
return 0
s = 0.0; n = 0
for i in range(-120, 0):
w = window[i]; uu = w.get('u', 0.0)
if uu > 0:
s += w['c'] / uu; n += 1
if n < 60:
return 0
basis = b['c'] / (u * (s / n)) - 1
if basis >= -0.0002:
return -1 # リーダー水準へ回帰したら手仕舞い
local15 = b['c'] / window[-15]['c'] - 1
leader15 = u / u15 - 1
# 較正 2026-08-17: -0.4%/15分のローカル投げは実測で月数回しか起きず
# 6日間0取引。-0.25%へ緩和(リーダー静穏条件は-0.15%へ)
if local15 < -0.0025 and leader15 > -0.0015:
return 1
return 0
# ☆基準回帰×funding合議: 割安(basis)とショート混雑(fr<=0)の合議
# 理論: 価格発見収斂(bz_)に、funding負=ショート過密(踏み上げ余地)を重ねる。
# fr正(ロング過密)のときは要求乖離を2倍に(段階ゲート)。
def signal(window, state):
_exec = 'maker'
b = window[-1]
u = b.get('u', 0.0)
if u <= 0:
return 0
s = 0.0; n = 0
for i in range(-120, 0):
w = window[i]; uu = w.get('u', 0.0)
if uu > 0:
s += w['c'] / uu; n += 1
if n < 60:
return 0
basis = b['c'] / (u * (s / n)) - 1
if basis >= 0.0:
return -1
k = 0.0015 if b.get('fr', 0.0) <= 0 else 0.0030
u10 = window[-10].get('u', 0.0)
if u10 <= 0 or u / u10 - 1 < -0.003:
return 0
if basis < -k:
return 1
return 0
# ☆三者合議: 基準回帰 / lead-lag gap / EMA帯逆張り の2/3投票
# 理論: 独立性のある3つの正当なシグナル源の合議は単独より誤検出に強い。
def signal(window, state):
_exec = 'maker'
b = window[-1]
c = [w['c'] for w in window]
u = b.get('u', 0.0)
vin = 0; vout = 0
# 1) 基準回帰
if u > 0:
s = 0.0; n = 0
for i in range(-120, 0):
w = window[i]; uu = w.get('u', 0.0)
if uu > 0:
s += w['c'] / uu; n += 1
if n >= 60:
basis = b['c'] / (u * (s / n)) - 1
if basis < -0.0015:
vin += 1
if basis >= 0.0:
vout += 1
# 2) lead-lag gap(6分)
u6 = window[-6].get('u', 0.0)
if u > 0 and u6 > 0 and c[-6] > 0:
gap = (u / u6 - 1) - (c[-1] / c[-6] - 1)
if gap > 0.0008:
vin += 1
if gap < -0.0002:
vout += 1
# 3) EMA帯逆張り(長期下向きは棄権)
sma20 = sum(c[-20:]) / 20
sma60 = sum(c[-60:]) / 60
if sma20 >= sma60 * 0.9985:
if c[-1] < sma20 * 0.999:
vin += 1
if c[-1] > sma20 * 1.001:
vout += 1
if vout >= 2:
return -1
if vin >= 2:
return 1
return 0
# 外来シード: 基準回帰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
# 外来シード: 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
# 外来シード: 基準回帰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
# 外来シード: 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
# 狙い: 生成(気質DNA→部品合成。dna_gen.py)
# 生成(気質DNA): 気質から部品合成
# _tg: {"exec": "maker", "alpha": "leadlag", "agg": 0.59, "sl": 7.1, "tp": 7.0, "atr_n": 14, "g_down": true, "g_vol": false, "g_t1": true, "g_fr": false}
def signal(window, state):
_exec = 'maker'
b = window[-1]
c = [x["c"] for x in window]
if c[-1] / c[-31] - 1 < -0.00236:
return -1
if b["t1"] < -0.08:
return -1
u = [x["u"] for x in window]
if u[-1] <= 0 or u[-6] <= 0:
return 0
need = 0.001356
gap = (u[-1] / u[-6] - 1) - (c[-1] / c[-6] - 1)
if gap > need:
return 1
if gap < -need * 0.25:
return -1
return 0
# 狙い: 分岐を削除
def signal(window, state):
_exec = 'maker'
b = window[-1]
c = [x['c'] for x in window]
if c[-1] / c[-31] - 1 < -0.00236:
return -1
if b['t1'] < -0.08:
return -1
u = [x['u'] for x in window]
if u[-1] <= 0 or u[-6] <= 0:
return 0
need = 0.001356
gap = u[-1] / u[-6] - 1 - (c[-1] / c[-6] - 1)
if gap > need:
return 1
return 0
# 複合シード: 逆張り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
# 複合シード: 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
# 複合シード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
# 外来シード: 継続確認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
# 外来シード: 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
# 外来シード: 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
# 狙い: 条件を厳しく/緩く
def signal(window, state):
_exec = 'maker'
b = window[-1]
c = [x['c'] for x in window]
if b['t1'] < -0.08:
return -1
u = [x['u'] for x in window]
need = 0.001356
gap = u[-1] / u[-6] - 1 - (c[-1] / c[-6] - 1)
if gap > need and sum((_x['h'] for _x in window[-90:])) / 90 < window[-1]['o']:
return 1
return 0
# 外来シード: 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
# 外来シード: 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
# 外来シード: 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
# 外来シード: 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
# 狙い: 条件を厳しく/緩く
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 or window[-1]['o'] < sum((_x['c'] * _x['v'] for _x in window[-3:])) / max(sum((_x['v'] for _x in window[-3:])), 1e-09):
return 0
need = 0.001356
gap = u[-1] / u[-6] - 1 - (c[-1] / c[-6] - 1)
if gap > need:
return 1
return 0
# 狙い: 分岐を削除
def signal(window, state):
_exec = 'maker'
b = window[-1]
c = [x['c'] for x in window]
if b['t1'] < -0.08:
return -1
u = [x['u'] for x in window]
need = 0.001356
gap = u[-1] / u[-6] - 1 - (c[-1] / c[-6] - 1)
if gap > need:
return 1
return 0
# 外来シード: 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
# 外来シード: 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
# 文脈シード: 資金調達率マイナス=ショート過密。反発の初動で踏み上げに乗る
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
# 逆張り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
# 帯域×投げ売り合議シード: 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
更新: 2026-10-03 16:05 JST