OPEN-SOURCE SCRIPT

takeshi Rule Disqualification

56
//version=5
indicator("猛の掟・初動スクリーナー(作り直し版:8項目+即除外+押し目待ち最適化)", overlay=true, max_labels_count=50)

//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// Inputs
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
showPanel = input.bool(true, "コメント表示")
panelPos = input.string("右上", "コメント位置", options=["右上","左上","右下","左下"])
lastBarOnly = input.bool(true, "最後の足だけ更新(推奨)")

// EMA
lenEma1 = input.int(5, "EMA 5", minval=1)
lenEma2 = input.int(13, "EMA 13", minval=1)
lenEma3 = input.int(26, "EMA 26", minval=1)

// MACD
macdFast = input.int(12, "MACD fast", minval=1)
macdSlow = input.int(26, "MACD slow", minval=1)
macdSig = input.int(9, "MACD signal", minval=1)

// Volume
volMaLen = input.int(5, "出来高平均(N日)", minval=1)
volMinMul = input.float(1.3, "出来高倍率Min", step=0.1)
volMaxMul = input.float(2.0, "出来高倍率Max", step=0.1)
volFinalMul = input.float(1.5, "最終三点:出来高倍率(>=)", step=0.1)

// Candle
wickBodyMult = input.float(1.8, "下ヒゲ判定:下ヒゲ/実体 >=", step=0.1)
upperToLower = input.float(0.6, "ピンバー:上ヒゲ<=下ヒゲ×", step=0.1)
atrLen = input.int(14, "ATR長", minval=1)
bigBodyATR = input.float(1.2, "大陽線判定:実体 >= ATR×", step=0.1)

// Breakout / Pullback
resLookback = input.int(20, "レジスタンス:過去N日高値", minval=5)
pullMinPct = input.float(5.0, "押し目Min(%)", step=0.5)
pullMaxPct = input.float(15.0, "押し目Max(%)", step=0.5)
retestAllowPct = input.float(1.0, "ブレイク価格の許容下抜け(%)", step=0.1)
stateExpireBars = input.int(30, "ブレイク状態の期限(本数)", minval=5)

// “二度と戻らない銘柄” 即解除(押し目待ち中のゴミ滞留防止)
cutOnBreakFail = input.bool(true, "押し目待ち中:レジ割れで即解除")
cutOnBelow26 = input.bool(true, "押し目待ち中:26EMA割れで即解除")
cutOnEma5Down = input.bool(true, "押し目待ち中:5EMA下向きで即解除")

//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// Series
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ema5 = ta.ema(close, lenEma1)
ema13 = ta.ema(close, lenEma2)
ema26 = ta.ema(close, lenEma3)

[macdLine, macdSignal, macdHist] = ta.macd(close, macdFast, macdSlow, macdSig)

volAvg = ta.sma(volume, volMaLen)
volMul = volAvg == 0 ? na : (volume / volAvg)

atr = ta.atr(atrLen)

// Candle parts
body = math.abs(close - open)
upperWick = high - math.max(open, close)
lowerWick = math.min(open, close) - low

//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 1-3: トレンド(掟A)
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ema5Up = ema5 > ema5[1]
ema13Up = ema13 > ema13[1]
ema26Up = ema26 > ema26[1]

chk1_allEmaUp = ema5Up and ema13Up and ema26Up
chk2_golden = (ema5 > ema13) and (ema13 > ema26)
chk3_above26_2days = (close > ema26) and (close[1] > ema26[1])

//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 4: MACD(掟B:ゼロライン上GC)
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
chk4_macdZeroGC = ta.crossover(macdLine, macdSignal) and (macdLine > 0) and (macdSignal > 0)

// 参考:ヒストグラム縮小→上向き(表示だけ)
histShrinkToUp = (macdHist > macdHist[1]) and (macdHist[1] < macdHist[2])

//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 5: 出来高(掟C)
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
chk5_volOK = not na(volMul) and (volMul >= volMinMul) and (volMul <= volMaxMul)
volStrongOK = not na(volMul) and (volMul >= volFinalMul) // 最終三点

//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 6: ローソク(掟D:ピンバー/包み/大陽線)
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// ピンバー(下ヒゲが実体より長く、上ヒゲが短め、陽線寄り)
longLowerWick = (body > 0) and ((lowerWick / body) >= wickBodyMult) and (upperWick <= lowerWick * upperToLower) and (close >= open)

// 陽線包み足
bullEngulf = (close[1] < open[1]) and (close > open) and (open <= close[1]) and (close >= open[1])

// 大陽線(EMA13を跨ぐ/上に抜け、実体がATR基準)
bigBull = (close > open) and (body >= atr * bigBodyATR) and (open < ema13) and (close > ema5)

chk6_candleOK = longLowerWick or bullEngulf or bigBull

//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 7-8: ブレイク後押し目(掟E)
// chk7 = 押し目率(-5〜15%)
// chk8 = ブレイク後&レジスタンス維持(リテストOK)
// ※chk7とchk8を独立させ、二重判定を排除
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
res = ta.highest(high, resLookback)[1]
breakout = ta.crossover(close, res)

// ブレイク状態
var bool inBreak = false
var float breakPrice = na
var int breakBar = na
var float postBreakHigh = na

if breakout
inBreak := true
breakPrice := res
breakBar := bar_index
postBreakHigh := high

if inBreak
postBreakHigh := na(postBreakHigh) ? high : math.max(postBreakHigh, high)

