Strategi penilaian nilai jangkaan adaptif penjejakan trend berdasarkan purata bergerak silang

SMA EMA
Tarikh penciptaan: 2024-06-17 16:29:02 Akhirnya diubah suai: 2024-06-17 16:29:02
Salin: 2 Bilangan klik: 580
1
fokus pada
1617
Pengikut

Strategi penilaian nilai jangkaan adaptif penjejakan trend berdasarkan purata bergerak silang

Gambaran keseluruhan

Strategi ini menggunakan persilangan purata bergerak sederhana dari dua tempoh yang berbeza untuk menentukan arah trend, dan berdagang apabila trend muncul. Pada masa yang sama, strategi ini juga memperkenalkan panel nilai jangkaan untuk mengira dan mempamerkan pendapatan yang diharapkan dari strategi ini dalam skala masa yang berbeza, supaya pengguna dapat menilai prestasi strategi dengan lebih baik.

Prinsip Strategi

Strategi ini menggunakan purata bergerak sederhana dari dua kitaran yang berbeza (dalam contoh ini 14 dan 28 hari) untuk menilai trend pasaran. Apabila rata-rata jangka pendek dari bawah ke atas melintasi rata-rata jangka panjang, menganggap bahawa pasaran memasuki trend naik, strategi membuka lebih banyak kedudukan; sebaliknya, apabila rata-rata jangka pendek dari atas ke bawah melintasi rata-rata jangka panjang, menganggap bahawa pasaran memasuki trend menurun, strategi membuka posisi kosong. Dengan cara ini, strategi dapat menyesuaikan diri dengan trend pasaran yang berbeza, dan membangunkan posisi tepat pada masanya untuk mendapatkan keuntungan dari trend.

Di samping penilaian trend asas dan logik dagangan, strategi ini juga memperkenalkan panel nilai yang diharapkan untuk mengira dan mempamerkan hasil yang diharapkan dari strategi ini dalam skala masa yang berbeza (bulan dan tahun). Pengiraan nilai yang diharapkan adalah berdasarkan kepada indikator statistik utama strategi dalam tempoh sejarah, termasuk:

  1. Kadar kemenangan: peratusan jumlah keuntungan strategi dalam jumlah dagangan dalam tempoh masa tersebut
  2. Purata keuntungan: jumlah keuntungan purata dari semua perdagangan keuntungan strategi dalam tempoh masa tersebut
  3. Purata kerugian: jumlah purata kerugian strategi bagi semua urus niaga yang rugi dalam tempoh masa tersebut

Dengan menggunakan petunjuk ini, anda boleh mengira nilai yang diharapkan oleh strategi dalam tempoh masa ini: Nilai yang diharapkan = Peluang menang × purata keuntungan - (1 - Peluang menang) × purata kerugian

Dengan memaparkan nilai yang diharapkan untuk tempoh masa yang berbeza dalam bentuk carta panas, pengguna dapat melihat dengan jelas bagaimana strategi itu diharapkan untuk berfungsi dalam keadaan pasaran yang berbeza, dan dengan itu lebih memahami kelayakan dan risiko strategi.

Analisis kelebihan

  1. Adaptif terhadap trend: Dengan menggunakan persilangan rata-rata bergerak untuk menilai trend, strategi ini dapat menyesuaikan kedudukan tepat pada masanya di bawah trend pasaran yang berbeza untuk menyesuaikan diri dengan perubahan pasaran. Ini membolehkan strategi ini memperoleh keuntungan yang lebih baik di pasaran yang sedang tren.

  2. Penilaian prestasi intuitif: Panel nilai jangkaan terbina dalam menunjukkan hasil yang diharapkan dari strategi dalam bentuk carta panas dalam tempoh masa yang berbeza, yang membolehkan pengguna menilai prestasi strategi dalam keadaan pasaran yang berbeza. Penampilan prestasi visual ini memberikan lebih banyak rujukan keputusan kepada pengguna.

  3. Mengambil kira petunjuk statistik utama: Pengiraan nilai yang diharapkan mempertimbangkan bukan sahaja peluang kemenangan strategi, tetapi juga kesan keuntungan purata dan kerugian purata. Cara pengiraan ini dapat mencerminkan prestasi sebenar strategi dengan lebih lengkap dan lebih tepat, memberikan rujukan yang lebih dipercayai kepada pengguna.

  4. Tetapan parameter yang fleksibel: Pengguna boleh mengikut keperluan yang fleksibel untuk menetapkan nilai yang diharapkan untuk panel yang dipaparkan atau tidak, dan juga untuk ketelusan panel. Ini membolehkan pengguna untuk menyesuaikan paparan grafik mengikut keutamaan mereka sendiri, meningkatkan pengalaman penggunaan.

