
EMA গড় মূল্যের রিটার্ন ট্রেডিং কৌশল হল একটি ট্রেডিং কৌশল যেখানে পজিশন খোলার এবং পজিশন অপারেশন করার জন্য গড় লাইন থেকে দামের দূরত্বের উপর ভিত্তি করে। এটি পজিশন খোলার সংকেত হিসাবে EMA গড় লাইন থেকে বর্তমান দামের শতাংশের পার্থক্য ব্যবহার করে এবং পজিশন পরিচালনার জন্য স্টপ লস ট্র্যাকিং ব্যবহার করে।
এই কৌশলটি ইএমএকে গড়রেখার সূচক হিসাবে ব্যবহার করে এবং বর্তমান দামের থেকে ইএমএর শতকরা পার্থক্য গণনা করে। যখন দাম ইএমএর কাছ থেকে যথেষ্ট দূরে থাকে (ডিফল্ট 9%) তখন আরও বেশি পজিশন খোলা হয়; যখন দাম ইএমএর কাছাকাছি থাকে (ডিফল্ট 1%) তখন পজিশন বন্ধ করে দেওয়া হয়। পজিশন খোলার পরে, এটি লাভের জন্য লক করার জন্য অপারেটিং স্টপ লস ব্যবহার করে এবং লাভের সাথে সাথে স্টপ লসকে ধীরে ধীরে বাড়িয়ে দেয়।
বিশেষ করে, কৌশলটিতে নিম্নলিখিত উপাদানগুলি অন্তর্ভুক্ত রয়েছেঃ
EMA গড় রেখা গণনা করুন। আপনি সময়কাল কনফিগার করতে পারেন (ডিফল্ট 200), ডেটা উত্স (ক্লোজ-আউট মূল্য), গণনা পদ্ধতি (EMA, SMA, RMA, WMA) ।
EMA থেকে বর্তমান মূল্যের শতকরা পার্থক্য গণনা করুন।
ব্যবধানের অনুপাত অনুসারে পজিশন খোলার
ভলিউম খোলার জন্য সমর্থন. ভলিউম এবং প্রতিটি স্তরের সংখ্যা কনফিগার করা যেতে পারে।
পজিশন খোলার পর ট্র্যাকিং স্টপ কনফিগার করা যায় স্টপ লস থ্রেশহোল্ড ((ডিফল্ট মুনাফা 1%) এবং ট্র্যাকিং প্রশস্ততা ((ডিফল্ট 1%)
ফাঁক অনুপাতের উপর ভিত্তি করে প্লেইন পজিশন. মাল্টি পজিশন প্লেইন পজিশনের থ্রেশহোল্ডটি 1% ((কনফিগার করা যায়), খালি পজিশন একই রকম।
অর্ডার প্রত্যাহারঃ অর্ডার প্রত্যাহার করা হবে যখন দাম EMA-র কাছাকাছি আসবে।
কনফিগারযোগ্য স্টপ লস শতাংশ
রিটার্ন এবং রিয়েল-টাইম লেনদেন সমর্থন করে।
এই কৌশলটির সুবিধাগুলো হলঃ
গড়রেখার প্রত্যাবর্তন ধারণা ব্যবহার করে, যখন দাম গড়রেখার বাইরে চলে যায় তখন পজিশন খোলে, যখন ফিরে আসে তখন প্লেইন পজিশন, প্রবণতা ট্রেডিং তত্ত্বের সাথে সামঞ্জস্যপূর্ণ।
পজিশন খোলার, স্টপ লস এবং পজিশন ক্লিয়ার করার পরামিতিগুলি বিভিন্ন বাজারের পরিবেশের সাথে খাপ খাইয়ে নিতে পারে।
এই প্রকল্পের মাধ্যমে, একক খরচ কমানো সম্ভব।
অপারেশনাল স্টপ লস লাভের জন্য এবং ঝুঁকি পরিচালনার জন্য ব্যবহার করা হয়।
অপ্টিমাইজেশনের জন্য প্রচুর জায়গা রয়েছে, আপনি গড় লাইন প্যারামিটারগুলি সামঞ্জস্য করতে পারেন বা বিভিন্ন পরিস্থিতিতে খোলার পজিশনের ফাঁকটি সামঞ্জস্য করতে পারেন।
মূলধারার প্রোগ্রামিং ভাষা পাইন স্ক্রিপ্ট সমর্থন করে, যা সরাসরি ট্রেডিংভিউতে ব্যবহার করা যেতে পারে।
ছবির মাধ্যমে, আপনি দেখতে পারেন যে, আপনি কোন বিষয়ের উপর কাজ করছেন।
এই কৌশলটি নিম্নলিখিত ঝুঁকিগুলিও বহন করেঃ
ফিটনেস ডেটা ফিটনেস ঝুঁকি। প্যারামিটার অপ্টিমাইজেশানগুলি ফিটনেস ডেটাতে অতিরিক্ত ফিট হতে পারে, রিয়েল-ডিস্কের কার্যকারিতা সন্দেহজনক।
গড়রেখার বিপর্যয়ের ঝুঁকি। দাম দীর্ঘমেয়াদী গড়রেখার বাইরে চলে যেতে পারে এবং ফিরে আসতে পারে না।
স্টপ লস (Stop Loss) -এর ঝুঁকি অতিক্রম করা যায়।
লেনদেন ঘন ঘন হয় এবং লেনদেনের খরচ বেশি হয়।
এর জন্য দীর্ঘ পর্যবেক্ষণের প্রয়োজন হয়, এবং জরুরী পরিস্থিতিতে এর প্রভাব বেশি।
সংশ্লিষ্ট ঝুঁকি ব্যবস্থাপনাঃ
অনেক প্যারামিটার সমন্বয় করা হয়, যাতে নিশ্চিত করা যায় যে প্যারামিটারগুলি স্থিতিশীল।
যুক্তিসঙ্গতভাবে কনফিগার করা সমান্তরাল চক্র, খুব ছোট বা খুব দীর্ঘ হতে পারে না
স্ট্যাম্প ল্যাম্পেজকে যথাযথভাবে প্রশস্ত করুন, যাতে এটি বন্ধ না হয়।
পজিশন খোলার শর্তাবলী যথাযথভাবে শিথিল করা এবং লেনদেনের ঘনত্ব হ্রাস করা।
এর সাথে আরও কিছু সূচক যুক্ত করা হয়েছে, যা জরুরী অবস্থার প্রতিরোধ ক্ষমতা বাড়িয়ে তুলবে।
এই কৌশলটি নিম্নলিখিত দিকগুলিতে উন্নত করা যেতে পারেঃ
ট্রেডিং ভলিউম, বুলিন ব্যান্ড, আরএসআই ইত্যাদির মতো সূচকগুলিকে ফিল্টার করার জন্য অতিরিক্ত শর্তগুলি যুক্ত করা হয়েছে, যা মিথ্যা সংকেত হ্রাস করে।
ডাবল ইএমএ সিস্টেমের মতো সমন্বিত গড় লাইন যুক্ত করুন, যা বিপরীতমুখী লেনদেনের সম্ভাবনা বাড়িয়ে তুলবে।
অপ্টিমাইজ করা স্টপ লস কৌশল যেমন, স্বনির্ধারিত স্টপ লস, চ্যান্ডেলিয়ার এক্সট ইত্যাদি, যা ঝুঁকিকে আরও সীমাবদ্ধ করে।
স্বয়ংক্রিয় প্যারামিটার অপ্টিমাইজেশান বৈশিষ্ট্য যোগ করা হয়েছে, স্বয়ংক্রিয়ভাবে আরও ভাল প্যারামিটার সমন্বয় খুঁজছেন।
মেশিন লার্নিং ভবিষ্যদ্বাণী বৃদ্ধি করে, যা মূল্যের গড় থেকে বেরিয়ে যাওয়ার সম্ভাবনা নির্ধারণে সহায়তা করে।
সময়সীমার মধ্যে লেনদেনের কথা ভাবুন, রাতের বা প্রাক-প্লেস তথ্য ব্যবহার করে অগ্রিম লেনদেন করুন।
ইন্টিগ্রেটেড স্টক পুল, স্বয়ংক্রিয়ভাবে স্টক নির্বাচন এবং ট্রেডিং, কৌশল ক্ষমতা প্রসারিত করুন।
ইএমএ হল একটি প্রবণতা অনুসরণকারী কৌশল যা মূল্যের গড় রেখার রিটার্ন বৈশিষ্ট্যগুলির উপর ভিত্তি করে। এটি প্রবণতা ঘুরিয়ে দেওয়ার জন্য এবং ঝুঁকি নিয়ন্ত্রণের জন্য স্টপ লস ব্যবহার করে। এটি প্রচলিত গড় রেখার ট্রেডিং কৌশলগুলির তুলনায় গতিশীল স্টপ লস ট্র্যাকিংয়ের দিকে বেশি মনোযোগ দেয়, স্থির পজিশন খোলার পরিবর্তে। এই কৌশলটি প্রবণতা অনুসরণকারী কৌশল পোর্টফোলিওকে সমৃদ্ধ করতে পারে, তবে অপ্টিমাইজেশনের সমস্যাগুলি পর্যবেক্ষণ করতে হবে এবং ট্রেডিং ফ্রিকোয়েন্সি নিয়ন্ত্রণ করতে হবে। যদি আপনি স্টপ লস প্রক্রিয়াটি অপ্টিমাইজ করতে এবং পজিশন খোলার গুণমান উন্নত করতে পারেন তবে এটি আরও কার্যকর হতে পারে।
/*backtest
start: 2022-10-19 00:00:00
end: 2023-10-25 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © jordanfray
//@version=5
strategy(title="EMA Mean Reversion Strategy", overlay=true, max_bars_back=5000, default_qty_type=strategy.percent_of_equity, default_qty_value=100,initial_capital=100000, commission_type=strategy.commission.percent, commission_value=0.05, backtest_fill_limits_assumption=2)
// Indenting Classs
indent_1 = " "
indent_2 = " "
indent_3 = " "
indent_4 = " "
// Tooltips
longEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, a long postion will open."
shortEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, a short postion will open."
closeEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, open postion will close."
ladderInToolTip = "Enable this to use the laddering settings below."
cancelEntryToolTip = "When the percentage that the price is away from the selected EMA reaches this point, any unfilled entries will be canceled."
// Group Titles
group_one_title = "EMA Settings"
group_two_title = "Entry Settings"
// Colors
blue = color.new(#00A5FF,0)
lightBlue = color.new(#00A5FF,90)
green = color.new(#2DBD85,0)
gray_80 = color.new(#7F7F7F,80)
gray_60 = color.new(#7F7F7F,60)
gray_40 = color.new(#7F7F7F,40)
white = color.new(#ffffff,0)
red = color.new(#E02A4A,0)
transparent = color.new(#000000,100)
// Strategy Settings
EMAtimeframe = input.timeframe(defval="", title="Timeframe", group=group_one_title)
EMAlength = input.int(defval=200, minval=1, title="Length", group=group_one_title)
EMAtype = input.string(defval="EMA", options = ["EMA", "SMA", "RMA", "WMA"], title="Type", group=group_one_title)
EMAsource = input.source(defval=close, title="Source", group=group_one_title)
openLongEntryAbove = input.float(defval=9, title="Long Position Entry Trigger", tooltip=longEntryToolTip, group=group_two_title)
openEntryEntryAbove = input.float(defval=9, title="Short Position Entry Trigger", tooltip=shortEntryToolTip, group=group_two_title)
closeEntryBelow = input.float(defval=1.0, title="Close Position Trigger", tooltip=closeEntryToolTip, group=group_two_title)
cancelEntryBelow = input.float(defval=4, title="Cancel Unfilled Entries Trigger", tooltip=cancelEntryToolTip, group=group_two_title)
enableLaddering = input.bool(defval=true, title="Ladder Into Positions", tooltip=ladderInToolTip, group=group_two_title)
ladderRungs = input.int(defval=4, minval=2, maxval=4, step=1, title=indent_4+"Ladder Rungs", group=group_two_title)
ladderStep = input.float(defval=.5, title=indent_4+"Ladder Step (%)", step=.1, group=group_two_title)/100
stop_loss_val = input.float(defval=4.0, title="Stop Loss (%)", step=0.1, group=group_two_title)/100
start_trailing_after = input.float(defval=1, title="Start Trailing After (%)", step=0.1, group=group_two_title)/100
trail_behind = input.float(defval=1, title="Trail Behind (%)", step=0.1, group=group_two_title)/100
// Calculate trailing stop values
long_start_trailing_val = strategy.position_avg_price + (strategy.position_avg_price * start_trailing_after)
long_trail_behind_val = close - (strategy.position_avg_price * trail_behind)
long_stop_loss = strategy.position_avg_price * (1.0 - stop_loss_val)
short_start_trailing_val = strategy.position_avg_price - (strategy.position_avg_price * start_trailing_after)
short_trail_behind_val = close + (strategy.position_avg_price * trail_behind)
short_stop_loss = strategy.position_avg_price * (1 + stop_loss_val)
// Calulate EMA
EMA = switch EMAtype
"EMA" => ta.ema(EMAsource, EMAlength)
"SMA" => ta.sma(EMAsource, EMAlength)
"RMA" => ta.rma(EMAsource, EMAlength)
"WMA" => ta.wma(EMAsource, EMAlength)
=> na
EMA_ = EMAtimeframe == timeframe.period ? EMA : request.security(syminfo.ticker, EMAtimeframe, EMA[1], lookahead = barmerge.lookahead_on)
plot(EMA_, title="EMA", linewidth=2, color=blue, editable=true)
EMA_cloud_upper_band_val = EMA_ + (EMA_ * openLongEntryAbove/100)
EMA_cloud_lower_band_val = EMA_ - (EMA_ * openLongEntryAbove/100)
EMA_cloud_upper_band = plot(EMA_cloud_upper_band_val, title="EMA Cloud Upper Band", color=blue)
EMA_cloud_lower_band = plot(EMA_cloud_lower_band_val, title="EMA Cloud Upper Band", color=blue)
fill(EMA_cloud_upper_band, EMA_cloud_lower_band, editable=false, color=lightBlue)
distance_from_EMA = ((close - EMA_)/close)*100
if distance_from_EMA < 0
distance_from_EMA := distance_from_EMA * -1
// Calulate Ladder Entries
long_ladder_1_limit_price = close - (close * 1 * ladderStep)
long_ladder_2_limit_price = close - (close * 2 * ladderStep)
long_ladder_3_limit_price = close - (close * 3 * ladderStep)
long_ladder_4_limit_price = close - (close * 4 * ladderStep)
short_ladder_1_limit_price = close + (close * 1 * ladderStep)
short_ladder_2_limit_price = close + (close * 2 * ladderStep)
short_ladder_3_limit_price = close + (close * 3 * ladderStep)
short_ladder_4_limit_price = close + (close * 4 * ladderStep)
var position_qty = strategy.equity/close
if enableLaddering
position_qty := (strategy.equity/close) / ladderRungs
else
position_qty := strategy.equity/close
plot(position_qty, color=white)
//plot(strategy.equity, color=green)
// Entry Conditions
currently_in_a_postion = strategy.position_size != 0
currently_in_a_long_postion = strategy.position_size > 0
currently_in_a_short_postion = strategy.position_size < 0
average_price = strategy.position_avg_price
bars_since_entry = currently_in_a_postion ? bar_index - strategy.opentrades.entry_bar_index(strategy.opentrades - 1) + 1 : 5
long_run_up = ta.highest(high, bar_index == 0 ? 5000: bars_since_entry)
long_run_up_line = plot(long_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? green : transparent)
start_trailing_long_entry = currently_in_a_long_postion and long_run_up > long_start_trailing_val
long_trailing_stop = start_trailing_long_entry ? long_run_up - (long_run_up * trail_behind) : long_stop_loss
long_trailing_stop_line = plot(long_trailing_stop, style=plot.style_stepline, editable=false, color=currently_in_a_long_postion ? long_trailing_stop > strategy.position_avg_price ? green : red : transparent)
short_run_up = ta.lowest(low, bar_index == 0 ? 5000: bars_since_entry)
short_run_up_line = plot(short_run_up, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? green : transparent)
start_trailing_short_entry = currently_in_a_short_postion and short_run_up < short_start_trailing_val
short_trailing_stop = start_trailing_short_entry ? short_run_up + (short_run_up * trail_behind) : short_stop_loss
short_trailing_stop_line = plot(short_trailing_stop, style=plot.style_stepline, editable=false, color=currently_in_a_short_postion ? short_trailing_stop < strategy.position_avg_price ? green : red : transparent)
long_conditions_met = distance_from_EMA > openLongEntryAbove and close < EMA_ and not currently_in_a_postion
short_conditions_met = distance_from_EMA > openEntryEntryAbove and close > EMA_ and not currently_in_a_postion
close_long_entries = distance_from_EMA <= closeEntryBelow or close <= long_trailing_stop
close_short_entries = distance_from_EMA <= closeEntryBelow or close >= short_trailing_stop
cancel_entries = distance_from_EMA <= cancelEntryBelow
plotshape(long_conditions_met ? close : na, style=shape.diamond, title="Long Conditions Met" )
plotshape(short_conditions_met ? close : na, style=shape.diamond, title="Short Conditions Met" )
plot(average_price,style=plot.style_stepline, editable=false, color=currently_in_a_postion ? blue : transparent)
// Long Entry
if enableLaddering
if ladderRungs == 2
strategy.entry(id="Long Ladder 1", direction=strategy.long, qty=position_qty, limit=long_ladder_1_limit_price, when=long_conditions_met)
strategy.entry(id="Long Ladder 2", direction=strategy.long, qty=position_qty, limit=long_ladder_2_limit_price, when=long_conditions_met)
else if ladderRungs == 3
strategy.entry(id="Long Ladder 1", direction=strategy.long, qty=position_qty, limit=long_ladder_1_limit_price, when=long_conditions_met)
strategy.entry(id="Long Ladder 2", direction=strategy.long, qty=position_qty, limit=long_ladder_2_limit_price, when=long_conditions_met)
strategy.entry(id="Long Ladder 3", direction=strategy.long, qty=position_qty, limit=long_ladder_3_limit_price, when=long_conditions_met)
else if ladderRungs == 4
strategy.entry(id="Long Ladder 1", direction=strategy.long, qty=position_qty, limit=long_ladder_1_limit_price, when=long_conditions_met)
strategy.entry(id="Long Ladder 2", direction=strategy.long, qty=position_qty, limit=long_ladder_2_limit_price, when=long_conditions_met)
strategy.entry(id="Long Ladder 3", direction=strategy.long, qty=position_qty, limit=long_ladder_3_limit_price, when=long_conditions_met)
strategy.entry(id="Long Ladder 4", direction=strategy.long, qty=position_qty, limit=long_ladder_4_limit_price, when=long_conditions_met)
strategy.exit(id="Close Long Ladder 1", from_entry="Long Ladder 1", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries)
strategy.exit(id="Close Long Ladder 2", from_entry="Long Ladder 2", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries)
strategy.exit(id="Close Long Ladder 3", from_entry="Long Ladder 3", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries)
strategy.exit(id="Close Long Ladder 4", from_entry="Long Ladder 4", stop=long_trailing_stop, limit=long_trailing_stop, when=close_long_entries)
strategy.cancel(id="Long Ladder 1", when=cancel_entries)
strategy.cancel(id="Long Ladder 2", when=cancel_entries)
strategy.cancel(id="Long Ladder 3", when=cancel_entries)
strategy.cancel(id="Long Ladder 4", when=cancel_entries)
else
strategy.entry(id="Long", direction=strategy.long, qty=100, when=long_conditions_met)
strategy.exit(id="Close Long", from_entry="Long", stop=long_stop_loss, limit=EMA_, when=close_long_entries)
strategy.cancel(id="Long", when=cancel_entries)
// Short Entry
if enableLaddering
if ladderRungs == 2
strategy.entry(id="Short Ladder 1", direction=strategy.short, qty=position_qty, limit=short_ladder_1_limit_price, when=short_conditions_met)
strategy.entry(id="Short Ladder 2", direction=strategy.short, qty=position_qty, limit=short_ladder_2_limit_price, when=short_conditions_met)
else if ladderRungs == 3
strategy.entry(id="Short Ladder 1", direction=strategy.short, qty=position_qty, limit=short_ladder_1_limit_price, when=short_conditions_met)
strategy.entry(id="Short Ladder 2", direction=strategy.short, qty=position_qty, limit=short_ladder_2_limit_price, when=short_conditions_met)
strategy.entry(id="Short Ladder 3", direction=strategy.short, qty=position_qty, limit=short_ladder_3_limit_price, when=short_conditions_met)
else if ladderRungs == 4
strategy.entry(id="Short Ladder 1", direction=strategy.short, qty=position_qty, limit=short_ladder_1_limit_price, when=short_conditions_met)
strategy.entry(id="Short Ladder 2", direction=strategy.short, qty=position_qty, limit=short_ladder_2_limit_price, when=short_conditions_met)
strategy.entry(id="Short Ladder 3", direction=strategy.short, qty=position_qty, limit=short_ladder_3_limit_price, when=short_conditions_met)
strategy.entry(id="Short Ladder 4", direction=strategy.short, qty=position_qty, limit=short_ladder_4_limit_price, when=short_conditions_met)
strategy.exit(id="Close Short Ladder 1", from_entry="Short Ladder 1", stop=short_trailing_stop, limit=EMA_, when=close_short_entries)
strategy.exit(id="Close Short Ladder 2", from_entry="Short Ladder 2", stop=short_trailing_stop, limit=EMA_, when=close_short_entries)
strategy.exit(id="Close Short Ladder 3", from_entry="Short Ladder 3", stop=short_trailing_stop, limit=EMA_, when=close_short_entries)
strategy.exit(id="Close Short Ladder 4", from_entry="Short Ladder 4", stop=short_trailing_stop, limit=EMA_, when=close_short_entries)
strategy.cancel(id="Short Ladder 1", when=cancel_entries)
strategy.cancel(id="Short Ladder 2", when=cancel_entries)
strategy.cancel(id="Short Ladder 3", when=cancel_entries)
strategy.cancel(id="Short Ladder 4", when=cancel_entries)
else
strategy.entry(id="Short", direction=strategy.short, when=short_conditions_met)
strategy.exit(id="Close Short", from_entry="Short", limit=EMA_, when=close_short_entries)
strategy.cancel(id="Short", when=cancel_entries)