Стратегия перекрестного использования скользящей средней

Автор:Чао Чжан, Дата: 2023-10-24 16:39:40
Тэги:

img

Обзор

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

Логика стратегии

Стратегия в основном рассчитывает краткосрочные и долгосрочные простые скользящие средние и определяет направление тренда на основе их перекрестки.

В частности, вначале рассчитывается краткосрочная скользящая средняя xMA и долгосрочная скользящая средняя, где краткосрочный период - Len, а долгосрочный период - 2*Len.

Затем он проверяет, пересекает ли краткосрочный MA выше долгосрочного MA, и генерирует длинный сигнал, если произойдет перекресток.

При получении длинного сигнала, он открывает длинную позицию по рыночной цене, если нет позиции. При получении короткого сигнала, он открывает короткую позицию по рыночной цене, если нет позиции.

Для длинных сделок стоп-лосс устанавливается по цене входа - процент стоп-лосса * цена входа, и стоп-лосс устанавливается по цене входа + процент взятки прибыли * цена входа. Для коротких сделок стоп-лосс устанавливается по цене входа + процент взятки прибыли * цена входа, и стоп-лосс устанавливается по цене входа - процент взятки прибыли * цена входа.

Наконец, скользящие средние показаны для визуализации, чтобы помочь в определении тренда.

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

  • Простой и понятный, подходит для начинающих.

  • Может эффективно отслеживать рыночные тенденции на основе скользящих средних перекрестных показателей.

  • Риски контролируются путем настройки стоп-лосса и прибыли.

  • Визуализация скользящих средних интуитивно отражает изменения тренда.

Риски

  • Движущиеся средние имеют отставание, что может привести к отсутствию лучших входных точек.

  • Неправильная конфигурация стоп-потери может привести к тому, что стопы будут слишком широкими или слишком тесными.

  • Прокат цен может вызвать ложные сигналы.

  • Оптимизация, основанная исключительно на периодах скользящей средней, может привести к перенастройке.

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

Руководство по оптимизации

  • Добавьте другие индикаторы, такие как MACD, KDJ для фильтрации, чтобы избежать ложных сигналов.

  • Оптимизировать комбинации коротких и длинных скользящих средних периодов для поиска оптимальных параметров.

  • Испытывайте различные стратегии стоп-лосса/стоп-прибыли, такие как стоп-полеты.

  • Добавьте размер позиций для оптимизации использования капитала.

Резюме

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


/*backtest
start: 2023-09-23 00:00:00
end: 2023-10-23 00:00:00
period: 2h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@strategy_alert_message {{strategy.order.alert_message}} 
////////////////////////////////////////////////////////////
//  Copyright by HPotter v2.0 19/09/2023
// MA Crossover Bot for OKX Exchange
////////////////////////////////////////////////////////////
var ALERTGRP_CRED = "entry"
signalToken = input("", "Signal Token", inline = "11", group = ALERTGRP_CRED)
OrderType = input.string("market", "Order Type", options = ["market", "limit"], inline = "21", group = ALERTGRP_CRED)
OrderPriceOffset = input.float(0, "Order Price Offset", minval = 0, maxval = 100, step = 0.01, inline = "21", group = ALERTGRP_CRED)
InvestmentType = input.string("percentage_balance", "Investment Type", options = ["margin", "contract", "percentage_balance", "percentage_investment"], inline = "31", group = ALERTGRP_CRED)
Amount = input.float(100, "Amount", minval = 0.01, inline = "31", group = ALERTGRP_CRED)

getAlertMsg(action, instrument, signalToken, orderType, orderPriceOffset, investmentType, amount) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    //str := str + '"timestamp": "' + str.format_time(timenow, "yyyy-MM-dd'T'HH:mm:ssZ", "UTC+0") + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '"orderType": "' + orderType + '", '
    str := str + '"orderPriceOffset": "' + str.tostring(orderPriceOffset) + '", '
    str := str + '"investmentType": "' + investmentType + '", '
    str := str + '"amount": "' + str.tostring(amount) + '"'
    str := str + '}'
    str

getOrderAlertMsgExit(action, instrument, signalToken) =>
    str = '{'
    str := str + '"action": "' + action + '", '
    str := str + '"instrument": "' + instrument + '", '
    str := str + '"signalToken": "' + signalToken + '", '
    str := str + '"timestamp": "' + '{{timenow}}' + '", '
    str := str + '}'
    str

strategy(title='OKX: MA Crossover', overlay=true)
Len = input(13)
Profit = input.float(7, title='Take Profit %', minval=0.01) / 100
Stop =  input.float(7, title='Stop Loss %', minval=0.01) / 100
xMA = ta.sma(close, Len)
//Robot State
isLong = strategy.position_size > 0 
isShort = strategy.position_size < 0 
isFlat = strategy.position_size == 0 
//Current Signal
doLong = low < xMA[1] ? true : false
doShort =   high > xMA[1] ? true:  false
//Backtest Start Date
tm =  timestamp(2022, 01, 01, 09, 30)
//Entry and exit orders
if  doLong[2] == false and isLong == false and doLong and time > tm
    strategy.cancel_all()
    buyAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_LONG', instrument = syminfo.ticker, signalToken = signalToken)
    buyAlertMsg = getAlertMsg(action = 'ENTER_LONG', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Long', strategy.long, limit = close, comment='Long', alert_message =buyAlertMsg)
    strategy.exit("ExitLong", 'Long', stop=close - close * Stop  , limit = close + close * Profit , qty_percent = 100, alert_message = buyAlertMsgExit)  
if doShort[2] == false and isShort == false and doShort and time > tm
    strategy.cancel_all()
    sellAlertMsgExit = getOrderAlertMsgExit(action = 'EXIT_SHORT', instrument = syminfo.ticker, signalToken = signalToken)
    sellAlertMsg = getAlertMsg(action = 'ENTER_SHORT', instrument = syminfo.ticker, signalToken = signalToken, orderType =  OrderType, orderPriceOffset =  OrderPriceOffset, investmentType =  InvestmentType, amount = Amount)
    strategy.entry('Short', strategy.short, limit=close, comment='Short', alert_message = sellAlertMsg)
    strategy.exit("ExitShort", 'Short', stop=close + close * Stop  , limit = close - close * Profit  , qty_percent = 100, alert_message = sellAlertMsgExit)  
//Visual
barcolor(isShort  ? color.red : isLong ? color.green : color.blue)
plot(xMA, color=color.new(color.red, 0), title='MA')

Больше