Бычьи и медвежьи стратегии криптовалют на основе индикатора Wall Street Mouse Halo


Дата создания: 2023-11-01 11:27:20 Последнее изменение: 2023-11-01 11:27:20
Копировать: 0 Количество просмотров: 681
1
Подписаться
1617
Подписчики

Бычьи и медвежьи стратегии криптовалют на основе индикатора Wall Street Mouse Halo

Обзор

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

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

  1. Расчет средней величины криптовалюты Wall Street Rat Trap Sphere Index с длиной средней величины 200 циклов.

  2. Определение состояния падения средней линии: когда средняя линия поднимается, стратегия принимает позиционную операцию; когда средняя линия падает, стратегия принимает нисходящую операцию

  3. Стратегия, позволяющая автоматически открывать и закрывать позиции в зависимости от текущего состояния позиции:

    • Стратегия автоматически открывает позиции, когда средняя линия находится на высоте и в данный момент нет позиции;

    • Стратегическая рыночная цена автоматически открывает позицию вниз, когда средняя линия падает и в настоящее время нет позиции;

    • При достижении установленного стоп-процента прибыли от многопоточной сделки, рыночная цена стратегии автоматически уравняется при многопоточной сделке;

    • Когда прибыль от позиции по убыточному курсу достигает установленного стоп-процента, рыночная цена стратегии автоматически устраняет позицию по убыточному курсу;

    • Когда убытки по опциону достигают установленной нормы остановки, рыночная цена стратегии автоматически уравняется с опционом;

    • Когда убытки по позиции на форекс достигают установленного стоп-процента, рыночная цена стратегии автоматически устраняет позиции на форекс.

  4. Стратегия обновления стоп-стоп-лосс в режиме реального времени в зависимости от изменения рынка базовой криптовалюты.

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

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

  2. Используя индикатор Уолл-стрит по ловле мыши, можно определить рыночные тенденции и избежать ошибочных сделок, вызванных шумом. Этот показатель имеет определенную задержку на прорыве вверх и вниз, что позволяет уменьшить убытки, вызванные ложными прорывами.

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

  4. Стратегия заключает полностью автоматизированные сделки, не требующие человеческого вмешательства, и работает 24 часа в сутки.

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

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

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

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

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

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

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

  2. Добавление механизма отслеживания тенденций, динамическое корректирование стоп-лосса в зависимости от колебаний курса.

  3. Повышение уровня ущерба, предотвращающего прорыв ущерба в экстремальных ситуациях.

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

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

  6. Повышение адаптивности стратегий для оптимизации параметров для различных криптовалют.

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

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

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

