
এই কৌশলটির মূল ধারণা হ’ল ব্রেকআউট ব্যান্ডটি ট্রেন্ডের দিকনির্দেশনা সনাক্তকরণের জন্য ব্যবহার করা হয় এবং স্থির স্টপ লস সহ ঝুঁকি ব্যবস্থাপনা করা হয়। কৌশলটি প্রথমে একটি নির্দিষ্ট সময়ের মধ্যে সর্বোচ্চ এবং সর্বনিম্ন দাম গণনা করে, যা একটি ব্রেকআউট ব্যান্ড গঠন করে। যখন দামটি ব্রেকআউট ব্যান্ডটি ভেঙে যায় তখন একটি ট্রেডিং সংকেত উত্পন্ন হয়। উপরন্তু, কৌশলটি ব্যবসায়ীদের একটি স্থির স্টপ লস সেট করার অনুমতি দেয়। প্রতিটি ব্যবসায়ের সময়, সিস্টেমটি স্থির স্টপ লস ভিত্তিতে বিপরীত ট্রেডের গণনা করে, যার ফলে প্রতিটি স্থির ক্ষতি হয়।
এই কৌশলটি মূলত চারটি অংশ নিয়ে গঠিতঃ পজিশন ম্যানেজমেন্ট, ব্রেকআউট ব্যান্ড সনাক্তকরণ, স্টপ লস সেটিং এবং পরিমাণ গণনা।
প্রথমত, কৌশলটি নির্ধারণ করে যে বর্তমানে কোন অবস্থান রয়েছে কিনা। যদি ইতিমধ্যে অবস্থান থাকে তবে নতুন সংকেত তৈরি করা হবে না।
দ্বিতীয়ত, কৌশলটি একটি নির্দিষ্ট সময়ের মধ্যে সর্বোচ্চ এবং সর্বনিম্ন দাম গণনা করে, একটি বিরতি অঞ্চল গঠন করে। যখন দামটি বিরতি অঞ্চলের অভ্যন্তর থেকে বাইরে বেরিয়ে আসে, তখন একটি লেনদেনের সংকেত তৈরি হয়। বিশেষত, যদি দামটি বিরতি অঞ্চলটি অতিক্রম করে তবে এটি একটি মাল্টি-সিগন্যাল তৈরি করে। যদি দামটি বিরতি অঞ্চলটি অতিক্রম করে তবে এটি একটি ফাঁকা সংকেত তৈরি করে।
এছাড়াও, যখন একাধিক সংকেত তৈরি হয়, তখন কৌশলটি ব্রেকিং-ব্যান্ডের মধ্যবর্তী স্থানে একটি স্টপ লস সেট করে। যখন একটি খালি সংকেত তৈরি হয়, তখন স্টপ লস সেট করা হয়। স্টপ লস ট্র্যাক করার জন্য, কৌশলটি রিয়েল-টাইমে স্টপ লস সামঞ্জস্য করে।
অবশেষে, কৌশলটি একটি স্থির স্টপ লস পরিমাণ সেট করার অনুমতি দেয়। যখন সংকেত আসে, কৌশলটি স্টপ লস পয়েন্ট থেকে বর্তমান দামের পয়েন্টের দূরত্ব গণনা করে, তারপরে উদ্ধৃতি ইউনিট, বিনিময় হার ইত্যাদির সাথে যুক্ত করে, স্টপ লস পয়েন্টের মধ্যে দামের পরিবর্তনের দ্বারা প্রতিনিধিত্ব করা পরিমাণ গণনা করে। তারপরে স্থির স্টপ লসের ভিত্তিতে বিপরীতভাবে লেনদেনের সংখ্যা গণনা করা হয়।
এটি কৌশলটির মূল নীতি। ট্রেন্ডের দিকনির্দেশনা সনাক্তকরণের মাধ্যমে এবং ফিক্সড স্টপ লস ব্যবহার করে ঝুঁকি নিয়ন্ত্রণের জন্য এটি কৌশলটির মূল ধারণা।
এই প্যারো ব্যান্ডেজ ফিক্সড স্টপ কৌশলটির নিম্নলিখিত সুবিধাগুলি রয়েছেঃ
স্টপ লস চিন্তাধারা উন্নত। কৌশলটি একটি নির্দিষ্ট স্টপ লস পরিমাণের পরিবর্তে একটি নির্দিষ্ট স্টপ লস দূরত্ব গ্রহণ করে। এটি বিভিন্ন জাতের মধ্যে পয়েন্টের মানের পার্থক্যের কারণে অনির্ধারিত ঝুঁকির সমস্যা এড়ায়। ঝুঁকি পরিচালনার দৃষ্টিকোণ থেকে, নির্দিষ্ট পরিমাণে স্টপ লস আরও উন্নত।
পরিমাণ গণনা যুক্তিসঙ্গত। কৌশলটি স্থির স্টপ লস পরিমাণের উপর ভিত্তি করে বুদ্ধিমানভাবে লেনদেনের সংখ্যা গণনা করতে পারে, যার ফলে প্রতিটি ক্ষতি নিয়ন্ত্রণযোগ্য হয়, যার ফলে ঝুঁকি ফাঁককে যুক্তিসঙ্গতভাবে নিয়ন্ত্রণ করা যায়।
ব্রেকিং সনাক্তকরণ সহজ এবং কার্যকর। ব্রেকিং ব্যান্ডের সনাক্তকরণ সহজ এবং সরাসরি, যা প্রবণতার দিকটি কার্যকরভাবে সনাক্ত করতে পারে। কেবলমাত্র একটি নির্দিষ্ট মূল্য স্তর অতিক্রম করার তুলনায়, এই ধরনের ব্রেকিং ব্যান্ড সনাক্তকরণ প্রবণতা দিক থেকে আরও বেশি মিথ্যা সংকেত এড়াতে পারে।
ট্র্যাকিং স্টপ লস বৃদ্ধি লাভ। কৌশলটি রিয়েল-টাইমে স্টপ লস পজিশনে পরিবর্তন করতে পারে, স্টপ লস ট্র্যাক করতে পারে এবং আরও বেশি লাভের জন্য লক করতে সহায়তা করে।
প্রয়োগের বিস্তৃত পরিসীমা। কৌশলটি যে কোনও জাতের জন্য প্রযোজ্য, কেবলমাত্র প্যারামিটারগুলি সেট করা থাকলে, নির্দিষ্ট পরিমাণের ক্ষতি বন্ধের ঝুঁকি নিয়ন্ত্রণ করা যায়, যার ফলে এটির খুব বিস্তৃত প্রয়োগযোগ্যতা রয়েছে।
কোডের কাঠামো পরিষ্কার। নীতি কোডের কাঠামো যুক্তিসঙ্গতভাবে পরিষ্কার, প্রতিটি ফাংশনাল মডিউল ভালভাবে ব্যাখ্যা করা হয়েছে, যা বোঝা এবং পরবর্তী অপ্টিমাইজেশনের জন্য সহজ।
যদিও এই কৌশলটি উপরের সুবিধাগুলির মধ্যে রয়েছে, তবুও এটির কিছু ঝুঁকি রয়েছে যা সম্পর্কে সতর্ক হওয়া দরকারঃ
ব্রেকিং ফর্ম্যাট মানের বিচার করা যায় না। কৌশলটি ব্রেকিং ফর্ম্যাট মানের বিচার করতে পারে না, কিছু নিম্নমানের সংকেত তৈরি করতে পারে। অন্যান্য সূচকগুলির সাথে মিলিতভাবে ফিল্টারিং করা প্রয়োজন।
ফিক্সড স্টপগুলি খুব যান্ত্রিক হতে পারে। বাজারের দামগুলি প্রায়শই উড়োজাহাজের বৈশিষ্ট্যযুক্ত, ফিক্সড স্টপগুলি খুব বেশি নিয়মের উপর নির্ভরশীল হতে পারে এবং নমনীয়ভাবে সামঞ্জস্য করতে পারে না।
ট্রেডিং ফ্রিকোয়েন্সি সীমাবদ্ধ করা যায় না। কৌশলটি ট্রেডিং ফ্রিকোয়েন্সি সীমাবদ্ধ করতে পারে না, এটি খুব ঘন ঘন খেলতে পারে। অন্যান্য নিয়মের সাথে মিলিত হওয়া দরকার ফ্রিকোয়েন্সি সীমাবদ্ধতা।
স্থির ক্ষতি বন্ধের উপর নির্ভরশীল প্যারামিটার সেট করুন। স্থির ক্ষতির পরিমাণ সেট করা সামগ্রিক খোলার নিয়ন্ত্রণের সাথে সম্পর্কিত, তহবিলের আকার, ঝুঁকি পছন্দ ইত্যাদির উপর ভিত্তি করে যুক্তিসঙ্গতভাবে সেট করা প্রয়োজন।
ব্রেকডাউন দিকটি ভুল সংকেত তৈরি করতে পারে। যখন দামের ঝাঁকুনি বা পুনরুদ্ধার হয়, তখন ভুল ব্রেকডাউন সংকেত তৈরি হতে পারে। একাধিক শর্তের সমন্বয়ে অপ্টিমাইজেশন প্রয়োজন।
স্টপ-অফ সেটিংয়ের অভাব। কৌশলটিতে বর্তমানে কোনও স্টপ-অফ ব্যবস্থা নেই, মুনাফা নির্ধারণ করতে সক্ষম নয়। এর ফলে মুনাফা অনুকূল হতে পারে।
এই ঝুঁকির জন্য, আমরা নিম্নলিখিত দিকগুলি থেকে অপ্টিমাইজ করতে পারিঃ
সংকেত গুণমান ফিল্টার করার জন্য, যেমন MACD, KD ইত্যাদি।
ব্রেকিং স্ট্রেংথের সাথে ব্রেকিং স্ট্রেংথের গুণমানের মূল্যায়ন করুন। উদাহরণস্বরূপ, ব্রেকিং স্ট্রেংথের পরিমাণের পরিবর্তনের মাধ্যমে ব্রেকিং স্ট্রেংথের দুর্বলতা নির্ধারণ করুন।
উদাহরণস্বরূপ, প্রতিদিন মাত্র একবার ট্রেড করা বা অনুরূপ নিয়ম।
স্থির স্টপ সেটিং লজিক অপ্টিমাইজ করুন। যেমন নির্দিষ্ট থ্রেশহোল্ডের উপর ভিত্তি করে শতাংশ স্টপ পরিবর্তন করুন।
অন্যান্য ফিল্টারিং কন্ডিশন যোগ করা। যেমন, বর্ধিত স্টপ লস, মূল্যের ওঠানামা ইত্যাদি।
স্টপ স্ট্র্যাটেজি যুক্ত করুন। যেমন প্রতিরোধের কাছাকাছি স্টপ স্ট্র্যাটেজি।
উপরের বিশ্লেষণের ভিত্তিতে, এই কৌশলটি নিম্নলিখিত দিকগুলি থেকে অপ্টিমাইজ করা যেতে পারেঃ
ফিল্টারিংয়ের শর্ত বাড়ানো, সংকেতের গুণমান বাড়ানো। প্রবণতার গুণমান বিচার করার জন্য বিভিন্ন প্রযুক্তিগত সূচক যুক্ত করা যেতে পারে, অবাঞ্ছিত ব্রেকআপ সংকেত এড়ানো যায়। ব্রেকআপের শক্তিও বিচার করা যেতে পারে।
অপ্টিমাইজড স্টপ স্ট্র্যাটেজি, যা আরও নমনীয় করে তোলে। এটি একটি নির্দিষ্ট দূরত্বের পরে অনুপাতগত স্টপ পরিবর্তন করতে পারে। এটি রিয়েল-টাইমে স্টপ দূরত্বের অনুকূল করতে পারে।
ট্রেডিং ফ্রিকোয়েন্সি নিয়ন্ত্রণ করুন, অতিরিক্ত লেনদেন এড়িয়ে চলুন। আপনি সময়কাল বা সংখ্যার জন্য ফিল্টারিং শর্ত সেট করতে পারেন, লেনদেনের ফ্রিকোয়েন্সি হ্রাস করুন।
প্রবণতা নির্ণয় সূচকগুলির সাথে মিলিত হয়ে, প্রবেশের সময় নির্বাচন করুন। উদাহরণস্বরূপ, প্রবণতা নিশ্চিত হওয়ার পরে পুনরায় প্রবেশের জন্য অনুকূলিতকরণ।
স্টপ স্ট্র্যাটেজি অপ্টিমাইজ করুন, লাভজনকতা বাড়ান। আপনি লক্ষ্য লাভ, সরানো স্টপ, ওভাররাইড স্টপ ইত্যাদি সেট করতে পারেন।
অপ্টিমাইজেশন ঝুঁকি পরামিতি সেট করুন। আপনি রিটার্নের ফলাফলের উপর ভিত্তি করে আরও ভাল প্যারামিটার সেট করতে পারেন, যেমন ফিক্সড স্টপ লস, ব্রেকআউট চক্র ইত্যাদি।
কোডের কাঠামো উন্নত করা হয়েছে, এক্সটেনসিবিলিটি উন্নত করা হয়েছে। সিগন্যাল জেনারেশন, ফিল্টারিং, বায়ু নিয়ন্ত্রণ, এবং লাভের মতো মডিউলগুলিকে আরও বিশ্লেষণ করা হয়েছে।
আরও বেশি জাতের বাজারজাতকরণের সুযোগ পরীক্ষা করুন। বিভিন্ন জাতের সমন্বয়ের বাজারজাতকরণের সুবিধা মূল্যায়ন করুন।
উপরোক্ত বিভিন্ন দিকের অপ্টিমাইজেশনের মাধ্যমে, এই বিরতি-ক্ষতি কৌশলটির স্থিতিশীলতা এবং লাভজনকতা আরও বাড়ানো যেতে পারে। এটি ভবিষ্যতে আরও কৌশলগত পোর্টফোলিওগুলিতে প্রসারিত করার জন্য একটি ভিত্তি তৈরি করে।
এই কৌশলটির সামগ্রিক চিন্তাভাবনা যুক্তিসঙ্গত, ব্রেকব্যান্ড ট্রেন্ড সনাক্তকরণ এবং স্থির পরিমাণের ক্ষতির ব্যবহার করে ঝুঁকি নিয়ন্ত্রণের জন্য। এটি ঝুঁকি ব্যবস্থাপনার ক্ষেত্রে অগ্রগতিশীল। একই সাথে লেনদেনের সংখ্যা গণনা করার চিন্তাভাবনাও যুক্তিসঙ্গত, প্রতিটি ক্ষতি নিয়ন্ত্রণ করতে পারে। তবে কৌশলটি সংকেতের গুণমান, ক্ষতির কৌশলটির নমনীয়তা এবং মুনাফা সমতা উন্নত করার জন্য একাধিক দিক দিয়ে অনুকূলিতকরণ করা যেতে পারে। যদি প্রবণতা বিচার সূচকগুলি ফিল্টার করা, স্টপ পদ্ধতিগুলি উন্নত করা এবং ট্রেডিং ফ্রিকোয়েন্সি কঠোরভাবে নিয়ন্ত্রণ করা হয় তবে কৌশলটির কার্যকারিতাটি অনেক বেশি বাড়ানোর জায়গা রয়েছে। সামগ্রিকভাবে, এই কৌশলটি ঝুঁকি ব্যবস্থাপনা এবং পরিমাণ গণনা পদ্ধতির একটি সেট সরবরাহ করে যা শিখতে পারে এবং কৌশল এবং বহু-কৌশল সমন্বয়কে আরও গবেষণা করার জন্য ভিত্তি তৈরি করে।
/*backtest
start: 2023-10-26 00:00:00
end: 2023-10-28 03:00:00
period: 10m
basePeriod: 1m
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/
//@version=4
//@author=Takazudo
strategy("Fixed price SL",
overlay=true,
default_qty_type=strategy.fixed,
initial_capital=0,
currency=currency.USD)
var COLOR_TRANSPARENT = color.new(#000000, 100)
var COLOR_ENTRY_BAND = color.new(#43A6F5, 30)
//============================================================================
// config
//============================================================================
// Money management
_g1 = 'Money management'
var config_riskPrice = input(100, minval=1, title="Risk price for each entry", group=_g1)
var config_depositCurrency = input(title="Deposit currency", type=input.string, defval="USD", options=["USD"], group=_g1)
// Entry strategy
_g2 = 'Entry strategy'
var config_entryBandBars = input(defval = 100, title = "Entry band bar count", minval=1, group=_g2)
// Backtesting range
_g3 = 'Backtesting range'
fromYear = input(defval = 2018, title = "From Year", minval = 1970, group=_g3)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12, group=_g3)
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31, group=_g3)
toYear = input(defval = 2020, title = "To Year", minval = 1970, group=_g3)
toMonth = input(defval = 12, title = "To Month", minval = 1, maxval = 12, group=_g3)
toDay = input(defval = 31, title = "To Day", minval = 1, maxval = 31, group=_g3)
//============================================================================
// exchange caliculations
//============================================================================
// mico pip size caliculation
// ex1: AUDCAD -> 0.0001
// ex2: USDJPY -> 0.01
f_calcMicroPipSize() =>
_base = syminfo.basecurrency
_quote = syminfo.currency
_result = 0.0001
if _quote == 'JPY'
_result := _result * 100
if _base == 'BTC'
_result := _result * 100
_result
// convert price to pips
f_convertPriceToPips(_price) =>
_microPipSize = f_calcMicroPipSize()
_price / _microPipSize
// caliculate exchange rate between deposit and quote currency
f_calcDepositExchangeSymbolId() =>
_result = ''
_deposit = config_depositCurrency
_quote = syminfo.currency
if (_deposit == 'USD') and (_quote == 'USD')
_result := na
if (_deposit == 'USD') and (_quote == 'AUD')
_result := 'OANDA:AUDUSD'
if (_deposit == 'EUR') and (_quote == 'USD')
_result := 'OANDA:EURUSD'
if (_deposit == 'USD') and (_quote == 'GBP')
_result := 'OANDA:GBPUSD'
if (_deposit == 'USD') and (_quote == 'NZD')
_result := 'OANDA:NZDUSD'
if (_deposit == 'USD') and (_quote == 'CAD')
_result := 'OANDA:USDCAD'
if (_deposit == 'USD') and (_quote == 'CHF')
_result := 'OANDA:USDCHF'
if (_deposit == 'USD') and (_quote == 'JPY')
_result := 'OANDA:USDJPY'
_result
// Let's say we need CAD to USD exchange
// However there's only "OANDA:USDCAD" symbol.
// Then we need to invert the exhchange rate.
// this function tells us whether we should invert the rate or not
f_calcShouldInvert() =>
_result = false
_deposit = config_depositCurrency
_quote = syminfo.currency
if (_deposit == 'USD') and (_quote == 'CAD')
_result := true
if (_deposit == 'USD') and (_quote == 'CHF')
_result := true
if (_deposit == 'USD') and (_quote == 'JPY')
_result := true
_result
// caliculate how much quantity should I buy or sell
f_calcQuantitiesForEntry(_depositExchangeRate, _slPips) =>
_microPipSize = f_calcMicroPipSize()
_priceForEachPipAsDeposit = _microPipSize * _depositExchangeRate
_losePriceOnSl = _priceForEachPipAsDeposit * _slPips
floor(config_riskPrice / _losePriceOnSl)
//============================================================================
// Quantity caliculation
//============================================================================
depositExchangeSymbolId = f_calcDepositExchangeSymbolId()
// caliculate deposit exchange rate
rate = security(depositExchangeSymbolId, timeframe.period, hl2)
shouldInvert = f_calcShouldInvert()
depositExchangeRate = if config_depositCurrency == syminfo.currency
// if USDUSD, no exchange of course
1
else
// else, USDCAD to CADUSD invert if we need
shouldInvert ? (1 / rate) : rate
//============================================================================
// Range Edge caliculation
//============================================================================
f_calcEntryBand_high() =>
_highest = max(open[3], close[3])
for i = 4 to (config_entryBandBars - 1)
_highest := max(_highest, open[i], close[i])
_highest
f_calcEntryBand_low() =>
_lowest = min(open[3], close[3])
for i = 4 to (config_entryBandBars - 1)
_lowest := min(_lowest, open[i], close[i])
_lowest
entryBand_high = f_calcEntryBand_high()
entryBand_low = f_calcEntryBand_low()
entryBand_height = entryBand_high - entryBand_low
plot(entryBand_high, color=COLOR_ENTRY_BAND, linewidth=1)
plot(entryBand_low, color=COLOR_ENTRY_BAND, linewidth=1)
rangeBreakDetected_long = entryBand_high < close
rangeBreakDetected_short = entryBand_low > close
shouldMakeEntryLong = (strategy.position_size == 0) and rangeBreakDetected_long
shouldMakeEntryShort = (strategy.position_size == 0) and rangeBreakDetected_short
//============================================================================
// SL & Quantity
//============================================================================
var sl_long = hl2
var sl_short = hl2
entryQty = 0
slPips = 0.0
// just show info bubble
f_showEntryInfo(_isLong) =>
_str =
'SL pips: ' + tostring(slPips) + '\n' +
'Qty: ' + tostring(entryQty)
_bandHeight = entryBand_high - entryBand_low
_y = _isLong ? (entryBand_low + _bandHeight * 1/4) : (entryBand_high - _bandHeight * 1/4)
_style = _isLong ? label.style_label_up : label.style_label_down
label.new(bar_index, _y, _str, size=size.large, style=_style)
if shouldMakeEntryLong
sl_long := (entryBand_high + entryBand_low) / 2
slPips := f_convertPriceToPips(close - sl_long)
entryQty := f_calcQuantitiesForEntry(depositExchangeRate, slPips)
if shouldMakeEntryShort
sl_short := (entryBand_high + entryBand_low) / 2
slPips := f_convertPriceToPips(sl_short - close)
entryQty := f_calcQuantitiesForEntry(depositExchangeRate, slPips)
// trailing SL
if strategy.position_size > 0
sl_long := max(sl_long, entryBand_low)
if strategy.position_size < 0
sl_short := min(sl_short, entryBand_high)
//============================================================================
// backtest duration
//============================================================================
// Calculate start/end date and time condition
startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp(toYear, toMonth, toDay, 00, 00)
//============================================================================
// make entries
//============================================================================
if (true)
if shouldMakeEntryLong
strategy.entry(id="Long", long=true, stop=close, qty=entryQty)
f_showEntryInfo(true)
if shouldMakeEntryShort
strategy.entry(id="Short", long=false, stop=close, qty=entryQty)
f_showEntryInfo(false)
strategy.exit('Long-SL/TP', 'Long', stop=sl_long)
strategy.exit('Short-SL/TP', 'Short', stop=sl_short)
//============================================================================
// plot misc
//============================================================================
sl = strategy.position_size > 0 ? sl_long :
strategy.position_size < 0 ? sl_short : na
plot(sl, color=color.red, style=plot.style_cross, linewidth=2, title="SL")
value_bgcolor = rangeBreakDetected_long ? color.green :
rangeBreakDetected_short ? color.red : COLOR_TRANSPARENT
bgcolor(value_bgcolor, transp=95)