এই কৌশলটি মূল্যের পরিবর্তনগুলি পরিমাপ করার জন্য গাউসিয়ান ত্রুটি ফাংশন দ্বারা গণনা করা পি-সিগন্যাল সূচকের উপর ভিত্তি করে একটি পরিমাণগত ট্রেডিং কৌশল। এটি প্রবেশ এবং প্রস্থানগুলির জন্য মূল্যের প্রবণতা এবং বাঁক পয়েন্টগুলি নির্ধারণ করতে পি-সিগন্যাল ব্যবহার করে।
এই কৌশলটির মূল সূচক হল পি-সিগন্যাল। পি-সিগন্যালের গণনার সূত্র হলঃ
fPSignal(ser, int) =>
nStDev = stdev(ser, int)
nSma = sma(ser, int)
fErf(nStDev > 0 ? nSma/nStDev/sqrt(2) : 1.0)
এখানে ser হল মূল্য সিরিজ, int হল nPoints প্যারামিটার, যা ফিরে তাকানোর জন্য বার সংখ্যা। এই সূত্রটি তিনটি অংশ নিয়ে গঠিতঃ
পুরো সূত্রটির অর্থ হল দামের চলমান গড়কে দামের স্ট্যান্ডার্ড বিচ্যুতি দ্বারা ভাগ করা, তারপরে স্ট্যান্ডার্ডাইজেশনের জন্য 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-সিগন্যাল 0 এর চেয়ে কম হলে এটি লং হয়ে যায় এবং ধনাত্মক হয়ে যায়। P-সিগন্যাল 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.