Analisis risiko

  1. Performa buruk dalam pasaran goyah: Oleh kerana strategi ini bergantung kepada trend untuk mendapatkan keuntungan, perdagangan yang kerap dalam keadaan pasaran goyah atau trend yang tidak jelas boleh menyebabkan slippage dan kos perdagangan yang besar, yang mempengaruhi prestasi keseluruhan strategi.

  2. Batasan pengiraan nilai harapan: Walaupun panel nilai harapan memberikan cara intuitif untuk menilai prestasi strategi, ia masih dikira berdasarkan data sejarah. Data sejarah mungkin tidak mencerminkan prestasi strategi yang sebenarnya dengan baik apabila terdapat perubahan besar di pasaran atau keadaan yang melampau, dan nilai harapan mungkin dikurangkan.

  3. Pilihan parameter mempunyai pengaruh yang besar: prestasi strategi ini sangat bergantung kepada pilihan kitaran rata-rata bergerak. Kombinasi kitaran yang berbeza mungkin membawa hasil perdagangan yang sangat berbeza. Jika parameter yang dipilih tidak sesuai dengan ciri-ciri pasaran, prestasi sebenar strategi mungkin menyimpang jauh dari nilai yang diharapkan.

Arah pengoptimuman

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

  2. Pengurusan kedudukan yang optimum: Strategi semasa mengambil pendekatan kedudukan tetap apabila isyarat perdagangan muncul. Anda boleh mempertimbangkan untuk menyesuaikan kedudukan secara dinamik berdasarkan faktor seperti turun naik pasaran, kekuatan trend, dan sebagainya untuk mengawal risiko dan meningkatkan keuntungan.

  3. Menambahkan mekanisme hentian dan kerugian: Menambahkan mekanisme hentian dan kerugian yang munasabah dalam strategi dapat membantu strategi mengunci keuntungan yang ada pada masa yang tepat, sambil mengehadkan kemungkinan kerugian. Ini membantu meningkatkan nisbah keuntungan risiko strategi, yang membolehkan ia mengekalkan prestasi yang agak mantap dalam pelbagai keadaan pasaran.

  4. Mengoptimumkan pengiraan nilai yang diharapkan: kaedah pengiraan nilai yang diharapkan dapat dioptimumkan lebih lanjut, seperti mempertimbangkan kos transaksi, memperkenalkan tetingkap mudah alih, dan lain-lain, untuk meningkatkan keberkesanan dan kegunaan indikator nilai yang diharapkan. Selain itu, indikator penilaian prestasi strategi lain dapat dijelajahi untuk memberi rujukan yang lebih menyeluruh kepada pengguna.

ringkaskan

Strategi ini menggunakan persilangan rata-rata bergerak untuk menilai trend pasaran dan mengambil kedudukan tepat pada masanya apabila trend muncul untuk mendapatkan keuntungan dari trend tersebut. Di samping itu, strategi ini juga memperkenalkan panel nilai jangkaan yang intuitif untuk mempamerkan pendapatan yang diharapkan dari strategi ini dalam skala masa yang berbeza, untuk memberikan lebih banyak rujukan kepada pengguna. Walaupun strategi ini mungkin tidak berfungsi dengan baik di pasaran yang bergolak dan mempunyai batasan dalam pengiraan nilai yang diharapkan, dengan memperkenalkan lebih banyak petunjuk teknikal, mengoptimumkan pengurusan kedudukan, dan memasukkan langkah-langkah stop loss, anda dapat meningkatkan lagi keuntungan berbanding risiko strategi, dan dapat menyesuaikan diri dengan lebih baik dengan banyak perubahan pasaran.

Kod sumber strategi
/*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]