পরিমাণগত সূচকের উপর ভিত্তি করে ক্যান্ডেলস্টিক সেন্টিমেন্ট মোমেন্টাম ট্রেন্ড ট্রেডিং কৌশল

CEI ADX RSI MACD VOLUME SMA
সৃষ্টির তারিখ: 2025-02-21 13:23:51 অবশেষে সংশোধন করুন: 2025-02-21 13:23:51
অনুলিপি: 1 ক্লিকের সংখ্যা: 361
2
ফোকাস
319
অনুসারী

পরিমাণগত সূচকের উপর ভিত্তি করে ক্যান্ডেলস্টিক সেন্টিমেন্ট মোমেন্টাম ট্রেন্ড ট্রেডিং কৌশল পরিমাণগত সূচকের উপর ভিত্তি করে ক্যান্ডেলস্টিক সেন্টিমেন্ট মোমেন্টাম ট্রেন্ড ট্রেডিং কৌশল

ওভারভিউ

এই কৌশলটি বাজারের আবেগ বিশ্লেষণের উপর ভিত্তি করে এবং তিনটি মূল ওসিলারেটর (হুঁশিয়ারি ওসিলার, ভয় ওসিলার এবং লোভী ওসিলার) দ্বারা বাজার মনোবিজ্ঞানকে পরিমাণে পরিমাপ করে। এই কৌশলটি গতিশীলতা এবং প্রবণতা সূচকগুলিকে সংহত করে এবং একটি সম্পূর্ণ ট্রেডিং সিস্টেম তৈরি করার জন্য ট্র্যাডিশনাল কনফার্মেশনকে সংযুক্ত করে। এই কৌশলটি এমন ব্যবসায়ীদের জন্য উপযুক্ত যারা বাজারের আবেগ বিশ্লেষণের মাধ্যমে উচ্চ সম্ভাব্যতার ব্যবসায়ের সুযোগগুলি সনাক্ত করতে চান।

কৌশল নীতি

এই কৌশলটির মূল উদ্দেশ্য হল তিনটি আবেগের ওসিলার তৈরি করা, যা বিভিন্ন ফ্রেমওয়ার্ক বিশ্লেষণ করে তৈরি করা হয়ঃ

  1. দ্বিধা ওসিলারেটর - ক্রস স্টার এবং টরোসোলের মাধ্যমে বাজারের অনিশ্চয়তা পরিমাপ করা
  2. ভয়ের ওসিলার - উড়ন্ত গ্রহাণু, উঁচু লাইন এবং নিমজ্জিত রূপের মাধ্যমে শূন্য অনুভূতি ট্র্যাক করে
  3. লোভী ওসিলারেটর - শূন্য মাথা সূর্যের রশ্মি, নাকের রেখা, তরমুজ গ্রাসকারী এবং সাদা সৈন্যদের দ্বারা বহু মাথাযুক্ত আবেগ সনাক্ত করে

এই তিনটি ওসিলিয়েটরের গড় মান হল ক্রেডিট ইমোশনাল ইনডেক্স (CEI) । যখন CEI বিভিন্ন থ্রেশহোল্ড অতিক্রম করে তখন এটি একটি পল্টু ট্রেডিং সিগন্যাল ট্রিগার করে এবং এটি ট্রেডিং ভলিউম দ্বারা নিশ্চিত করা হয়।

কৌশলগত সুবিধা

  1. আবেগ বিশ্লেষণের পদ্ধতিগতকরণ - পরিমাণগত ক্যাটাগরির মাধ্যমে বিষয়গত বিশ্লেষণকে বস্তুনিষ্ঠ পরিমাপে রূপান্তর করা
  2. ভাল ঝুঁকি ব্যবস্থাপনা - সর্বোচ্চ পজিশনের মেয়াদ, স্টপ লস এবং কুলিং পিরিয়ডের মতো ব্যবস্থা
  3. নমনীয় পুনরুদ্ধারের প্রক্রিয়া - যখন ট্রেডিং ক্ষতিগ্রস্থ হয়, কৌশলটি ভারসাম্য ব্রেকিংয়ের মাধ্যমে পুনরুদ্ধার করার চেষ্টা করে
  4. মাল্টি-মার্কেট প্রযোজ্যতা - শেয়ার, ফরেক্স এবং ক্রিপ্টোকারেন্সির মতো একাধিক বাজারে প্রযোজ্য
  5. উচ্চ সংকেত নির্ভরযোগ্যতা - ট্রান্সমিশন নিশ্চিতকরণ এবং একাধিক প্রযুক্তিগত সূচক যাচাইকরণের মাধ্যমে নির্ভুলতা বাড়ানো

