তরঙ্গ প্রবণতা এবং VWMA এর উপর ভিত্তি করে পরিমাণগত কৌশল অনুসরণ করে প্রবণতা


সৃষ্টির তারিখ: 2024-01-26 17:35:29 অবশেষে সংশোধন করুন: 2024-01-26 17:35:29
অনুলিপি: 0 ক্লিকের সংখ্যা: 894
1
ফোকাস
1617
অনুসারী

তরঙ্গ প্রবণতা এবং VWMA এর উপর ভিত্তি করে পরিমাণগত কৌশল অনুসরণ করে প্রবণতা

ওভারভিউ

এই কৌশলটি ওয়েভ ট্রেন্ড ওজিলার এবং ভিডাব্লুএমএ সূচককে একত্রিত করে একটি প্রবণতা-অনুসরণকারী পরিমাণগত ট্রেডিং কৌশল বাস্তবায়ন করে। এই কৌশলটি বাজারের প্রবণতা সনাক্ত করতে পারে এবং ওয়েভ ট্রেন্ড ওজিলারের সংকেতের ভিত্তিতে কেনা বা বিক্রি করতে পারে। এছাড়াও, VWMA সূচকের সংকেতের ভিত্তিতে লেনদেনের আকার নির্ধারণ করা হয়।

কৌশল নীতি

