
Стратегия использует пересечение простых движущихся средних двух различных периодов, чтобы определить направление тренда, и торговать, когда тренд появляется. В то же время, стратегия также вводит панель ожиданий для расчета и демонстрации ожидаемой прибыли от стратегии в разных временных масштабах, чтобы пользователи могли лучше оценить эффективность стратегии.
В основе этой стратегии лежит использование пересечения простых движущихся средних двух различных циклов (в данном случае 14 и 28 дней) для определения тенденции рынка. Когда краткосрочная средняя линия сверху пересекает долгосрочную среднюю линию, считается, что рынок входит в восходящую тенденцию, и стратегия открывает позицию.
В дополнение к базовым трендовым суждениям и логике торгов, стратегия также вводит панель ожидаемых значений для расчета и демонстрации ожидаемой прибыли от стратегии в разных временных масштабах (месячные и годовые). Расчет ожидаемых значений основан на ключевых статистических показателях стратегии за исторический период, включая:
Используя эти показатели, можно рассчитать ожидаемые значения стратегии за данный временной период: Ожидаемое значение = коэффициент выигрыша × средняя прибыль - (1 - коэффициент выигрыша) × средний убыток
Показав на графике в виде тепловых графиков ожидаемые значения для разных временных периодов, пользователь может получить представление о том, как стратегия будет работать в разных рыночных условиях, чтобы лучше понять ее применимость и риски.
Тенденционная адаптивность: используя пересечение движущихся средних для определения тенденции, стратегия может своевременно корректировать позиции в соответствии с различными тенденциями рынка, чтобы адаптироваться к изменениям рынка. Это позволяет стратегии получать лучшую прибыль в трендовых рынках.
Интуитивная оценка эффективности: встроенная панель ожидаемых значений в виде тепловой диаграммы показывает ожидаемую отдачу от стратегии в разные периоды времени, что позволяет пользователю оценить эффективность стратегии в разных рыночных условиях. Эта визуализированная представленность эффективности предоставляет пользователю дополнительную информацию для принятия решений.
С учетом ключевых статистических показателей: расчет ожидаемого значения учитывает не только вероятность успеха стратегии, но и влияние средней прибыли и средних убытков. Такой способ расчета может более полно и точно отражать фактическую эффективность стратегии, предоставляя пользователям более надежные ссылки.
Гибкая параметровая настройка: пользователь может гибко настроить желаемые значения панели, в зависимости от того, будет ли она отображаться или нет, а также прозрачность панели. Это позволяет пользователям настраивать отображение диаграмм в соответствии с их предпочтениями, улучшая пользовательский опыт.
Недостаточная эффективность в нестабильных рынках: Поскольку стратегия в основном зависит от тенденций для получения дохода, частое совершение сделок может привести к значительным скольжениям и торговым затратам в нестабильных рынках или в условиях неопределенной тенденции, что может повлиять на общую эффективность стратегии.
Ограничения расчета ожидаемых значений: Несмотря на то, что панель ожидаемых значений предоставляет интуитивный способ оценки эффективности стратегии, она по-прежнему рассчитывается на основе исторических данных. В случае значительных изменений на рынке или возникновения экстремальных ситуаций исторические данные могут не отражать эффективность стратегии, и эталонный смысл ожидаемых значений может быть снижен.
Выбор параметров имеет большое влияние: эффективность стратегии во многом зависит от выбора циклов движущихся средних. Различные комбинации циклов могут привести к совершенно разным результатам торгов. Если выбранные параметры не могут хорошо адаптироваться к рыночным особенностям, фактическая эффективность стратегии может отклоняться от ожидаемых значений.
Внедрение большего количества технических показателей: на основе существующих скользящих средних можно рассмотреть возможность внедрения других технических показателей, таких как MACD, RSI и т. Д., Чтобы лучше оценить силу и устойчивость тенденций, что позволит улучшить время входа и выхода из стратегии.
Оптимизация управления позициями: в настоящее время в стратегии используется метод фиксирования позиций при появлении торговых сигналов. Можно рассмотреть возможность динамической корректировки позиций в зависимости от факторов, таких как волатильность рынка, интенсивность тренда, для лучшего контроля риска и повышения прибыли.
Включение механизма стоп-стоп: Включение в стратегию разумного механизма стоп-стоп может помочь стратегии своевременно блокировать уже полученные доходы, ограничивая при этом возможные потери. Это помогает повысить соотношение риска и прибыли стратегии, позволяя ей оставаться относительно стабильной в различных рыночных условиях.
Оптимизация расчета ожидаемых значений: методы расчета ожидаемых значений могут быть дополнительно оптимизированы, например, с учетом затрат на транзакции, введением мобильных окон и т. Д., Чтобы повысить эффективность и практичность показателей ожидаемых значений. Кроме того, можно также исследовать другие показатели оценки эффективности стратегий, чтобы предоставить пользователям более полную справку.
Стратегия использует пересечение движущихся средних для оценки рыночных тенденций и своевременного создания позиций для получения прибыли от тенденций. В то же время, стратегия также вводит интуитивно понятную панель ожидаемых значений, используемую для отображения ожидаемых доходов от стратегии в разных временных масштабах, чтобы предоставить пользователям больше информации для принятия решений. Хотя стратегия может плохо работать в нестабильных рынках, и есть определенные ограничения в расчете ожидаемых значений, но путем введения большего количества технических показателей, оптимизации управления позициями и включения стоп-стоп-убытков можно еще больше повысить риск-прибыль стратегии, чтобы она могла лучше адаптироваться к многочисленным изменениям в рыночной среде.
/*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]