কৌশলগত ঝুঁকি

  1. প্যারামিটার সংবেদনশীলতা - বিভিন্ন প্রকারের থ্রেশহোল্ডের জন্য সেটিংগুলি পরীক্ষা এবং অপ্টিমাইজ করার প্রয়োজন
  2. বাজার পরিস্থিতির উপর নির্ভরশীলতা - অস্থির বাজারে ভুল সংকেত হতে পারে
  3. স্লাইড পয়েন্ট ঝুঁকি - কম তরল বাজারে সম্ভাব্য কার্যকর ঝুঁকি
  4. অতিরিক্ত লেনদেনের ঝুঁকি - ঘন ঘন লেনদেন এড়াতে যুক্তিসঙ্গত শীতল সময় নির্ধারণ করা প্রয়োজন
  5. সিস্টেমিক ঝুঁকি - বড় বাজার ইভেন্টে বড় ক্ষতির সম্ভাবনা

কৌশল অপ্টিমাইজেশনের দিকনির্দেশনা

  1. ডায়নামিক হ্রাস - বাজারের অস্থিরতার উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে বিভিন্ন হ্রাসকে সামঞ্জস্য করে
  2. বাজার অবস্থার শ্রেণিবিন্যাস - প্রবণতা এবং অস্থিরতা বাজার সনাক্তকরণের প্রক্রিয়া
  3. মেশিন লার্নিং অপ্টিমাইজেশন - মেশিন লার্নিং অ্যালগরিদম ব্যবহার করে প্যারামিটার প্যারেন্টার অপ্টিমাইজ করুন
  4. ঝুঁকি ব্যবস্থাপনা উন্নত - তহবিল ব্যবস্থাপনা এবং অবস্থান নিয়ন্ত্রণ মডিউল যোগ করা হয়েছে
  5. সিগন্যাল ফিল্টারিং - ভুয়া সংকেত ফিল্টার করার জন্য আরও প্রযুক্তিগত পরিমাপ একত্রিত করা

সারসংক্ষেপ

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