এই কৌশলটি মূলত নিম্নলিখিত দুটি সূচকের উপর ভিত্তি করে তৈরি করা হয়েছেঃ

  1. Wave Trend Oscillator: LazyBear দ্বারা ট্রেডিংভিউতে স্থানান্তরিত একটি সূচক, যা মূল্যের ওঠানামা এবং ক্রয়/বিক্রয় সংকেত উৎপন্ন করে। এটি গণনা করা হয় নিম্নরূপঃ মূল্যের গড় মান ap গণনা করা হয়, তারপরে EMA এর জন্য ap গণনা করা হয় (যাকে esa বলা হয়), তারপরে EMA এর জন্য ap এবং ESA এর পার্থক্যের পরম মান গণনা করা হয় (যাকে d বলা হয়), এবং শেষ পর্যন্ত একটি সামঞ্জস্যের সূচক গণনা করা হয়*d), ci এর EMA হল Wave Trend ((wt1), wt1 এর 4 চক্রের SMA হল wt2। যখন wt1 এর উপরে wt2 কে ক্রয় সংকেত হিসাবে এবং নীচে একটি বিক্রয় সংকেত হিসাবে পরিবেশন করা হয়।

  2. ভিডাব্লুএমএ সূচকঃ এটি একটি ওজনের চলমান গড় যা লেনদেনের পরিমাণ বিবেচনা করে। দামের উপর নির্ভর করে ভিডাব্লুএমএ ব্যান্ডের (ভিডাব্লুএমএ এর উপরের এবং নীচের ট্র্যাকের) মধ্যে বা বাইরে, একটি সংকেত উত্পন্ন করে যা + 1 (মাল্টিহেড), 0 (নিরপেক্ষ) বা -1 (খালি) ।

ওয়েভ ট্রেন্ডের সংকেতের ভিত্তিতে কেনা এবং বিক্রি করার সময় নির্ধারণ করুন। এবং ভিডাব্লুএমএ সূচকের পল্টু-হোড সংকেতের ভিত্তিতে প্রতিটি লেনদেনের সঠিক সংখ্যা নির্ধারণ করুন।

কৌশলগত সুবিধা

  • এই দুটি সূচকের সংমিশ্রণ সিদ্ধান্ত গ্রহণের সঠিকতা বাড়াতে সাহায্য করে
  • ভিডাব্লুএমএ সূচকের উপর ভিত্তি করে বাজারের শক্তির তুলনা করা যায়
  • গুরুত্বপূর্ণ নিউজ ইভেন্টের তীব্র অস্থিরতা এড়াতে কাস্টমাইজড ট্রেডিং সময়সীমা
  • VWMA এর সংকেত অনুযায়ী ট্রেডিংয়ের সংখ্যা সামঞ্জস্য করা, ট্রেডিংয়ের ঝুঁকি হ্রাস করতে পারে

কৌশলগত ঝুঁকি

  • ওয়েভ ট্রেন্ড সূচক ভুল সংকেত দিতে পারে
  • VWMA সূচকগুলিকে প্রভাবিত করতে পারে অস্পষ্ট ডেলিভারি ডেটা
  • সূচক গণনার জন্য দীর্ঘ ইতিহাসের প্রয়োজন
  • ক্ষতিপূরণের কৌশল বিবেচনা করা হয়নি

অপ্টিমাইজেশান দিক

  • বিভিন্ন প্যারামিটার সমন্বয় পরীক্ষা করে সেরা প্যারামিটার খুঁজুন
  • স্টপ লস বাড়ান
  • সিগন্যাল ফিল্টারিং অন্যান্য সূচকের সাথে মিলিয়ে বিবেচনা করুন
  • বিভিন্ন লেনদেনের সময়সীমার সেটিং পরীক্ষা করুন
  • ডায়নামিক অ্যাডজাস্টমেন্ট ট্রেডিং গণনা পদ্ধতি

সারসংক্ষেপ

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

কৌশল সোর্স কোড
/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-25 00:00:00
period: 1h
basePeriod: 15m
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/
//
// Created by jadamcraig
// 
// This strategy benefits from extracts taken from the following
// studies/authors.  Thank you for developing and sharing your ideas in an open
// way!
//  * Wave Trend Strategy by thomas.gigure
//  * cRSI + Waves Strategy with VWMA overlay by Dr_Roboto
//
//@version=4

//==============================================================================
//==============================================================================
overlay = true  // plots VWMA (need to close and re-add)
//overlay = false // plots Wave Trend (need to close and re-add)

strategy("Wave Trend w/ VWMA overlay", overlay=overlay)
     
baseQty = input(defval=1, title="Base Quantity", type=input.float, minval=1)

useSessions = input(defval=true, title="Limit Signals to Trading Sessions?")
sess1_startHour = input(defval=8, title="Session 1: Start Hour",
     type=input.integer, minval=0, maxval=23)
sess1_startMinute = input(defval=25, title="Session 1: Start Minute",
     type=input.integer, minval=0, maxval=59)
sess1_stopHour = input(defval=10, title="Session 1: Stop Hour",
     type=input.integer, minval=0, maxval=23)
sess1_stopMinute = input(defval=25, title="Session 1: Stop Minute",
     type=input.integer, minval=0, maxval=59)
sess2_startHour = input(defval=12, title="Session 2: Start Hour",
     type=input.integer, minval=0, maxval=23)
sess2_startMinute = input(defval=55, title="Session 2: Start Minute",
     type=input.integer, minval=0, maxval=59)
sess2_stopHour = input(defval=14, title="Session 2: Stop Hour",
     type=input.integer, minval=0, maxval=23)
sess2_stopMinute = input(defval=55, title="Session 2: Stop Minute",
     type=input.integer, minval=0, maxval=59)
sess1_closeAll = input(defval=false, title="Close All at End of Session 1")
sess2_closeAll = input(defval=true, title="Close All at End of Session 2")

//==============================================================================
//==============================================================================
//                    Volume Weighted Moving Average (VWMA)
//==============================================================================
//==============================================================================
plotVWMA = overlay

// check if volume is available for this equity
useVolume = input(
     title="VWMA: Use Volume (uncheck if equity does not have volume)",
     defval=true)

vwmaLen = input(defval=21, title="VWMA: Length", type=input.integer, minval=1,
     maxval=200)
vwma = vwma(close, vwmaLen)
vwma_high = vwma(high, vwmaLen)
vwma_low = vwma(low, vwmaLen)

if not(useVolume)
    vwma := wma(close, vwmaLen)
    vwma_high := wma(high, vwmaLen)
    vwma_low := wma(low, vwmaLen)

// +1 when above, -1 when below, 0 when inside
vwmaSignal(priceOpen, priceClose, vwmaHigh, vwmaLow) =>
    sig = 0
    color = color.gray
    if priceClose > vwmaHigh
        sig := 1
        color := color.green
    else if priceClose < vwmaLow
        sig := -1
        color := color.red
    else
        sig := 0
        color := color.gray
    [sig,color]

[vwma_sig, vwma_color] = vwmaSignal(open, close, vwma_high, vwma_low)

priceAboveVWMA = vwma_sig ==  1 ? true : false
priceBelowVWMA = vwma_sig == -1 ? true : false
// plot(priceAboveVWMA?2.0:0,color=color.blue)
// plot(priceBelowVWMA?2.0:0,color=color.maroon)

//bandTrans = input(defval=70, title="VWMA Band Transparancy (100 invisible)",
//     type=input.integer, minval=0, maxval=100)
//fillTrans = input(defval=70, title="VWMA Fill Transparancy (100 invisible)",
//     type=input.integer, minval=0, maxval=100)
bandTrans = 60
fillTrans = 60

// ***** Plot VWMA *****
highband = plot(plotVWMA?fixnan(vwma_high):na, title='VWMA High band', 
     color = vwma_color, linewidth=1, transp=bandTrans)
lowband = plot(plotVWMA?fixnan(vwma_low):na, title='VWMA Low band',
     color = vwma_color, linewidth=1, transp=bandTrans)
fill(lowband, highband, title='VWMA Band fill', color=vwma_color,
     transp=fillTrans)
plot(plotVWMA?vwma:na, title='VWMA', color = vwma_color, linewidth=3,
     transp=bandTrans)

//==============================================================================
//==============================================================================
//                                  Wave Trend
//==============================================================================
//==============================================================================
plotWaveTrend = not(overlay)

n1 = input(10, "Wave Trend: Channel Length")
n2 = input(21, "Wave Trend: Average Length")
obLevel1 = input(60, "Wave Trend: Over Bought Level 1")
obLevel2 = input(53, "Wave Trend: Over Bought Level 2")
osLevel1 = input(-60, "Wave Trend: Over Sold Level 1")
osLevel2 = input(-53, "Wave Trend: Over Sold Level 2")

ap = hlc3 
esa = ema(ap, n1)
d = ema(abs(ap - esa), n1)
ci = (ap - esa) / (0.015 * d)
tci = ema(ci, n2)
 
wt1 = tci
wt2 = sma(wt1,4)

plot(plotWaveTrend?0:na, color=color.gray)
plot(plotWaveTrend?obLevel1:na, color=color.red)
plot(plotWaveTrend?osLevel1:na, color=color.green)
plot(plotWaveTrend?obLevel2:na, color=color.red, style=3)
plot(plotWaveTrend?osLevel2:na, color=color.green, style=3)

plot(plotWaveTrend?wt1:na, color=color.green)
plot(plotWaveTrend?wt2:na, color=color.red, style=3)
plot(plotWaveTrend?wt1-wt2:na, color=color.blue, transp=80)

//==============================================================================
//==============================================================================
//                               Order Management
//==============================================================================
//==============================================================================
// Define Long and Short Conditions
longCondition = crossover(wt1, wt2)
shortCondition = crossunder(wt1, wt2)

// Define Quantities
orderQty = baseQty * 2
if (longCondition)
    if (vwma_sig == 1)
        if ( strategy.position_size >= (baseQty * 4 * -1) and 
             strategy.position_size < 0 )
            orderQty := baseQty * 4 + abs(strategy.position_size)
        else
            orderQty := baseQty * 4
    else if (vwma_sig == 0)
        if ( strategy.position_size >= (baseQty * 2 * -1) and 
             strategy.position_size < 0 )
            orderQty := baseQty * 2 + abs(strategy.position_size)
        else
            orderQty := baseQty * 2
    else if (vwma_sig == -1)
        if ( strategy.position_size >= (baseQty * 1 * -1) and 
             strategy.position_size < 0 )
            orderQty := baseQty * 1 + abs(strategy.position_size)
        else
            orderQty := baseQty * 1
else if (shortCondition)
    if (vwma_sig == -1)
        if ( strategy.position_size <= (baseQty * 4) and 
             strategy.position_size > 0 )
            orderQty := baseQty * 4 + strategy.position_size
        else
            orderQty := baseQty * 4
    else if (vwma_sig == 0)
        if ( strategy.position_size <= (baseQty * 2) and 
             strategy.position_size > 2 )
            orderQty := baseQty * 2 + strategy.position_size
        else
            orderQty := baseQty * 2
    else if (vwma_sig == 1)
        if ( strategy.position_size <= (baseQty * 1) and 
             strategy.position_size > 0 )
            orderQty := baseQty * 1 + strategy.position_size
        else
            orderQty := baseQty * 1

// Determine if new trades are permitted
newTrades = false
if (useSessions)
    if ( hour == sess1_startHour and minute >= sess1_startMinute )
        newTrades := true
    else if ( hour > sess1_startHour and hour < sess1_stopHour )
        newTrades := true
    else if ( hour == sess1_stopHour and minute < sess1_stopMinute )
        newTrades := true
    else if ( hour == sess2_startHour and minute >= sess2_startMinute )
        newTrades := true
    else if ( hour > sess2_startHour and hour < sess2_stopHour )
        newTrades := true
    else if ( hour == sess2_stopHour and minute < sess2_stopMinute )
        newTrades := true
    else
        newTrades := false
else
    newTrades := true

// Long Signals
if ( longCondition  )
    strategy.order("Buy", strategy.long, orderQty)

// Short Signals
if ( shortCondition  )
    strategy.order("Sell", strategy.short, orderQty)

// Close open position at end of Session 1, if enabled
if (sess1_closeAll )
    strategy.close_all()
    
// Close open position at end of Session 2, if enabled
if (sess2_closeAll  )
    strategy.close_all()