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


Дата создания: 2023-12-27 14:42:16 Последнее изменение: 2023-12-27 14:42:16
Копировать: 5 Количество просмотров: 761
1
Подписаться
1623
Подписчики

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

Обзор

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

Стратегический принцип

Стратегия использует показатели MFI для определения сверхпокупа и сверхпродажи на рынке. Когда MFI входит в зону сверхпродажи ниже 20, это означает, что ценность находится в нижней зоне, где она недооценена, и тогда она падает; когда MFI входит в зону сверхпокупа выше 80, это означает, что актив переоценен, и тогда он падает.

Для фильтрации ложных обратных поворотов в стратегию также вводятся показатели MA, определяющие направление ценовой тенденции. Торговый сигнал генерируется только тогда, когда цены находятся на уровне или ниже средней линии MA одновременно с обратным поворотом MFI.

Конкретная логика сделки заключается в следующем:

  1. MFI пробивает 20 и входит в зону перепродажи, в то же время закрытие цены на станции на средней линии MA, генерируя сигнал купить
  2. MFI перешагнул отметку в 80 и вошел в зону перекупа, в то время как цена закрытия упала ниже средней MA и вызвала сигнал продажи

Таким образом, с помощью двойных фильтров показателей можно эффективно идентифицировать возможности поворота, а сигнал входа в поле более надежный.

Стратегические преимущества

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

Стратегический риск

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

Что делать?

  1. Умеренное ослабление остановочной величины, предоставление большего пространства для стратегии
  2. При увеличении позиции обратите внимание на более крупный график и систематический риск.
  3. Оптимизация параметров, снижение бессмысленных сделок

Направление оптимизации стратегии

  1. Оптимизация параметров MA, чтобы соответствовать характеристикам торгуемых сортов
  2. Оптимизация параметров перекупа и перепродажи для адаптации к различным рыночным настроениям
  3. Добавление механизмов управления позициями, позволяющих контролировать прибыль

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2023-12-19 00:00:00
end: 2023-12-26 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/
// © vikris

//@version=4
strategy("[VJ]Thor for MFI", overlay=true, calc_on_every_tick = false,pyramiding=0)

// ********** Strategy inputs - Start **********

// Used for intraday handling
// Session value should be from market start to the time you want to square-off 
// your intraday strategy
// Important: The end time should be at least 2 minutes before the intraday
// square-off time set by your broker
var i_marketSession = input(title="Market session", type=input.session, 
     defval="0915-1455", confirm=true)

// Make inputs that set the take profit % (optional)
longProfitPerc = input(title="Long Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=1) * 0.01

shortProfitPerc = input(title="Short Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=1) * 0.01
     
// Set stop loss level with input options (optional)
longLossPerc = input(title="Long Stop Loss (%)",
     type=input.float, minval=0.0, step=0.1, defval=0.5) * 0.01

shortLossPerc = input(title="Short Stop Loss (%)",
     type=input.float, minval=0.0, step=0.1, defval=0.5) * 0.01    

i_MFI = input(3, title="MFI Length")
OB=input(100, title="Overbought Level")
OS=input(0, title="Oversold Level")
barsizeThreshold=input(.5, step=.05, minval=.1, maxval=1, title="Bar Body Size, 1=No Wicks")
i_MAFilter = input(true, title="Use MA Trend Filter")
i_MALen = input(80, title="MA Length")
// ********** Strategy inputs - End **********


// ********** Supporting functions - Start **********

// A function to check whether the bar or period is in intraday session
barInSession(sess) => time(timeframe.period, sess) != 0
// Figure out take profit price
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)
shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)

// Determine stop loss price
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)


// ********** Supporting functions - End **********


// ********** Strategy - Start **********
// See if intraday session is active
bool intradaySession = true

// Trade only if intraday session is active

//=================Strategy logic goes in here===========================
 

MFI=mfi(close,i_MFI)
barsize=high-low
barbodysize=close>open?(open-close)*-1:(open-close)
shortwicksbar=barbodysize>barsize*barsizeThreshold
SMA=sma(close, i_MALen)
MAFilter=close > SMA



BUY = MFI[1] == OB and close > open and shortwicksbar and (i_MAFilter ? MAFilter : true)

SELL = MFI[1] == OS and close < open and shortwicksbar and (i_MAFilter ? not MAFilter : true) 

//Final Long/Short Condition
longCondition = BUY
shortCondition = SELL
 
//Long Strategy - buy condition and exits with Take profit and SL
if (longCondition and intradaySession)
    stop_level = longStopPrice
    profit_level = longExitPrice
    strategy.entry("Buy", strategy.long)
    strategy.exit("TP/SL", "Buy", stop=stop_level, limit=profit_level)


//Short Strategy - sell condition and exits with Take profit and SL
if (shortCondition and intradaySession)
    stop_level = shortStopPrice
    profit_level = shortExitPrice
    strategy.entry("Sell", strategy.short)
    strategy.exit("TP/SL", "Sell", stop=stop_level, limit=profit_level)
 
 
// Square-off position (when session is over and position is open)
squareOff = (not intradaySession) and (strategy.position_size != 0)
strategy.close_all(when = squareOff, comment = "Square-off")

// ********** Strategy - End **********