Этот пост носит исключительно обучающий характер. Ранее я уже
публиковал эту систему для Python и теперь её можно повторить на PineScript для TradingView.
GoldenCross это самая простая торговая система, которая закрывает позицию на «кресте смерти» и открывает её снова на «золотом кресте» — так называется пересечение 50-дневной и 200-дневной скользящих средних на таймфрейме D. Такая система иногда может обгонять рынок, но главное её преимущество в том, что вы меньше находитесь в рынке и можете парковать средства в консервативных инструментах, когда происходят коррекции.
По умолчанию система предполагает использование 100% депозита и комиссию 0.04% от сделки:
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// This strategy has been created for illustration purposes only and should not be relied upon as a basis for buying, selling, or holding any asset or security.
// © Diamond
//@version=4
strategy("SMA Golden Cross Strategy", overlay = true, calc_on_every_tick = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_value = 0.04, commission_type = strategy.commission.percent)
Доступно редактирование 4 переменных: период быстрой средней, период медленной средней, даты начала и конца бэктеста:
//Inputs
smaFast = input(title = "Fast SMA", type = input.integer, defval = 50, minval = 1)
smaSlow = input(title = "Slow SMA", type = input.integer, defval = 200, minval = 1)
//Options to configure backtest trade range
startDate = input(title = "Start Date", type=input.time, defval=timestamp("01 Jan 1998 00:00"))
endDate = input(title = "End Date", type=input.time, defval=timestamp("31 Dec 2070 23:59"))
SMA вычисляется по цене закрытия:
//Calculations
fastSMA = sma(close, smaFast)
slowSMA = sma(close, smaSlow)
Затем они отображаются на графике с помощью
Plot(), где можно задать цвет (
Color) и толщину линии (
linewidth):
//Plot
plot(series = fastSMA, color = color.orange, linewidth = 2)
plot(series = slowSMA, color = color.blue, linewidth = 3)
У торговой системы всего 3 условия для работы.
1. Она работает только в пределах диапазона для бэктеста:
inDateRange = (time >= startDate) and (time < endDate)
2. Позиция открывается в тот момент, когда быстрая средняя
fastSMA пересекает медленную
slowSMA снизу вверх:
longOpenCondition = crossover(fastSMA, slowSMA)
3. Позиция закрывается при обратном условии:
longCloseCondition = crossunder(fastSMA, slowSMA)
Эта логика отражена в коде для трейдинга. Для открытия позиции используется
strategy.entry(), а для закрытия
strategy.exit()
//Trading
if(longOpenCondition and inDateRange)
strategy.entry(id = "long", long = true, comment = "Long Open")
if(strategy.position_size > 0 and longCloseCondition)
strategy.exit(id = "long", stop = close, comment = "Long Close")
Стоп-лосса и тейк-профита нет, это ваша первая торговая система и она должна быть максимально простой для понимания.
Если провести бэктест на SBER (акции Сбербанк обыкновенные), то с 1998 года по текущую дату получим всего 12 трейдов:
Результат бэктеста:
Максимальная просадка 35.15%
Прибыльных сделок 66.67%
Профит фактор 5.063
Общий профит 25206.33%
В моменте вы будете обгонять Buy&Hold, но конечный результат примерно одинаковый. Это нормально для системы, которая просто снижает вашу просадку на счёте.
Стоит также отметить, что такие системы требуют предварительного отбора торгуемых инструментов. Например, вы получите убыток, если выберете цикличный биржевой инструмент.
Полный код системы:
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// This strategy has been created for illustration purposes only and should not be relied upon as a basis for buying, selling, or holding any asset or security.
// © Diamond
//@version=4
strategy("SMA Golden Cross Strategy", overlay = true, calc_on_every_tick = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_value = 0.04, commission_type = strategy.commission.percent)
//Inputs
smaFast = input(title = "Fast SMA", type = input.integer, defval = 50, minval = 1)
smaSlow = input(title = "Slow SMA", type = input.integer, defval = 200, minval = 1)
//Options to configure backtest trade range
startDate = input(title = "Start Date", type=input.time, defval=timestamp("01 Jan 1998 00:00"))
endDate = input(title = "End Date", type=input.time, defval=timestamp("31 Dec 2070 23:59"))
//Calculations
fastSMA = sma(close, smaFast)
slowSMA = sma(close, smaSlow)
//Plot
plot(series = fastSMA, color = color.orange, linewidth = 2)
plot(series = slowSMA, color = color.blue, linewidth = 3)
//Conditions
inDateRange = (time >= startDate) and (time < endDate)
longOpenCondition = crossover(fastSMA, slowSMA)
longCloseCondition = crossunder(fastSMA, slowSMA)
//Trading
if(longOpenCondition and inDateRange)
strategy.entry(id = "long", long = true, comment = "Long Open")
if(strategy.position_size > 0 and longCloseCondition)
strategy.exit(id = "long", stop = close, comment = "Long Close")
Переставьте калк_он_еври_тик в фальс и добавьте условие проверки, что случилось реальное пересечение, а не «переплетение». Уверен, результат теста будет иным. И скорее с минусом…
Да, для фильтрации. Не совсем боковики, а когда СМА совпадают.
Как насчет 100000 на минутках?