В этой статье подробно объясняется количественная тенденция, следующая за стратегией, основанной на анализе соотношения объема.
I. Логика стратегии
Основным показателем этой стратегии является бычий и медвежий объем.
Вычислить суточный общий объем.
При закрытии ежедневных листов объем маркируется как бычий, а при закрытии снижается как медвежий.
Вычислять скользящие средние отдельно для бычьих и медвежьих объемов.
Сигнал покупки генерируется, когда MA бычьего объема пересекает MA медвежьего объема и наоборот.
Индикатор изменения курса цен также используется в качестве фильтра, принимая сделки только при наличии четкой тенденции.
Установите стоп-лосс и принимайте прибыль на основе сигналов, чтобы закрепить прибыль.
Осуждая направление тренда через соотношение объема и фильтруя с изменением цены, качество сигнала может быть улучшено.
II. Преимущества стратегии
Самое большое преимущество этой стратегии заключается в использовании объема для определения направления тренда, который является одним из самых основных методов следования тренду.
Кроме того, показатели объема могут ранне отражать сигналы прорыва, будучи относительно чувствительными.
Наконец, фильтрация с изменением цены также повышает качество сигнала.
III. Потенциальные риски
Хотя стратегия имеет свои преимущества, следует учитывать следующие риски для торговли в режиме реального времени:
Во-первых, параметры показателей объема должны быть установлены осторожно, чтобы избежать ложных сигналов.
Во-вторых, основываясь только на одном показателе, он подвержен недействительности цен. Другие показатели должны быть объединены для проверки.
Наконец, если стоп-лосс будет установлен слишком близко, то риски могут быть преждевременными.
IV. Резюме
В этой статье объясняется количественная стратегия, использующая соотношение объемов для определения тенденций. Она генерирует торговые сигналы путем расчета скользящих сред бычьего и медвежьего объемов. Стратегия имеет определенную степень лидерства и чувствительности, но должна быть объединена с другими показателями для проверки. Кроме того, правильное регулирование параметров и разумное управление деньгами также являются ключевыми для ее жизнеспособности. В целом, она обеспечивает уникальный подход к использованию объема для анализа тенденций, но требует дальнейших улучшений.
/*backtest start: 2023-08-14 00:00:00 end: 2023-09-13 00:00:00 period: 3h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // Based on Volume Flow v3 indicator by oh92 strategy("Volume Flow BF", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0) /////////////// Time Frame /////////////// testStartYear = input(2017, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0) testStopYear = input(2019, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(31, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0) testPeriod() => true maType = input(title="Moving Average Type", options=["Simple", "Exponential", "Double Exponential"], defval="Simple") length = input(6, title="MA Length") x = input(3.1, title="Factor For Breakout Candle") // Basic Volume Calcs // vol = volume bull = close>open?vol:0 bear = open>close?vol:0 // Double EMA Function // dema(src, len) => (2 * ema(src, len) - ema(ema(src, len), len)) // BULL Moving Average Calculation bullma = maType == "Exponential" ? ema(bull, length) : maType == "Double Exponential" ? dema(bull, length) : sma(bull, length) // BEAR Moving Average Calculation // bearma = maType == "Exponential" ? ema(bear, length) : maType == "Double Exponential" ? dema(bear, length) : sma(bear, length) ///////////// Rate Of Change ///////////// source = close roclength = input(12, minval=1) pcntChange = input(2, minval=1) roc = 100 * (source - source[roclength]) / source[roclength] emaroc = ema(roc, roclength / 2) isMoving() => emaroc > (pcntChange / 2) or emaroc < (0 - (pcntChange / 2)) /////////////// Strategy /////////////// long = bullma > bearma and isMoving() short = bullma < bearma and isMoving() last_long = 0.0 last_short = 0.0 last_long := long ? time : nz(last_long[1]) last_short := short ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) last_open_long_signal = 0.0 last_open_short_signal = 0.0 last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1]) last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1]) last_long_signal = 0.0 last_short_signal = 0.0 last_long_signal := long_signal ? time : nz(last_long_signal[1]) last_short_signal := short_signal ? time : nz(last_short_signal[1]) in_long_signal = last_long_signal > last_short_signal in_short_signal = last_short_signal > last_long_signal last_high = 0.0 last_low = 0.0 last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1]) last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1]) sl_inp = input(2.0, title='Stop Loss %') / 100 tp_inp = input(900.0, title='Take Profit %') / 100 take_level_l = strategy.position_avg_price * (1 + tp_inp) take_level_s = strategy.position_avg_price * (1 - tp_inp) since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) slLong = in_long_signal ? strategy.position_avg_price * (1 - sl_inp) : na slShort = strategy.position_avg_price * (1 + sl_inp) long_sl = in_long_signal ? slLong : na short_sl = in_short_signal ? slShort : na /////////////// Execution /////////////// if testPeriod() strategy.entry("Long", strategy.long, when=long) strategy.entry("Short", strategy.short, when=short) strategy.exit("Long Ex", "Long", stop=long_sl, limit=take_level_l, when=since_longEntry > 0) strategy.exit("Short Ex", "Short", stop=short_sl, limit=take_level_s, when=since_shortEntry > 0) ///////////// Plotting ///////////// bgcolor(isMoving() ? long ? color.green : short ? color.red : na : color.white, transp=80) bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=30) plot(bullma, color=color.lime, linewidth=1, transp=0, title="Bull MA", transp=10) plot(bearma, color=color.red, linewidth=1, transp=0, title="Bear MA", transp=10)