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

Автор:Чао Чжан, Дата: 2023-11-21 13:43:24
Тэги:

img

Обзор

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

Принцип стратегии

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

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

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

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

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

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

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

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

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

Руководство по оптимизации

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

  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)


Больше