
এটি একটি প্রবণতা-অনুসরণ কৌশল যা একাধিক প্রযুক্তিগত সূচকগুলির উপর ভিত্তি করে এবং গতিশীলভাবে স্থিতিস্থাপকতা বজায় রাখার মাধ্যমে ট্রেডিংয়ের জন্য ব্যবহৃত হয়। এই কৌশলটি মূলত সূচকীয় চলমান গড় (ইএমএ), আপেক্ষিকভাবে শক্তিশালী সূচক (আরএসআই) এবং ট্রেন্ড দিকনির্দেশক সূচক (এডিএক্স) ব্যবহার করে বাজারের প্রবণতা বিশ্লেষণ এবং ট্রেডিং সংকেত তৈরি করতে, যখন গতিশীল স্টপ লস এবং লাভের লক্ষ্য নির্ধারণের জন্য প্রকৃত ওল্টার (এটিআর) ব্যবহার করা হয়।
এই কৌশলটি একটি ট্রেডিং সিস্টেম যা একাধিক প্রযুক্তিগত সূচকের সাথে ট্রেন্ড ট্র্যাকিং ট্রেডিং সিস্টেমকে সংযুক্ত করে। এটি মূলত ইএমএ দ্বারা মূল্য প্রবণতার দিক নির্ধারণ করে, আরএসআই বাজার ওভারসোলের অবস্থা নির্ধারণ করে, এডিএক্স প্রবণতার শক্তি যাচাই করে এবং শেষ পর্যন্ত এটিআর ব্যবহার করে পজিশন আকার এবং ঝুঁকি পরিচালনার প্যারামিটারগুলিকে গতিশীলভাবে সামঞ্জস্য করে। এই কৌশলটি একাধিক পজিশন গণনা পদ্ধতি সমর্থন করে, যার মধ্যে রয়েছে অ্যাকাউন্টের শতাংশ, ফিক্সড ক্যাপিটাল পরিমাণ এবং ফিক্সড চুক্তির সংখ্যা ইত্যাদি।
এটি একটি সমন্বিত প্রবণতা-অনুসরণ কৌশল যা একাধিক প্রযুক্তিগত সূচক ব্যবহার করে, বহু-মাত্রিক প্রবণতা নিশ্চিতকরণ এবং উন্নত ঝুঁকি ব্যবস্থাপনার মাধ্যমে তুলনামূলকভাবে স্থিতিশীল লেনদেন অর্জন করে। কৌশলটির সুবিধা হল সিস্টেমিক প্রবণতা নিশ্চিতকরণ ব্যবস্থা এবং নমনীয় পজিশন পরিচালনা, তবে সূচকের পশ্চাদপসরণ এবং বাজারের পরিবেশের সাথে অভিযোজনযোগ্যতার মতো বিষয়গুলিও বিবেচনা করা প্রয়োজন। ক্রমাগত অপ্টিমাইজেশন এবং ঝুঁকি নিয়ন্ত্রণের উন্নতির মাধ্যমে, কৌশলটি বিভিন্ন ধরণের বাজারের পরিবেশে স্থিতিশীল পারফরম্যান্স বজায় রাখার প্রত্যাশা করে।
/*backtest
start: 2025-02-10 00:00:00
end: 2025-02-17 00:00:00
period: 45m
basePeriod: 45m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("EMA Momentum Scalper", shorttitle="EMS", overlay=true, pyramiding=0)
// === ПАРАМЕТРЫ ===
posSizeMethod = input.string("Capital %", title="Метод расчета позиции", options=["% Based", "Capital %", "Fixed Capital Based", "Fixed Contract Size"])
riskPerTrade = input.float(3, title="Риск на сделку (%)", minval=0.1, maxval=100, step=0.5) / 100
capitalPctPerTrade = input.float(10, title="Доля капитала на сделку (%)", minval=0.1, maxval=100, step=0.5) / 100
fixedCapitalAmount = input.float(100, title="Фиксированная сумма капитала", minval=0)
fixedContractSize = input.int(10, title="Фиксированный размер контракта")
atrLength = input.int(14, title="Длина ATR")
atrMultiplierSL = input.float(2.5, title="ATR множитель для SL")
atrMultiplierTP = input.float(1.5, title="ATR множитель для TP")
timeoutBars = input.int(20, title="Выход через X баров, если нет TP/SL")
emaLength = input.int(50, title="Длина EMA")
rsiLength = input.int(14, title="Длина RSI")
rsiOverbought = input.int(70, title="RSI перекупленность")
rsiOversold = input.int(30, title="RSI перепроданность")
adxLength = input.int(14, title="Длина ADX")
adxThreshold = input.float(20, title="Порог ADX для тренда")
leverage = input.int(15, title="Плечо", minval=1, maxval=100)
// === ИНДИКАТОРЫ ===
atr = ta.atr(atrLength)
ema = ta.ema(close, emaLength)
rsi = ta.rsi(close, rsiLength)
// === ADX ===
diPlus = ta.rma(math.max(high - high[1], 0), adxLength)
diMinus = ta.rma(math.max(low[1] - low, 0), adxLength)
dx = 100 * math.abs(diPlus - diMinus) / (diPlus + diMinus)
adx = ta.rma(dx, adxLength)
// === УСЛОВИЯ ВХОДА ===
longEntry = ta.crossover(close, ema) and rsi > 50 and adx > adxThreshold
shortEntry = ta.crossunder(close, ema) and rsi < 50 and adx > adxThreshold
// === РАСЧЕТ РАЗМЕРА ПОЗИЦИИ ===
var float qty = na
riskAmount = strategy.equity * riskPerTrade
stopLossDistance = atr * atrMultiplierSL
positionSize = riskAmount / stopLossDistance
if (posSizeMethod == "% Based")
qty := strategy.equity * riskPerTrade / (atr * atrMultiplierSL)
else if (posSizeMethod == "Capital %")
qty := strategy.equity * capitalPctPerTrade / close
else if (posSizeMethod == "Fixed Capital Based")
qty := fixedCapitalAmount / close
else if (posSizeMethod == "Fixed Contract Size")
qty := fixedContractSize
qty := qty * leverage // Умножаем на плечо
// === СТОП-ЛОСС И ТЕЙК-ПРОФИТ ===
entryPrice = close
stopLossLong = entryPrice - atrMultiplierSL * atr
stopLossShort = entryPrice + atrMultiplierSL * atr
takeProfit1 = entryPrice + atrMultiplierTP * atr * (longEntry ? 1 : -1)
takeProfit2 = entryPrice + atrMultiplierTP * atr * (longEntry ? 2 : -2) / 1.5
// === ТРЕЙЛИНГ-СТОП ===
trailStopDistance = atr * atrMultiplierSL
if (longEntry)
strategy.entry("Long", strategy.long, qty=qty)
strategy.exit("Exit Long", "Long", stop=stopLossLong, limit=takeProfit1, trail_points=trailStopDistance)
alertMessage = syminfo.ticker + " LONG\n" +
"Leverage: Cross " + str.tostring(leverage) + "x\n" +
"➡️ Entry: " + str.tostring(entryPrice) + "\n" +
"🟢 Take profit 1: " + str.tostring(takeProfit1) + "\n" +
"🛑 Stop loss: " + str.tostring(stopLossLong)
alert(alertMessage, alert.freq_once_per_bar_close)
if (shortEntry)
strategy.entry("Short", strategy.short, qty=qty)
strategy.exit("Exit Short", "Short", stop=stopLossShort, limit=takeProfit1, trail_points=trailStopDistance)
alertMessage = syminfo.ticker + " SHORT\n" +
"Leverage: Cross " + str.tostring(leverage) + "x\n" +
"➡️ Entry: " + str.tostring(entryPrice) + "\n" +
"🟢 Take profit 1: " + str.tostring(takeProfit1) + "\n" +
"🛑 Stop loss: " + str.tostring(stopLossShort)
alert(alertMessage, alert.freq_once_per_bar_close)
// === ВИЗУАЛИЗАЦИЯ ===
plotshape(longEntry, color=color.green, style=shape.labelup, location=location.belowbar, text="BUY")
plotshape(shortEntry, color=color.red, style=shape.labeldown, location=location.abovebar, text="SELL")
plot(ema, color=color.blue, title="EMA")
bgcolor(rsi > rsiOverbought or rsi < rsiOversold ? color.new(color.gray, 80) : na)