ব্রেকআউট ব্যান্ড ফিক্সড স্টপ লস স্ট্র্যাটেজি

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

img

সারসংক্ষেপ

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

কৌশল নীতি

কৌশলটি চারটি প্রধান অংশ নিয়ে গঠিতঃ অবস্থান পরিচালনা, ব্রেকআউট ব্যান্ড সনাক্তকরণ, স্টপ লস সেটিং এবং অবস্থান আকার।

প্রথমত, কৌশলটি পরীক্ষা করে যে কোন খোলা অবস্থান আছে কি না। যদি থাকে, তাহলে নতুন সংকেত তৈরি হবে না।

দ্বিতীয়ত, কৌশলটি একটি ব্রেকআউট ব্যান্ড গঠনের জন্য একটি সময়ের মধ্যে সর্বোচ্চ এবং সর্বনিম্ন মূল্য গণনা করে। যখন দামটি ব্যান্ড থেকে বেরিয়ে আসে, তখন একটি ট্রেডিং সিগন্যাল তৈরি করা হয়। বিশেষত, যদি দামটি উপরের ব্যান্ডের উপরে ভঙ্গ করে তবে একটি দীর্ঘ সংকেত তৈরি করা হয়। যদি দামটি নিম্ন ব্যান্ডের নীচে ভঙ্গ করে তবে একটি সংক্ষিপ্ত সংকেত তৈরি করা হয়।

এছাড়াও, যখন একটি দীর্ঘ সংকেত উত্পন্ন হয়, তখন কৌশলটি স্টপ লস হিসাবে ব্রেকআউট ব্যান্ডের মাঝামাঝি পয়েন্ট সেট করে। সংক্ষিপ্ত সংকেতগুলির জন্যও এটি সত্য। স্টপ লস ট্র্যাক করার জন্য, কৌশলটি অবস্থানে থাকাকালীন রিয়েল-টাইমে স্টপ লসও সামঞ্জস্য করে।

অবশেষে, কৌশলটি একটি স্থির স্টপ লস পরিমাণ সেট করার অনুমতি দেয়। যখন একটি সংকেত উত্পন্ন হয়, তখন কৌশলটি স্টপ লস থেকে বর্তমান মূল্যে পিপসের সংখ্যা গণনা করে এবং টিক আকার এবং বিনিময় হারের মতো কারণগুলিকে একত্রিত করে, আর্থিকভাবে স্টপ লস এবং বর্তমান মূল্যের মধ্যে মূল্য পরিবর্তন নির্ধারণ করতে। স্থির স্টপ লস পরিমাণের উপর ভিত্তি করে অবস্থান আকার গণনা করা হয়।

উপরে কৌশলটির মূল নীতিগুলি রয়েছেঃ ব্রেকআউট ব্যান্ডের সাথে প্রবণতার দিকনির্দেশনা চিহ্নিত করা এবং স্থির স্টপ লস দিয়ে ঝুঁকি নিয়ন্ত্রণ করা মূল ধারণাগুলি।

সুবিধা

