Тенденционная стратегия, основанная на показателе объема потоков

Автор:Чао Чжан, Дата: 2023-10-10 14:51:13
Тэги:

Обзор

Эта стратегия реализует тренд после торговли на основе индикатора объема потока (VFI). Она оценивает направление тенденции рынка путем расчета колебаний цен и изменений объема, и реализует низкие покупки и высокие продажи.

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

  1. Вычисление показателя VFI: вычислить значение VFI на основе логарифмического изменения цен и объема и сгладить колебания с помощью методов сглаживания.

  2. Определить направление тренда: пересечение ВФИ выше 0 является бычьим сигналом, а пересечение ниже 0 является медвежьим сигналом.

  3. Торговые сигналы: длинный курс, когда быстрая EMA пересекает медленную EMA, и VFI пересекает линию покупки; закрытие позиции, когда VFI пересекает линию продажи.

  4. Стоп-лосс: устанавливается фиксированный процент стоп-лосса.

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

Преимущества

  1. VFI лучше определяет тенденции, чем единые ценовые показатели, эффективно отфильтровывая консолидации и ложные прорывы.

  2. Движущиеся средние дают дополнительные суждения, избегая неверных сигналов от ВФИ на рыночных диапазонах.

  3. Фиксированный стоп-лосс контролирует риск и облегчает управление рисками.

  4. Мод, следующий за трендом, генерирует избыточные доходы, не предсказывая перемены.

  5. Гибкая настройка параметров адаптируется к различным периодам и продуктам.

Риски

  1. VFI может генерировать неправильные сигналы при значительных колебаниях.

  2. Фиксированный стоп-лосс может быть слишком широким или слишком узким.

  3. Неправильно настроенные настройки входа и выхода приводят к чрезмерной или отсутствующей торговле.

  4. Следование тренду не позволяет зафиксировать перелом и требует своевременного прекращения потерь.

  5. Неправильные параметры вызывают преждевременный или задержанный вход.

Усовершенствования

  1. Оптимизировать расчет VFI путем корректировки параметров.

  2. Прямая настройка периодов скользящей средней для лучшего синхронизации сигнала.

  3. Используйте динамический стоп-лосс вместо фиксированного.

  4. Добавьте другие индикаторы к фильтру сигналов.

  5. Оптимизируйте параметры отдельно на основе временных рамок.

  6. Испытать прочность различных продуктов.

Заключение

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


