
Эта стратегия основана на принципе пересечения скользящих средних, когда краткосрочные средние сверху пересекают долгосрочные средние сверху, а когда краткосрочные средние сверху пересекают долгосрочные средние сверху, это типичная стратегия отслеживания тенденций.
Эта стратегия основана на вычислении двух простых движущихся средних, краткосрочных и долгосрочных, и определении направления тенденции на основе их пересечения.
В частности, сначала стратегия рассчитывает краткосрочный средний xMA и долгосрочный средний, длина которого составляет Len, а длина долгосрочного среднего - 2*Len。
Затем стратегия определяет, является ли кратковременная средняя линия выше долгосрочной средней линии, и если она выше, то это создает многосигнальный сигнал; определяет, является ли кратковременная средняя линия ниже долгосрочной средней линии, и если она ниже, то это создает пустой сигнал.
После получения сигнала на увеличение, если в настоящее время нет позиций, открывайте позиции на увеличение по рыночной цене; после получения сигнала на уменьшение, если в настоящее время нет позиций, открывайте позиции на уменьшение по рыночной цене.
Кроме того, в стратегии также установлена точка остановки убытков. После выполнения дополнительных действий установлена цена остановки убытков как цена входа - процент убытков.*Цена входа, цена остановки - это цена входа + процент от остановки*Цена входа; цена стоп-лосса после ликвидации - цена входа + процент стоп-лосса*Цена входа, цена остановки - цена входа - процент остановки*Стоимость входа
Наконец, стратегия также выводит визуализацию равнолинейной кривой, чтобы помочь определить тенденцию.
Мысли должны быть простыми, понятными и понятными, а реализация - для начинающих.
На основе движущихся средних можно эффективно отслеживать тенденции рынка;
Установка остановки убытков, которая позволяет контролировать риск;
Визуальное отображение равнолинейной кривой, интуитивное отображение изменения тренда.
Промежуточная линия имеет отсталость, которая может привести к риску не попасть в лучшие моменты входа в игру;
Нерациональная установка стоп-пойнтов может привести к тому, что стоп-пойнты будут слишком мягкими или слишком жесткими;
Возможность создания ложного сигнала при резких колебаниях цен на акции;
Оптимизация параметров только на основе среднелинейных циклов может привести к пересоответствию.
Эти риски могут быть уменьшены с помощью надлежащего ослабления остановочных потерь, оптимизации комбинации параметров среднелинейного цикла и фильтрации других показателей.
Добавление фильтров для других индикаторов, таких как 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')