Количественная стратегия ломаной линии


Дата создания: 2023-11-21 13:43:24 Последнее изменение: 2023-12-01 15:01:07
Копировать: 1 Количество просмотров: 622
1
Подписаться
1617
Подписчики

Количественная стратегия ломаной линии

Обзор

Цель этой стратегии - проверить, могут ли различные входные переменные, такие как цвет K-линий, количество сделок и случайные методы, использовать для прогнозирования изменения цены в форме сигнала. Стратегия преобразует эти переменные в форму сигнала, когда пик или долина волны достигает установленного количества раз, чтобы принять решение о покупке или продаже.

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

Стратегия состоит из трёх частей: первая - обнаруживает изменение цвета K-линий. Вторая - обнаруживает, превышает ли трафик или ниже среднего, а третья - переворачивает волны при прорыве среднего.

Код контролирует движение волн, отслеживая текущее направление трех волн, их пик и положение на верхней K-линии. Когда пик достигает установленных параметров, изменяется направление движения. Этим циклом имитируется движение сигнала.

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

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

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

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

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

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

Для снижения риска требуется дальнейший анализ случайных результатов, определение диапазона параметров; или в сочетании с другими методами анализа для проверки торговых сигналов.

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

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

  1. Добавление большего количества переменных в волнах, расширение пространства выборки
  2. Комбинирование трех текущих волн для поиска оптимального сочетания прохождения
  3. Настройка стоп-стратегии, например, стоп-стратегия убыточности
  4. Оптимизация логики входа и выхода из игры, проведение обратной проверки для поиска оптимальных параметров

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

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

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

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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Gentleman-Goat

//@version=5
strategy("Sine Wave Theory",overlay=false, precision = 2, initial_capital = 1000,shorttitle = "SINE_W_T")

var bar_change_wave_direction = input.int(defval=1,title="Starting Wave Direction",group="Bar Change")
bar_change_sine_wave_number = input.int(defval=28,title="Sine Wave #",group="Bar Change")
bar_change_sine_wave_res = input.timeframe(defval="D",title="Resolution",group="Bar Change")
bar_change_trade = input.bool(defval=true,title="Trade",group="Bar Change")

var volume_wave_direction = input.int(defval=1,title="Starting Wave Direction",group="Volume")
avg_volume_length = input.int(7,title="Lookback Length",group="Volume")
volume_sine_wave_number = input.int(defval=28,title="Sine Wave #",group="Volume")
volume_sine_wave_res = input.timeframe(defval="D",title="Resolution",group="Volume")
volume_trade = input.bool(defval=false,title="Trade",group="Volume")

var coin_flip_wave_direction = input.int(defval=1,title="Starting Wave Direction",group="Coin Flip")
coin_flip_sine_wave_number = input.int(defval=28,title="Sine Wave #",group="Coin Flip")
coin_flip_seed = input.int(defval=1,title="Seed #",group="Coin Flip")
coin_flip_trade = input.bool(defval=false,title="Trade",group="Coin Flip")

avg_volume = ta.sma(volume,avg_volume_length)

//Green or Red Candle
bar_color = close>open ? color.green : color.red
bar_color_time_adj = request.security(syminfo.tickerid, bar_change_sine_wave_res, bar_color)

//Above or Below Average
volume_state = (volume>avg_volume) ? color.blue : color.purple
volume_state_time_adj = request.security(syminfo.tickerid, volume_sine_wave_res, volume_state)
 
//Coinflip
coin_flip = math.random(0,100,coin_flip_seed)>=50 ? color.teal : color.yellow

var bar_change_wave_count = 0
var volume_wave_count = 0
var coin_flip_wave_count = 0

//Wave Counters
if(volume_state_time_adj[1] != volume_state_time_adj)
    volume_wave_count := volume_wave_count + volume_wave_direction

if(bar_color_time_adj[1] != bar_color_time_adj)
    bar_change_wave_count := bar_change_wave_count + bar_change_wave_direction

if(coin_flip[1] != coin_flip)
    coin_flip_wave_count := coin_flip_wave_count + coin_flip_wave_direction

//Direction changers
if(math.abs(bar_change_wave_count) == bar_change_sine_wave_number and bar_color_time_adj[1] != bar_color_time_adj)
    bar_change_wave_direction := bar_change_wave_direction * -1

if(math.abs(volume_wave_count) == volume_sine_wave_number and volume_state_time_adj[1] != volume_state_time_adj)
    volume_wave_direction := volume_wave_direction * -1

if(math.abs(coin_flip_wave_count) == coin_flip_sine_wave_number and coin_flip[1] != coin_flip)
    coin_flip_wave_direction := coin_flip_wave_direction * -1

//Entry positions
if(bar_change_wave_count==bar_change_sine_wave_number and bar_change_trade==true)
    strategy.entry(id="short",direction=strategy.short)
if(bar_change_wave_count==bar_change_sine_wave_number*-1 and bar_change_trade==true)
    strategy.entry(id="long",direction=strategy.long)

if(volume_wave_count==volume_sine_wave_number and volume_trade==true)
    strategy.entry(id="short-volume",direction=strategy.short)
if(volume_wave_count==volume_sine_wave_number*-1 and volume_trade==true)
    strategy.entry(id="long-volume",direction=strategy.long)

if(coin_flip_wave_count==coin_flip_sine_wave_number and coin_flip_trade==true)
    strategy.entry(id="short-coinflip",direction=strategy.short)
if(coin_flip_wave_count==coin_flip_sine_wave_number*-1 and coin_flip_trade==true)
    strategy.entry(id="long-coinflip",direction=strategy.long)

hline(0, title='Center', color=color.white, linestyle=hline.style_dashed, linewidth=1)
plot(bar_change_wave_count,title="Bar Change", color=bar_color, linewidth=2)
plot(volume_wave_count,title="Volume Average Change", color=volume_state, linewidth=2)
plot(coin_flip_wave_count,title="Coin Flip Change", color=coin_flip, linewidth=2)