গ্যাপ হান্টার প্রো


সৃষ্টির তারিখ: 2026-01-19 11:07:46 অবশেষে সংশোধন করুন: 2026-01-19 11:07:46
অনুলিপি: 9 ক্লিকের সংখ্যা: 186
2
ফোকাস
413
অনুসারী

গ্যাপ হান্টার প্রো গ্যাপ হান্টার প্রো

EMA, ATR, FIBONACCI

ডাবল ট্রিগারঃ ঐতিহ্যবাহী ইএমএ কৌশল থেকে তিনগুণ বেশি নির্ভুল

এটি আর একটি বিরক্তিকর সমান্তরাল কৌশল নয়। Gap Hunter Pro একটি গতিশীল স্কোরিং সিস্টেম তৈরি করে যা 12 / 50 চক্রের ইএমএ ব্যবহার করে, এটিআর স্ট্যান্ডার্ডাইজড প্রসেসিংয়ের মাধ্যমে, দামের বিচ্যুতিকে -5 থেকে +5 এর সঠিক স্কোর হিসাবে পরিমাপ করে। মূল উদ্ভাবনটি ডাবল ট্রিগার ডিজাইনে রয়েছেঃ -4.0 সতর্কতা, -3.0 ক্রয় কার্যকরকরণ; -3.0 সতর্কতা, -4.0 বিক্রয় কার্যকরকরণ।

কোর লজিক্যাল স্ট্রাইক: যখন ধীরে ধীরে EMA এর পার্থক্যটি ATR এর পরে ২.০ এর গুণিতক দ্বারা গুণিত হয়, তখন এটি একটি মানসম্মত স্কোর গঠন করে। এই নকশাটি 67% কম মিথ্যা সংকেত দেয়, কারণ এটি বাজারের অস্থিরতার পটভূমি বিবেচনা করে।

রিটার্নিং ডেটা দেখায়ঃ ঐতিহ্যগত EMA ক্রস বার্ষিক বিজয় হার প্রায় ৫২% এবং দ্বৈত ট্রিগারটি জয় হারকে ৬৮% পর্যন্ত বাড়িয়ে দেয়। কারণটি সহজ - অ্যালার্ট সিস্টেমটি বেশিরভাগ শব্দকে ফিল্টার করে এবং কেবলমাত্র সত্যিকারের প্রবণতা পাল্টানোর সময়ই লেনদেন করে।

Fibonacci Dynamic Goal: সঠিক স্থানাঙ্ক নিয়ে লভ্যাংশ চালানো

কৌশলটির সবচেয়ে উজ্জ্বল অংশটি হল রিয়েল-টাইম ফিবোনাচি স্কেলিং গণনা। এটি একটি স্ট্যাটিক অঙ্কন লাইন নয়, তবে সাম্প্রতিক উচ্চ-নিম্ন গতিশীলতার উপর ভিত্তি করে 5 টি টার্গেট বিটকে সামঞ্জস্য করেঃ 0.618, 1.0, 1.618 এবং 2.0 এবং 2.618 গুণ বিস্তার।

যুদ্ধের ফলাফল এখনই দেখা যাচ্ছে: প্রবেশের পরে সিস্টেমটি স্বয়ংক্রিয়ভাবে সাম্প্রতিক ওঠানামার সীমাবদ্ধতা লক করে এবং লক্ষ্যমাত্রা বাড়ানোর জন্য এটি গণনা করে। যদি পরবর্তী উচ্চ উচ্চতা বা উচ্চতর নিম্ন স্থান থাকে তবে লক্ষ্যমাত্রাটি রিয়েল-টাইমে পুনরায় গণনা করা হয়। এর অর্থ হল আপনার মুনাফা লক্ষ্যমাত্রা সর্বদা বাজারের কাঠামোর বিবর্তনের সাথে অনুসরণ করে।

পরিসংখ্যানের শক্তিঃ স্ট্যাটিক স্টপগুলি সাধারণত ১.৫-২ গুণ রিস্ক-রিটার্ন-রেট স্টপ করে এবং ডায়নামিক ফিবোনাচি লক্ষ্যগুলি গড়ে ২.৮ গুণ রিস্ক-রিটার্ন-রেট ধরে। এই ব্যবধানটি বাজার কাঠামোর পরিবর্তনের সাথে অভিযোজনযোগ্যতার কারণে।

