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)