Эта стратегия реализует тренд после торговли на основе индикатора объема потока (VFI). Она оценивает направление тенденции рынка путем расчета колебаний цен и изменений объема, и реализует низкие покупки и высокие продажи.
Вычисление показателя VFI: вычислить значение VFI на основе логарифмического изменения цен и объема и сгладить колебания с помощью методов сглаживания.
Определить направление тренда: пересечение ВФИ выше 0 является бычьим сигналом, а пересечение ниже 0 является медвежьим сигналом.
Торговые сигналы: длинный курс, когда быстрая EMA пересекает медленную EMA, и VFI пересекает линию покупки; закрытие позиции, когда VFI пересекает линию продажи.
Стоп-лосс: устанавливается фиксированный процент стоп-лосса.
Эта стратегия в основном опирается на VFI для определения направления тренда, в сочетании с скользящими средними для генерации торговых сигналов. VFI отражает настроение рынка через волатильность цен и изменения объема, что делает его индикатором, следующим за трендом. По сравнению с едиными индикаторами цен, VFI обеспечивает более всеобъемлющие суждения и лучше определяет точки обратного движения тренда, фильтруя консолидации.
VFI лучше определяет тенденции, чем единые ценовые показатели, эффективно отфильтровывая консолидации и ложные прорывы.
Движущиеся средние дают дополнительные суждения, избегая неверных сигналов от ВФИ на рыночных диапазонах.
Фиксированный стоп-лосс контролирует риск и облегчает управление рисками.
Мод, следующий за трендом, генерирует избыточные доходы, не предсказывая перемены.
Гибкая настройка параметров адаптируется к различным периодам и продуктам.
VFI может генерировать неправильные сигналы при значительных колебаниях.
Фиксированный стоп-лосс может быть слишком широким или слишком узким.
Неправильно настроенные настройки входа и выхода приводят к чрезмерной или отсутствующей торговле.
Следование тренду не позволяет зафиксировать перелом и требует своевременного прекращения потерь.
Неправильные параметры вызывают преждевременный или задержанный вход.
Оптимизировать расчет VFI путем корректировки параметров.
Прямая настройка периодов скользящей средней для лучшего синхронизации сигнала.
Используйте динамический стоп-лосс вместо фиксированного.
Добавьте другие индикаторы к фильтру сигналов.
Оптимизируйте параметры отдельно на основе временных рамок.
Испытать прочность различных продуктов.
Эта стратегия определяет направление тренда с помощью 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)