কৌশল সোর্স কোড
/*backtest
start: 2024-03-09 18:40:00
end: 2025-02-19 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/

//@version=6
strategy("Candle Emotion Index Strategy", shorttitle="CEI Strategy", overlay=true)

// User Inputs
length = input.int(14, title="Lookback Period", minval=1)
dojiThreshold = input.float(0.1, title="Doji Threshold", minval=0.01, maxval=0.5)
spinningTopThreshold = input.float(0.3, title="Spinning Top Threshold", minval=0.1, maxval=0.5)
shootingStarThreshold = input.float(0.5, title="Shooting Star Threshold", minval=0.1, maxval=1.0)
hangingManThreshold = input.float(0.5, title="Hanging Man Threshold", minval=0.1, maxval=1.0)
engulfingThreshold = input.float(0.5, title="Engulfing Threshold", minval=0.1, maxval=1.0)
marubozuThreshold = input.float(0.9, title="Marubozu Threshold", minval=0.5, maxval=1.0)
hammerThreshold = input.float(0.5, title="Hammer Threshold", minval=0.1, maxval=1.0)
threeWhiteSoldiersThreshold = input.float(0.5, title="Three White Soldiers Threshold", minval=0.1, maxval=1.0)

// Volume Multiplier Input
volumeMultiplier = input.float(1.5, title="Volume Multiplier", minval=1.0)

// Cooldown Period Input
cooldownPeriod = input.int(10, title="Cooldown Period (Candles)", minval=1)

// Maximum Holding Period Inputs
maxHoldingPeriod = input.int(20, title="Maximum Holding Period (Candles)", minval=1)
lossHoldingPeriod = input.int(10, title="Loss Exit Holding Period (Candles)", minval=1)
lossThreshold = input.float(0.02, title="Loss Threshold (as % of Entry Price)", minval=0.01, maxval=1.0)

// --- Indecision Oscillator Functions ---
isDoji(open, close, high, low, threshold) =>
    bodySize = math.abs(close - open)
    rangeSize = high - low
    bodySize / rangeSize < threshold

isSpinningTop(open, close, high, low, threshold) =>
    bodySize = math.abs(close - open)
    rangeSize = high - low
    bodySize / rangeSize < threshold and bodySize / rangeSize >= dojiThreshold

indecisionOscillator() =>
    var float dojiScore = 0.0
    var float spinningTopScore = 0.0
    for i = 1 to length
        if isDoji(open[i], close[i], high[i], low[i], dojiThreshold)
            dojiScore := dojiScore + 1.0
        if isSpinningTop(open[i], close[i], high[i], low[i], spinningTopThreshold)
            spinningTopScore := spinningTopScore + 1.0
    dojiScore := dojiScore / length
    spinningTopScore := spinningTopScore / length
    (dojiScore + spinningTopScore) / 2

// --- Fear Oscillator Functions ---
isShootingStar(open, close, high, low, threshold) =>
    bodySize = math.abs(close - open)
    upperWick = high - math.max(open, close)
    lowerWick = math.min(open, close) - low
    upperWick / bodySize > threshold and lowerWick < bodySize

isHangingMan(open, close, high, low, threshold) =>
    bodySize = math.abs(close - open)
    upperWick = high - math.max(open, close)
    lowerWick = math.min(open, close) - low
    lowerWick / bodySize > threshold and upperWick < bodySize

isBearishEngulfing(open, close, openPrev, closePrev, threshold) =>
    bodySize = math.abs(close - open)
    prevBodySize = math.abs(closePrev - openPrev)
    close < openPrev and open > closePrev and bodySize / prevBodySize > threshold

fearOscillator() =>
    var float shootingStarScore = 0.0
    var float hangingManScore = 0.0
    var float engulfingScore = 0.0
    for i = 1 to length
        if isShootingStar(open[i], close[i], high[i], low[i], shootingStarThreshold)
            shootingStarScore := shootingStarScore + 1.0
        if isHangingMan(open[i], close[i], high[i], low[i], hangingManThreshold)
            hangingManScore := hangingManScore + 1.0
        if isBearishEngulfing(open[i], close[i], open[i+1], close[i+1], engulfingThreshold)
            engulfingScore := engulfingScore + 1.0
    shootingStarScore := shootingStarScore / length
    hangingManScore := hangingManScore / length
    engulfingScore := engulfingScore / length
    (shootingStarScore + hangingManScore + engulfingScore) / 3

// --- Greed Oscillator Functions ---
isMarubozu(open, close, high, low, threshold) =>
    bodySize = math.abs(close - open)
    totalRange = high - low
    bodySize / totalRange > threshold

isHammer(open, close, high, low, threshold) =>
    bodySize = math.abs(close - open)
    lowerWick = math.min(open, close) - low
    upperWick = high - math.max(open, close)
    lowerWick / bodySize > threshold and upperWick < bodySize

isBullishEngulfing(open, close, openPrev, closePrev, threshold) =>
    bodySize = math.abs(close - open)
    prevBodySize = math.abs(closePrev - openPrev)
    close > openPrev and open < closePrev and bodySize / prevBodySize > threshold

isThreeWhiteSoldiers(open, close, openPrev, closePrev, openPrev2, closePrev2, threshold) =>
    close > open and closePrev > openPrev and closePrev2 > openPrev2 and close > closePrev and closePrev > closePrev2

greedOscillator() =>
    var float marubozuScore = 0.0
    var float hammerScore = 0.0
    var float engulfingScore = 0.0
    var float soldiersScore = 0.0
    for i = 1 to length
        if isMarubozu(open[i], close[i], high[i], low[i], marubozuThreshold)
            marubozuScore := marubozuScore + 1.0
        if isHammer(open[i], close[i], high[i], low[i], hammerThreshold)
            hammerScore := hammerScore + 1.0
        if isBullishEngulfing(open[i], close[i], open[i+1], close[i+1], engulfingThreshold)
            engulfingScore := engulfingScore + 1.0
        if isThreeWhiteSoldiers(open[i], close[i], open[i+1], close[i+1], open[i+2], close[i+2], threeWhiteSoldiersThreshold)
            soldiersScore := soldiersScore + 1.0
    marubozuScore := marubozuScore / length
    hammerScore := hammerScore / length
    engulfingScore := engulfingScore / length
    soldiersScore := soldiersScore / length
    (marubozuScore + hammerScore + engulfingScore + soldiersScore) / 4

// --- Final Calculations ---
indecision = indecisionOscillator()
fear = fearOscillator()
greed = greedOscillator()

// Calculate the average of the three oscillators
averageOscillator = (indecision + fear + greed) / 3

// --- Combined Strategy Logic ---
var float entryPriceLong = na
var float entryPriceShort = na
var int holdingPeriodLong = 0
var int holdingPeriodShort = 0
var int cooldownCounter = 0

// Buy Signal Logic for Long and Short
longBuySignal = ta.crossover(averageOscillator, 0.1)
shortBuySignal = ta.crossover(averageOscillator, 0.2)

// Calculate average volume over the lookback period
avgVolume = ta.sma(volume, length)

// Take Profit Conditions
longTakeProfitCondition = close > open and volume > avgVolume * volumeMultiplier
shortTakeProfitCondition = close < open and volume > avgVolume * volumeMultiplier

// Buy Logic for Long Positions
if longBuySignal and strategy.position_size == 0 and cooldownCounter <= 0
    entryPriceLong := close
    strategy.entry("Long Entry", strategy.long)
    cooldownCounter := cooldownPeriod
    holdingPeriodLong := 0

// Increment holding period if in a long position
if strategy.position_size > 0
    holdingPeriodLong := holdingPeriodLong + 1

// Sell Logic for Long Positions
if longTakeProfitCondition and strategy.position_size > 0 and close > entryPriceLong
    strategy.close_all()
    cooldownCounter := cooldownPeriod

if holdingPeriodLong >= maxHoldingPeriod and strategy.position_size > 0 and close >= entryPriceLong
    strategy.close_all()
    cooldownCounter := cooldownPeriod

if holdingPeriodLong >= lossHoldingPeriod and strategy.position_size > 0 and close < entryPriceLong * (1 - lossThreshold)
    strategy.close_all()
    cooldownCounter := cooldownPeriod

// Short Logic for Short Positions
if shortBuySignal and strategy.position_size == 0 and cooldownCounter <= 0
    entryPriceShort := close
    strategy.entry("Short Entry", strategy.short)
    cooldownCounter := cooldownPeriod
    holdingPeriodShort := 0

// Increment holding period if in a short position
if strategy.position_size < 0
    holdingPeriodShort := holdingPeriodShort + 1

// Cover Logic for Short Positions
if shortTakeProfitCondition and strategy.position_size < 0 and close < entryPriceShort
    strategy.close_all()
    cooldownCounter := cooldownPeriod

if holdingPeriodShort >= maxHoldingPeriod and strategy.position_size < 0 and close <= entryPriceShort
    strategy.close_all()
    cooldownCounter := cooldownPeriod

if holdingPeriodShort >= lossHoldingPeriod and strategy.position_size < 0 and close > entryPriceShort * (1 + lossThreshold)
    strategy.close_all()
    cooldownCounter := cooldownPeriod

// Decrement the cooldown counter each candle
if cooldownCounter > 0
    cooldownCounter := cooldownCounter - 1