Эта стратегия разработана на основе технических индикаторов скользящей средней и объема торговли для долгосрочной количественной стратегии, следующей за трендом. Когда цена закрытия находится выше 20-дневной скользящей средней линии, а объем покупки за день больше объема продажи и среднего объема торговли за последние n дней, рынок считается бычьим, и пришло время покупать. Когда цена закрытия проходит ниже нижней рельсы, и объем продажи за день больше объема покупки и среднего объема торговли за последние n дней, рынок считается медвежьим, и пришло время продавать.
Стратегия основывается главным образом на двух показателях оценки:
Двойная скользящая средняя линия: Вычислить 20-дневную линию и 60-дневную линию. Когда 20-дневная линия пересекает 60-дневную линию, рынок считается восходящим. Когда 20-дневная линия пересекает 60-дневную линию, рынок считается понижающимся.
Объем торговли: рассчитывается ежедневный объем покупок и объем продаж. Если объем покупок больше объема продаж и больше среднего объема торговли за последние n дней, определяется, что рынок быстрый. Если объем продаж больше объема покупок и больше среднего объема торговли за последние n дней, определяется, что рынок медвежий.
Конкретная стратегия и логика торговли следующие:
Если цена закрытия находится выше 20-дневной скользящей средней линии, а объем покупки за день больше объема продажи и среднего объема торговли за последние n дней, рынок считается бычьим.
Если цена закрытия превышает нижний рельс, а объем продажи больше объема покупки и среднего объема торговли за последние n дней, рынок считается медвежьим.
Приобретение прибыли и остановка убытков: Установите разумные уровни получения прибыли и остановки убытков, чтобы зафиксировать прибыль или уменьшить убытки. Например, когда цена повышается на 5% выше входной цены, получайте прибыль; когда убыток достигает 10%, прекратите убыток; или когда цена достигает недавнего нового максимума, а затем в некоторой степени отступает, получайте прибыль.
Стратегия имеет следующие преимущества:
Сочетание двух скользящих средних линий и индикаторов объема торгов позволяет избежать слепых точек при оценке одного технического индикатора.
Использование полос Боллинджера с различными параметрами определяет более точные входные цены.
Стратегия получения прибыли и остановки убытков является разумной, что помогает зафиксировать прибыль и контролировать риски.
Хорошие результаты обратного тестирования с стабильными доходами, которые могут быть фактически применены к количественной торговле.
Стратегия также сопряжена с некоторыми рисками:
Стратегии двойных скользящих сред, как правило, производят ложные сигналы и должны быть отфильтрованы показателями объема.
Неправильное настройка параметров Bollinger Bands может привести к чрезмерной частоте или редкости записей.
Неправильные фиксированные точки получения прибыли и остановки потерь могут повлиять на доходность стратегии.
Для обратного тестирования требуется большое количество исторических данных, и неожиданные потери все еще могут возникнуть в режиме реального времени.
Стратегия может быть оптимизирована в следующих аспектах:
Оптимизировать параметры системы скользящих средних для поиска оптимальной комбинации скользящих средних.
Оптимизировать параметры полос Боллинджера для более точного ввода.
Динамически корректируйте точки получения прибыли и остановки потери в соответствии с рыночными условиями, чтобы установить разумные коэффициенты риска и прибыли.
Повышение оценки других технических индикаторов, таких как MACD, KD и т. д., для повышения точности стратегии.
Используйте методы машинного обучения для автоматического поиска оптимальных параметров, чтобы сделать стратегии более надежными.
В целом, это очень практичная количественная стратегия торговли с хорошей производительностью обратного тестирования. Она проста в реализации, с контролируемыми рисками, и является стабильной стратегией, подходящей для реальной торговли, которую стоит изучить для количественных трейдеров. Конечно, еще есть много возможностей для оптимизации стратегии, и я с нетерпением жду, что больше экспертов по количественной торговле улучшат ее.
/*backtest start: 2023-12-21 00:00:00 end: 2023-12-28 00:00:00 period: 1m basePeriod: 1m 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/ // © KAIST291 //@version=4 strategy("prototype",initial_capital=0.01,commission_type=strategy.commission.percent,commission_value=0.1, format=format.volume, precision=0,overlay=true) // SETTING // length1=input(1) length3=input(3) length7=input(7) length14=input(14) length20=input(20) length60=input(60) length120=input(120) ma1= sma(close,length1) ma3= sma(close,length3) ma7= sma(close,length7) ma14=sma(close,length14) ma20=sma(close,length20) ma60=sma(close,length60) ma120=sma(close,length120) rsi=rsi(close,14) // BUYING VOLUME AND SELLING VOLUME // BV = iff( (high==low), 0, volume*(close-low)/(high-low)) SV = iff( (high==low), 0, volume*(high-close)/(high-low)) vol = iff(volume > 0, volume, 1) dailyLength = input(title = "Daily MA length", type = input.integer, defval = 50, minval = 1, maxval = 100) weeklyLength = input(title = "Weekly MA length", type = input.integer, defval = 10, minval = 1, maxval = 100) //----------------------------------------------------------- Davgvol = sma(volume, dailyLength) Wavgvol = sma(volume, weeklyLength) //----------------------------------------------------------- length = input(20, minval=1) src = input(close, title="Source") mult = input(2.0, minval=0.001, maxval=50, title="StdDev") mult2= input(1.5, minval=0.001, maxval=50, title="exp") mult3= input(1.0, minval=0.001, maxval=50, title="exp1") basis = sma(src, length) dev = mult * stdev(src, length) upper = basis + dev lower = basis - dev dev2= mult2 * stdev(src, length) Supper= basis + dev2 Slower= basis - dev2 dev3= mult3 * stdev(src, length) upper1= basis + dev3 lower1= basis - dev3 offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500) plot(basis, "Basis", color=#FF6D00, offset = offset) p1 = plot(upper, "Upper", color=#2962FF, offset = offset) p2 = plot(lower, "Lower", color=#2962FF, offset = offset) fill(p1, p2, title = "Background", color=color.rgb(33, 150, 243, 95)) //---------------------------------------------------- exit=(close-strategy.position_avg_price / strategy.position_avg_price*100) bull=(close>Supper and BV>SV and BV>Davgvol) bull2=(close>ma20 and BV>SV and BV>Davgvol) bux =(close<Supper and close>Slower and volume<Wavgvol) bear=(close<Slower and close<lower and SV>BV and SV>Wavgvol) hi=highest(exit,10) imInATrade = strategy.position_size != 0 highestPriceAfterEntry = valuewhen(imInATrade, high, 0) // STRATEGY LONG // if (bull and close>ma3 and ma20>ma60 and rsi<70) strategy.entry("Long",strategy.long,0.1) if (strategy.position_avg_price*1.05<close) strategy.close("Long",0.1) else if (highestPriceAfterEntry*0.999<close and close>strategy.position_avg_price*1.002) strategy.close("Long",0.1) else if (highestPriceAfterEntry*0.997<close and close>strategy.position_avg_price*1.002) strategy.close("Long",0.1) else if (highestPriceAfterEntry*0.995<close and close>strategy.position_avg_price*1.002) strategy.close("Long",0.1) else if (strategy.openprofit < strategy.position_avg_price*0.9-close) strategy.close("Long",0.1) ////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////