Стратегия "Устойчивый как каменная черепаха" - это количественная торговая стратегия, которая следует правилам методологии торговли черепахами Брэди. Она использует прорыв цены для входа в позиции и прекращает отслеживание остановок для выхода. Она рассчитывает размер позиций на основе реальной волатильности и строго контролирует потери за сделку. Стратегия имеет долгосрочную стабильность в работе и сильную толерантность к снижению, как и устойчивые скалы.
Стратегия "Устойчивый как каменная черепаха" вступает в прорыв. В частности, она рассчитывает самый высокий максимум и самый низкий минимум за указанный период. Когда цена превышает самый высокий максимум, она идет на длинный. Когда цена превышает самый низкий минимум, она идет на короткий.
Например, с периодом входа, установленным на 20 бар, стратегия извлекает самый высокий максимум и самый низкий минимум за последние 20 бар. Если закрытие текущего бар превышает самый высокий максимум за последние 20 бар, стратегия разместит длинный стоп-ордер по этой цене, чтобы подготовиться к выходу выше самого высокого максимума.
Устойчивая стратегия Rock Turtle выходит с остановками, отслеживающими остановки. Она динамически вычисляет самый высокий и самый низкий уровень за указанный период выхода и использует их для определения выхода канала.
Если держать длинный, как только цена опустится ниже самого низкого уровня выхода канала, позиция остановится.
Кроме того, стратегия рассчитывает уровень стоп-лосса на основе реальной волатильности, которая служит последней остановкой. Пока цена остается выше выходного канала, стоп-лосс будет продолжать отслеживать и корректировать, гарантируя, что остановки устанавливаются на соответствующих расстояниях
Стратегия "Устойчивый как каменная черепаха" измеряет свои позиции на основе реальной волатильности. В частности, сначала она оценивает процент потенциальной потери вблизи входной цены, а затем обратно рассчитывает размер позиции из ожидаемого параметра риска. Это эффективно контролирует максимальную потерю на сделку.
Стратегия Steadfast as a Rock Turtle строго придерживается классических правил торговли черепахами при входе и выходе без произвольных модификаций. Это позволяет стратегии работать стабильно в течение длительного времени без сбоев системы из-за временного плохого суждения.
При входе на прорывы, стратегия эффективно избегает переоцененных входов, уменьшая вероятность потерь системы. и выходом с остановками отслеживания остановок, она гарантирует максимальный убыток на сделку контролируется, чтобы в значительной степени предотвратить последовательные потери, приводящие к глубоким снижениям.
Оценивая реальную волатильность, стратегия строго контролирует максимальную потерю на одну сделку в пределах допустимых пределов, и отслеживая расстояния остановки, она может сократить потери вовремя, чтобы эффективно сдерживать риски.
Если цена выходит с низким импульсом, это может оказаться ложным сигналом, вызывающим ошибочные потери входа.
Статические параметры стратегии, такие как периоды входа/выхода, могут стать недействительными, если рыночный режим резко изменится.
Индикаторы, используемые как ценовые флаги, могут потерпеть неудачу, когда тенденция или волатильность значительно меняются.
Можно добавить общие индикаторы тренда, такие как MA, MACD. Длинный ход только в восходящем тренде и короткий только в нисходящем тренде, чтобы избежать сбоев контртенда.
Повышенные показатели временных рамок, например, уровни суточных среднемесячных показателей, могут помочь подтвердить общее направление для дополнения сигналов более низких временных рамок.
Машинное обучение может автоматически обновлять параметры стратегии постоянно на основе последних данных, чтобы поддерживать эффективность в изменяющейся динамике рынка.
Стратегия "Устойчивый как каменная черепаха" следует классической торговой методологии черепахи, строго соблюдающей вход и отслеживание остановки выхода с строгим контролем рисков. Это позволяет долгосрочные стабильные операции с сильной устойчивостью к снижению. Несмотря на риски, такие как ложный прорыв, неудача параметров и т. Д., Они могут быть эффективно смягчены с помощью добавок, таких как фильтр тренда, синтез временных рамок, динамическая настройка и т. Д., Чтобы значительно улучшить стабильность стратегии.
/*backtest start: 2024-01-18 00:00:00 end: 2024-02-17 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Real Turtle", shorttitle = "Real Turtle", overlay=true, pyramiding=1, default_qty_type= strategy.percent_of_equity,calc_on_order_fills=false, slippage=25,commission_type=strategy.commission.percent,commission_value=0.075) ////////////////////////////////////////////////////////////////////// // Testing Start dates testStartYear = input(2016, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) //Stop date if you want to use a specific range of dates testStopYear = input(2030, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(30, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) // A switch to control background coloring of the test period // Use if using a specific date range testPeriodBackground = input(title="Color Background?", type=bool, defval=false) testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na bgcolor(testPeriodBackgroundColor, transp=97) testPeriod() => true // Component Code Stop ////////////////////////////////////////////////////////////////////// //How many candles we want to determine our position entry enterTrade = input(20, minval=1, title="Entry Channel Length") //How many candles we want ot determine our position exit exitTrade = input(10, minval=1, title="Exit Channel Length") //True Range EMA Length trLength = input(13, minval=1, title="True Range Length") //Go all in on every trade allIn = input(false, title="Use whole position on every trade") dRisk = input(2, "Use Desired Risk %") //How much of emaTR to use for TS offset multiEmaTR = input(2, "Desired multiple of ema Tr (N)") //absolute value (highest high of of this many candles - lowest high of this many candles) . This is used if we want to change our timeframe to a higher timeframe otherwise just works like grabbing high o r low of a candle //True range is calculated as just high - low. Technically this should be a little more complicated but with 24/7 nature of crypto markets high-low is fine. trueRange = max(high - low, max(high - close[1], close[1] - low)) //Creates an EMA of the true range by our custom length emaTR = ema(trueRange, trLength) //Highest high of how many candles back we want to look as specified in entry channel for long longEntry = highest(enterTrade) //loweest low of how many candles back we want to look as specified in exit channel for long exitLong = lowest(exitTrade) //lowest low of how many candles back want to look as specified in entry channel for short shortEntry = lowest(enterTrade) //lowest low of how many candles back want to look as specified in exit channel for short exitShort = highest(exitTrade) //plots the longEntry as a green line plot(longEntry[1], title="Long Entry",color=green) //plots the short entry as a purple line plot(shortEntry[1], title="Short Entry",color=purple) howFar = barssince(strategy.position_size == 0) actualLExit = strategy.position_size > 0 ? strategy.position_avg_price - (emaTR[howFar] * multiEmaTR) : longEntry - (emaTR * multiEmaTR) actualLExit2 = actualLExit > exitLong ? actualLExit : exitLong actualSExit = strategy.position_size < 0 ? strategy.position_avg_price + (emaTR[howFar] * multiEmaTR) : shortEntry + (emaTR * multiEmaTR) actualSExit2 = actualSExit < exitShort ? actualSExit : exitShort //plots the long exit as a red line plot(actualLExit2[1], title="Long Exit",color=red) //plots the short exit as a blue line plot(actualSExit2[1], title="Short Exit",color=yellow) //Stop loss in ticks SLLong =(emaTR * multiEmaTR)/ syminfo.mintick SLShort = (emaTR * multiEmaTR)/ syminfo.mintick //Calculate our potential loss as a whole percentage number. Example 1 instead of 0.01 for 1% loss. We have to convert back from ticks to whole value, then divided by close PLLong = ((SLLong * syminfo.mintick) * 100) / longEntry PLShort = ((SLShort * syminfo.mintick) * 100) / shortEntry //Calculate our risk by taking our desired risk / potential loss. Then multiple by our equity to get position size. we divide by close because we are using percentage size of equity for quantity in this script as not actual size. //we then floor the value. which is just to say we round down so instead of say 201.54 we would just input 201 as TV only supports whole integers for quantity. qtyLong = floor(((dRisk / PLLong) * strategy.equity) /longEntry ) qtyShort = floor(((dRisk / PLShort) * strategy.equity) /shortEntry ) qtyLong2 = allIn ? 100 : qtyLong qtyShort2 = allIn ? 100 : qtyShort //Only open long or short positions if we are inside the test period specified earlier if testPeriod() //Open a stop market order at our long entry price and keep it there at the quantity specified. This order is updated/changed on each new candlestick until a position is opened strategy.entry("long", strategy.long, stop = longEntry, qty = qtyLong2) //sets up or stop loss order by price specified in our actualLExit2 variable strategy.exit("Stoploss-Long", "long", stop=actualLExit2) //Open a stop market order at our short entry price and keep it there at the quantity specified. This order is updated/changed on each new candlestick until a position is opened strategy.entry("short", strategy.short, stop = shortEntry, qty = qtyShort2) //sets up or stop loss order by price specified in our actualLExit2 variable strategy.exit("Stoploss-Short", "short", stop=actualSExit2)