Sumber dimuat naik... memuat...

Trend Mengikut Strategi Penilaian Harapan Beradaptasi Berdasarkan Purata Bergerak Silang

Penulis:ChaoZhang, Tarikh: 2024-06-17 16:29:02
Tag:SMAEMA

img

Ringkasan

Strategi ini menggunakan persilangan dua purata bergerak mudah dengan tempoh yang berbeza untuk menentukan arah trend dan memasuki perdagangan apabila trend muncul. Pada masa yang sama, strategi ini juga memperkenalkan panel nilai dijangka untuk mengira dan memaparkan pulangan yang dijangka dari strategi pada skala masa yang berbeza, yang membolehkan pengguna menilai prestasi strategi dengan lebih baik. Panel nilai dijangka mengambil kira penunjuk utama seperti kadar kemenangan strategi, purata keuntungan, dan purata kerugian semasa tempoh sejarah, dan membentangkan prestasi strategi di bawah keadaan pasaran yang berbeza dengan cara yang intuitif.

Prinsip Strategi

Inti strategi ini adalah untuk menggunakan persilangan dua purata bergerak mudah dengan tempoh yang berbeza (14-hari dan 28-hari dalam contoh ini) untuk menentukan trend pasaran. Apabila purata jangka pendek melintasi di atas purata jangka panjang dari bawah, ia dianggap bahawa pasaran telah memasuki trend menaik, dan strategi membuka kedudukan panjang. Sebaliknya, apabila purata jangka pendek melintasi di bawah purata jangka panjang dari atas, ia dianggap bahawa pasaran telah memasuki trend menurun, dan strategi membuka kedudukan pendek. Dengan cara ini, strategi dapat menyesuaikan diri dengan trend pasaran yang berbeza dan menubuhkan kedudukan dengan tepat pada masanya apabila trend kelihatan menangkap keuntungan yang dibawa oleh trend.

Sebagai tambahan kepada penentuan trend asas dan logik perdagangan, strategi ini juga memperkenalkan panel nilai yang dijangkakan untuk mengira dan memaparkan pulangan yang dijangkakan dari strategi pada skala masa yang berbeza (bulan dan tahunan).

  1. Kadar kemenangan: bahagian perdagangan yang menguntungkan terhadap jumlah perdagangan dalam tempoh masa
  2. Keuntungan purata: jumlah keuntungan purata daripada semua perdagangan yang menguntungkan dalam tempoh masa
  3. Jumlah kerugian purata: jumlah kerugian purata daripada semua perdagangan yang rugi dalam tempoh masa

Menggunakan penunjuk ini, nilai yang dijangkakan strategi dalam tempoh masa itu boleh dikira: Nilai yang dijangkakan = Kadar Menang × Keuntungan Purata - (1 - Kadar Menang) × Kerugian Purata

Dengan memaparkan nilai yang dijangkakan untuk tempoh masa yang berbeza dalam bentuk peta haba pada carta, pengguna dapat melihat sekilas prestasi yang dijangkakan strategi dalam keadaan pasaran yang berbeza, dengan itu memahami penerapan dan risiko strategi dengan lebih baik.

Analisis Kelebihan

  1. Kemampuan penyesuaian yang kuat terhadap trend: Dengan menggunakan persilangan purata bergerak untuk menentukan trend, strategi dapat menyesuaikan kedudukan dengan tepat pada masanya di bawah trend pasaran yang berbeza untuk menyesuaikan diri dengan perubahan pasaran. Ini membolehkan strategi untuk mencapai pulangan yang baik di pasaran trend.

  2. Penilaian prestasi intuitif: Panel nilai yang dijangkakan yang terbina dalam memaparkan pulangan yang dijangkakan dari strategi pada tempoh masa yang berbeza dalam bentuk peta haba, yang membolehkan pengguna menilai prestasi strategi di bawah keadaan pasaran yang berbeza sekilas.

  3. Pertimbangan penunjuk statistik utama: Pengiraan nilai yang dijangkakan bukan sahaja mempertimbangkan kadar kemenangan strategi tetapi juga mengintegrasikan kesan keuntungan purata dan kerugian purata.

  4. Tetapan parameter yang fleksibel: Pengguna boleh menetapkan secara fleksibel sama ada untuk memaparkan panel nilai yang diharapkan dan ketelusan mengikut keperluan mereka. Ini membolehkan pengguna menyesuaikan kesan paparan carta mengikut pilihan mereka, meningkatkan pengalaman pengguna.