Исходный код стратегии
/*backtest
start: 2022-10-25 00:00:00
end: 2023-10-31 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/
// © levieux

//@version=5
strategy(title='Correlation Strategy', shorttitle='Correlation Strategy', 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)

supportLength = input.int(200, minval=1, title='Support Length')
supportSymbol = input('BTC_USDT:swap', title='Correlated Symbol')
supportSource = input(hlc3, title='Price Source')
takeprofitLong = input.float(0.2, 'Take Profit Long', step=0.01)
takeprofitShort = input.float(0.15, 'Take Profit Short', step=0.01)
stoplossLong = input.float(0.1, 'Stop Loss Long', step=0.01)
stoplossShort = input.float(0.04, 'Stop Loss Short', step=0.01)
start = input(defval = timestamp("01 Jan 2016 00:00 +0000"), title = "Start Time")
end = input(defval = timestamp("31 Dec 2050 23:59 +0000"), title = "End Time")

supportTicker = request.security(supportSymbol, timeframe.period, supportSource, lookahead=barmerge.lookahead_off)  //input(close, title="Source")
supportLine = ta.wma(supportTicker, supportLength)

window() => true

if not window()
    strategy.cancel_all()

supportLongPrice = close
supportShortPrice = close

if strategy.position_size > 0
    supportLongPrice := supportLongPrice[1]
if strategy.position_size < 0
    supportShortPrice := supportShortPrice[1]

longCondition = ta.rising(supportLine, 5) and window() and strategy.position_size <= 0
shortCondition = ta.falling(supportLine, 5) and window() and window() and strategy.position_size > 0
takeprofitLongCondition = takeprofitLong > 0 and window() and strategy.position_size > 0 and supportTicker > supportLongPrice * (1 + takeprofitLong)
stoplossLongCondition = stoplossLong > 0 and window() and strategy.position_size > 0 and supportTicker < supportLongPrice * (1 - stoplossLong)
takeprofitShortCondition = takeprofitShort > 0 and window() and strategy.position_size < 0 and supportTicker > supportShortPrice * (1 + takeprofitShort)
stoplossShortCondition = stoplossShort > 0 and window() and strategy.position_size < 0 and supportTicker < supportShortPrice * (1 - stoplossShort)

if longCondition
    strategy.entry('Long', strategy.long)
    supportLongPrice := supportTicker

if shortCondition
    strategy.entry('Short', strategy.short)
    supportShortPrice := supportTicker

if takeprofitLongCondition
    strategy.close('Long')
if stoplossLongCondition
    strategy.close('Long')
if takeprofitShortCondition
    strategy.close('Short')
if stoplossShortCondition
    strategy.close('Short')

///////////////////
// MONTHLY TABLE //

new_month = month(time) != month(time[1])
new_year  = year(time)  != year(time[1])

eq = strategy.equity

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

cur_month_pnl = 0.0
cur_year_pnl  = 0.0
cur_month_bh = 0.0
cur_year_bh  = 0.0

// Current Monthly P&L
cur_month_pnl := new_month ? 0.0 : 
                 (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1 
cur_month_bh := new_month ? 0.0 : 
                 (1 + cur_month_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 Monthly P&Ls
var month_pnl  = array.new_float(0)
var month_time = array.new_int(0)
var month_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_month_pnl[1]) and (new_month or end_time))
    if (end_time[1])
        array.pop(month_pnl)
        array.pop(month_time)
        
    array.push(month_pnl , cur_month_pnl[1])
    array.push(month_time, time[1])
    array.push(month_bh , cur_month_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])

// Monthly P&L Table    
var monthly_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
    monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_pnl) + 1, border_width = 1)

    table.cell(monthly_table, 0,  0, "",     bgcolor = #cccccc)
    table.cell(monthly_table, 1,  0, "Jan",  bgcolor = #cccccc)
    table.cell(monthly_table, 2,  0, "Feb",  bgcolor = #cccccc)
    table.cell(monthly_table, 3,  0, "Mar",  bgcolor = #cccccc)
    table.cell(monthly_table, 4,  0, "Apr",  bgcolor = #cccccc)
    table.cell(monthly_table, 5,  0, "May",  bgcolor = #cccccc)
    table.cell(monthly_table, 6,  0, "Jun",  bgcolor = #cccccc)
    table.cell(monthly_table, 7,  0, "Jul",  bgcolor = #cccccc)
    table.cell(monthly_table, 8,  0, "Aug",  bgcolor = #cccccc)
    table.cell(monthly_table, 9,  0, "Sep",  bgcolor = #cccccc)
    table.cell(monthly_table, 10, 0, "Oct",  bgcolor = #cccccc)
    table.cell(monthly_table, 11, 0, "Nov",  bgcolor = #cccccc)
    table.cell(monthly_table, 12, 0, "Dec",  bgcolor = #cccccc)
    table.cell(monthly_table, 13, 0, "Year", bgcolor = #999999)


    for yi = 0 to array.size(year_pnl) - 1
        table.cell(monthly_table, 0,  yi + 1, str.tostring(year(array.get(year_time, yi))), bgcolor = #cccccc)
        
        y_color = getCellColor(array.get(year_pnl, yi), array.get(year_bh, yi))
        table.cell(monthly_table, 13, yi + 1, str.tostring(math.round(array.get(year_pnl, yi) * 100)) + " (" + str.tostring(math.round(array.get(year_bh, yi) * 100)) + ")", bgcolor = y_color)
        
    for mi = 0 to array.size(month_time) - 1
        m_row   = year(array.get(month_time, mi))  - year(array.get(year_time, 0)) + 1
        m_col   = month(array.get(month_time, mi)) 
        m_color = getCellColor(array.get(month_pnl, mi), array.get(month_bh, mi))
        
        table.cell(monthly_table, m_col, m_row, str.tostring(math.round(array.get(month_pnl, mi) * 100)) + " (" + str.tostring(math.round(array.get(month_bh, mi) * 100)) +")", bgcolor = m_color)