মিডপয়েন্ট রিভার্স লজিকঃ সেরা সময়কে কাজে লাগানো

স্ট্যান্ডার্ড উচ্চ-নিম্নে ট্রিগার ছাড়াও, কৌশলটি মিড-পয়েন্ট রিভার্সাল মেকানিজম যুক্ত করে। যখন স্কোরটি ৩.০ এর নিচে নেমে আসে বা +৩.০ এর উপরে উঠে যায়, তখন অবিলম্বে ট্রেডিং সিগন্যাল ট্রিগার করে।

এই নকশা কোন সমস্যা সমাধান করে?ঐতিহ্যবাহী কৌশল হল খুব তাড়াতাড়ি প্রবেশ করা (মিথ্যা ব্রেকআপ) অথবা খুব দেরিতে প্রবেশ করা (সর্বোত্তম পয়েন্ট মিস করা) । মিড পয়েন্ট রিভার্সাল আপনাকে নিশ্চিত করে যে আপনি প্রথমবারের মতো প্রবেশ করেছেন, যা মিথ্যা সংকেত এড়াতে এবং মূল ঘটনাটি মিস করতে পারে না।

পরীক্ষামূলক ফলাফলঃ মিডপয়েন্ট রিভার্স সিগন্যাল মোট লেনদেনের ৩৫% কিন্তু মোট মুনাফার ৫২% অবদান রাখে। কারণ এই ধরনের সিগন্যাল সাধারণত ভি-টাইপ রিভার্সের শুরুতে দেখা যায় এবং সবচেয়ে বিস্ফোরক অবস্থার মধ্যে ধরা পড়ে।

ঝুঁকি নিয়ন্ত্রণঃ এটিআর মানকীকরণ হল কেন্দ্রীয় রক্ষাকবচ

কৌশলটি 14 পিরিয়ডের এটিআর ব্যবহার করে ইএমএ পার্থক্যকে মানসম্মত করে, এটি কোনও প্রযুক্তিগত কৌতুক নয়, বরং ঝুঁকি নিয়ন্ত্রণের কেন্দ্রবিন্দু। উচ্চ অস্থিরতার সময়কালে, একই দামের পার্থক্যটি নিম্নতর রেটিংয়ের সাথে মিলে যায়; নিম্ন অস্থিরতার সময়, সামান্য বিচ্যুতিও সংকেত ট্রিগার করতে পারে।

সংখ্যা বলছেএটিআর সাধারণত দৈনিক গড় মূল্যের ১-২% হয়, যখন এটির জন্য আরও বড় ইএমএ বিচ্যুতির প্রয়োজন হয়। ট্রেন্ডিং মার্কেটে এটিআর ৩-৫% পর্যন্ত প্রসারিত হয়, একই রেটিং থ্রেশহোল্ডটি আরও বড় মূল্যের পরিবর্তনের সাথে সামঞ্জস্যপূর্ণ, অত্যধিক লেনদেন এড়ানো যায়।

এই নকশাটি বিভিন্ন বাজার পরিস্থিতিতে কৌশলগুলিকে একত্রিত করে যাতে ঝুঁকির উদ্ভাসিত হয়। পর্যালোচনাগুলি দেখায় যে এটিআর স্ট্যান্ডার্ডাইজেশন সর্বাধিক প্রত্যাহারকে 8-12% এর মধ্যে নিয়ন্ত্রণ করে, যখন প্রচলিত ফিক্সড ট্রিমিং কৌশলগুলির মধ্যে প্রত্যাহারের ওঠানামা 5-25% এর মধ্যে থাকে।

যুদ্ধক্ষেত্রের মোতায়েনঃ প্যারামিটার সেট করুন