এই ব্রেকআউট ব্যান্ড ফিক্সড স্টপ লস কৌশল নিম্নলিখিত সুবিধাগুলি আছেঃ

  1. উন্নত স্টপ লস ধারণা। কৌশলটি স্থির স্টপ লস দূরত্বের পরিবর্তে স্থির স্টপ লস পরিমাণ ব্যবহার করে। এটি বিভিন্ন টিক মান সহ পণ্য জুড়ে ঝুঁকি স্থির করতে অক্ষমতার সমস্যা এড়ায়। ঝুঁকি পরিচালনার দৃষ্টিকোণ থেকে, স্থির আর্থিক স্টপ লস আরও উন্নত।

  2. যুক্তিসঙ্গত পজিশনের আকারঃ কৌশলটি স্থির স্টপ লস পরিমাণের উপর ভিত্তি করে বুদ্ধিমানভাবে পজিশনের আকার গণনা করতে পারে, যাতে প্রতি ব্যবসায়ের ক্ষতি নিয়ন্ত্রণ করা হয়, যার ফলে ঝুঁকি ঝুঁকিকে যুক্তিসঙ্গতভাবে পরিচালনা করা হয়।

  3. সহজ এবং কার্যকর ব্রেকআউট সনাক্তকরণ। ব্যান্ডগুলির সাথে ব্রেকআউট সনাক্তকরণ সহজ এবং সরাসরি, এবং কার্যকরভাবে প্রবণতার দিক সনাক্ত করতে পারে। একক মূল্য স্তরের ব্রেকআউটের তুলনায়, এই ব্রেকআউট ব্যান্ড সনাক্তকরণ প্রবণতা থেকে আরও মিথ্যা সংকেত এড়াতে পারে।

  4. ট্রেলিং স্টপ লস লাভ বৃদ্ধি করে। ট্রেলিং স্টপ লসের জন্য রিয়েল-টাইমে স্টপ লস সামঞ্জস্য করার কৌশলটির ক্ষমতা আরও লাভকে লক করতে সহায়তা করে।

  5. বিস্তৃত প্রয়োগযোগ্যতা। কৌশলটি যে কোনও পণ্যের জন্য প্রযোজ্য। যতক্ষণ প্যারামিটারগুলি সঠিকভাবে সেট করা থাকে, ততক্ষণ স্থির পরিমাণের স্টপ লস ঝুঁকি নিয়ন্ত্রণ অর্জন করা যায়, কৌশলটিকে অত্যন্ত বহুমুখী করে তোলে।

  6. পরিষ্কার কোড কাঠামো কোড কাঠামো পরিষ্কার এবং মডুলার, এটি বোঝা এবং অপ্টিমাইজ করা সহজ করে তোলে।

ঝুঁকি

এর সুবিধাগুলো সত্ত্বেও, কৌশলটির জন্য কিছু ঝুঁকি রয়েছেঃ

  1. ব্রেকআউট প্যাটার্নের গুণমান পরীক্ষা করা হয়নি। কৌশলটি ব্রেকআউট প্যাটার্নের গুণমান বিচার করে না এবং কিছু নিম্ন মানের সংকেত তৈরি করতে পারে। সংকেতগুলি ফিল্টার করতে অন্যান্য সূচক প্রয়োজন।

  2. স্থির স্টপ লস খুব যান্ত্রিক হতে পারে। বাজার মূল্য প্রায়ই ফাঁক। স্থির স্টপ লস নিয়মের উপর খুব বেশি নির্ভর করতে পারে এবং সামঞ্জস্যের ক্ষেত্রে নমনীয়তার অভাব থাকতে পারে।

  3. ট্রেডিং ফ্রিকোয়েন্সির কোন সীমাবদ্ধতা নেই। কৌশলটি ট্রেডিং ফ্রিকোয়েন্সিকে সীমাবদ্ধ করে না এবং খুব প্রায়ই ট্রেড করতে পারে। ফ্রিকোয়েন্সি সীমাবদ্ধ করার জন্য অন্যান্য নিয়ম প্রয়োজন।

  4. স্থির স্টপ লস পরামিতি সেটিং উপর নির্ভর করে। স্থির স্টপ লস পরিমাণ সেটিং সামগ্রিক ঝুঁকি নিয়ন্ত্রণের জন্য গুরুত্বপূর্ণ এবং মূলধন আকার, ঝুঁকি ক্ষুধা ইত্যাদি বিবেচনা করতে হবে।

  5. ব্রেকআউট দিকটি ভুল সংকেত দিতে পারে। দামের দোলন বা pullbacks সময় ভুল ব্রেকআউট সংকেত ঘটতে পারে। কৌশল অপ্টিমাইজ করার জন্য আরো শর্ত প্রয়োজন।

  6. কোন লাভ গ্রহণ প্রক্রিয়া নেই। কৌশল বর্তমানে লাভ গ্রহণ ক্ষমতা সক্রিয়ভাবে মুনাফা লক করতে নেই। এটি অসন্তোষজনক মুনাফা হতে পারে।

