মৎস্য নেট উন্নত কৌশল
এই কৌশলটি ক্লাসিকাল ফিশ নেট কৌশলকে উন্নত করে, একটি সম্পূর্ণ ট্রেন্ড অনুসরণকারী সিস্টেম গঠনের জন্য ক্রয় / বিক্রয় সংকেত থ্রেশহোল্ড এবং ট্রেলিং স্টপ লস যুক্ত করে।
ফিশ নেট কৌশলটি মূল্য এবং ভলিউমের মধ্যে সম্পর্ককে প্রতিফলিত করে মূল্যের সেন্ট্রয়েড ফোর্স গণনা করে বাজারের প্রবণতা বিচার করে। ক্রমবর্ধমান সেন্ট্রয়েড ফোর্স বুলিশ শক্তিকে শক্তিশালী করে, যখন হ্রাস হ্রাসের শক্তিকে উপস্থাপন করে, তাই ট্রেডিং সংকেতগুলি সেই অনুযায়ী তৈরি করা যেতে পারে।
সেন্ট্রয়েড ফোর্স গণনা করার মূল চাবিকাঠি হল মূল্য এবং সময়ের মধ্যে সম্পর্ক। সহজ কথায়, সাম্প্রতিক মূল্য পরিবর্তনের সামগ্রিক প্রবণতা রায়কে প্রভাবিত করার ক্ষেত্রে বৃহত্তর ওজন রয়েছে, যখন পুরানো দামের ওজন ছোট। সুতরাং গণনা করার সময়, একটি সময়-পঙ্গু ওজন গুণিত হয়। এটি উচ্চতর স্তরে ঘটে যাওয়া লেনদেনগুলিকে সামগ্রিক রায়কে আরও বেশি প্রভাবিত করে।
তবে মূল ফিশ নেটটি কেবল সেন্ট্রয়েড বক্ররেখার দিকের উপর ভিত্তি করে দীর্ঘ / সংক্ষিপ্ত বিচার করে, সহজেই পাশের দিকে চলাচলে ধরা পড়ে। এই উন্নত সংস্করণটি সংজ্ঞায়িত কিনুন / বিক্রয় সংকেত প্রান্তিককরণ যুক্ত করে, কেবলমাত্র যখন সেন্ট্রয়েড শক্তি একটি নির্দিষ্ট মাত্রা অতিক্রম করে তখন সংকেত উত্পন্ন করে, প্রচুর শব্দ ফিল্টার করে।
এছাড়াও, উন্নত সংস্করণটি প্রস্থানগুলির জন্য ট্রেইলিং স্টপ লস এবং ফিক্সড স্টপ লসের একটি সমন্বিত প্রক্রিয়া বাস্তবায়ন করে। একটি প্রবণতা প্রবেশের পরে, ট্রেইলিং স্টপ লস দামের ক্রিয়াকলাপের সাথে সামঞ্জস্য রাখতে পারে, গতিশীল ঝুঁকি নিয়ন্ত্রণ অর্জন করে। ফিক্সড স্টপ লস আকস্মিক ঘটনা থেকে ক্ষতি আরও নির্ভরযোগ্যভাবে প্রতিরোধ করতে পারে।
অবশ্যই, জটিল বাজারে সেন্ট্রয়েড ফোর্স সূচকের সীমিত ক্ষমতা রয়েছে, এবং অনুপযুক্তভাবে সেট করা হলে ট্রেইলিং স্টপগুলিও অনুপ্রবেশ করতে পারে, তাই ব্যবসায়ীদের সতর্ক থাকতে এবং সময়মত পরামিতিগুলি অনুকূল করতে হবে। তবে সামগ্রিকভাবে, এই উন্নত ফিশ নেট কৌশলটির উন্নত প্রক্রিয়াটি আরও বিস্তৃত, এবং শালীন স্থিতিশীল রিটার্ন তৈরি করতে পারে।
/*backtest start: 2023-09-04 00:00:00 end: 2023-09-11 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 // Copyright nilux: https://www.tradingview.com/u/nilux/ // Based on the original of dasanc: https://www.tradingview.com/u/dasanc/ strategy("FSCG-TSSL", "FSCG-TSSL Mod Backtest", default_qty_type = strategy.percent_of_equity, default_qty_value = 100, initial_capital = 100000, slippage = 5) Price = input.source(close, "Source") Length = input(20,"Period") transform = input("Inphase-Quadrature","Use Transform?",options=["Hilbert","Inphase-Quadrature","False"]) min = input(108,"Min. Period") buyTreshold = input(-2.41, title = "Buy Treshold (-)", type = float, defval=-2.0, minval = -2.50, maxval = -0.01, step = 0.01) sellTreshold = input(2.43, title = "Sell Treshold (+)", type = float, defval=2.0, minval = 0.01, maxval = 2.50, step = 0.01) // === TSSL === fixedSL = input(title="SL Activation", defval=300) trailSL = input(title="SL Trigger", defval=1) fixedTP = input(title="TP Activation", defval=150) trailTP = input(title="TP Trigger", defval=50) // === BACKTEST RANGE === FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2019, title = "From Year", minval = 2015) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 2015) start = timestamp(FromYear, FromMonth, FromDay, 00, 00) finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) window() => time >= start and time <= finish ? true : false getIQ(src,min,max) => PI = 3.14159265359 P = src - src[7] lenIQ = 0.0 lenC = 0.0 imult = 0.635 qmult = 0.338 inphase = 0.0 quadrature = 0.0 re = 0.0 im = 0.0 deltaIQ = 0.0 instIQ = 0.0 V = 0.0 inphase := 1.25*(P[4] - imult*P[2]) + imult*nz(inphase[3]) quadrature := P[2] - qmult*P + qmult*nz(quadrature[2]) re := 0.2*(inphase*inphase[1] + quadrature*quadrature[1]) + 0.8*nz(re[1]) im := 0.2*(inphase*quadrature[1] - inphase[1]*quadrature) + 0.8*nz(im[1]) if (re!= 0.0) deltaIQ := atan(im/re) for i=0 to max V := V + deltaIQ[i] if (V > 2*PI and instIQ == 0.0) instIQ := i if (instIQ == 0.0) instIQ := nz(instIQ[1]) lenIQ := 0.25*instIQ + 0.75*nz(lenIQ[1],1) length = lenIQ<min ? min : lenIQ getHT(src) => Price = src Imult = .635 Qmult = .338 PI = 3.14159 InPhase = 0.0 Quadrature = 0.0 Phase = 0.0 DeltaPhase = 0.0 InstPeriod = 0.0 Period = 0.0 Value4 = 0.0 if(n > 5) //Detrend Price Value3 = Price - Price[7] //Compute InPhase and Quadrature components InPhase := 1.25*(Value3[4] - Imult*Value3[2]) + Imult*nz(InPhase[3]) Quadrature := Value3[2] - Qmult*Value3 + Qmult*nz(Quadrature[2]) //Use ArcTangent to compute the current phase if(abs(InPhase + InPhase[1]) > 0) Phase := 180/PI * atan(abs((Quadrature + Quadrature[1]) / (InPhase + InPhase[1]))) //Resolve the ArcTangent ambiguity if(InPhase < 0 and Quadrature > 0) Phase := 180 - Phase if(InPhase < 0 and Quadrature < 0) Phase := 180 + Phase if(InPhase > 0 and Quadrature < 0) Phase := 360 - Phase //Compute a differential phase, resolve phase wraparound, and limit delta phase errors DeltaPhase := Phase[1] - Phase if(Phase[1] < 90 and Phase > 270) DeltaPhase := 360 + Phase[1] - Phase if(DeltaPhase < 1) DeltaPhase := 1 if(DeltaPhase > 60) DeltaPhase := 60 //Sum DeltaPhases to reach 360 degrees. The sum is the instantaneous period. for i = 0 to 50 Value4 := Value4 + DeltaPhase[i] if(Value4 > 360 and InstPeriod == 0) InstPeriod := i //Resolve Instantaneous Period errors and smooth if(InstPeriod == 0) InstPeriod = nz(InstPeriod[1]) Period := .25*(InstPeriod) + .75*Period[1] Period //Get highest val in period getHighest(src, len)=> H = src[len] for i=0 to len if src[i]>H H := src[i] H //Get lowest val in period getLowest(src, len)=> L = src[len] for i=0 to len if src[i]<L L := src[i] L if transform == "Hilbert" Length := round(getHT(Price)/2) if transform == "Inphase-Quadrature" Length := round(getIQ(Price,min,50)/2) if Length<min Length := min Num = 0.0 Denom = 0.0 CG = 0.0 MaxCG = 0.0 MinCG = 0.0 Value1 = 0.0 Value2 = 0.0 Value3 = 0.0 for i = 0 to Length - 1 Num := Num + (1 + i)*(Price[i]) Denom := Denom + (Price[i]) if(Denom != 0) CG := -Num/Denom + (Length + 1) / 2 MaxCG := getHighest(CG, Length) MinCG := getLowest(CG, Length) if(MaxCG != MinCG) Value1 := (CG - MinCG) / (MaxCG - MinCG) Value2 := (4*Value1 + 3*Value1[1] + 2*Value1[2] + Value1[3]) / 10 Value3 := .5*log((1+1.98*(Value2-.5))/(1-1.98*(Value2-.5))) plot(Value3, "CG",orange, linewidth=2) plot(Value3[1], "Trigger",green, linewidth=2) hline(0,color=color(black,60)) hline(2,linestyle=hline.style_solid,color=color(black,70)) hline(-2,linestyle=hline.style_solid,color=color(black,70)) sell = crossover(Value3[1],Value3) and Value3 > sellTreshold buy = crossunder(Value3[1],Value3) and Value3 < buyTreshold strategy.entry("Long", strategy.long, when= buy and window()) strategy.exit("Exit", loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) strategy.exit("Exit", when= sell) strategy.entry("Short", strategy.short, when= sell and window()) strategy.exit("Exit", loss=fixedSL, trail_offset=trailTP, trail_points=fixedTP) strategy.exit("Exit", when= buy)