/*backtest
start: 2023-10-02 00:00:00
end: 2023-10-06 21:00:00
period: 3m
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/
// © mohanee
//This strategy is based on VFI indicator published by  UTS.  
//more details of VFI indicator can be found at  [url=http://mkatsanos.com/VFI.html]http://mkatsanos.com/VFI.html[/url] 
// I have added buy line and sell line to the indicator  and tested  SPY stock/index on one hour chart

//@version=4
strategy(title="VFI  strategy [based on VFI indicator published by  UTS]", overlay=false,pyramiding=2, default_qty_type=strategy.fixed,    initial_capital=10000, currency=currency.USD)


// Const
kMaColor = color.aqua
kNeutralColor = color.gray
kBearColor = color.red
kBullColor = color.green

kAlma = "ALMA"
kEma = "EMA"
kSma = "SMA"
kWma = "WMA"


// Input

vfi_length = input(8, title="Length", minval=1)  //default 130
vfi_coef = input(0.2, title="Coef", minval=0.1)
vfi_volCutoff = input(2.5, title="Volume Cutoff", minval=0.1)
vfi_smoothLen = input(3, title="Smoothing Period", minval=1)
vfi_smoothType = input(kEma, title="Smoothing Type", options=[kAlma, kEma, kSma, kWma])

//These are adde by me for the strategy purpose  BEGIN
vfi_buyLine = input(-4, title="Buy Line", minval=-10)
vfi_sellLine = input(5, title="Sell Line", minval=-10)
stopLoss = input(title="Stop Loss%", defval=5, minval=1)
//These are adde by me for the strategy purpose  END

vfi_longEMA = input(200, title="Long EMA", minval=1)
vfi_shortEMA1 = input(50, title="short EMA1", minval=1)
vfi_shortEMA2 = input(9, title="short EM2A", minval=1)

vfi_showTrend = input(false, title="Visualize Trend")
vfi_showFill = input(true, title="Apply Filling")
vfi_showMa = input(true, title="Show Moving Average")
vfi_maType = input(kSma, title="Moving Average Type", options=[kAlma, kEma, kSma, kWma])
vfi_maLength = input(30, title="Moving Average Length", minval=1)
vfi_almaOffset = input(0.85, title="• ALMA - Offset (global setting)", minval=0.0, maxval=1.0, step=0.05) // more smoothness (closer to 1) vs. more responsiveness (closer to 0)
vfi_almaSigma = input(6.0, title="• ALMA - Sigma (global setting)", minval=0.0, step=0.05) // the larger sigma the smoother ALMA


// Functionality

isRising(sig) =>
    sig > sig[1]
    
isFlat(sig) =>
    sig == sig[1]

vfi_trendColor(sig) =>
    isFlat(sig) ? kNeutralColor : isRising(sig) ? kBullColor : kBearColor
    
vfi_color(sig) =>
    isFlat(sig) ? kNeutralColor : sig > 0 ? kBullColor : kBearColor
    
osc_color(sig) =>
    sig == 0 ? kNeutralColor : sig > 0 ? kBullColor : kBearColor

smooth(t, sig, len) =>
    ma = float(sig)         // None
    if t == kSma            // Simple
        ma := sma(sig, len)
    if t == kEma            // Exponential
        ma := ema(sig, len)
    if t == kWma            // Weighted
        ma := wma(sig, len)
    if t == kAlma           // Arnaud Legoux
        ma := alma(sig, len, vfi_almaOffset, vfi_almaSigma)
    ma

calc_vfi(fviPeriod, smoothType, smoothLen, coef, vCoef) =>
    avg = nz(hlc3)
    inter = log(avg) - log(avg[1])
    vInter = stdev(inter, 30)
    cutOff = coef * vInter * close
    vAve = smooth(kSma, volume[1], fviPeriod)
    vMax = vAve * vCoef
    vC = min(volume, vMax)
    mf = avg - avg[1]
    vCp = iff(mf > cutOff, vC, iff(mf < -cutOff, -vC, 0))
    sVfi = sum(vCp, fviPeriod) / vAve
    vfi = smooth(smoothType, sVfi, smoothLen)
    
value_vfi = calc_vfi(vfi_length, vfi_smoothType, vfi_smoothLen, vfi_coef, vfi_volCutoff)
value_ma = smooth(vfi_maType, value_vfi, vfi_maLength)

longEMAval= ema(close, vfi_longEMA)
shortEMAval1= ema(close, vfi_shortEMA1)
shortEMAval2= ema(close, vfi_shortEMA2)

color_vfi = vfi_showTrend ? vfi_trendColor(value_vfi) : vfi_color(value_vfi)
color_osc = vfi_showFill ? osc_color(value_vfi) : na
color_ma = vfi_showMa ? kMaColor : na


// Drawings

plot_vfi = plot(value_vfi, title="VFI", color=color_vfi, linewidth=1)
plot_fill = plot(0, color=color_vfi, editable=false)
fill(plot_vfi, plot_fill, title="Oscillator Fill", color=color_osc, transp=75) 
hline(vfi_buyLine, color=color.green, title="Buy Line", linewidth=2, linestyle=hline.style_dashed)
hline(vfi_sellLine, color=color.purple, title="Sell Line", linewidth=2, linestyle=hline.style_dashed)
plot(value_ma, title="MA", color=color_ma, linewidth=2)

strategy.entry(id="VFI LE", long=true,  when=crossover(value_vfi,vfi_buyLine)  and ( shortEMAval1 >= longEMAval  ))

//strategy.close(id="VFI LE", comment="Exit",   when=crossunder(value_vfi,vfi_sellLine))
strategy.close(id="VFI LE", comment="TP Exit",   when=crossunder(value_vfi,vfi_sellLine) and close>strategy.position_avg_price)
//strategy.close(id="VFI LE", comment="Exit",   when=  (shortEMAval1 > shortEMAval2 )  and crossunder(close, shortEMAval2))

//stoploss
stopLossVal =   strategy.position_avg_price -  (strategy.position_avg_price*stopLoss*0.01) 
strategy.close(id="VFI LE", comment="SL Exit",   when=crossunder(value_vfi,vfi_sellLine) and close < stopLossVal)




Больше