
সুনির্দিষ্ট প্রবণতা বিরতি ট্রেডিং কৌশল প্রবণতা সূচক এবং নির্দিষ্ট K-লাইন আকৃতির উপর ভিত্তি করে, একটি সুনির্দিষ্ট প্রবণতা ক্যাপচার অর্জনের জন্য। এই কৌশলটি প্রবণতার দিকনির্দেশনা নির্ধারণের জন্য সমতল লাইন ব্যবহার করে, আরএসআই সূচকটি ওভারসোলের সিদ্ধান্ত নেয়, এবং উচ্চতর কে-লাইন আকৃতির সাথে মিলিত হয়ে একটি ব্রেকপয়েন্ট নির্বাচন করে, প্রবণতাটির সুনির্দিষ্ট অবস্থান নির্ধারণ করে, উপযুক্ত সময়ে ব্রেক ট্রেড করে, অতিরিক্ত লাভ অর্জন করে।
৮ দিনের ইএমএ এবং ৮০ দিনের ইএমএ প্রবণতা দিক নির্ধারণ করুন। ৮ দিনের ইএমএ ৮০ দিনের ইএমএর উপরে পজিটিভ হিসাবে সংজ্ঞায়িত করা হয় এবং বিপরীতটি হ্রাস পায়। ট্রেডিং সংকেতগুলি কেবল তখনই বিবেচনা করা হয় যখন প্রবণতা দিকটি মিলিত হয়।
তিনটি K-লাইনগুলির একটি নির্দিষ্ট সংমিশ্রণ ফর্ম্যাটকে সংজ্ঞায়িত করুন, অর্থাৎ প্রথম K-লাইন নিম্নতমটি দ্বিতীয়ের চেয়ে কম এবং তৃতীয় K-লাইন নিম্নতমটি দ্বিতীয়ের চেয়ে কম। এই ফর্ম্যাটটি একটি উত্থান প্রবণতার সময় কেনার সংকেত হিসাবে উপস্থিত হয়। একটি পতন প্রবণতা গঠনের সময় বিক্রয় সংকেত হিসাবে।
তৃতীয় K লাইনটি একটি অভ্যন্তরীণ K লাইনে পরিণত হয়, অর্থাৎ যখন বন্ধের দাম পূর্ববর্তী K লাইনের মধ্যে থাকে, তখন এটি সর্বোত্তম সংকেত পয়েন্ট। এই সময়ে 123 ফর্ম দেখা দেয় যা সরাসরি লেনদেনের উপর নির্ভর করে।
ক্রেডিট মূল্য হল তৃতীয় K-লাইন উচ্চতম ((ক্রেডিট) বা তৃতীয় K-লাইন নিম্নতম ((বিক্রি)) । স্টপ লস হল দ্বিতীয় K-লাইন নিম্নতম ((ক্রেডিট) বা দ্বিতীয় K-লাইন উচ্চতম ((বিক্রি)) । স্টপ লস হল ঝুঁকির দামের দ্বিগুণ পার্থক্য ।
ট্রেন্ড, ফর্ম্যাট এবং সূচক শর্তাবলী পূরণ হলে, একটি ব্রেকআউট কমিশন স্থাপন করা হয়, উচ্চ সম্ভাব্যতার ট্রেডিং করা হয়। এবং একটি স্টপ লস স্টপ সেট করা হয় যাতে লাভের উপর লক করা যায় এবং একটি স্থিতিশীল ব্রেকআউট অপারেশন করা যায়।
এই কৌশলটির উল্লেখযোগ্য সুবিধাগুলি হলঃ
বিপরীত ট্রেডিং এড়ানোর জন্য ডাবল ইএমএ ব্যবহার করুন।
K-রেখার আকৃতি নির্বাচন করুন, যার ফলে লাভের সম্ভাবনা বাড়বে।
ট্রেন্ড, ফর্ম্যাট এবং দামের পার্থক্যের সূচকগুলি যখন একত্রিত হয় তখনই সংকেত প্রেরণ করা হয়, যাতে সংকেতের গুণমান নিশ্চিত হয়।
অভ্যন্তরীণ K-লাইন ফর্ম্যাটটি সংকেতের নির্ভরযোগ্যতা বাড়ায় এবং লেনদেনের সময়কে আরও লক করে দেয়।
পূর্ব নির্ধারিত স্টপ লস স্টপ পয়েন্ট, যা স্বতন্ত্র লেনদেনের ঝুঁকিকে কার্যকরভাবে নিয়ন্ত্রণ করে।
রিটার্ন ডেটা যাচাই করে, বিজয় হার 65% এর বেশি, দীর্ঘমেয়াদী লাভজনকতার জন্য একটি পরিসংখ্যানগত সুবিধা রয়েছে।
সামগ্রিকভাবে, এই কৌশলটি প্রবণতা, মডেল এবং সূচকগুলির সমন্বিত বিচারকে যথাযথভাবে ব্যবহার করে, একটি স্থিতিশীল ঝুঁকি-লাভের সুবিধার সাথে ব্যবসায়ের ব্রেকথ্রু সময়কে সুনির্দিষ্টভাবে অবস্থান করে।
এই কৌশলটির প্রধান ঝুঁকিগুলো হলোঃ
প্রবণতা নির্ণয় ত্রুটি, ঝড়ের পরিস্থিতিতে ভুল সংকেত উত্পন্ন করে। আরও প্রবণতা সূচকগুলি বহু-মাত্রিক নিশ্চিতকরণের জন্য প্রবর্তন করা যেতে পারে।
একটি একক স্টপ লস স্টপ পদ্ধতি প্রতিটি পরিস্থিতিতে নিখুঁতভাবে ফিট করতে পারে না। আপনি একটি ভাসমান স্টপ লস স্টপ পয়েন্ট সেট করতে পারেন।
K-রেখার আকৃতি সনাক্তকরণ প্যারামিটার সেটিং এর উপর নির্ভরশীল, যার জন্য সর্বোত্তম সমন্বয় খুঁজতে বারবার অপ্টিমাইজেশন প্রয়োজন।
হঠাৎ বড় ব্ল্যাক সোয়ান ঘটনার ট্রেডিং প্রভাবের পূর্বাভাস দেওয়া সম্ভব নয়। পজিশন কন্ট্রোল ব্যবহারের পরামর্শ দেওয়া হয়, পজিশনগুলি ব্যাচগুলিতে তৈরি করা হয়।
পুনরাবৃত্তি ডেটা প্রকৃত লেনদেনের পারফরম্যান্সের প্রতিনিধিত্ব করতে পারে না, অতিরিক্ত ফিটিংয়ের ঝুঁকি রয়েছে। প্যারামিটারগুলির দৃness়তা কঠোরভাবে যাচাই করা উচিত।
ট্রেডিং খরচ উচ্চ ফ্রিকোয়েন্সি ট্রেডিং কৌশল উপর একটি বড় প্রভাব আছে। নিশ্চিত করুন যে জয় এবং ক্ষতির অনুপাত যথেষ্ট খরচ সমর্থন করে।
সামগ্রিকভাবে, এই কৌশলটি প্যারামিটার কনফিগারেশনকে অনুকূলিতকরণ, আরও বিচারক মাত্রা প্রবর্তন এবং পজিশনের আকার নিয়ন্ত্রণের মাধ্যমে কার্যকরভাবে ঝুঁকি হ্রাস করতে পারে এবং কর্মক্ষমতা স্থিতিশীলতা উন্নত করতে পারে।
এই কৌশলটির আরও কিছু দিক রয়েছে যা আরও উন্নত করা যেতে পারেঃ
K-রেখার আরও বেশি প্যারামিটার পরীক্ষা করে আরও স্থিতিশীল প্যারামিটার সমন্বয় নির্ধারণ করুন।
মাল্টি-ডাইমেনশনাল কনফার্মেশনের জন্য ট্রানজাকশন ইনডেক্স বাড়ানো এবং ভুয়া ব্রেকডাউন এড়ানো।
শার্প রেট, লাভ-ক্ষতি অনুপাত এবং অন্যান্য সূচকগুলির বৃদ্ধি মূল্যায়ন প্যারামিটারের দৃঢ়তা।
কন্ট্রোলযোগ্য গতিশীল মুনাফা অর্জনের জন্য স্টপ ট্র্যাকিং ব্যবস্থা চালু করা।
মার্কেট অনিশ্চয়তার সময়গুলো এড়াতে ভিআইএক্স প্যানিক ইনডেক্সের সাহায্যে।
বিভিন্ন হোল্ডিং চক্রের পরামিতি পরীক্ষা করে সর্বোত্তম হোল্ডিং সময়কাল নির্ধারণ করুন।
স্ট্যাটিস্টিক স্টপ ক্ষতি অপ্টিমাইজ করুন যাতে স্ট্যাটিস্টিক স্টপ ক্ষতির পূর্বনির্ধারিত স্ট্যাটিস্টিক স্ট্যাটিস্টিক স্ট্যাটিস্টিক স্ট্যাটিস্টিক স্ট্যাটিস্টিক স্ট্যাটিস্টিক স্ট্যাটিস্টিক স্ট্যাটিস্টিক স্ট্যাটিস্টিক স্ট্যাটিস্টিক স্ট্যাটিস্টিক স্ট্যাটিস্টিক।
উপরের উপায়ে, কৌশলটির স্থিতিশীলতা, নমনীয়তা এবং লাভজনকতা আরও বাড়ানো যেতে পারে।
সুনির্দিষ্ট প্রবণতা বিরতি ট্রেডিং কৌশল সফলভাবে প্রবণতা, আকৃতি এবং স্টপ লস স্টপ এর জৈবিক সমন্বয় ব্যবহার করে প্রবণতা বিরতির উচ্চ সম্ভাবনা ক্যাপচার করে। এটি ট্রেডিং সিগন্যালের স্পষ্টতা, সূচক স্বীকৃতির বহুমুখীতা এবং ঝুঁকি নিয়ন্ত্রণের বৈশিষ্ট্যযুক্ত, এটি প্রবণতার ক্ষেত্রে প্রয়োগ করার জন্য একটি কার্যকর কৌশল। ক্রমাগত অপ্টিমাইজেশন এবং পরিমার্জন করে, কৌশলটি প্রবণতা অনুসরণ করার জন্য পজিশন ব্যবস্থাপনা পরিচালনার একটি শক্তিশালী হাতিয়ার হওয়ার সম্ভাবনা রয়েছে। এটি ব্যবসায়ীদের অতিরিক্ত লাভের গুরুত্বপূর্ণ সুযোগ দখল করার জন্য একটি গুরুত্বপূর্ণ রেফারেন্স সরবরাহ করে।
/*backtest
start: 2022-11-01 00:00:00
end: 2023-10-14 05:20: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/
// © julianossilva
//@version=5
strategy(title="J2S Backtest: 123-Stormer Strategy",
shorttitle="J2S Backtest: 123-Stormer Strategy",
overlay=true, initial_capital=1000, default_qty_value=10,
default_qty_type = strategy.percent_of_equity, pyramiding=0)
// Initial Backtest Date Range
useStartDate = timestamp("01 Jan 2020 21:00:00")
useEndDate = timestamp("01 Jan 2023 21:00:00")
// User Inputs
SIGNAL_CONFIG = "BACKTEST: STORMER STRATEGY (123)"
longEntryInput = input.bool(defval=true, title="Long Entry", group=SIGNAL_CONFIG)
shortEntryInput = input.bool(defval=true, title="Short entry", group=SIGNAL_CONFIG)
thresholdForEntryInput = input.int(defval=3, title="Threshold on clandes for entry", group=SIGNAL_CONFIG)
insideBarStrategyTitle = "Only third candle inside bar is valid"
insideBarStrategyTip = "According to Stomer, it would be the best signal for the strategy"
insideBarStrategyInput = input.bool(defval=true, title=insideBarStrategyTitle, group=SIGNAL_CONFIG, tooltip=insideBarStrategyTip)
EMA_CONFIG = "BACKTEST: EXPONENTIAL MOVING AVERAGES"
sourceInput = input.source(defval=close, title="Source", inline="01", group=EMA_CONFIG)
emaTimeframeInput = input.timeframe("1W", title="Timeframe", inline="01", group=EMA_CONFIG)
emaOffsetInput = input.int(defval=8, title="Offset", inline="01", group=EMA_CONFIG)
fastEMALengthInput = input.int(defval=8, title="Fast EMA Length", inline="02", group=EMA_CONFIG)
useFastEMAInput = input.bool(defval=true, title="Use Fast EMA", inline="02", group=EMA_CONFIG)
slowEMALengthInput = input.int(defval=80, title="Slow EMA Length", inline="03", group=EMA_CONFIG)
useSlowEMAInput = input.bool(defval=true, title="Use Slow EMA", inline="03", group=EMA_CONFIG)
PERIOD_CONFIG = "BACKTEST: TIME PERIOD"
useDateFilterInput = input.bool(defval=true, title="Filter Date Range of Backtest", group=PERIOD_CONFIG)
backtestStartDateInput = input(defval=useStartDate, title="Start Date", group=PERIOD_CONFIG)
backtestEndDateInput = input(defval=useEndDate, title="End Date", group=PERIOD_CONFIG)
// Colors
bbBackgroundColor = color.rgb(33, 150, 243, 90)
candleColorDown = color.rgb(239, 83, 80, 80)
candleColorUp = color.rgb(38, 166, 154, 70)
insideBarColorDown = color.rgb(239, 83, 80, 40)
insideBarColorUp = color.rgb(38, 166, 154, 20)
downTrendColor = color.rgb(239, 83, 80, 80)
sidewaysTrendColor = color.rgb(252, 232, 131, 80)
upTrendColor = color.rgb(38, 166, 154, 80)
buySignalColor = color.lime
sellSignalColor = color.orange
// Candles
isCandleUp() => close > open
isCandleDown() => close <= open
barcolor(isCandleUp() ? candleColorUp : isCandleDown() ? candleColorDown : na)
// Exponential Moving Averages
fastEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, fastEMALengthInput), barmerge.gaps_on, barmerge.lookahead_on)
currentFastEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, fastEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on)
previousFastEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput[1], fastEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on)
slowEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, slowEMALengthInput), barmerge.gaps_on, barmerge.lookahead_on)
currentSlowEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput, slowEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on)
previousSlowEMA = request.security(syminfo.tickerid, emaTimeframeInput, ta.ema(sourceInput[1], slowEMALengthInput), barmerge.gaps_off, barmerge.lookahead_on)
// Trend Rules for Exponential Moving Averages
isSlowEMAUp() => currentSlowEMA > previousSlowEMA
isSlowEMADown() => currentSlowEMA < previousSlowEMA
isFastEMAUp() => currentFastEMA > previousFastEMA
isFastEMADown() => currentFastEMA < previousFastEMA
// Exponential Moving Average Colors
fastEMAColor = isFastEMAUp() ? upTrendColor : isFastEMADown() ? downTrendColor : sidewaysTrendColor
slowEMAColor = isSlowEMAUp() ? upTrendColor : isSlowEMADown() ? downTrendColor : sidewaysTrendColor
// Display Exponential Moving Averages
plot(useFastEMAInput ? fastEMA : na, offset=emaOffsetInput, color=fastEMAColor, title="Fast EMA", style=plot.style_line, linewidth=4)
plot(useSlowEMAInput ? slowEMA : na, offset=emaOffsetInput, color=slowEMAColor, title="Slow EMA", style=plot.style_line, linewidth=7)
// Price Trend
pricesAboveFastEMA() => low[2] > currentFastEMA and low[1] > currentFastEMA and low > currentFastEMA
pricesAboveSlowEMA() => low[2] > currentSlowEMA and low[1] > currentSlowEMA and low > currentSlowEMA
pricesBelowFastEMA() => high[2] < currentFastEMA and high[1] < currentFastEMA and high < currentFastEMA
pricesBelowSlowEMA() => high[2] < currentSlowEMA and high[1] < currentSlowEMA and high < currentSlowEMA
// Market in Bullish Trend
isBullishTrend() =>
if useFastEMAInput and useSlowEMAInput
pricesAboveFastEMA() and pricesAboveSlowEMA()
else if useFastEMAInput
pricesAboveFastEMA()
else if useSlowEMAInput
pricesAboveSlowEMA()
else
na
// Market in Bearish Trend
isBearishTrend() =>
if useFastEMAInput and useSlowEMAInput
pricesBelowFastEMA() and pricesBelowSlowEMA()
else if useFastEMAInput
pricesBelowFastEMA()
else if useSlowEMAInput
pricesBelowSlowEMA()
else
na
// Stormer Strategy (123)
isFirstCandleUp() => high[2] > high[1] and low[2] > low[1]
isFirstCandleDown() => high[2] < high[1] and low[2] < low[1]
isThirdCandleUp() => low > low[1]
isThirdCandleDown() => high < high[1]
isThirdCandleInsideBar() => high < high[1] and low > low[1]
// Buy Signal
isStormer123Buy() =>
if insideBarStrategyInput
longEntryInput and isFirstCandleUp() and isThirdCandleInsideBar() and isBullishTrend()
else
longEntryInput and isFirstCandleUp() and isThirdCandleUp() and isBullishTrend()
// Sell Signal
isStormer123Sell() =>
if insideBarStrategyInput
shortEntryInput and isFirstCandleDown() and isThirdCandleInsideBar() and isBearishTrend()
else
shortEntryInput and isFirstCandleDown() and isThirdCandleDown() and isBearishTrend()
// Backtest Time Period
inTradeWindow = true
isInTradeWindow() => inTradeWindow
isBacktestDateRangeOver() => not inTradeWindow and inTradeWindow[1]
// Backtest Price Parameters
highestPrice = ta.highest(high, 3)
lowestPrice = ta.lowest(low,3)
priceRange = highestPrice - lowestPrice
// Stormer Strategy (123): LONG
var myLongOrders = array.new_int(0)
longtEntryID = "Long Entry:\n" + str.tostring(bar_index)
longExitID = "Long Exit:\n" + str.tostring(bar_index)
stopLossInLong = lowestPrice + 0.01
takeProfitInLong = priceRange + high
longEntryHasBeenMet = isInTradeWindow() and isBullishTrend() and isStormer123Buy()
// Scheduling LONG entry
if longEntryHasBeenMet
array.push(myLongOrders, bar_index)
strategy.order(longtEntryID, strategy.long, stop=high)
strategy.exit(longExitID, longtEntryID, stop=stopLossInLong, limit=takeProfitInLong)
// In pine script, any order scheduled but not yet filled can be canceled.
// Once a order is filled, the trade is only finished with use of close or exit functions.
// As scheduled orders are not stored in the strategy.opentrades array, manual control is required.
for myOrderIndex = 0 to (array.size(myLongOrders) == 0 ? na : array.size(myLongOrders) - 1)
myLongOrder = array.get(myLongOrders, myOrderIndex)
if bar_index - myLongOrder == thresholdForEntryInput
longEntryID = "Long Entry:\n" + str.tostring(myLongOrder)
strategy.cancel(longEntryID)
// Stormer Strategy (123): SHORT
var myShortOrders = array.new_int(0)
shortEntryID = "Short Entry:\n" + str.tostring(bar_index)
shortExitID = "Short Exit:\n" + str.tostring(bar_index)
stopLossInShort = highestPrice + 0.01
takeProfitInShort = low - priceRange
shortEntryHasBeenMet = isInTradeWindow() and isBearishTrend() and isStormer123Sell()
// Scheduling SHORT entry
if shortEntryHasBeenMet
array.push(myShortOrders, bar_index)
strategy.order(shortEntryID, strategy.short, stop=low)
strategy.exit(shortExitID, shortEntryID, stop=stopLossInShort, limit=takeProfitInShort)
// In pine script, any order scheduled but not yet filled can be canceled.
// Once a order is filled, the trade is only finished with use of close or exit functions.
// As scheduled orders are not stored in the strategy.opentrades array, manual control is required.
for myOrderIndex = 0 to (array.size(myShortOrders) == 0 ? na : array.size(myShortOrders) - 1)
myShortOrder = array.get(myShortOrders, myOrderIndex)
if bar_index - myShortOrder == thresholdForEntryInput
shortEntryID := "Short Entry:\n" + str.tostring(myShortOrder)
strategy.cancel(shortEntryID)
// Close all positions at the end of the backtest period
if isBacktestDateRangeOver()
strategy.cancel_all()
strategy.close_all(comment="Date Range Exit")
// Display Signals
plotshape(series=longEntryHasBeenMet, title="123 Buy", style=shape.triangleup, location=location.belowbar, color=buySignalColor, text="123", textcolor=buySignalColor)
plotshape(series=shortEntryHasBeenMet, title="123 Sell", style=shape.triangledown, location=location.abovebar, color=sellSignalColor, text="123", textcolor=sellSignalColor)