
এই কৌশলটি একটি গাউস ত্রুটি ফাংশনের উপর ভিত্তি করে মূল্য পরিবর্তনের জন্য পি-সিগন্যাল সূচকের পরিমাণগত ট্রেডিং কৌশল। এটি মূল্যের প্রবণতা এবং বিপরীত দিকগুলি নির্ধারণের জন্য পি-সিগন্যাল সূচক ব্যবহার করে, যার ফলে প্রবেশ এবং প্রস্থান করার সময় নির্ধারণ করা হয়।
এই কৌশলটির কেন্দ্রীয় সূচক হল পি-সিগন্যাল। পি-সিগন্যালের গণনা সূত্রটি নিম্নরূপঃ
fPSignal(ser, int) =>
nStDev = stdev(ser, int)
nSma = sma(ser, int)
fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
এখানে ser মূল্যের ক্রমকে নির্দেশ করে, int পয়েন্টের সংখ্যাকে নির্দেশ করে, অর্থাৎ কতটি K-রেখা রয়েছে তা দেখুন। এই সূত্রটি তিনটি অংশে বিভক্তঃ
সমগ্র সূত্রের অর্থ হল, দামের চলমান গড়কে দামের স্ট্যান্ডার্ড ডিভার্জেন্ট দ্বারা ভাগ করা, তারপর sqrt ((2) দিয়ে স্ট্যান্ডার্ডাইজ করা, তারপর গাউসের ত্রুটি ফাংশন দ্বারা ((-1, 1) পরিসরে ম্যাপ করা। অর্থাৎ, যদি দামের ওঠানামা গড়ের চেয়ে বড় হয় তবে পি-সিগন্যালটি 1 এর কাছাকাছি; যদি দামের ওঠানামা গড়ের চেয়ে কম হয় তবে পি-সিগন্যালটি -1 এর কাছাকাছি।
কৌশলটি P-Signal এর মান এবং তার পরিবর্তিত প্রতীক ব্যবহার করে প্রবেশ এবং প্রস্থান নির্ধারণ করেঃ
strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)
strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)
যখন P-Signal 0 এর চেয়ে ছোট হয় এবং ইতিবাচক পরিবর্তিত হয় তখন বেশি করা; যখন P-Signal 0 এর চেয়ে বড় হয় এবং নেতিবাচক পরিবর্তিত হয় তখন প্লেইন করা।
এই কৌশলটির সুবিধাগুলো হলঃ
এই কৌশলটির কিছু ঝুঁকিও রয়েছে, যেমনঃ
এই ঝুঁকিগুলি হ্রাস করার জন্য, আপনি ফিল্টারিংয়ের শর্তগুলি বাড়িয়ে তুলতে এবং লেনদেনের ফ্রিকোয়েন্সি হ্রাস করতে পারেন; প্যারামিটার সমন্বয় এবং লেনদেনের ব্যয় সেটিংটি অপ্টিমাইজ করুন; সঠিক জাতের নির্বাচন করুন।
এই কৌশলটি আরও উন্নত করার সুযোগ রয়েছে, যার প্রধান দিকগুলো হলঃ
সামগ্রিকভাবে, এই কৌশলটির মূল ধারণাটি উদ্ভাবনী, দামের বন্টনকে মাপসই করার জন্য গস ফাংশন ব্যবহার করে এবং প্যারামিটারগুলির পরিসীমা স্বয়ংক্রিয়ভাবে সামঞ্জস্য করে। তবে একটি উচ্চ-প্রাচীরের ট্রেডিং কৌশল হিসাবে, আরও পরীক্ষা এবং অপ্টিমাইজেশনের প্রয়োজন, বিশেষত ঝুঁকি নিয়ন্ত্রণ এবং প্যারামিটার সামঞ্জস্যের ক্ষেত্রে, স্থিতিশীল মুনাফা অর্জনের জন্য।
/*backtest
start: 2023-01-12 00:00:00
end: 2024-01-18 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/
// P-Signal Strategy © Kharevsky
// @version=4
// **********************************************************************************************************
strategy("P-Signal Strategy", precision = 3)
// Parameters and const of P-Signal.
nPoints = input(title = "Number of Bars", type = input.integer, defval = 9, minval = 4, maxval = 100, group = "Parameters of observation.")
int nIntr = nPoints - 1
// Horner's method for the error (Gauss) & P-Signal functions.
fErf(x) =>
nT = 1.0/(1.0 + 0.5*abs(x))
nAns = 1.0 - nT*exp(-x*x - 1.26551223 +
nT*( 1.00002368 + nT*( 0.37409196 + nT*( 0.09678418 +
nT*(-0.18628806 + nT*( 0.27886807 + nT*(-1.13520398 +
nT*( 1.48851587 + nT*(-0.82215223 + nT*( 0.17087277 ))))))))))
x >= 0 ? nAns : -nAns
fPSignal(ser, int) =>
nStDev = stdev(ser, int)
nSma = sma(ser, int)
fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
// Strat.
float nPSignal = sma(fPSignal(change(ohlc4), nIntr), nIntr)
float ndPSignal = sign(nPSignal[0] - nPSignal[1])
strategy.entry("long", strategy.long, 1, when = nPSignal < 0 and ndPSignal > 0)
strategy.close("long", when = nPSignal > 0 and ndPSignal < 0)
// Plotting.
hline(+1.0, color = color.new(color.orange,70), linestyle = hline.style_dotted)
hline(-1.0, color = color.new(color.orange,70), linestyle = hline.style_dotted)
plot(nPSignal, color = color.blue, style = plot.style_line)
plot(strategy.position_size, color = color.white, style = plot.style_cross)
// Alerts.
if(strategy.position_size[0] > strategy.position_size[1])
alert("P-Signal strategy opened the long position: " + syminfo.tickerid + " " + timeframe.period, alert.freq_once_per_bar)
if(strategy.position_size[0] < strategy.position_size[1])
alert("P-Signal strategy closed the long position: " + syminfo.tickerid + " " + timeframe.period, alert.freq_once_per_bar)
// The end.