Система морских черепах Коннектикута


Дата создания: 2023-11-06 10:23:12 Последнее изменение: 2023-11-06 10:23:12
Копировать: 1 Количество просмотров: 663
1
Подписаться
1617
Подписчики

Система морских черепах Коннектикута

Обзор

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

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

  • Двойная равновесная линия N1 и N2 (по умолчанию 20-я и 55-я) построена с использованием наивысшей цены.
  • Строй двойную равномерную линию, рассчитывающую минимальную цену на солнечную линию N3 и солнечную линию N4 (по умолчанию 10 и 20 дней).
  • Когда цена закрытия превышает линию дня N2, делаем больше; когда цена закрытия ниже линии дня N4, делаем равновесную позицию.
  • После того, как вы сделаете больше, каждое пополнение будет увеличено в N раз (по умолчанию в 1 раз), один раз, максимум 5 раз.
  • Настройка фиксированного стоп-страха, по умолчанию ATR N-кратно ниже входной цены (по умолчанию 2 раза).
  • Вход в новую позицию разрешается только после того, как предыдущая сделка является выигрышной.

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

Эта стратегия имеет следующие преимущества:

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

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

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

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

Риски можно снизить следующими способами:

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

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

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

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

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

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

Исходный код стратегии
/*backtest
start: 2022-10-30 00:00:00
end: 2023-11-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="Turtle", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=10, commission_type=strategy.commission.percent, commission_value=0.1, pyramiding=5)

stopInput = input(2.0, "Stop N", step=.5)
pyramidInput = input(1, "Pyramid N", step=.5)
l1LongInput = input(20, "L1 Long", minval=5)
l2LongInput = input(55, "L2 Long", minval=5)
l1LongExitInput = input (10, "L1 Long Exit", minval=5)
l2LongExitInput = input (20, "L2 Long Exit", minval=5)

FromYear = input(2000, "From Year", minval=1900),   FromMonth = input(1, "From Month", minval=1, maxval=12),    FromDay = input(1, "From Day", minval=1, maxval=31)
ToYear = input(9999, "To Year", minval=1900),       ToMonth = input(1, "To Month", minval=1, maxval=12),        ToDay = input(1, "To Day", minval=1, maxval=31)
FromDate = timestamp(FromYear, FromMonth, FromDay, 00, 00),     ToDate = timestamp(ToYear, ToMonth, ToDay, 23, 59)
TradeDateIsAllowed() => time >= FromDate and time <= ToDate
l1Long = highest(l1LongInput)
l1LongExit = lowest(l1LongExitInput)
l2Long = highest(l2LongInput)
l2LongExit = lowest(l2LongExitInput)

// 
// ADX, +-DI
// https://www.tradingview.com/script/rlMJ05yl-ADX-and-DI-pine-script-3-0/
//
len = 14
th = 20
TrueRange = max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
DirectionalMovementPlus = high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
DirectionalMovementMinus = nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
SmoothedTrueRange = 0.0
SmoothedTrueRange := nz(SmoothedTrueRange[1]) - (nz(SmoothedTrueRange[1])/len) + TrueRange
SmoothedDirectionalMovementPlus = 0.0
SmoothedDirectionalMovementPlus := nz(SmoothedDirectionalMovementPlus[1]) - (nz(SmoothedDirectionalMovementPlus[1])/len) + DirectionalMovementPlus
SmoothedDirectionalMovementMinus = 0.0
SmoothedDirectionalMovementMinus := nz(SmoothedDirectionalMovementMinus[1]) - (nz(SmoothedDirectionalMovementMinus[1])/len) + DirectionalMovementMinus

DIPlus = SmoothedDirectionalMovementPlus / SmoothedTrueRange * 100
DIMinus = SmoothedDirectionalMovementMinus / SmoothedTrueRange * 100
DX = abs(DIPlus-DIMinus) / (DIPlus+DIMinus)*100
ADX = sma(DX, len)

// Back to Turtle

filter = true // not (DIPlus < ADX and DIMinus < ADX) and DIPlus > DIMinus
var win = false
var totalPrice = 0.0
var buyPrice = 0.0
var avgPrice = 0.0
var nextBuyPrice = 0.0
var stopPrice = 0.0
var totalBuys = 0

var bool inBuy = false
var float l1LongPlot = highest(l1LongInput)
var float l2LongPlot = highest(l2LongInput)

n = atr(14)

var mode = 'L1'
string longLevel = na

if not inBuy 
    l1LongPlot := highest(l1LongInput)[1]
    l2LongPlot := highest(l2LongInput)[1]
    
    if (close > l2Long[1] and filter)
        mode := 'L2'
        if TradeDateIsAllowed() 
            strategy.close_all()
            strategy.entry("long", strategy.long, comment="L2")
            longLevel := 'L2'

        win := false
        buyPrice := close
        totalBuys := 1
        totalPrice := buyPrice
        avgPrice := buyPrice
        stopPrice := close-(stopInput*n)
        nextBuyPrice := high+(pyramidInput*n)
        inBuy := true
    else 
        if (close > l1Long[1] and filter)
            mode := 'L1'
            if not win
                if TradeDateIsAllowed()
                    strategy.close_all()
                    strategy.entry("long", strategy.long, comment="L1")
                    longLevel := 'L1'
            win := false
            buyPrice := close
            totalBuys := 1
            totalPrice := buyPrice
            avgPrice := buyPrice
            stopPrice := close-(stopInput*n)
            nextBuyPrice := high+(pyramidInput*n)
            inBuy := true
        else 
            inBuy := false

else
    l1LongPlot := l1LongPlot[1]
    l2LongPlot := l2LongPlot[1]
    
    if close > nextBuyPrice and TradeDateIsAllowed() and totalBuys < 6
        strategy.entry("long", strategy.long, comment="LP")
        longLevel := 'P'
        stopPrice := close-(stopInput*n)
        nextBuyPrice := high+(pyramidInput*n)
        totalBuys := totalBuys + 1
        totalPrice := totalPrice + buyPrice
        avgPrice := totalPrice / totalBuys

    if (close < stopPrice) 
        inBuy := false
        if TradeDateIsAllowed()
            if (close >= avgPrice)
                longLevel := 'SG'
            else 
                longLevel := 'SR'
            strategy.close("long", strategy.long)
        win := false
        buyPrice := 0
        avgPrice := 0
    else
        if (mode == 'L1' and close > l2Long[1] and filter)
            if win
                inBuy := true
                win := false
                mode := 'L2'
                if TradeDateIsAllowed()
                    strategy.close_all()
                    longLevel := 'L2'
                    strategy.entry("long", strategy.long, comment="L2")
                buyPrice := close
                totalBuys := 1
                totalPrice := buyPrice
                avgPrice := buyPrice
                stopPrice := close-(stopInput*n)
                nextBuyPrice := close+(pyramidInput*n)
        else
            if (close < l1LongExit[1] or close < l2LongExit[1])
                inBuy := false
                if TradeDateIsAllowed()
                    strategy.close("long", strategy.long)
                if close < avgPrice
                    longLevel := 'SR'
                    win := false
                else
                    longLevel := 'SG'
                    win := true
                buyPrice := 0

plot(l1LongPlot, title="l1 long", linewidth=3, style=plot.style_stepline, color=color.green)
plot(l1LongExit[1], title="l1 exit", linewidth=3, style=plot.style_stepline, color=color.red)

plot(l2LongPlot, title="l2 long", linewidth=2, style=plot.style_stepline, color=color.green)
plot(l2LongExit[1], title="l2 exit", linewidth=2, style=plot.style_stepline, color=color.red)

plot(stopPrice, title="stop", linewidth=2, style=plot.style_stepline, color=color.purple)

plotarrow(longLevel == 'L1' ? 1 : 0, colordown=color.black, colorup=color.green, transp=40)
plotarrow(longLevel == 'L2' ? 1 : 0, colordown=color.black, colorup=color.purple, transp=40)
plotarrow(longLevel == 'SR' ? -1 : 0, colordown=color.red, colorup=color.purple, transp=40)
plotarrow(longLevel == 'SG' ? -1 : 0, colordown=color.green, colorup=color.purple, transp=40)