Стратегия получения прибыли от перемещения Джокера


Дата создания: 2023-09-23 15:04:20 Последнее изменение: 2023-09-23 15:04:20
Копировать: 0 Количество просмотров: 786
1
Подписаться
1617
Подписчики

Обзор

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

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

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

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

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

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

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

  • После включения мобильной остановки можно корректировать положение остановки в зависимости от движения рынка, гарантируя, что положение остановки всегда придерживается цены. Это более гибкое и эффективное, чем установка фиксированной цены остановки.

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

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

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

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

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

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

  • Подвижная остановка учитывает только односторонние движения, не учитывая отступления. Это означает, что цена снова возвращается назад, а подвижная остановка не понижается. Это может привести к тому, что остановка в конечном итоге отклоняется от теоретической цены.

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

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

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

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

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

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

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

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

Исходный код стратегии
/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='Joker Trailing TP Bot', shorttitle='Joker TTP Bot', overlay=true, pyramiding=0, process_orders_on_close=false, close_entries_rule='ANY', calc_on_every_tick=false, calc_on_order_fills=false, commission_type=strategy.commission.percent, commission_value=0.07, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, currency=currency.USD) //, max_labels_count=500)

fromDate = input(timestamp('01 Jan 2021 00:00 UTC'), 'From Date')
toDate = input(timestamp('31 Dec 2121 23:59 UTC'), 'To Date')
fastMALen = input.int(23, 'Fast SMA Length')
slowMALen = input.int(50, 'Slow SMA Length')
longTakeProfitPerc = input.float(0.5, 'Long Take Profit %', minval=0.05, step=0.05) * 0.01
shortTakeProfitPerc = input.float(0.5, 'Short Take Profit %', minval=0.05, step=0.05) * 0.01
enableTrailing = input.bool(true, 'Enable Trailing')
trailingTakeProfitPerc = input.float(0.01, 'Trailing Take Profit %', minval=0.01, maxval=100, step=0.01) * 0.01

float fastMA = ta.sma(close, fastMALen)
float slowMA = ta.sma(close, slowMALen)
bool isWithinPeriod = true
bool openLongPosition = isWithinPeriod and ta.crossover(fastMA, slowMA)
bool openShortPosition = isWithinPeriod and ta.crossunder(fastMA, slowMA)
bool longIsActive = openLongPosition or strategy.position_size > 0
bool shortIsActive = openShortPosition or strategy.position_size < 0

float longTakeProfitPrice = na
longTakeProfitPrice := if longIsActive
    if openLongPosition and not (strategy.position_size > 0)
        close * (1 + longTakeProfitPerc)
    else
        nz(longTakeProfitPrice[1], close * (1 + longTakeProfitPerc))
else
    na

float shortTakeProfitPrice = na
shortTakeProfitPrice := if shortIsActive
    if openShortPosition and not (strategy.position_size < 0)
        close * (1 - shortTakeProfitPerc)
    else
        nz(shortTakeProfitPrice[1], close * (1 - shortTakeProfitPrice))
else
    na

float longTrailingTakeProfitStepTicks = longTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick
float shortTrailingTakeProfitStepTicks = shortTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick

strategy.entry(id = 'Long Entry', direction = strategy.long, when = openLongPosition, alert_message = 'Long(' + syminfo.ticker + '): Started')
strategy.entry(id = 'Short Entry', direction = strategy.short, when = openShortPosition, alert_message = 'Short(' + syminfo.ticker + '): Started')
strategy.exit(id = 'Long Take Profit', from_entry = 'Long Entry', limit = enableTrailing ? na : longTakeProfitPrice, trail_price = enableTrailing ? longTakeProfitPrice : na, trail_offset = enableTrailing ? longTrailingTakeProfitStepTicks : na, when = longIsActive, alert_message = 'Long(' + syminfo.ticker + '): Take Profit activated')
strategy.exit(id = 'Short Take Profit', from_entry = 'Short Entry', limit = enableTrailing ? na : shortTakeProfitPrice, trail_price = enableTrailing ? shortTakeProfitPrice : na, trail_offset = enableTrailing ? shortTrailingTakeProfitStepTicks : na, when = shortIsActive, alert_message = 'Short(' + syminfo.ticker + '): Take Profit activated')

plot(series = fastMA, title='Fast SMA', color = color.blue, linewidth = 1, style = plot.style_line)
plot(series = slowMA, title='Slow SMA', color = color.orange, linewidth = 1, style = plot.style_line)
plot(series = longTakeProfitPrice, title='Long Take Profit', color = color.green, linewidth = 1, style = plot.style_cross, offset = 1)
plot(series = shortTakeProfitPrice, title='Short Take Profit', color = color.red, linewidth = 1, style = plot.style_cross, offset = 1)
plot(series = strategy.position_avg_price, title='Position', color = color.white, linewidth = 1, style = plot.style_linebr)