// 押し目率(ブレイク後高値からの下落率)
pullPct = (inBreak and not na(postBreakHigh) and postBreakHigh != 0) ? (postBreakHigh - close) / postBreakHigh * 100.0 : na
chk7_pullOK = not na(pullPct) and (pullPct >= pullMinPct) and (pullPct <= pullMaxPct)

// レジ維持(ブレイク価格を許容範囲内で保持)
retestOK = inBreak and not na(breakPrice) and (close >= breakPrice * (1 - retestAllowPct/100.0))
chk8_breakoutRetestOK = retestOK

//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 押し目待ち中:即解除(“二度と戻らない銘柄”を切る)
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
breakFail = inBreak and not na(breakPrice) and close < breakPrice * (1 - retestAllowPct/100.0)
below26 = inBreak and close < ema26
ema5Down = inBreak and ema5 <= ema5[1]

shouldCut =
(cutOnBreakFail and breakFail) or
(cutOnBelow26 and below26) or
(cutOnEma5Down and ema5Down)

// 期限切れ or 即解除
if inBreak and not na(breakBar) and (bar_index - breakBar > stateExpireBars)
inBreak := false
breakPrice := na
breakBar := na
postBreakHigh := na

if shouldCut
inBreak := false
breakPrice := na
breakBar := na
postBreakHigh := na

//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 8項目チェック(1つでも欠けたら見送り)
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
chk1 = chk1_allEmaUp
chk2 = chk2_golden
chk3 = chk3_above26_2days
chk4 = chk4_macdZeroGC
chk5 = chk5_volOK
chk6 = chk6_candleOK
chk7 = chk7_pullOK
chk8 = chk8_breakoutRetestOK

all8 = chk1 and chk2 and chk3 and chk4 and chk5 and chk6 and chk7 and chk8

// 最終三点(ヒゲ×出来高×MACD)
final3 = longLowerWick and volStrongOK and chk4_macdZeroGC

judge = (all8 and final3) ? "判定:買い" : "判定:見送り"

//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// コメント文字列
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
fMark(x) => x ? "達成" : "未達"

cutReason =
shouldCut ? (
(cutOnBreakFail and breakFail) ? "即解除:レジ割れ" :
(cutOnBelow26 and below26) ? "即解除:26EMA割れ" :
(cutOnEma5Down and ema5Down) ? "即解除:5EMA下向き" :
"即解除"
) :
(inBreak ? "押し目待ち:継続" : "押し目待ち:未突入/解除")

txt =
"【8項目チェック】\n" +
"1 EMA全上向き: " + fMark(chk1) + "\n" +
"2 黄金隊列: " + fMark(chk2) + "\n" +
"3 26EMA上2日: " + fMark(chk3) + "\n" +
"4 MACDゼロ上GC: " + fMark(chk4) + "\n" +
"5 出来高" + str.tostring(volMinMul) + "-" + str.tostring(volMaxMul) + ": " + fMark(chk5) + "\n" +
"6 ローソク条件: " + fMark(chk6) + "\n" +
"7 押し目-" + str.tostring(pullMinPct) + "〜" + str.tostring(pullMaxPct) + "%: " + fMark(chk7) + "\n" +
"8 ブレイク後リテスト: " + fMark(chk8) + "\n\n" +
"最終三点(ヒゲ×出来高×MACD): " + (final3 ? "成立" : "未成立") + "\n" +
judge + "\n\n" +
"状態: " + cutReason + "\n" +
"(参考)出来高倍率=" + (na(volMul) ? "na" : str.tostring(volMul, "#.00")) +
" / 押し目率=" + (na(pullPct) ? "na" : str.tostring(pullPct, "#.0")) + "%" +
" / hist転換=" + (histShrinkToUp ? "YES" : "NO")

//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// Table(位置切替:入力変更時に作り直し)
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
pos =
panelPos == "右上" ? position.top_right :
panelPos == "左上" ? position.top_left :
panelPos == "右下" ? position.bottom_right :
position.bottom_left

var string prevPos = na
var table t = na

if barstate.isfirst or prevPos != panelPos or na(t)
t := table.new(pos, 1, 1)
prevPos := panelPos

drawNow = showPanel and (lastBarOnly ? barstate.islast : true)

bg = (all8 and final3) ? color.new(color.lime, 80) : color.new(color.gray, 15)
fg = color.white

if drawNow
table.cell(t, 0, 0, txt, text_color=fg, bgcolor=bg, text_size=size.small)
else
table.cell(t, 0, 0, "", text_color=fg, bgcolor=color.new(color.black, 100))

//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// 視覚補助
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
plot(ema5, color=color.new(color.yellow, 0), title="EMA5")
plot(ema13, color=color.new(color.orange, 0), title="EMA13")
plot(ema26, color=color.new(color.red, 0), title="EMA26")

// ブレイク価格(参考)
plot(inBreak ? breakPrice : na, title="BreakPrice", color=color.new(color.aqua, 0), style=plot.style_linebr, linewidth=1)

// BUYサイン
plotshape(all8 and final3, title="BUY", style=shape.triangleup, location=location.belowbar,
color=color.new(color.lime, 0), size=size.tiny, text="BUY")

Exención de responsabilidad

La información y las publicaciones no constituyen, ni deben considerarse como asesoramiento o recomendaciones financieras, de inversión, de trading o de otro tipo proporcionadas o respaldadas por TradingView. Más información en Condiciones de uso.