Эта стратегия основана на принципе пересечения скользящей средней. Она длинна, когда краткосрочная скользящая средняя пересекается выше долгосрочной скользящей средней снизу, и коротка, когда краткосрочная скользящая средняя пересекается ниже долгосрочной скользящей средней сверху. Это типичная тенденция, следующая за стратегией.
Стратегия в основном рассчитывает краткосрочные и долгосрочные простые скользящие средние и определяет направление тренда на основе их перекрестки.
В частности, вначале рассчитывается краткосрочная скользящая средняя 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')