Analisis Risiko

  1. Prestasi yang lemah di pasaran yang terikat julat: Oleh kerana strategi terutamanya bergantung kepada trend untuk menjana keuntungan, perdagangan yang kerap dalam keadaan pasaran yang terikat julat atau trend yang tidak jelas boleh menyebabkan kelewatan dan kos transaksi yang ketara, yang mempengaruhi prestasi keseluruhan strategi.

  2. Batasan pengiraan nilai yang dijangkakan: Walaupun panel nilai yang dijangkakan menyediakan cara intuitif untuk menilai prestasi strategi, ia masih berdasarkan data sejarah untuk pengiraan. Apabila perubahan yang ketara berlaku di pasaran atau situasi yang melampau timbul, data sejarah mungkin tidak mencerminkan prestasi sebenar strategi, dan nilai rujukan nilai yang dijangkakan mungkin dikurangkan.

  3. Kesan besar pemilihan parameter: Prestasi strategi sebahagian besarnya bergantung pada pemilihan tempoh purata bergerak. Gabungan tempoh yang berbeza mungkin membawa hasil perdagangan yang sama sekali berbeza. Jika parameter yang dipilih tidak dapat menyesuaikan diri dengan baik dengan ciri pasaran, prestasi sebenar strategi mungkin menyimpang dengan ketara dari nilai yang diharapkan.

Arah pengoptimuman

  1. Memperkenalkan lebih banyak penunjuk teknikal: Berdasarkan purata bergerak yang sedia ada, penunjuk teknikal lain seperti MACD dan RSI boleh dipertimbangkan untuk menentukan kekuatan dan kelestarian trend dengan lebih baik, dengan itu meningkatkan masa masuk dan keluar strategi.

  2. Mengoptimumkan pengurusan kedudukan: Pada masa ini, strategi mengamalkan pendekatan kedudukan tetap apabila isyarat perdagangan muncul. Ia boleh dipertimbangkan untuk menyesuaikan kedudukan secara dinamik berdasarkan faktor seperti turun naik pasaran dan kekuatan trend untuk mengawal risiko dengan lebih baik dan meningkatkan pulangan.

  3. Tambahkan mekanisme berhenti keuntungan dan berhenti kerugian: Menambahkan mekanisme berhenti keuntungan dan berhenti kerugian yang munasabah kepada strategi dapat membantu strategi mengunci keuntungan yang ada dengan tepat pada masanya sambil mengehadkan kerugian yang berpotensi. Ini membantu meningkatkan nisbah risiko-balasan strategi dan mengekalkan prestasi yang agak stabil dalam pelbagai persekitaran pasaran.

  4. Mengoptimumkan pengiraan nilai yang dijangkakan: Kaedah pengiraan nilai yang dijangkakan boleh dioptimumkan lagi, seperti mempertimbangkan kos transaksi dan memperkenalkan tingkap bergerak untuk meningkatkan keberkesanan dan kepraktisan penunjuk nilai yang dijangkakan.

Ringkasan

Strategi ini menentukan trend pasaran dengan menggunakan persilangan purata bergerak dan menubuhkan kedudukan dengan tepat pada masanya apabila trend nampaknya menangkap keuntungan yang dibawa oleh trend. Pada masa yang sama, strategi ini juga memperkenalkan panel nilai dijangka yang intuitif untuk memaparkan pulangan yang dijangka dari strategi pada skala masa yang berbeza, menyediakan pengguna dengan lebih banyak rujukan membuat keputusan. Walaupun strategi mungkin berprestasi buruk di pasaran terhad julat dan pengiraan nilai dijangka mempunyai batasan tertentu, dengan memperkenalkan lebih banyak penunjuk teknikal, mengoptimumkan pengurusan kedudukan, menambah mekanisme berhenti keuntungan dan berhenti kerugian, dan langkah-langkah lain, nisbah risiko-balasan strategi dapat ditingkatkan lagi, membolehkannya menyesuaikan diri dengan lebih baik dengan persekitaran pasaran yang berubah.


