চলমান গড় ক্রসওভার কৌশল

লেখক:চাওঝাং, তারিখ: ২০২৩-১০-২৪ ১৬ঃ৩৯ঃ৪০
ট্যাগঃ

img

সারসংক্ষেপ

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

কৌশলগত যুক্তি

কৌশলটি মূলত স্বল্পমেয়াদী এবং দীর্ঘমেয়াদী সহজ চলমান গড় গণনা করে এবং তাদের ক্রসওভারের ভিত্তিতে প্রবণতার দিক নির্ধারণ করে।

বিশেষ করে, এটি প্রথমে স্বল্পমেয়াদী চলমান গড় xMA এবং দীর্ঘমেয়াদী চলমান গড় গণনা করে, যেখানে স্বল্পমেয়াদী সময়কাল Len এবং দীর্ঘমেয়াদী সময়কাল 2*Len।

তারপর এটি স্বল্পমেয়াদী এমএ দীর্ঘমেয়াদী এমএ এর উপরে ক্রস করে কিনা তা পরীক্ষা করে এবং ক্রসওভার হলে একটি দীর্ঘ সংকেত তৈরি করে। এটি স্বল্পমেয়াদী এমএ দীর্ঘমেয়াদী এমএ এর নীচে ক্রস করে কিনা তাও পরীক্ষা করে এবং ক্রসওভার হলে একটি সংক্ষিপ্ত সংকেত তৈরি করে।

লং সিগন্যাল পাওয়ার পর, যদি কোন পজিশন না থাকে তবে এটি বাজার মূল্যে লং পজিশন খোলে।

উপরন্তু, স্টপ লস এবং লাভের পয়েন্টগুলি কনফিগার করা হয়। লং ট্রেডগুলির জন্য, স্টপ লস প্রবেশের মূল্যে সেট করা হয় - স্টপ লস শতাংশ * প্রবেশের মূল্য, এবং প্রবেশের মূল্যে লাভ নিন + লাভের শতাংশ নিন * প্রবেশের মূল্য। শর্ট ট্রেডগুলির জন্য, স্টপ লস প্রবেশের মূল্যে সেট করা হয় + স্টপ লস শতাংশ * প্রবেশের মূল্য, এবং প্রবেশের মূল্যে লাভ নিন - লাভের শতাংশ নিন * প্রবেশের মূল্য।

অবশেষে, প্রবণতা নির্ধারণে সহায়তা করার জন্য ভিজ্যুয়ালাইজেশনের জন্য চলমান গড়গুলি প্লট করা হয়।

সুবিধা

  • সহজ এবং সহজেই বোঝা যায়, নতুনদের জন্য উপযুক্ত।

  • মুভিং মিডিয়ার ক্রসওভারের ভিত্তিতে বাজারের প্রবণতা কার্যকরভাবে ট্র্যাক করতে পারে।

  • স্টপ লস এবং লাভ নেওয়ার মাধ্যমে ঝুঁকি নিয়ন্ত্রণ করা হয়।

  • চলমান গড়ের ভিজ্যুয়ালাইজেশন প্রবণতা পরিবর্তনকে স্বজ্ঞাতভাবে প্রতিফলিত করে।

ঝুঁকি

  • মুভিং মিডিয়ার পিছনের প্রভাব রয়েছে, যা সেরা এন্ট্রি পয়েন্টগুলি মিস করার কারণ হতে পারে।

  • ভুল স্টপ লস কনফিগারেশনের ফলে স্টপগুলি খুব প্রশস্ত বা খুব শক্ত হতে পারে।

  • দামের ঝাঁকুনি মিথ্যা সংকেত সৃষ্টি করতে পারে।

  • শুধুমাত্র চলমান গড় সময়ের উপর ভিত্তি করে অপ্টিমাইজেশন অতিরিক্ত ফিটিংয়ের দিকে পরিচালিত করতে পারে।

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

