
これは,流動性地域分析と内部市場構造の動態を組み合わせた革新的な取引戦略で,高確率のエントリーポイントを特定することを目的としています.この戦略は,価格と重要な市場レベルとの相互作用を追跡し,内部市場の変換を利用して取引を誘発することで,トレーダーに柔軟で精密な市場へのアクセス方法を提供します.
戦略の核心的な論理は,流動性の領域の識別と内部市場転換の2つの重要な構成要素に基づいています.流動性の領域は局所的な高点と低点を分析することによって動的に決定され,内部市場転換は,価格が以前のブルイッシュまたはベアリスレベルを突破して市場の方向の変化を判断します.
戦略の核心的な特徴は以下の通りです.
これは,流動性分析と市場構造のダイナミクスを融合した革新的な取引戦略である. 柔軟な内部市場変換の論理と正確な流動性領域の追跡により,トレーダーに強力な取引ツールを提供している. 戦略の鍵は,その適応性と多次元分析能力であり,異なる市場条件下で高い実行効率を維持できるものである.
/*backtest
start: 2024-03-28 00:00:00
end: 2025-03-27 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("Liquidity + Internal Market Shift Strategy", overlay=true)
// ======== Mode Selection ========
mode = input.string("Both", title="Mode", options=["Both", "Bullish Only", "Bearish Only"])
// ======== Stop-Loss and Take-Profit Input (in pips) ========
enableTakeProfit = input.bool(true, title="Enable Custom Take Profit") // Option to enable/disable take profit
stopLossPips = input.int(10, title="Stop Loss (in pips)", minval=1) // Stop loss in pips
takeProfitPips = input.int(20, title="Take Profit (in pips)", minval=1) // Take profit in pips
// ======== Internal Shift Logic ========
// Fixed number of consecutive candles to track (set to 1)
consecutiveBullishCount = 1
consecutiveBearishCount = 1
// Function to check for bullish and bearish candles
isBullish = close > open
isBearish = close < open
// Variables to track consecutive candles and mark lowest/highest
var int bullishCount = 0
var int bearishCount = 0
var float lowestBullishPrice = na
var float highestBearishPrice = na
var float previousBullishPrice = na // For the previous bullish lowest price
var float previousBearishPrice = na // For the previous bearish highest price
// Variables to track last internal shift type (1 = Bullish, -1 = Bearish, 0 = None)
var int lastInternalShift = 0
// Counting consecutive bullish and bearish candles
if isBullish
bullishCount := bullishCount + 1
bearishCount := 0
if bullishCount == 1 or low < lowestBullishPrice
lowestBullishPrice := low
else if isBearish
bearishCount := bearishCount + 1
bullishCount := 0
if bearishCount == 1 or high > highestBearishPrice
highestBearishPrice := high
else
bullishCount := 0
bearishCount := 0
lowestBullishPrice := na
highestBearishPrice := na
// Internal shift conditions
internalShiftBearish = close < previousBullishPrice and close < lowestBullishPrice
internalShiftBullish = close > previousBearishPrice and close > highestBearishPrice
// Condition to alternate internal shifts
allowInternalShiftBearish = internalShiftBearish and lastInternalShift != -1
allowInternalShiftBullish = internalShiftBullish and lastInternalShift != 1
// Tracking shifts
if bullishCount >= consecutiveBullishCount
previousBullishPrice := lowestBullishPrice
if bearishCount >= consecutiveBearishCount
previousBearishPrice := highestBearishPrice
// ======== Liquidity Seal-Off Points Logic ========
upperLiquidityLookback = input.int(10, title="Lookback Period for Upper Liquidity Line")
lowerLiquidityLookback = input.int(10, title="Lookback Period for Lower Liquidity Line")
isLocalHigh = high == ta.highest(high, upperLiquidityLookback)
isLocalLow = low == ta.lowest(low, lowerLiquidityLookback)
var bool touchedLowerLiquidityLine = false
var bool touchedUpperLiquidityLine = false
if (low <= ta.lowest(low, lowerLiquidityLookback))
touchedLowerLiquidityLine := true
if (high >= ta.highest(high, upperLiquidityLookback))
touchedUpperLiquidityLine := true
var bool lockedBullish = false
var bool lockedBearish = false
var int barSinceLiquidityTouch = na
// ======== Combined Signals ========
bullishSignal = allowInternalShiftBullish and touchedLowerLiquidityLine and not lockedBullish
bearishSignal = allowInternalShiftBearish and touchedUpperLiquidityLine and not lockedBearish
if bullishSignal
lockedBullish := true
touchedLowerLiquidityLine := false
barSinceLiquidityTouch := 0
if bearishSignal
lockedBearish := true
touchedUpperLiquidityLine := false
barSinceLiquidityTouch := 0
if not na(barSinceLiquidityTouch)
barSinceLiquidityTouch := barSinceLiquidityTouch + 1
if barSinceLiquidityTouch >= 3
lockedBullish := false
lockedBearish := false
if touchedLowerLiquidityLine
lockedBullish := false
if touchedUpperLiquidityLine
lockedBearish := false
// ======== Plot Combined Signals ========
plotshape(bullishSignal, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.tiny, title="Bullish Signal")
plotshape(bearishSignal, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny, title="Bearish Signal")
plot(isLocalHigh ? high : na, color=color.red, linewidth=2, style=plot.style_stepline, title="Local High Line")
plot(isLocalLow ? low : na, color=color.green, linewidth=2, style=plot.style_stepline, title="Local Low Line")
// ======== Track Entry and Opposing Signals ========
var float entryPrice = na
var int entryTime = na
var string positionSide = ""
// ======== Strategy Execution (Mode Logic) ========
if (mode == "Both")
// Short Entry Logic (Bearish Signal)
if (bearishSignal and na(entryPrice))
strategy.entry("Short", strategy.short)
entryPrice := close
entryTime := time
positionSide := "short"
// Long Entry Logic (Bullish Signal)
if (bullishSignal and na(entryPrice))
strategy.entry("Long", strategy.long)
entryPrice := close
entryTime := time
positionSide := "long"
// Exit Logic: Close on Opposing Signal (after the current signal is triggered)
if (positionSide == "short" and bullishSignal )
strategy.close("Short")
entryPrice := na
positionSide := ""
if (positionSide == "long" and bearishSignal)
strategy.close("Long")
entryPrice := na
positionSide := ""
// Stop-Loss and Take-Profit Logic (in pips)
stopLossPriceLong = entryPrice - stopLossPips * syminfo.mintick
takeProfitPriceLong = entryPrice + takeProfitPips * syminfo.mintick
stopLossPriceShort = entryPrice + stopLossPips * syminfo.mintick
takeProfitPriceShort = entryPrice - takeProfitPips * syminfo.mintick
// Long Stop-Loss and Take-Profit Conditions
if (positionSide == "long" and close <= stopLossPriceLong)
strategy.close("Long", comment="Stop Loss Triggered")
entryPrice := na
positionSide := ""
if (positionSide == "long" and enableTakeProfit and close >= takeProfitPriceLong)
strategy.close("Long", comment="Take Profit Triggered")
entryPrice := na
positionSide := ""
// Short Stop-Loss and Take-Profit Conditions
if (positionSide == "short" and close >= stopLossPriceShort)
strategy.close("Short", comment="Stop Loss Triggered")
entryPrice := na
positionSide := ""
if (positionSide == "short" and enableTakeProfit and close <= takeProfitPriceShort)
strategy.close("Short", comment="Take Profit Triggered")
entryPrice := na
positionSide := ""
if (mode == "Bullish Only")
if (bullishSignal and na(entryPrice))
strategy.entry("Long", strategy.long)
entryPrice := close
entryTime := time
positionSide := "long"
if (positionSide == "long" and bearishSignal)
strategy.close("Long")
entryPrice := na
positionSide := ""
// Stop-Loss and Take-Profit Logic (in pips)
stopLossPriceLong = entryPrice - stopLossPips * syminfo.mintick
takeProfitPriceLong = entryPrice + takeProfitPips * syminfo.mintick
if (positionSide == "long" and close <= stopLossPriceLong)
strategy.close("Long", comment="Stop Loss Triggered")
entryPrice := na
positionSide := ""
if (positionSide == "long" and enableTakeProfit and close >= takeProfitPriceLong)
strategy.close("Long", comment="Take Profit Triggered")
entryPrice := na
positionSide := ""
if (mode == "Bearish Only")
if (bearishSignal and na(entryPrice))
strategy.entry("Short", strategy.short)
entryPrice := close
entryTime := time
positionSide := "short"
if (positionSide == "short" and bullishSignal)
strategy.close("Short")
entryPrice := na
positionSide := ""
// Stop-Loss and Take-Profit Logic (in pips)
stopLossPriceShort = entryPrice + stopLossPips * syminfo.mintick
takeProfitPriceShort = entryPrice - takeProfitPips * syminfo.mintick
if (positionSide == "short" and close >= stopLossPriceShort)
strategy.close("Short", comment="Stop Loss Triggered")
entryPrice := na
positionSide := ""
if (positionSide == "short" and enableTakeProfit and close <= takeProfitPriceShort)
strategy.close("Short", comment="Take Profit Triggered")
entryPrice := na
positionSide := ""