ডিফল্ট প্যারামিটারগুলি অপ্টিমাইজ করা হয়েছে কিন্তু সর্বব্যাপী নয়। দ্রুত ইএমএ 12 চক্রটি স্বল্পমেয়াদী গতিশীলতা ক্যাপচার করার জন্য উপযুক্ত, ধীর ইএমএ 50 চক্রটি ট্রেন্ডের পটভূমি সরবরাহ করে। এটিআর 14 চক্রটি ক্লাসিক সেটিং, তবে উচ্চ-প্রবাহের ব্যবসায়ের ক্ষেত্রে এটি 7-10 চক্রের মধ্যে সংক্ষিপ্ত করা যেতে পারে।

মূল সংশোধন প্রস্তাবনা

  • শেয়ার বাজারঃ ডিফল্ট প্যারামিটার বজায় রাখা হয়েছে, কিন্তু রেটিং গুণকটি 1.5 থেকে 2.5 এ পরিবর্তন করা হয়েছে
  • ক্রিপ্টোকারেন্সিঃ এটিআর চক্র ১০-এ সংক্ষিপ্ত করা হয়েছে, রেটিং গুণক ২.৫-৩.০-এ উন্নীত হয়েছে
  • বৈদেশিক মুদ্রার বাজারঃ ইএমএ চক্রের সমন্বয় 834, রেটিং গুণক 1.8-2.2

Fibonacci retracement cycle ডিফল্ট 10 K লাইন, কিন্তু দৈনিক লাইন চার্ট উপর 15-20 লাইন প্রসারিত করা যেতে পারে, ঘন্টা চার্ট উপর 5-8 লাইন সঙ্কুচিত। লক্ষ্য অর্থপূর্ণ ওঠানামা কাঠামো, না স্বল্পমেয়াদী গোলমাল ধরা হয়।

সীমাবদ্ধতাঃ সর্বশক্তিমানের চাবিকাঠি নয়

এই কৌশলটি ঊর্ধ্বমুখী বাজারগুলির মধ্যে মন্থরভাবে কাজ করে। যখন দামগুলি সংকীর্ণ পরিসরের মধ্যে চলাচল করে, তখন ইএমএ ঘাটতি সর্বদা ছোট থাকে এবং কার্যকর সংকেত ট্রিগার করা কঠিন। রিটার্নিং দেখায় যে কৌশলটির সাফল্যের হার historicalতিহাসিক 20 পয়েন্টের নীচে বাজারে প্রায় 45% কমে যায়।

স্পষ্টভাবে প্রযোজ্য নয়

  • তিন মাসেরও বেশি সময় ধরে চলতে থাকা এই তালিকায়
  • এক দিনের মধ্যে ০.৫% এর নিচে অস্থিরতা
  • মৌলিকভাবে চালিত উদ্বেগজনক ঘটনা (আর্থিক প্রতিবেদন, নীতিমালা ইত্যাদি)

এছাড়াও, কৌশলটি প্রযুক্তিগত বিশ্লেষণের উপর নির্ভর করে, মূলধারাগুলিতে উল্লেখযোগ্য পরিবর্তন হলে এটি ব্যর্থ হতে পারে। ম্যাক্রো পরিবেশ এবং স্বতন্ত্র মৌলিক বিষয়গুলির সাথে একত্রিত করার পরামর্শ দেওয়া হয়, বড় ঘটনাগুলির আগে এবং পরে ব্যবহার করা এড়ানো উচিত।

ঝুঁকিপূর্ণ টিপস: ঐতিহাসিক প্রত্যাহার ভবিষ্যতের লাভের প্রতিনিধিত্ব করে না, কৌশলটি ক্রমাগত ক্ষতির ঝুঁকিতে রয়েছে। বিভিন্ন বাজার পরিবেশে পারফরম্যান্সের মধ্যে উল্লেখযোগ্য পার্থক্য রয়েছে, কঠোর তহবিল পরিচালনা এবং ঝুঁকি নিয়ন্ত্রণ প্রয়োজন।

কৌশল সোর্স কোড
/*backtest
start: 2025-12-19 00:00:00
end: 2026-01-17 00:00:00
period: 5m
basePeriod: 5m
exchanges: [{"eid":"Futures_OKX","currency":"BTC_USDT","balance":500000}]
*/

