추세 추종 자동 이동 평균 전략


생성 날짜: 2023-10-10 15:21:45 마지막으로 수정됨: 2023-10-10 15:21:45
복사: 1 클릭수: 649
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 빠른 이동 평균선과 느린 이동 평균선의 교차로로 구매 및 판매 신호를 기반으로, 트렌드 추적 유형 전략에 속한다. 이동 평균선 파라미터를 자동으로 조정하여 시장 추세에 동적으로 적응하여 수익을 극대화한다.

전략 원칙

  1. 빠르게 움직이는 평균선과 느리게 움직이는 평균선을 계산한다. 빠르게 움직이는 평균선 파라미터는 21을 기본으로 하고, 느리게 움직이는 평균선 파라미터는 34을 기본으로 한다.

  2. 빠른 이동 평균선에서 느린 이동 평균선을 통과할 때, 상향을 표시하고, 구매 신호를 발산한다.

  3. 빠르게 움직이는 평균선 아래로 느리게 움직이는 평균선을 통과하면, 시세상태가 하향을 가리키며, 팔아넘는 신호를 낸다.

  4. 이동 평균선의 길이 변수를 자동으로 조정하여 시장 추세에 동적으로 적응하여 추세를 추적하여 수익을 얻습니다.

우위 분석

  1. 전략은 간단하고 명확하며, 이해하기 쉬운 실행이다.

  2. 시장 동향을 효과적으로 추적할 수 있고 수익 가능성이 높습니다.

  3. 동적으로 매개 변수를 조정하여 상황에 따라 변동할 수 있다.

  4. 이동식 평균선 알고리즘을 구성하여 전략의 유연성을 높인다.

  5. 이 앱은 자유로이 구성할 수 있고, 논리적이고, 유연하게 사용할 수 있습니다.

위험 분석

  1. 이동평균선전략은 거래가 빈번하고 거래비용이 높습니다.

  2. 거래가 급격하게 변동할 때, 이동평균선은 지연되어 최적의 구매/판매 시기를 놓칠 수 있다.

  3. 이동 평균선 변수와 조정 주파수를 최적화해야 하며, 잘못 구성되면 전략이 실패할 수 있다.

  4. 손실을 막기 위한 엄격한 통제가 필요합니다.

  5. 하지만, 이 추세에서 벗어나면 엄청난 손실이 발생할 수 있습니다.

최적화 방향

  1. 이동 평균 변수를 최적화하여 트렌드 변화를 더 민감하게 파악할 수 있도록 한다.

  2. 단독 손실을 엄격하게 통제하는 스톱 로직을 추가합니다.

  3. 트렌드를 판단하는 지표를 늘리고, 트렌드 반전이 손실을 초래하지 않도록 한다.

  4. 모바일 평행선 조정 전략을 최적화하여 더 지능적이고 자동화하십시오.

  5. 매개 변수 최적화 모듈을 추가하고, 기계 학습 방법을 사용하여 자동으로 최적화한다.

요약하다

이 전략의 전체적인 아이디어는 명확하고 이해하기 쉽다. 각기 다른 길이의 빠른 느린 이동 평균선을 구성하여 매매를 완료하고, 전형적인 트렌드 추적 전략에 속한다. 전략의 장점은 거래 규칙이 간단하고, 구현하기 쉽고, 효과적으로 트렌드를 잡을 수 있다는 것이다. 그러나 또한 일정 위험이 존재하며, 지속적으로 파라미터 구성을 최적화하고, 손실을 막는 논리를 사용하여 전략을 더 안정적으로 신뢰할 수 있다.

전략 소스 코드
/*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)