অপ্টিমাইজেশান নির্দেশাবলী

  • মিথ্যা সংকেত এড়াতে ফিল্টারিংয়ের জন্য MACD, KDJ এর মতো অন্যান্য সূচক যুক্ত করুন।

  • সর্বোত্তম পরামিতি খুঁজে পেতে স্বল্প এবং দীর্ঘ চলমান গড় সময়ের সমন্বয়কে অনুকূল করুন।

  • ট্রেইলিং স্টপ এর মত বিভিন্ন স্টপ লস/টেক প্রফিট কৌশল পরীক্ষা করুন।

  • মূলধন ব্যবহারের অপ্টিমাইজেশান করার জন্য পজিশন সাইজিং যোগ করুন।

সংক্ষিপ্তসার

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


/*backtest
start: 2023-09-23 00:00:00
end: 2023-10-23 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@strategy_alert_message {{strategy.order.alert_message}} 
////////////////////////////////////////////////////////////
//  Copyright by HPotter v2.0 19/09/2023
// MA Crossover Bot for OKX Exchange
////////////////////////////////////////////////////////////
var ALERTGRP_CRED = "entry"
signalToken = input("", "Signal Token", inline = "11", group = ALERTGRP_CRED)
OrderType = input.string("market", "Order Type", options = ["market", "limit"], inline = "21", group = ALERTGRP_CRED)
OrderPriceOffset = input.float(0, "Order Price Offset", minval = 0, maxval = 100, step = 0.01, inline = "21", group = ALERTGRP_CRED)
InvestmentType = input.string("percentage_balance", "Investment Type", options = ["margin", "contract", "percentage_balance", "percentage_investment"], inline = "31", group = ALERTGRP_CRED)
Amount = input.float(100, "Amount", minval = 0.01, inline = "31", group = ALERTGRP_CRED)

getAlertMsg(action, instrument, signalToken, orderType, orderPriceOffset, investmentType, amount) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    //str := str + '"timestamp": "' + str.format_time(timenow, "yyyy-MM-dd'T'HH:mm:ssZ", "UTC+0") + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '"orderType": "' + orderType + '", '
    str := str + '"orderPriceOffset": "' + str.tostring(orderPriceOffset) + '", '
    str := str + '"investmentType": "' + investmentType + '", '
    str := str + '"amount": "' + str.tostring(amount) + '"'
    str := str + '}'
    str

getOrderAlertMsgExit(action, instrument, signalToken) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '}'
    str

strategy(title='OKX: MA Crossover', overlay=true)
Len = input(13)
Profit = input.float(7, title='Take Profit %', minval=0.01) / 100
Stop =  input.float(7, title='Stop Loss %', minval=0.01) / 100
xMA = ta.sma(close, Len)
//Robot State
isLong = strategy.position_size > 0 
isShort = strategy.position_size < 0 
isFlat = strategy.position_size == 0 
//Current Signal
doLong = low < xMA[1] ? true : false
doShort =   high > xMA[1] ? true:  false
//Backtest Start Date
tm =  timestamp(2022, 01, 01, 09, 30)
//Entry and exit orders
if  doLong[2] == false and isLong == false and doLong and time > tm
    strategy.cancel_all()
    buyAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_LONG', instrument = syminfo.ticker, signalToken = signalToken)
    buyAlertMsg = getAlertMsg(action = 'ENTER_LONG', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Long', strategy.long, limit = close, comment='Long', alert_message =buyAlertMsg)
    strategy.exit("ExitLong", 'Long', stop=close - close * Stop  , limit = close + close * Profit , qty_percent = 100, alert_message = buyAlertMsgExit)  
if doShort[2] == false and isShort == false and doShort and time > tm
    strategy.cancel_all()
    sellAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_SHORT', instrument = syminfo.ticker, signalToken = signalToken)
    sellAlertMsg = getAlertMsg(action = 'ENTER_SHORT', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Short', strategy.short, limit=close, comment='Short', alert_message = sellAlertMsg)
    strategy.exit("ExitShort", 'Short', stop=close + close * Stop  , limit = close - close * Profit  , qty_percent = 100, alert_message = sellAlertMsgExit)  
//Visual
barcolor(isShort  ? color.red : isLong ? color.green : color.blue)
plot(xMA, color=color.new(color.red, 0), title='MA')

আরো