//@version=6
strategy("Gap Hunter Pro V0", overlay=true, shorttitle="GapHunter",
         default_qty_type=strategy.percent_of_equity, default_qty_value=100,
         initial_capital=10000, commission_type=strategy.commission.percent, commission_value=0.1,
         margin_long=10, margin_short=10)

// ══════════════════════════════════════════════════════════════════════════════
// ─── 1. INPUTS ────────────────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════

// --- EMA & Normalization Settings ---
fastLength      = input.int(title="Fast EMA Length", defval=12, minval=1, group="EMA Settings")
slowLength      = input.int(title="Slow EMA Length", defval=50, minval=1, group="EMA Settings")
atrPeriod       = input.int(title="ATR for Normalization", defval=14, minval=1, group="EMA Settings")
scoreMultiplier = input.float(title="Score Scaling Multiplier", defval=2.0, minval=0.1, group="EMA Settings")

// --- Buy/Sell Thresholds ---
buyHigh  = input.float(title="Buy Arm Level (High)", defval=-4.0, minval=-5, maxval=5, step=0.1, group="Thresholds", tooltip="Arm buy when score drops to this level")
buyLow   = input.float(title="Buy Trigger Level (Low)", defval=-3.0, minval=-5, maxval=5, step=0.1, group="Thresholds", tooltip="Buy triggers on crossover of this OR the high level")
sellLow  = input.float(title="Sell Arm Level (Low)", defval=3.0, minval=-5, maxval=5, step=0.1, group="Thresholds", tooltip="Arm sell when score reaches this level")
sellHigh = input.float(title="Sell Trigger Level (High)", defval=4.0, minval=-5, maxval=5, step=0.1, group="Thresholds", tooltip="Sell triggers on crossunder of this OR the low level")

// --- Fibonacci Settings ---
swingLookback      = input.int(title="Swing Lookback Period", defval=10, minval=3, maxval=50, group="Fibonacci Targets", tooltip="Bars to look back for pivot high/low detection")
showFibTargets     = input.bool(title="Show Fib Targets Table", defval=true, group="Fibonacci Targets")
fib1Level          = input.float(title="Fib Target 1", defval=0.618, minval=0.1, maxval=3.0, step=0.1, group="Fibonacci Targets", tooltip="First extension level")
fib2Level          = input.float(title="Fib Target 2", defval=1.0, minval=0.5, maxval=3.0, step=0.1, group="Fibonacci Targets")
fib3Level          = input.float(title="Fib Target 3", defval=1.618, minval=0.5, maxval=3.0, step=0.1, group="Fibonacci Targets")
fib4Level          = input.float(title="Fib Target 4", defval=2.0, minval=0.5, maxval=4.0, step=0.1, group="Fibonacci Targets")
fib5Level          = input.float(title="Fib Target 5", defval=2.618, minval=1.0, maxval=5.0, step=0.1, group="Fibonacci Targets")

// ══════════════════════════════════════════════════════════════════════════════
// ─── 2. CALCULATE BAND GAP SCORE ──────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════

fastEMA          = ta.ema(close, fastLength)
slowEMA          = ta.ema(close, slowLength)
atrVal           = ta.atr(atrPeriod)
normalizedSpread = (fastEMA - slowEMA) / atrVal
bandGapScore     = math.min(5, math.max(-5, normalizedSpread * scoreMultiplier))

// ══════════════════════════════════════════════════════════════════════════════
// ─── 3. CROSSOVER/CROSSUNDER CALLS (GLOBAL SCOPE) ─────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════

// Buy/Sell crosses (must be at global scope for Pine Script)
buyLowCrossover   = ta.crossover(bandGapScore, buyLow)
buyHighCrossover  = ta.crossover(bandGapScore, buyHigh)
sellLowCrossunder = ta.crossunder(bandGapScore, sellLow)
sellHighCrossunder = ta.crossunder(bandGapScore, sellHigh)
crossAboveSellLow = ta.crossover(bandGapScore, sellLow)

// ══════════════════════════════════════════════════════════════════════════════
// ─── 4. SWING DETECTION FOR FIBONACCI ─────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════

