적응적 이동 평균 전략에 따른 경향

저자:차오장, 날짜: 2023-10-10 15:21:45
태그:

전반적인 설명

이 전략은 트렌드 다음 전략에 속하는 빠른 이동 평균과 느린 이동 평균의 교차를 기반으로 거래 신호를 생성합니다. 이동 평균 매개 변수를 적응적으로 조정함으로써 최대 수익을 위해 시장 트렌드에 동적으로 적응합니다.

전략 논리

  1. 빠른 MA의 기본 길이는 21이고 느린 MA의 기본 길이는 34입니다.

  2. 빠른 MA가 느린 MA를 넘을 때 상승 추세를 나타내고 구매 신호를 생성합니다.

  3. 빠른 MA가 느린 MA보다 낮을 때 하락 추세를 나타내고 판매 신호를 생성합니다.

  4. 이동 평균의 길이를 자동으로 조정함으로써 전략은 수익을 추적하기 위해 시장 추세에 동적으로 적응합니다.

이점 분석

  1. 전략은 간단하고 명확하고 이해하기 쉽고 실행하기 쉽습니다.

  2. 큰 수익 잠재력을 가진 시장 동향을 효과적으로 추적할 수 있습니다.

  3. 동적 매개 변수 조정 시장 조건 변화에 적응합니다.

  4. 사용자 정의 가능한 MA 알고리즘은 전략 유연성을 높입니다.

  5. 유연한 구매 및 판매 로직 구성

위험 분석

  1. 빈번한 거래는 더 높은 거래 비용을 초래합니다.

  2. MA 지연은 불안정한 시장에서 가장 좋은 입점과 출점을 놓칠 수 있습니다.

  3. 부적절한 MA 매개 변수와 조정 주파수 최적화는 전략 실패로 이어집니다.

  4. 손실을 제한하기 위해 엄격한 스톱 손실이 필요합니다.

  5. 트렌드 반전은 엄청난 부동 손실로 이어질 수 있습니다.

최적화 방향

  1. 트렌드 변경을 더 잘 감지하기 위해 MA 매개 변수를 최적화합니다.

  2. 단일 트레이드 손실을 제어하기 위해 스톱 로스 로직을 추가합니다.

  3. 트렌드 판단 지표를 추가하여 트렌드 역전 손실을 피합니다.

  4. 더 지능적이고 자동화 될 수 있도록 MA 조정 전략을 개선합니다.

  5. 기계 학습을 이용한 파라미터 최적화 모듈을 추가합니다.

요약

전략 논리는 간단하고 명확하며, 빠르고 느린 MAs 크로스오버를 기반으로 거래를 생성합니다. 트렌드를 효과적으로 캡처하지만 위험이 있습니다. 매개 변수에 대한 지속적인 최적화, 스톱 로스 논리는 전략을 더 견고하게 만들기 위해 필요합니다. 전반적으로 전략은 개선 잠재력이 있으며 연구와 적용 가치가 있습니다.


/*backtest
start: 2022-10-03 00:00:00
end: 2023-10-09 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//
// @version=4
// © Ehsan Haghpanah, (ehsanha)
// Algorithmic Trading Research
//
// eha Moving Averages Strategy, 
// A simple strategy based on crossing Moving Averages of 
// different lengths (a fast moving average and slow one)
//

strategy(title = "eha Moving Averages Strategy", shorttitle = "eha MA Strategy", overlay = true)

// 
// -- strategy parameter(s)
// moving averages parameter(s)
var _fastMA_len  = input(title = "Fast MA Length",  defval = 21,    type = input.integer, minval = 1, step = 1)
var _slowMA_len  = input(title = "Slow MA Length",  defval = 34,    type = input.integer, minval = 1, step = 1)
var _ma_algo_id  = input(title = "MA Algorithm",    defval = "SMA", options = ["SMA", "EMA", "WMA"])
// backtesting date and time range parameter(s)
var _startYear   = input(defval = 2020, title = "Start Year",  type = input.integer, minval = 1976)
var _startMonth  = input(defval = 1,    title = "Start Month", type = input.integer, minval = 1, maxval = 12)
var _startDay    = input(defval = 1,    title = "Start Day",   type = input.integer, minval = 1, maxval = 31)
var _closeYear   = input(defval = 2020, title = "Close Year",  type = input.integer, minval = 1984)
var _closeMonth  = input(defval = 9,    title = "Close Month", type = input.integer, minval = 1, maxval = 12)
var _closeDay    = input(defval = 1,    title = "Close Day",   type = input.integer, minval = 1, maxval = 31)

//
// -- function(s) and calculation(s)
// checks whether current time is in backtesting time range
start_t = timestamp(_startYear, _startMonth, _startDay, 00, 00)     // backtesting range start time, (00, 00); (hour, minute)
close_t = timestamp(_closeYear, _closeMonth, _closeDay, 23, 59)     // backtesting range close time, (23, 59); (hour, minute)
isInRange() => true
//
// calculates moving average based on provided algorithm, source and length
// alg : moving average algorithm
// len : length
// ser : series
calcMA(alg, len, ser) =>
    (len == 0) ? ser : ((alg == "SMA") ? sma(ser, len) : ((alg == "EMA") ? ema(ser, len) : (alg == "WMA" ? wma(ser, len) : na)))

//
// -- strategy logic and calculation(s)
ma_fast  = calcMA(_ma_algo_id, _fastMA_len, close)
ma_slow  = calcMA(_ma_algo_id, _slowMA_len, close)
cross_ov = crossover (ma_fast, ma_slow) // returns true if fastMA crosses over slowMA
cross_un = crossunder(ma_fast, ma_slow) // returns true if slowMA crosses over fastMA

//
// -- strategy execution logic
// opens a long position whenever the time is in range and crosses over
strategy.entry("ID", comment = "-", long = strategy.long, when = isInRange() and cross_ov)
// closes the position whenever the time is in range and crosses under
strategy.close("ID", comment = "-", when = isInRange() and cross_un)

//
// -- drawing and visualization
co_fast = color.new(color.gray, 25)
co_slow = color.new(color.gray, 75)
// drawing moving average(s)
plot(ma_fast, color = co_fast, linewidth = 2, style = plot.style_line)
plot(ma_slow, color = co_slow, linewidth = 3, style = plot.style_line)

더 많은