
Трехмерная золотовалютная стратегия является типичной технической аналитической стратегией. Стратегия использует одновременно три движущихся средних разных продолжительностей времени, чтобы поймать тенденцию и совершить низкорисковую торговлю. Сигнал покупки возникает, когда краткосрочная движущаяся средняя пересекает среднесрочную движущуюся среднюю, а среднесрочная движущаяся средняя выше, чем долгосрочная движущаяся средняя; сигнал продажи возникает, когда краткосрочная движущаяся средняя пересекает среднесрочную движущуюся среднюю ниже, а среднесрочная движущаяся средняя ниже, чем долгосрочная движущаяся средняя.
Трехмерная золотая крестовая стратегия в основном опирается на три движущихся средних для определения направления тренда. Краткосрочные движущиеся средние чувствительны к изменениям цен; среднесрочные движущиеся средние обеспечивают более четкое определение тренда; долгосрочные движущиеся средние фильтруют рыночный шум и определяют долгосрочное направление тренда.
Когда кратковременный подвижной средний пересекает среднесрочный подвижной средний, означает, что цена начинает прорыв вверх; в это время, если среднесрочный подвижной средний выше, чем долгосрочный подвижной средний, это означает, что в настоящее время находится в тренде, поэтому в это время создается сигнал к покупке.
Наоборот, когда краткосрочная скользящая средняя пересекает промежуточную скользящую среднюю, это означает, что цена начинает прорыв вниз; если промежуточная скользящая средняя ниже долгосрочной скользящей средней, это означает, что она в настоящее время находится в нисходящем тренде, поэтому в это время появляется сигнал продажи.
В этой стратегии одновременно устанавливается стоп-стоп-линия. После совершения сделки на основе установленного стоп-стоп-линия рассчитывается стоп-стоп и стоп-цена. Если цена достигает стоп-стоп или стоп-линии, то позиция закрывается.
Решение: Правильная настройка параметров скользящих средних, чтобы избежать ошибочного сигнала
Решение: Правильно настроить остановку, не слишком большую и не слишком маленькую
Решение: тестирование различных параметров, поиск оптимальной комбинации параметров
Стратегия треугольного равнозначного золотого креста может быть оптимизирована в следующих аспектах:
Для оптимального трейдинга можно тестировать комбинации движущихся средних различной длины или различных типов
Другие показатели, такие как KDJ, MACD и т. Д., могут быть включены в стратегию для многофакторной проверки, фильтрации ошибочных сигналов
Можно укоротить циклы для высоко волатильных сортов; увеличить циклы для низко волатильных сортов
Автоматическое перемещение по пространству параметров с помощью алгоритмов для быстрого определения оптимальных параметров
В целом, трехуровневая золотая крестовая стратегия является более простой и практичной стратегией отслеживания тенденций. Она одновременно использует три движущихся средних, чтобы улавливать направление тенденции, устанавливает риск сдерживания сдерживания, чтобы получить стабильную прибыль.
/*backtest
start: 2024-01-08 00:00:00
end: 2024-01-15 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Kozlod - 3 MA strategy with SL/PT", shorttitle="kozlod_3ma", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 5)
//
// author: Kozlod
// date: 2018-03-25
//
////////////
// INPUTS //
////////////
ma_type = input(title = "MA Type", defval = "SMA", options = ['SMA', 'EMA', 'WMA', 'VWMA', 'HMA', 'SMMA', 'DEMA'])
short_ma_len = input(title = "Short MA Length", defval = 5, minval = 1)
short_ma_src = input(title = "Short MA Source", defval = close)
medium_ma_len = input(title = "Medium MA Length", defval = 20, minval = 2)
medium_ma_src = input(title = "Medium MA Source", defval = close)
long_ma_len = input(title = "Long MA Length", defval = 100, minval = 3)
long_ma_src = input(title = "Long MA Source", defval = close)
sl_lev_perc = input(title = "SL Level % (0 - Off)", type = float, defval = 0, minval = 0, step = 0.01)
pt_lev_perc = input(title = "PT Level % (0 - Off)", type = float, defval = 0, minval = 0, step = 0.01)
// Set initial values to 0
short_ma = 0.0
long_ma = 0.0
medium_ma = 0.0
// Simple Moving Average (SMA)
if ma_type == 'SMA'
short_ma := sma(short_ma_src, short_ma_len)
medium_ma := sma(medium_ma_src, medium_ma_len)
long_ma := sma(long_ma_src, long_ma_len)
// Exponential Moving Average (EMA)
if ma_type == 'EMA'
short_ma := ema(short_ma_src, short_ma_len)
medium_ma := ema(medium_ma_src, medium_ma_len)
long_ma := ema(long_ma_src, long_ma_len)
// Weighted Moving Average (WMA)
if ma_type == 'WMA'
short_ma := wma(short_ma_src, short_ma_len)
medium_ma := wma(medium_ma_src, medium_ma_len)
long_ma := wma(long_ma_src, long_ma_len)
// Hull Moving Average (HMA)
if ma_type == 'HMA'
short_ma := wma(2*wma(short_ma_src, short_ma_len / 2) - wma(short_ma_src, short_ma_len), round(sqrt(short_ma_len)))
medium_ma := wma(2*wma(medium_ma_src, medium_ma_len / 2) - wma(medium_ma_src, medium_ma_len), round(sqrt(medium_ma_len)))
long_ma := wma(2*wma(long_ma_src, long_ma_len / 2) - wma(long_ma_src, long_ma_len), round(sqrt(long_ma_len)))
// Volume-weighted Moving Average (VWMA)
if ma_type == 'VWMA'
short_ma := vwma(short_ma_src, short_ma_len)
medium_ma := vwma(medium_ma_src, medium_ma_len)
long_ma := vwma(long_ma_src, long_ma_len)
// Smoothed Moving Average (SMMA)
if ma_type == 'SMMA'
short_ma := na(short_ma[1]) ? sma(short_ma_src, short_ma_len) : (short_ma[1] * (short_ma_len - 1) + short_ma_src) / short_ma_len
medium_ma := na(medium_ma[1]) ? sma(medium_ma_src, medium_ma_len) : (medium_ma[1] * (medium_ma_len - 1) + medium_ma_src) / medium_ma_len
long_ma := na(long_ma[1]) ? sma(long_ma_src, long_ma_len) : (long_ma[1] * (long_ma_len - 1) + long_ma_src) / long_ma_len
// Double Exponential Moving Average (DEMA)
if ma_type == 'DEMA'
e1_short = ema(short_ma_src , short_ma_len)
e1_medium = ema(medium_ma_src, medium_ma_len)
e1_long = ema(long_ma_src, long_ma_len)
short_ma := 2 * e1_short - ema(e1_short, short_ma_len)
medium_ma := 2 * e1_medium - ema(e1_medium, medium_ma_len)
long_ma := 2 * e1_long - ema(e1_long, long_ma_len)
/////////////
// SIGNALS //
/////////////
long_signal = crossover( short_ma, medium_ma) and medium_ma > long_ma
short_signal = crossunder(short_ma, medium_ma) and medium_ma < long_ma
// Calculate PT/SL levels
// Initial values
last_signal = 0
prev_tr_price = 0.0
pt_level = 0.0
sl_level = 0.0
// Calculate previous trade price
prev_tr_price := (long_signal[1] and nz(last_signal[2]) != 1) or (short_signal[1] and nz(last_signal[2]) != -1) ? open : nz(last_signal[1]) != 0 ? prev_tr_price[1] : na
// Calculate SL/PT levels
pt_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 + pt_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 - pt_lev_perc / 100) : na
sl_level := nz(last_signal[1]) == 1 ? prev_tr_price * (1 - sl_lev_perc / 100) : nz(last_signal[1]) == -1 ? prev_tr_price * (1 + sl_lev_perc / 100) : na
// Calculate if price hit sl/pt
long_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) == 1 and close >= pt_level
long_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) == 1 and close <= sl_level
short_hit_pt = pt_lev_perc > 0 and nz(last_signal[1]) == -1 and close <= pt_level
short_hit_sl = sl_lev_perc > 0 and nz(last_signal[1]) == -1 and close >= sl_level
// What is last active trade?
last_signal := long_signal ? 1 : short_signal ? -1 : long_hit_pt or long_hit_sl or short_hit_pt or short_hit_sl ? 0 : nz(last_signal[1])
//////////////
// PLOTTING //
//////////////
// Plot MAs
plot(short_ma, color = red, linewidth = 2)
plot(medium_ma, color = green, linewidth = 2)
plot(long_ma, color = yellow, linewidth = 2)
// Plot Levels
plotshape(prev_tr_price, style = shape.cross, color = gray, location = location.absolute, size = size.small)
plotshape(sl_lev_perc > 0 ? sl_level : na, style = shape.cross, color = red, location = location.absolute, size = size.small)
plotshape(pt_lev_perc > 0 ? pt_level : na, style = shape.cross, color = green, location = location.absolute, size = size.small)
//////////////
// STRATEGY //
//////////////
strategy.entry("long", true, when = long_signal)
strategy.entry("short", false, when = short_signal)
strategy.close("long", when = long_hit_pt or long_hit_sl)
strategy.close("short", when = short_hit_pt or short_hit_sl)