Стратегия оценки адаптивного ожидаемого значения отслеживания тренда на основе кроссоверной скользящей средней

SMA EMA
Дата создания: 2024-06-17 16:29:02 Последнее изменение: 2024-06-17 16:29:02
Копировать: 2 Количество просмотров: 580
1
Подписаться
1617
Подписчики

Стратегия оценки адаптивного ожидаемого значения отслеживания тренда на основе кроссоверной скользящей средней

Обзор

Стратегия использует пересечение простых движущихся средних двух различных периодов, чтобы определить направление тренда, и торговать, когда тренд появляется. В то же время, стратегия также вводит панель ожиданий для расчета и демонстрации ожидаемой прибыли от стратегии в разных временных масштабах, чтобы пользователи могли лучше оценить эффективность стратегии.

Стратегический принцип

В основе этой стратегии лежит использование пересечения простых движущихся средних двух различных циклов (в данном случае 14 и 28 дней) для определения тенденции рынка. Когда краткосрочная средняя линия сверху пересекает долгосрочную среднюю линию, считается, что рынок входит в восходящую тенденцию, и стратегия открывает позицию.

В дополнение к базовым трендовым суждениям и логике торгов, стратегия также вводит панель ожидаемых значений для расчета и демонстрации ожидаемой прибыли от стратегии в разных временных масштабах (месячные и годовые). Расчет ожидаемых значений основан на ключевых статистических показателях стратегии за исторический период, включая:

  1. Победовые коэффициенты: доля прибыли стратегии в общем количестве сделок за данный период времени
  2. Средняя прибыль: средняя сумма прибыли от всех прибыльных сделок стратегии за данный период времени
  3. Средний убыток: средняя сумма убытков стратегии по всем убыточным сделкам за данный период времени

Используя эти показатели, можно рассчитать ожидаемые значения стратегии за данный временной период: Ожидаемое значение = коэффициент выигрыша × средняя прибыль - (1 - коэффициент выигрыша) × средний убыток

Показав на графике в виде тепловых графиков ожидаемые значения для разных временных периодов, пользователь может получить представление о том, как стратегия будет работать в разных рыночных условиях, чтобы лучше понять ее применимость и риски.

Анализ преимуществ

  1. Тенденционная адаптивность: используя пересечение движущихся средних для определения тенденции, стратегия может своевременно корректировать позиции в соответствии с различными тенденциями рынка, чтобы адаптироваться к изменениям рынка. Это позволяет стратегии получать лучшую прибыль в трендовых рынках.

  2. Интуитивная оценка эффективности: встроенная панель ожидаемых значений в виде тепловой диаграммы показывает ожидаемую отдачу от стратегии в разные периоды времени, что позволяет пользователю оценить эффективность стратегии в разных рыночных условиях. Эта визуализированная представленность эффективности предоставляет пользователю дополнительную информацию для принятия решений.

  3. С учетом ключевых статистических показателей: расчет ожидаемого значения учитывает не только вероятность успеха стратегии, но и влияние средней прибыли и средних убытков. Такой способ расчета может более полно и точно отражать фактическую эффективность стратегии, предоставляя пользователям более надежные ссылки.

  4. Гибкая параметровая настройка: пользователь может гибко настроить желаемые значения панели, в зависимости от того, будет ли она отображаться или нет, а также прозрачность панели. Это позволяет пользователям настраивать отображение диаграмм в соответствии с их предпочтениями, улучшая пользовательский опыт.

Анализ рисков

  1. Недостаточная эффективность в нестабильных рынках: Поскольку стратегия в основном зависит от тенденций для получения дохода, частое совершение сделок может привести к значительным скольжениям и торговым затратам в нестабильных рынках или в условиях неопределенной тенденции, что может повлиять на общую эффективность стратегии.

  2. Ограничения расчета ожидаемых значений: Несмотря на то, что панель ожидаемых значений предоставляет интуитивный способ оценки эффективности стратегии, она по-прежнему рассчитывается на основе исторических данных. В случае значительных изменений на рынке или возникновения экстремальных ситуаций исторические данные могут не отражать эффективность стратегии, и эталонный смысл ожидаемых значений может быть снижен.

  3. Выбор параметров имеет большое влияние: эффективность стратегии во многом зависит от выбора циклов движущихся средних. Различные комбинации циклов могут привести к совершенно разным результатам торгов. Если выбранные параметры не могут хорошо адаптироваться к рыночным особенностям, фактическая эффективность стратегии может отклоняться от ожидаемых значений.

Направление оптимизации

  1. Внедрение большего количества технических показателей: на основе существующих скользящих средних можно рассмотреть возможность внедрения других технических показателей, таких как MACD, RSI и т. Д., Чтобы лучше оценить силу и устойчивость тенденций, что позволит улучшить время входа и выхода из стратегии.

  2. Оптимизация управления позициями: в настоящее время в стратегии используется метод фиксирования позиций при появлении торговых сигналов. Можно рассмотреть возможность динамической корректировки позиций в зависимости от факторов, таких как волатильность рынка, интенсивность тренда, для лучшего контроля риска и повышения прибыли.

  3. Включение механизма стоп-стоп: Включение в стратегию разумного механизма стоп-стоп может помочь стратегии своевременно блокировать уже полученные доходы, ограничивая при этом возможные потери. Это помогает повысить соотношение риска и прибыли стратегии, позволяя ей оставаться относительно стабильной в различных рыночных условиях.

  4. Оптимизация расчета ожидаемых значений: методы расчета ожидаемых значений могут быть дополнительно оптимизированы, например, с учетом затрат на транзакции, введением мобильных окон и т. Д., Чтобы повысить эффективность и практичность показателей ожидаемых значений. Кроме того, можно также исследовать другие показатели оценки эффективности стратегий, чтобы предоставить пользователям более полную справку.

Подвести итог

Стратегия использует пересечение движущихся средних для оценки рыночных тенденций и своевременного создания позиций для получения прибыли от тенденций. В то же время, стратегия также вводит интуитивно понятную панель ожидаемых значений, используемую для отображения ожидаемых доходов от стратегии в разных временных масштабах, чтобы предоставить пользователям больше информации для принятия решений. Хотя стратегия может плохо работать в нестабильных рынках, и есть определенные ограничения в расчете ожидаемых значений, но путем введения большего количества технических показателей, оптимизации управления позициями и включения стоп-стоп-убытков можно еще больше повысить риск-прибыль стратегии, чтобы она могла лучше адаптироваться к многочисленным изменениям в рыночной среде.

Исходный код стратегии
/*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]