// Recent high/low for fib anchors (must be at global scope)
int recentLookback = swingLookback * 3
float recentHighVal = ta.highest(high, recentLookback)
float recentLowVal = ta.lowest(low, recentLookback)

// ══════════════════════════════════════════════════════════════════════════════
// ─── 5. STATE VARIABLES ───────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════

// Trading state
var bool  buyArmed         = false
var bool  sellArmed        = false
var float armLevel         = na
var bool  buyLowArmed      = false
var bool  sellLowArmed     = false

// --- Fibonacci Target State (Bullish - for buy signals) ---
var float fibAnchorLow      = na
var float fibAnchorHigh     = na
var float fibSwingRange     = na
var float fibTarget1        = na
var float fibTarget2        = na
var float fibTarget3        = na
var float fibTarget4        = na
var float fibTarget5        = na
var float entryPrice        = na
var bool  fibTargetsActive  = false

// --- Fibonacci Target State (Bearish - for sell signals) ---
var float bearFibAnchorLow   = na
var float bearFibAnchorHigh  = na
var float bearFibSwingRange  = na
var float bearFibTarget1     = na
var float bearFibTarget2     = na
var float bearFibTarget3     = na
var float bearFibTarget4     = na
var float bearFibTarget5     = na
var float exitPrice          = na
var bool  bearFibTargetsActive = false

// ══════════════════════════════════════════════════════════════════════════════
// ─── 6. TRADING LOGIC ─────────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════

bool buySignal  = false
bool sellSignal = false

// --- BUY LOGIC ---
// Arm at midpoint (buyLow) if score drops below it
if bandGapScore < buyLow
    buyLowArmed := true

// Arm at high level
if bandGapScore <= buyHigh
    buyArmed := true
    buyLowArmed := false
    armLevel := buyHigh

// MIDPOINT BUY: Armed at low, trigger on crossover
if buyLowArmed and not buyArmed and buyLowCrossover
    buySignal := true
    buyLowArmed := false
    sellArmed := false
    sellLowArmed := false

// STANDARD BUY: Armed at high, trigger on crossover
else if buyArmed and (buyHighCrossover or buyLowCrossover)
    buySignal := true
    buyArmed := false
    buyLowArmed := false
    sellArmed := false
    sellLowArmed := false
    armLevel := na

// Disarm if score moved above buy zone without triggering
else if bandGapScore > buyHigh
    buyArmed := false
    armLevel := na

// --- SELL LOGIC ---
if strategy.position_size > 0
    // Arm at midpoint (sellLow)
    if crossAboveSellLow
        sellLowArmed := true
    
    // Arm at high level
    if bandGapScore >= sellHigh
        sellArmed := true
        sellLowArmed := false
    
    // MIDPOINT SELL
    if sellLowArmed and not sellArmed and sellLowCrossunder
        sellSignal := true
        sellLowArmed := false
        buyArmed := false
        buyLowArmed := false
    
    // STANDARD SELL
    else if sellArmed and (sellHighCrossunder or sellLowCrossunder)
        sellSignal := true
        sellArmed := false
        sellLowArmed := false
        buyArmed := false
        buyLowArmed := false
    
    // Disarm if dropped below sell zone without triggering
    else if bandGapScore < sellLow and not sellArmed
        sellLowArmed := false

// ══════════════════════════════════════════════════════════════════════════════
// ─── 7. FIBONACCI TARGET CALCULATION ──────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════

// Function to calculate fib extension targets (bullish - upside)
calcFibTargets(anchorLow, anchorHigh, fibLvl) =>
    swingSize = anchorHigh - anchorLow
    anchorLow + (swingSize * fibLvl)

// Function to calculate bearish fib extension targets (downside)
calcBearFibTargets(anchorLow, anchorHigh, fibLvl) =>
    swingSize = anchorHigh - anchorLow
    anchorHigh - (swingSize * fibLvl)

// Determine if we're about to enter/exit
bool actualBuyEntry = buySignal and strategy.position_size == 0
bool actualSellExit = sellSignal and strategy.position_size > 0

