Стратегия торговли скользящей средней


Дата создания: 2023-10-30 15:53:25 Последнее изменение: 2023-10-30 15:53:25
Копировать: 3 Количество просмотров: 611
1
Подписаться
1617
Подписчики

Стратегия торговли скользящей средней

Обзор

Эта стратегия применяет систему равнолинейной оценки направления текущего тренда, в зависимости от направления тренда, делать больше пробелов. Когда средняя линия поднимается, оценивать как высокую уверенность в понижении, делать больше; когда средняя линия снижается, оценивать как высокую уверенность в снижении, делать пробелы. Эта стратегия в основном использует систему равнолинейной оценки направления движения рынка, относится к стратегии, следующей за тенденцией.

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

  1. Вычислите весомое скользящее среднее (vwma) за определенный период (по умолчанию 400 циклов) в качестве среднелинейного показателя.

  2. Определить, повысилась ли средняя линия VWMA, если она повысилась, то настроить смотреть многосигнал uptrend; если она снизилась, то настроить смотреть сигнал downtrend.

  3. Когда uptrend является истинным, делать больше; когда downtrend является истинным, сделать пустой позиции.

  4. Вычислите стратегическую доходность bar_pnl и доходность bar_bh для каждой линии K.

  5. На основе квартальных и годовых точек отрыва рассчитывается стратегическая доходность quarter_pnl и годовая доходность year_pnl для каждого квартала и года, а также соответствующая доходность покупатель-держатель quarter_bh и year_bh.

  6. В таблице показаны стратегическая доходность и доходность покупки и хранения в каждом квартале за год.

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

Эта стратегия основана на оценке направления рыночных тенденций с помощью средней линии и имеет следующие преимущества:

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

  2. Сильная способность к отступлению, следование тренду и эффективное управление потерями на рынках, не являющихся трендом.

  3. Меньше параметров для настройки, основное регулирование среднелинейных циклов, легкость тестирования и оптимизации.

  4. Например, если вы используете таблицу для визуализации доходов, то это выглядит просто.

  5. В таблице доходов добавляется доход от покупки и хранения для сравнения, чтобы можно было четко определить стратегию прироста доходов.

  6. Гибкость в расположении таблицы позволяет использовать ее в сочетании с другими стратегиями.

Анализ стратегических рисков

Однако эта стратегия также несет в себе некоторые риски:

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

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

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

  4. Не учитывается механизм остановки убытков, существует значительный риск вывода. Можно установить динамическое остановку убытков или рассмотреть возможность снижения позиции.

  5. Для оптимизации таблицы можно рассмотреть возможность добавления таких показателей риска, как коэффициент резкости (sharp ratio) и максимальный отзыв (maximum withdrawal).

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

Эта стратегия может быть оптимизирована в следующих аспектах:

  1. Оптимизация среднелинейных параметров, адаптация среднелинейных циклов к различным рыночным условиям.

  2. Добавление фильтрующих условий, таких как высокие точки перед прорывом, чтобы уменьшить whipsaw.

  3. Попробуйте различные типы средних линий, такие как весовые скользящие средние, двузначные скользящие средние и т. д.

  4. Присоединение к механизму остановки убытков позволяет установить динамическую остановку убытков или рассмотреть возможность снижения позиции.

  5. Добавьте в таблицу дополнительные параметры, такие как sharpe ratio, максимальное отклонение и т.д.

  6. В сочетании с другими показателями, такими как MACD, Bollinger Bands и т.д., можно определить тенденцию.

  7. Оптимизация управления позициями, динамическая корректировка позиций в зависимости от рыночных условий.

  8. Тестирование эффективности работы различных стандартов для определения оптимального применения.

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

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