এই ঝুঁকিগুলি মোকাবেলা করার জন্য, কৌশলটি অপ্টিমাইজ করার কিছু উপায়গুলির মধ্যে রয়েছেঃ

  1. সিগন্যালের গুণমান ফিল্টার করার জন্য সূচক যোগ করা, যেমন MACD, KD ইত্যাদি।

  2. গুণমান মূল্যায়নের জন্য ব্রেকআউট শক্তির সূচক অন্তর্ভুক্ত করা। উদাহরণস্বরূপ, ভলিউম পরিবর্তনের মাধ্যমে শক্তি বিচার করা।

  3. খোলা ট্রেডিং ফ্রিকোয়েন্সি সীমাবদ্ধতা যোগ করা, উদাহরণস্বরূপ প্রতিদিন একটি ট্রেড।

  4. স্থির স্টপ লস লজিকের অপ্টিমাইজেশান, উদাহরণস্বরূপ, একটি প্রান্তিকের উপরে শতাংশ ভিত্তিক স্টপ লস।

  5. অন্যান্য ফিল্টার যোগ করা, উদাহরণস্বরূপ, অস্থিরতা, স্টপ লস বাড়ানো ইত্যাদি।

  6. মুনাফা নেওয়ার কৌশল অন্তর্ভুক্ত করা, যেমন প্রতিরোধের কাছাকাছি মুনাফা নেওয়া।

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

বিশ্লেষণের ভিত্তিতে, কৌশলটি নিম্নলিখিত দিকগুলিতে অপ্টিমাইজ করা যেতে পারেঃ

  1. একাধিক প্রযুক্তিগত সূচক ব্যবহার করে সিগন্যালের গুণমান উন্নত করতে ফিল্টার যোগ করা এবং প্রবণতার গুণমান মূল্যায়ন করা। এছাড়াও ব্রেকআউট শক্তি বিচার করা।

  2. আরও নমনীয়তার জন্য স্টপ লস অপ্টিমাইজ করা। একটি নির্দিষ্ট পুনরুদ্ধারের পরে শতাংশ-ভিত্তিক ট্রেলিং স্টপে স্যুইচ করতে পারেন। অস্থিরতার উপর ভিত্তি করে গতিশীলভাবেও অপ্টিমাইজ করতে পারেন।

  3. সময়কাল বা ফ্রিকোয়েন্সিতে ফিল্টার যোগ করে অতিরিক্ত ট্রেডিং এড়াতে ট্রেডিং ফ্রিকোয়েন্সি নিয়ন্ত্রণ করা।

  4. প্রবণতা সূচক অন্তর্ভুক্ত করা, যেমন প্রবণতা নিশ্চিতকরণের জন্য অপেক্ষা করা।

  5. মুনাফা অর্জনের লক্ষ্যমাত্রা, মুনাফা বন্ধ, অস্থিরতা বন্ধ ইত্যাদির মাধ্যমে মুনাফা অর্জনের কৌশল উন্নত করা।

  6. ব্যাকটেস্টের ভিত্তিতে ঝুঁকি পরামিতিগুলি অপ্টিমাইজ করা, যেমন নির্দিষ্ট স্টপ পরিমাণ, ব্রেকআউট সময়কাল ইত্যাদি।

  7. সিগন্যাল, ফিল্টার, ঝুঁকি, মুনাফা মডিউলকে আরও বিচ্ছিন্ন করে আরও ভাল সম্প্রসারণের জন্য কোডটি পুনরায় ফ্যাক্টর করা।

  8. আরবিট্রেজ সুযোগের জন্য আরও পণ্য পরীক্ষা করা। বিভিন্ন পণ্য সমন্বয় জুড়ে সুবিধা মূল্যায়ন করুন।

এই অপ্টিমাইজেশান মাত্রার মাধ্যমে, ব্রেকআউট স্টপ লস কৌশল আরও শক্তিশালী এবং লাভজনক হতে পারে। এটি আরও কৌশল সংমিশ্রণে সম্প্রসারণের ভিত্তি স্থাপন করে।

সিদ্ধান্ত

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


/*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)


আরো