/*backtest
start: 2023-06-11 00:00:00
end: 2024-06-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ir0nantc2

//@version=5
strategy("Expected Value Panel", overlay=true)

// ロングエントリー条件 / Long entry condition
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

// ショートエントリー条件 / Short entry condition
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)



// ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
// Please copy the code below and paste it into the strategy where you want to display the expected value.
// 以下のコードをコピーして期待値を表示させたいストラテジーに貼り付けて下さい。
// ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

// 表示選択 / Display selection
show_performance = input.bool(true, '期待値ON/OFF (Show Expected Value)', group='Expected Value / ©ir0nantc2')
transparency = input.int(50, '透過度 (Transparency)', minval=0, maxval=100, group='Expected Value / ©ir0nantc2')
prec = 2

// 背景色 / Background color
bg_color(value) =>
    na(value) ? color.new(color.gray, transparency) : value > 0.0 ? color.new(color.green, transparency) :
   value < 0.0 ? color.new(color.red, transparency) :color.new(color.gray, transparency)

// 利益と損失の追跡 / Track profits and losses
var float total_monthly_profit = 0.0
var float total_yearly_profit = 0.0

if show_performance
    new_month = month(time) != month(time[1])
    new_year  = year(time)  != year(time[1])
    cur_month_pnl = 0.0, cur_year_pnl  = 0.0
    eq = strategy.equity
    bar_pnl = eq / eq[1] - 1

    // 月次・年次 期待値 / Monthly & Yearly Expected Value
    cur_month_pnl := new_month ? 0.0 : (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 
    cur_year_pnl := new_year ? 0.0 : (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1  
    
    // 年次および月次期待値を格納 / Store monthly and yearly expected values
    var month_pnl  = array.new_float(), var month_time = array.new_int()
    var year_pnl  = array.new_float(), var year_time = array.new_int()
    
    // 期待値計算の変数 / Variables for expected value calculation
    var month_wins = array.new_int(), var month_losses = array.new_int()
    var month_avg_win = array.new_float(), var month_avg_loss = array.new_float()
    var year_wins = array.new_int(), var year_losses = array.new_int()
    var year_avg_win = array.new_float(), var year_avg_loss = array.new_float()

    // 月次および年次期待値の配列更新 / Update arrays for monthly and yearly expected values
    bool last_computed = false
    if (not na(cur_month_pnl[1]) and (new_month or barstate.islastconfirmedhistory))
        if (last_computed and array.size(month_pnl) > 0)
            array.pop(month_pnl), array.pop(month_time)
            array.pop(month_wins), array.pop(month_losses)
            array.pop(month_avg_win), array.pop(month_avg_loss)

        array.push(month_pnl, cur_month_pnl[1]), array.push(month_time, time[1])
        array.push(month_wins, 0), array.push(month_losses, 0)
        array.push(month_avg_win, 0.0), array.push(month_avg_loss, 0.0)
    
    if (not na(cur_year_pnl[1]) and (new_year or barstate.islastconfirmedhistory))
        if (last_computed and array.size(year_pnl) > 0)
            array.pop(year_pnl), array.pop(year_time)
            array.pop(year_wins), array.pop(year_losses)
            array.pop(year_avg_win), array.pop(year_avg_loss)

        array.push(year_pnl, cur_year_pnl[1]), array.push(year_time, time[1])
        array.push(year_wins, 0), array.push(year_losses, 0)
        array.push(year_avg_win, 0.0), array.push(year_avg_loss, 0.0)

    last_computed := barstate.islastconfirmedhistory ? true : last_computed

    // 勝ち取引と負け取引を追跡 / Track winning and losing trades
    if (strategy.closedtrades > 0 and na(strategy.closedtrades[1]) == false)
        closed_profit = strategy.netprofit - strategy.netprofit[1]
        if closed_profit > 0
            if array.size(month_wins) > 0
                wins = array.get(month_wins, array.size(month_wins) - 1) + 1
                avg_win = (array.get(month_avg_win, array.size(month_avg_win) - 1) * (wins - 1) + closed_profit) / wins
                array.set(month_wins, array.size(month_wins) - 1, wins)
                array.set(month_avg_win, array.size(month_avg_win) - 1, avg_win)
            if array.size(year_wins) > 0
                wins = array.get(year_wins, array.size(year_wins) - 1) + 1
                avg_win = (array.get(year_avg_win, array.size(year_avg_win) - 1) * (wins - 1) + closed_profit) / wins
                array.set(year_wins, array.size(year_wins) - 1, wins)
                array.set(year_avg_win, array.size(year_avg_win) - 1, avg_win)
        else
            if array.size(month_losses) > 0
                losses = array.get(month_losses, array.size(month_losses) - 1) + 1
                avg_loss = (array.get(month_avg_loss, array.size(month_avg_loss) - 1) * (losses - 1) + closed_profit) / losses
                array.set(month_losses, array.size(month_losses) - 1, losses)
                array.set(month_avg_loss, array.size(month_avg_loss) - 1, avg_loss)
            if array.size(year_losses) > 0
                losses = array.get(year_losses, array.size(year_losses) - 1) + 1
                avg_loss = (array.get(year_avg_loss, array.size(year_avg_loss) - 1) * (losses - 1) + closed_profit) / losses
                array.set(year_losses, array.size(year_losses) - 1, losses)
                array.set(year_avg_loss, array.size(year_avg_loss) - 1, avg_loss)

    // 月次テーブル / Monthly table
    var monthly_table = table(na)
    if (barstate.islastconfirmedhistory)
        monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_time) + 1, border_width = 1)
        table.cell(monthly_table, 0,  0, "",     bgcolor = #bbbbbb00)
        table.cell(monthly_table, 1,  0, "Jan",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 2,  0, "Feb",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 3,  0, "Mar",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 4,  0, "Apr",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 5,  0, "May",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 6,  0, "Jun",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 7,  0, "Jul",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 8,  0, "Aug",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 9,  0, "Sep",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 10, 0, "Oct",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 11, 0, "Nov",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 12, 0, "Dec",  bgcolor = #bbbbbb)
        table.cell(monthly_table, 13, 0, "Year", bgcolor = #bbbbbb)
    
        // 年次データの集計 / Collecting yearly data
        var year_total_pnl = array.new_float()
        var year_exp_val = array.new_float()
        
        for yt = 0 to array.size(year_time) - 1
            total_year_wins = 0, total_year_losses = 0
            total_year_avg_win = 0.0, total_year_avg_loss = 0.0
            total_year_pnl = 0.0

            for mt = 1 to 12
                idx = -1
                for j = 0 to array.size(month_time) - 1
                    if year(array.get(month_time, j)) == year(array.get(year_time, yt)) and month(array.get(month_time, j)) == mt
                        idx := j
                        break
                if idx != -1
                    total_year_pnl := total_year_pnl + array.get(month_pnl, idx)
                    total_year_wins := total_year_wins + array.get(month_wins, idx)
                    total_year_losses := total_year_losses + array.get(month_losses, idx)
                    total_year_avg_win := total_year_avg_win + (array.get(month_avg_win, idx) * array.get(month_wins, idx))
                    total_year_avg_loss := total_year_avg_loss + (array.get(month_avg_loss, idx) * array.get(month_losses, idx))
            
            total_year_avg_win := total_year_wins > 0 ? total_year_avg_win / total_year_wins : 0.0
            total_year_avg_loss := total_year_losses > 0 ? total_year_avg_loss / total_year_losses : 0.0
            win_rate = total_year_wins + total_year_losses > 0 ? total_year_wins / (total_year_wins + total_year_losses) : na
            exp_val = win_rate ? (win_rate * total_year_avg_win) - ((1 - win_rate) * math.abs(total_year_avg_loss)) : na
            array.push(year_total_pnl, total_year_pnl)
            array.push(year_exp_val, exp_val)
            
        for yt = 0 to array.size(year_time) - 1
            table.cell(monthly_table, 0,  yt + 1, str.tostring(year(array.get(year_time, yt))), bgcolor = #bbbbbb)
            
            y_color = bg_color(array.get(year_exp_val, yt))
            value_to_display = na(array.get(year_exp_val, yt)) ? "" : str.tostring(math.round(array.get(year_exp_val, yt) * 100, prec))
            table.cell(monthly_table, 13, yt + 1, value_to_display, bgcolor = y_color, text_color=color.new(color.white, 0))
            
        for mt = 0 to array.size(month_time) - 1
            m_row = year(array.get(month_time, mt)) - year(array.get(year_time, 0)) + 1
            m_col = month(array.get(month_time, mt))
            
            if array.size(month_wins) > mt and array.size(month_losses) > mt and array.size(month_avg_win) > mt and array.size(month_avg_loss) > mt
                win_rate = array.get(month_wins, mt) / (array.get(month_wins, mt) + array.get(month_losses, mt))
                exp_val = (win_rate * array.get(month_avg_win, mt)) - ((1 - win_rate) * math.abs(array.get(month_avg_loss, mt)))
                m_color = bg_color(exp_val)
                value_to_display = na(exp_val) ? "" : str.tostring(math.round(exp_val * 100, prec))
                table.cell(monthly_table, m_col, m_row, value_to_display, bgcolor = m_color, text_color=color.new(color.white, 0))
            else
                table.cell(monthly_table, m_col, m_row, "", bgcolor = color.new(color.gray, transparency), text_color=color.new(color.white, 0))
// [EOF]


Berkaitan

Lebih lanjut