Исходный код стратегии
/*backtest
start: 2022-10-23 00:00:00
end: 2023-10-29 00:00:00
period: 1d
basePeriod: 1h
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/
// © Dannnnnnny

//@version=4
strategy(title="Quarterly Returns in Strategies vs Buy & Hold", initial_capital= 1000, overlay=true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, commission_value = 0.1)
maLength= input(400)

wma= vwma(hl2,maLength)
uptrend= rising(wma, 5)
downtrend= falling(wma,5)

plot(wma)

if uptrend
    strategy.entry("Buy", strategy.long)
else
    strategy.close("Buy")//

///////////////////
// QUARTERLY TABLE //
enableQuarterlyTable = input(title="Enable Quarterly Return table", type=input.bool, defval=false)
enableCompareWithMarket = input(title="Compare with Market Benchmark", type=input.bool, defval=false)
table_position = input(title="Table Position", type=input.string, defval='bottom_right', options=['bottom_right','bottom_left','top_right', 'top_left'])
precision = 2
new_quarter = ceil(month(time)/3)  != ceil(month(time[1])/3)
new_year  = year(time)  != year(time[1])

eq = strategy.equity

bar_pnl = eq / eq[1] - 1
bar_bh = (close-close[1])/close[1]

cur_quarter_pnl = 0.0
cur_year_pnl  = 0.0
cur_quarter_bh = 0.0
cur_year_bh  = 0.0

// Current Quarterly P&L
cur_quarter_pnl := new_quarter ? 0.0 : 
                 (1 + cur_quarter_pnl[1]) * (1 + bar_pnl) - 1 
cur_quarter_bh := new_quarter ? 0.0 : 
                 (1 + cur_quarter_bh[1]) * (1 + bar_bh) - 1

// Current Yearly P&L
cur_year_pnl := new_year ? 0.0 : 
                 (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1
cur_year_bh := new_year ? 0.0 : 
                 (1 + cur_year_bh[1]) * (1 + bar_bh) - 1

// Arrays to store Yearly and Quarterly P&Ls
var quarter_pnl  = array.new_float(0)
var quarter_time = array.new_int(0)
var quarter_bh  = array.new_float(0)

var year_pnl  = array.new_float(0)
var year_time = array.new_int(0)
var year_bh  = array.new_float(0)

end_time = false

end_time:= time_close + (time_close - time_close[1]) > timenow or barstate.islastconfirmedhistory

if (not na(cur_quarter_pnl[1]) and (new_quarter or end_time))
    if (end_time[1])
        array.pop(quarter_pnl)
        array.pop(quarter_time)
        
    array.push(quarter_pnl , cur_quarter_pnl[1])
    array.push(quarter_time, time[1])
    array.push(quarter_bh , cur_quarter_bh[1])

if (not na(cur_year_pnl[1]) and (new_year or end_time))
    if (end_time[1])
        array.pop(year_pnl)
        array.pop(year_time)
        
    array.push(year_pnl , cur_year_pnl[1])
    array.push(year_time, time[1])
    array.push(year_bh , cur_year_bh[1])

// Quarterly P&L Table    
var quarterly_table = table(na)

getCellColor(pnl, bh)  => 
    if pnl > 0
        if bh < 0 or pnl > 2 * bh
            color.new(color.green, transp = 20)
        else if pnl > bh
            color.new(color.green, transp = 50)
        else
            color.new(color.green, transp = 80)
    else
        if bh > 0 or pnl < 2 * bh
            color.new(color.red, transp = 20)
        else if pnl < bh
            color.new(color.red, transp = 50)
        else
            color.new(color.red, transp = 80)

if (end_time and enableQuarterlyTable)
    quarterly_table := table.new(table_position, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)

    table.cell(quarterly_table, 0,  0, "",     bgcolor = #cccccc)
    table.cell(quarterly_table, 1,  0, "Q1",  bgcolor = #cccccc)
    table.cell(quarterly_table, 2,  0, "Q2",  bgcolor = #cccccc)
    table.cell(quarterly_table, 3,  0, "Q3",  bgcolor = #cccccc)
    table.cell(quarterly_table, 4,  0, "Q4",  bgcolor = #cccccc)
    table.cell(quarterly_table, 5,  0, "Year", bgcolor = #999999)


    for yi = 0 to array.size(year_pnl) - 1
        table.cell(quarterly_table, 0,  yi + 1, tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
        
        y_color = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi))
        table.cell(quarterly_table, 5, yi + 1, enableCompareWithMarket ? tostring(round(array.get(year_pnl, yi) * 100, precision)) + " (" + tostring(round(array.get(year_bh, yi) * 100, precision)) + ")" : tostring(round(array.get(year_pnl, yi) * 100, precision)), bgcolor = y_color, text_color=#bfbfbf)
        
    for mi = 0 to array.size(quarter_time) - 1
        m_row   = year(array.get(quarter_time, mi))  - year(array.get(year_time, 0)) + 1
        m_col   = ceil(month(array.get(quarter_time, mi)) / 3)
        m_color = getCellColor(array.get(quarter_pnl, mi), array.get(quarter_bh, mi))
        
        table.cell(quarterly_table, m_col, m_row, enableCompareWithMarket ?  tostring(round(array.get(quarter_pnl, mi) * 100, precision)) + " (" + tostring(round(array.get(quarter_bh, mi) * 100,precision)) +")" : tostring(round(array.get(quarter_pnl, mi) * 100, precision)), bgcolor = m_color, text_color=#bfbfbf)