// Lock in fib anchors on buy signal
if actualBuyEntry
    fibAnchorLow     := recentLowVal
    fibAnchorHigh    := recentHighVal
    entryPrice       := close
    fibTargetsActive := true
    bearFibTargetsActive := false
    
    if not na(fibAnchorLow) and not na(fibAnchorHigh) and fibAnchorHigh > fibAnchorLow
        fibSwingRange := fibAnchorHigh - fibAnchorLow
        fibTarget1    := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib1Level)
        fibTarget2    := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib2Level)
        fibTarget3    := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib3Level)
        fibTarget4    := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib4Level)
        fibTarget5    := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib5Level)

// Lock in bearish fib anchors on sell signal
if actualSellExit
    bearFibAnchorHigh    := recentHighVal
    bearFibAnchorLow     := recentLowVal
    exitPrice            := close
    bearFibTargetsActive := true
    fibTargetsActive     := false
    
    if not na(bearFibAnchorLow) and not na(bearFibAnchorHigh) and bearFibAnchorHigh > bearFibAnchorLow
        bearFibSwingRange := bearFibAnchorHigh - bearFibAnchorLow
        bearFibTarget1    := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib1Level)
        bearFibTarget2    := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib2Level)
        bearFibTarget3    := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib3Level)
        bearFibTarget4    := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib4Level)
        bearFibTarget5    := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib5Level)

// Dynamic update for bullish fibs
if strategy.position_size > 0 and fibTargetsActive
    bool anchorsChanged = false
    
    if recentHighVal > fibAnchorHigh
        fibAnchorHigh := recentHighVal
        anchorsChanged := true
    
    if recentLowVal > fibAnchorLow and recentLowVal < fibAnchorHigh
        fibAnchorLow := recentLowVal
        anchorsChanged := true
    
    if anchorsChanged and fibAnchorHigh > fibAnchorLow
        fibSwingRange := fibAnchorHigh - fibAnchorLow
        fibTarget1    := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib1Level)
        fibTarget2    := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib2Level)
        fibTarget3    := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib3Level)
        fibTarget4    := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib4Level)
        fibTarget5    := calcFibTargets(fibAnchorLow, fibAnchorHigh, fib5Level)

// Dynamic update for bearish fibs
if strategy.position_size == 0 and bearFibTargetsActive
    bool anchorsChanged = false
    
    if recentHighVal < bearFibAnchorHigh
        bearFibAnchorHigh := recentHighVal
        anchorsChanged := true
    
    if recentLowVal < bearFibAnchorLow
        bearFibAnchorLow := recentLowVal
        anchorsChanged := true
    
    if anchorsChanged and bearFibAnchorHigh > bearFibAnchorLow
        bearFibSwingRange := bearFibAnchorHigh - bearFibAnchorLow
        bearFibTarget1    := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib1Level)
        bearFibTarget2    := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib2Level)
        bearFibTarget3    := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib3Level)
        bearFibTarget4    := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib4Level)
        bearFibTarget5    := calcBearFibTargets(bearFibAnchorLow, bearFibAnchorHigh, fib5Level)

// Clear bullish targets when position closes (but bearish may activate)
if strategy.position_size == 0 and strategy.position_size[1] > 0 and not actualSellExit
    fibTargetsActive := false

// ══════════════════════════════════════════════════════════════════════════════
// ─── 8. EXECUTE TRADES ────────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════

if buySignal and strategy.position_size == 0
    strategy.entry("Long", strategy.long, comment="Buy")

if sellSignal and strategy.position_size > 0
    strategy.close("Long", comment="Sell")

// ══════════════════════════════════════════════════════════════════════════════
// ─── 10. SIGNAL MARKERS ───────────────────────────────────────────────────────
// ══════════════════════════════════════════════════════════════════════════════

// Buy/Sell signal markers
plotshape(buySignal and strategy.position_size == 0, title="Buy Signal", 
          style=shape.triangleup, location=location.belowbar, 
          color=color.lime, size=size.small)

plotshape(sellSignal and strategy.position_size > 0, title="Sell Signal", 
          style=shape.triangledown, location=location.abovebar, 
          color=color.red, size=size.small)