Стратегия называется
Основным принципом стратегии является:
Используйте еженедельные и ежедневные линии для оценки направления тренда рынка как условия фильтрации направления стратегии.
Создать канал на 4-часовом уровне для определения точек продажи и покупки и выдачи торговых сигналов.
Последовательность направлений, оцениваемых по недельным, ежедневным и 4-часовым временным рамкам, может отфильтровать много ложных сигналов и повысить надежность торговых сигналов.
Используйте точки ретрекча Фибоначчи для определения позиций получения прибыли и стоп-лосса для быстрого получения прибыли и прекращения потерь.
В частности, стратегия сначала оценивает приоритетное направление тренда на еженедельных и ежедневных линиях. Принцип оценки приоритетного направления заключается в следующем: если цена закрытия текущей K-линии находится на стороне с большим углом задержки на линии цикла, она определяется как направление линии цикла. Затем, постройте канал A B C D на 4-часовом уровне и определите точки покупки и продажи через направление канала и поворотные точки для выпуска торговых сигналов. Наконец, приоритетное направление, определенное текущей линией цикла, должно соответствовать направлению торгового сигнала на 4-часовом уровне. Это может отфильтровать многие ложные сигналы и улучшить надежность торговых сигналов.
Основными преимуществами этой стратегии являются:
Механизм двойной фильтрации сигналов, основанный на нескольких временных рамках, может отфильтровать много шума и получить очень надежные торговые возможности.
Использование каналов для построения точек покупки и продажи делает торговые сигналы ясными.
Пункты ретракции Фибоначчи используются для установки позиций получения прибыли и остановки потерь для быстрого получения прибыли и остановки потерь.
Стратегия имеет несколько параметров и легко понять и освоить.
Хорошая масштабируемость для легкой оптимизации и улучшения.
Основными рисками этой стратегии являются:
Мониторинг слишком большого количества временных рамок увеличивает сложность и склонность к ошибкам.
Не учитывает внезапные события особых рыночных условий, такие как резкие колебания рынка, вызванные крупными новостями.
Существует вероятность недостаточного установления точки остановки потерь и точки получения прибыли с использованием ретрексейнга.
Неправильное настройка параметров может привести к чрезмерной торговле или отсутствию ордеров.
Контрмеры:
Усилить мониторинг аномалий и крупных новостных событий.
Оптимизируйте логику стоп-лосса и получения прибыли, чтобы гарантировать, что прибыль достигнет определенного уровня.
Детальное тестирование и оптимизация параметров для уменьшения вероятности переторговли и пропущенных заказов.
Основными направлениями оптимизации данной стратегии являются:
Увеличить возможность использования моделей машинного обучения для определения приоритетного направления тенденций и использовать больше данных для улучшения точности суждений.
Проверьте другие индикаторы для построения каналов и определения точек покупки и продажи.
Попробуйте более продвинутые способы получения прибыли и остановки убытков, такие как перемещение получения прибыли, прыжок получения прибыли и т. д.
Получить оптимальные параметры из результатов обратного тестирования, чтобы параметры более соответствовали принципам количественных инвестиций.
Усилить механизмы мониторинга и реагирования на крупные внезапные события.
В целом, основной идеей этой стратегии является высокочастотная количественная стратегия торговли, основанная на двойной фильтрации для снижения шума. Она использует многочасовое суждение и определение каналов точек покупки и продажи для достижения двойной надежности фильтрации торговых сигналов. В то же время стратегия имеет несколько параметров и легко освоить; масштабируемость хороша и легко оптимизировать и улучшить. Далее оптимизация будет осуществляться с таких аспектов, как точность суждения, методы получения прибыли и стоп-лосса, и оптимизация параметров, чтобы стратегия работала лучше.
/*backtest start: 2023-11-19 00:00:00 end: 2023-11-26 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy(title='AG328', shorttitle='AG328', overlay=true ) // Настройки для включения/выключения торговли в Лонг и Шорт longEnabled = input(true, title="Торговля в Лонг") shortEnabled = input(true, title="Торговля в Шорт") smaEnabled = input(true, title="Включить SMA89") tradeInGrey = input(false, title = "Сигнал в серой зоне") pipsBuyStop = input.int(0, title="Пунктов добавить для Buy ордера", minval=-50, step=1, maxval=50) pipsSellStop = input.int(0, title="Пунктов добавить для Sell ордера", minval=-50, step=1, maxval=50) // Const LicenseID = 6889430941909 contracts = input.float(0.01, title="Контрактов на сделку:", minval=0, step=0.01, maxval=10) var float sma = na var float UW = na var float DW = na var bool weeklyLongPriority = na var bool weeklyShortPriority = na var float UD = na var float DD = na var bool dailyLongPriority = na var bool dailyShortPriority = na var float UP = na var float DOWN = na var bool h4LongPriority = na var bool h4ShortPriority = na var bool LongCondition = na var bool ShortCondition = na var bool GreenZone = na var bool GreyZone = na var bool RedZone = na var float LongOrder = 0 var float ShortOrder = 0 var float LongTP = 0 var float ShortTP = 0 var float LongTake = 0 var float ShortTake = 0 var float AA = 0 var float BB = 0 var float CC = 0 var float D = 0 var float AAA = 0 var float BBB = 0 var float CCC = 0 var float DDD = 0 var float stopLong = 0 var float stopShort = 0 var string olderTF = "" var string oldestTF = "" var string pivotTF = "" // Создаем входную настройку для ТФ Пивота maxValuePivotTF = input.int(2, title="ТФ Пивота старше на:", minval=1, step=1, maxval=3) // Шаг цены инструмента stepSize = syminfo.mintick currentTF = timeframe.period // Получаем текущий ТФ if currentTF == "1" // Определяем 2 более старших ТФ olderTF := "5" oldestTF := "15" pivotTF := (maxValuePivotTF == 1 ? "5" : (maxValuePivotTF == 2 ? "15" : "60")) if currentTF == "5" olderTF := "15" oldestTF := "60" pivotTF := (maxValuePivotTF == 1 ? "15" : (maxValuePivotTF == 2 ? "60" : "240")) if currentTF == "15" olderTF := "60" oldestTF := "240" pivotTF := (maxValuePivotTF == 1 ? "60" : (maxValuePivotTF == 2 ? "240" : "D")) if currentTF == "60" olderTF := "240" oldestTF := "D" pivotTF := (maxValuePivotTF == 1 ? "240" : (maxValuePivotTF == 2 ? "D" : "W")) if currentTF == "240" olderTF := "D" oldestTF := "W" pivotTF := (maxValuePivotTF == 1 ? "D" : (maxValuePivotTF == 2 ? "W" : "M")) if currentTF == "D" olderTF := "W" oldestTF := "M" pivotTF := (maxValuePivotTF == 1 ? "W" : (maxValuePivotTF == 2 ? "M" : "3M")) if currentTF == "W" olderTF := "M" oldestTF := "3M" pivotTF := (maxValuePivotTF == 1 ? "M" : (maxValuePivotTF == 2 ? "3M" : "3M")) // Рассчитываем бары ТФ+2 weekHigh0 = request.security(syminfo.tickerid, oldestTF, high) weekHigh1 = request.security(syminfo.tickerid, oldestTF, high[1]) weekHigh2 = request.security(syminfo.tickerid, oldestTF, high[2]) weekHigh3 = request.security(syminfo.tickerid, oldestTF, high[3]) weekHigh4 = request.security(syminfo.tickerid, oldestTF, high[4]) weekLow0 = request.security(syminfo.tickerid, oldestTF, low) weekLow1 = request.security(syminfo.tickerid, oldestTF, low[1]) weekLow2 = request.security(syminfo.tickerid, oldestTF, low[2]) weekLow3 = request.security(syminfo.tickerid, oldestTF, low[3]) weekLow4 = request.security(syminfo.tickerid, oldestTF, low[4]) // ТФ+2 Фракталы weekFractal_UP = weekHigh2 > weekHigh1 and weekHigh2 > weekHigh0 and weekHigh2 > weekHigh3 and weekHigh2 > weekHigh4 weekFractal_DOWN = weekLow2 < weekLow1 and weekLow2 < weekLow0 and weekLow2 < weekLow3 and weekLow2 < weekLow4 if weekFractal_UP UW := weekHigh2 UW if weekFractal_DOWN DW := weekLow2 DW // Рисуем UW, DW plot(UW, title = "UW", color=color.green) plot(DW, title = "DW", color=color.red) // ТФ+2 priority if close > UW weeklyLongPriority := true weeklyLongPriority else if close < DW weeklyLongPriority := false weeklyLongPriority //weeklyColor = weeklyLongPriority ? color.new(color.green, transp=70) : color.new(color.red, transp=70) //bgcolor(weeklyColor, title = "WeeklyPriority") //----------------------------------------------- // Рассчитываем дневные бары dayHigh0 = request.security(syminfo.tickerid, olderTF, high) dayHigh1 = request.security(syminfo.tickerid, olderTF, high[1]) dayHigh2 = request.security(syminfo.tickerid, olderTF, high[2]) dayHigh3 = request.security(syminfo.tickerid, olderTF, high[3]) dayHigh4 = request.security(syminfo.tickerid, olderTF, high[4]) dayLow0 = request.security(syminfo.tickerid, olderTF, low) dayLow1 = request.security(syminfo.tickerid, olderTF, low[1]) dayLow2 = request.security(syminfo.tickerid, olderTF, low[2]) dayLow3 = request.security(syminfo.tickerid, olderTF, low[3]) dayLow4 = request.security(syminfo.tickerid, olderTF, low[4]) // Дневные Фракталы dayFractal_UP = dayHigh2 > dayHigh1 and dayHigh2 > dayHigh0 and dayHigh2 > dayHigh3 and dayHigh2 > dayHigh4 dayFractal_DOWN = dayLow2 < dayLow1 and dayLow2 < dayLow0 and dayLow2 < dayLow3 and dayLow2 < dayLow4 if dayFractal_UP UD := dayHigh2 UD if dayFractal_DOWN DD := dayLow2 DD // Рисуем UD, DD //plot(UD, title = "UD", color=color.green) //plot(DD, title = "DD", color=color.red) // Daily priority if close > UD dailyLongPriority := true dailyLongPriority else if close < DD dailyLongPriority := false dailyLongPriority //dailyColor = dailyLongPriority ? color.new(color.green, transp=70) : color.new(color.red, transp=70) //bgcolor(dailyColor, title = "DailyPriority") //----------------------------------------------- // Рассчитываем 4-часовые бары h4High0 = request.security(syminfo.tickerid, currentTF, high) h4High1 = request.security(syminfo.tickerid, currentTF, high[1]) h4High2 = request.security(syminfo.tickerid, currentTF, high[2]) h4High3 = request.security(syminfo.tickerid, currentTF, high[3]) h4High4 = request.security(syminfo.tickerid, currentTF, high[4]) h4Low0 = request.security(syminfo.tickerid, currentTF, low) h4Low1 = request.security(syminfo.tickerid, currentTF, low[1]) h4Low2 = request.security(syminfo.tickerid, currentTF, low[2]) h4Low3 = request.security(syminfo.tickerid, currentTF, low[3]) h4Low4 = request.security(syminfo.tickerid, currentTF, low[4]) // H4 Фракталы h4Fractal_UP = h4High2 > h4High1 and h4High2 > h4High0 and h4High2 > h4High3 and h4High2 > h4High4 h4Fractal_DOWN = h4Low2 < h4Low1 and h4Low2 < h4Low0 and h4Low2 < h4Low3 and h4Low2 < h4Low4 if h4Fractal_UP UP := h4High2 UP if h4Fractal_DOWN DOWN := h4Low2 DOWN // Рисуем UP, DOWN plot(UP, title='UP', color=color.new(color.green, 0)) plot(DOWN, title='DOWN', color=color.new(color.red, 0)) // SMA89 sma89 = ta.sma(close, 89) plot(smaEnabled ? sma89 : na, title='sma89', color=color.new(color.white, transp=10)) //smaColor = close > sma89 ? color.new(color.green, transp=70) : color.new(color.red, transp=70) //bgcolor(smaColor, title = "smaPriority") // Condition LongCondition := weeklyLongPriority and dailyLongPriority and (smaEnabled ? close > sma89 : true) ShortCondition := weeklyLongPriority == false and dailyLongPriority == false and (smaEnabled ? close < sma89 : true) ConditionColor = LongCondition ? color.new(color.green, transp=85) : ShortCondition ? color.new(color.red, transp=85) : color.new(color.gray, transp=85) bgcolor(ConditionColor, title='Condition') // LOGIC LONG if AA == 0 and h4Fractal_UP AA := UP if (AA[1] != 0 and BB == 0 and h4Fractal_DOWN) or (AA[1] != 0 and BB != 0 and D == 2 and h4Fractal_DOWN) BB := DOWN D := 1 if BB != 0 and D == 1 and ta.crossunder(low, BB) D := 2 if AA != 0 and BB != 0 if D == 2 and (D[1] == 1 or D[2] == 1 or D[3] == 1) and h4Fractal_UP CC := UP else if D == 1 and h4Fractal_UP CC := UP if (AA != 0 and high > AA) or (LongOrder != 0 and high > LongOrder + pipsBuyStop * stepSize) or (tradeInGrey ? ShortCondition : not LongCondition) AA := 0 BB := 0 CC := 0 D := 0 // //plot(AA != 0 ? AA : na, title='A', color=color.new(color.white, transp=10), linewidth=2, style=plot.style_linebr) //plot(BB != 0 ? BB : na, title='B', color=color.new(color.gray, transp=10), linewidth=2, style=plot.style_linebr) //plot(CC != 0 ? CC : na, title='C', color=color.new(color.blue, transp=10), linewidth=2, style=plot.style_linebr) //plot(D != 0 ? D : na, title='D', color=color.new(color.green, transp=80), linewidth=2, style=plot.style_linebr) // LOGIC SHORT if AAA == 0 and h4Fractal_DOWN AAA := DOWN if (AAA[1] != 0 and BBB == 0 and h4Fractal_UP) or (AAA[1] != 0 and BBB[1] != 0 and DDD == 2 and h4Fractal_UP) BBB := UP DDD := 1 if BBB != 0 and DDD == 1 and ta.crossover(high, BBB) DDD := 2 if AAA != 0 and BBB != 0 if DDD == 2 and (DDD[1] == 1 or DDD[2] == 1 or DDD[3] == 1) and h4Fractal_DOWN CCC := DOWN else if DDD == 1 and h4Fractal_DOWN CCC := DOWN if (AAA != 0 and low < AAA) or (ShortOrder != 0 and low < ShortOrder - pipsSellStop * stepSize) or (tradeInGrey ? LongCondition : not ShortCondition) AAA := 0 BBB := 0 CCC := 0 DDD := 0 // //plot(AAA != 0 ? AAA : na, title='ShortA', color=color.new(color.white, transp=10), linewidth=2, style=plot.style_linebr) //plot(BBB != 0 ? BBB : na, title='ShortB', color=color.new(color.gray, transp=10), linewidth=2, style=plot.style_linebr) //plot(CCC != 0 ? CCC : na, title='ShortC', color=color.new(color.blue, transp=10), linewidth=2, style=plot.style_linebr) //plot(DDD != 0 ? DDD : na, title='ShortD', color=color.new(color.green, transp=80), linewidth=2, style=plot.style_linebr) // LongOrder if (tradeInGrey ? not ShortCondition : LongCondition) and CC != 0 and D == 2 and strategy.position_size[1] == 0 and longEnabled LongOrder := CC LongOrder else if (tradeInGrey ? ShortCondition : not LongCondition) or strategy.position_size[1] > 0 or (LongOrder != 0 and high > LongOrder + pipsBuyStop * stepSize) LongOrder := 0 LongOrder plot(LongOrder != 0 ? LongOrder : na, title='LongOrder', color=color.new(color.yellow, transp=10), linewidth=2, style=plot.style_linebr) // ShortOrder if (tradeInGrey ? not LongCondition : ShortCondition) and CCC != 0 and DDD == 2 and strategy.position_size[1] == 0 and shortEnabled ShortOrder := CCC ShortOrder else if (tradeInGrey ? LongCondition : not ShortCondition) or strategy.position_size[1] < 0 or (ShortOrder != 0 and low < ShortOrder - pipsSellStop * stepSize) ShortOrder := 0 ShortOrder plot(ShortOrder != 0 ? ShortOrder : na, title='ShortOrder', color=color.new(color.orange, transp=10), linewidth=2, style=plot.style_linebr) // Fibo Pivots H = request.security(syminfo.tickerid, pivotTF, high[1]) L = request.security(syminfo.tickerid, pivotTF, low[1]) C = request.security(syminfo.tickerid, pivotTF, close[1]) PP = (H + L + C) / 3 R3 = PP + 1.000 * (H - L) R2 = PP + 0.618 * (H - L) R1 = PP + 0.382 * (H - L) S1 = PP - 0.382 * (H - L) S2 = PP - 0.618 * (H - L) S3 = PP - 1.000 * (H - L) //plot(PP) //plot(R3) //plot(R2) //plot(R1) //plot(S1) //plot(S2) //plot(S3) // Расчет цены Лонг Тейка if S3 - LongOrder > LongOrder - DOWN LongTP := S3 LongTP else if S2 - LongOrder > LongOrder - DOWN LongTP := S2 LongTP else if S1 - LongOrder > LongOrder - DOWN LongTP := S1 LongTP else if PP - LongOrder > LongOrder - DOWN LongTP := PP LongTP else if R1 - LongOrder > LongOrder - DOWN LongTP := R1 LongTP else if R2 - LongOrder > LongOrder - DOWN LongTP := R2 LongTP else if R3 - LongOrder > LongOrder - DOWN LongTP := R3 LongTP else LongTP := 0 LongTP // //plot(LongTake) if strategy.position_size == 0 if LongTP == 0 and LongOrder != 0 LongTake := LongOrder + LongOrder - DOWN LongTake else LongTake := LongTP LongTake plot(series=strategy.position_size > 0 ? LongTake : na, title='LongTake', color=color.new(color.rgb(99, 253, 104), transp=0), linewidth=1, style=plot.style_linebr) // Расчет цены Шорт Тейка if ShortOrder - R3 > UP - ShortOrder ShortTP := R3 ShortTP else if ShortOrder - R2 > UP - ShortOrder ShortTP := R2 ShortTP else if ShortOrder - R1 > UP - ShortOrder ShortTP := R1 ShortTP else if ShortOrder - PP > UP - ShortOrder ShortTP := PP ShortTP else if ShortOrder - S1 > UP - ShortOrder ShortTP := S1 ShortTP else if ShortOrder - S2 > UP - ShortOrder ShortTP := S2 ShortTP else if ShortOrder - S3 > UP - ShortOrder ShortTP := S3 ShortTP else ShortTP := 0 ShortTP // //plot(ShortTP) if strategy.position_size == 0 if ShortTP == 0 and ShortOrder != 0 ShortTake := ShortOrder - (UP - ShortOrder) ShortTake else ShortTake := ShortTP ShortTake plot(series=strategy.position_size < 0 ? ShortTake : na, title='ShortTake', color=color.new(color.rgb(99, 253, 104), transp=0), linewidth=1, style=plot.style_linebr) // StopForLONG and SHORT stopLong := math.min(DOWN,ta.lowest(low,3)) - pipsSellStop*stepSize //plot(stopLong) stopShort := math.max(UP,ta.highest(high,3)) + pipsBuyStop*stepSize //plot(stopShort) // TRADES LONG if LongOrder > 0 and close < LongOrder and longEnabled and LongCondition strategy.entry('Long', strategy.long, stop=LongOrder + pipsBuyStop*stepSize) if LongOrder == 0 or not LongCondition or not longEnabled strategy.cancel('Long') strategy.exit('CloseLong', from_entry='Long', stop=stopLong, limit=LongTake - pipsSellStop*stepSize) // // LONG ALERT !!! // if longEnabled and LongCondition and LongOrder[1] == 0 and LongOrder != 0 // alert(str.tostring(LicenseID)+',buystop,GBPUSDb,price=' +str.tostring(LongOrder + pipsBuyStop*stepSize)+',risk='+str.tostring(contracts), alert.freq_once_per_bar_close) // if longEnabled and LongCondition and LongOrder[1] != 0 and LongOrder != 0 and LongOrder != LongOrder[1] // alert(str.tostring(LicenseID)+',cancellongbuystop,GBPUSDb,price='+str.tostring(LongOrder + pipsBuyStop*stepSize)+',risk='+str.tostring(contracts), alert.freq_once_per_bar_close) // if (strategy.position_size > 0 and (LongTake != LongTake[1] or stopLong != stopLong[1])) or (strategy.position_size > 0 and strategy.position_size[1] == 0 ) // alert(str.tostring(LicenseID)+',newsltplong,GBPUSDb,sl='+str.tostring(stopLong)+',tp='+str.tostring(LongTake - pipsSellStop*stepSize), alert.freq_once_per_bar_close) // if strategy.position_size == 0 and ((LongCondition[1] and not LongCondition) or not longEnabled) and (LongOrder[1] != 0 and LongOrder == 0) // alert(str.tostring(LicenseID)+',cancellong,GBPUSDb', alert.freq_once_per_bar_close) // // TRADES SHORT // if ShortOrder > 0 and close > ShortOrder and shortEnabled and ShortCondition // strategy.entry('Short', strategy.short, stop=ShortOrder - pipsSellStop*stepSize) // if ShortOrder == 0 or not ShortCondition or not shortEnabled // strategy.cancel('Short') // strategy.exit('CloseShort', from_entry='Short', stop=stopShort, limit=ShortTake + pipsBuyStop*stepSize) // // SHORT ALERT !!! // if shortEnabled and ShortCondition and ShortOrder[1] == 0 and ShortOrder != 0 // alert(str.tostring(LicenseID)+',sellstop,GBPUSDb,price=' +str.tostring(ShortOrder - pipsSellStop*stepSize)+',risk='+str.tostring(contracts), alert.freq_once_per_bar_close) // if shortEnabled and ShortCondition and ShortOrder[1] != 0 and ShortOrder != 0 and ShortOrder != ShortOrder[1] // alert(str.tostring(LicenseID)+',cancelshortsellstop,GBPUSDb,price='+str.tostring(ShortOrder - pipsSellStop*stepSize)+',risk='+str.tostring(contracts), alert.freq_once_per_bar_close) // if (strategy.position_size < 0 and (ShortTake != ShortTake[1] or stopShort != stopShort[1])) or (strategy.position_size < 0 and strategy.position_size[1] == 0) // alert(str.tostring(LicenseID)+',newsltpshort,GBPUSDb,sl='+str.tostring(stopShort)+',tp='+str.tostring(ShortTake + pipsBuyStop*stepSize), alert.freq_once_per_bar_close) // if strategy.position_size == 0 and ((ShortCondition[1] and not ShortCondition) or not shortEnabled) and (ShortOrder[1] != 0 and ShortOrder == 0) // alert(str.tostring(LicenseID)+',cancelshort,GBPUSDb', alert.freq_once_per_bar_close)