리소스 로딩... 로딩...

MA 횡단 전략

저자:차오장, 날짜: 2024-06-03 11:25:43
태그:SMAMA

img

전반적인 설명

이 문서에서는 이동 평균 크로스오버 원리에 기반한 양적 거래 전략을 소개합니다. 전략은 이동 평균과 가격을 비교하여 긴 / 짧은 방향을 결정하고 위험을 제어하기 위해 수익 및 스톱 손실 수준을 설정합니다. 전략 코드는 파이인 스크립트로 작성되어 Dhan 거래 플랫폼 API와 통합되어 전략 신호의 자동 거래가 가능합니다.

전략 원칙

이 전략의 핵심은 이동 평균이다. 트렌드를 판단하는 기초로 특정 기간 동안의 폐쇄 가격의 간단한 이동 평균을 계산한다. 가격이 이동 평균을 넘을 때 긴 신호를 생성하고, 아래를 넘을 때 짧은 신호를 생성한다. exrem 함수는 연속적인 중복 신호를 필터링하고 신호 품질을 향상시키기 위해 사용됩니다. 전략은 현재 위치 방향과 가격과 이동 평균 사이의 관계, 각 거래의 위험과 수익을 제어하는 데 따른 해당 수익 및 스톱 손실 수준을 설정합니다.

전략적 장점

이동 평균 크로스오버 (moving average crossover) 는 중장기 시장 트렌드를 효과적으로 파악할 수 있는 간단하고 사용하기 쉬운 트렌드 추적 방법이다. 합리적인 매개 변수 설정을 통해 전략은 트렌딩 시장에서 안정적인 수익을 얻을 수 있다. 수익을 취하고 손실을 멈추는 설정을 설정하면 인출을 제어하고 리스크 보상 비율을 향상시키는 데 도움이 된다. 전략 코드 논리는 기능 모듈화를 사용하여 명확하며 강력한 가독성과 확장성을 갖추고 있다. 또한 전략은 자동화 주문 실행을 실현하기 위해 Dhan 플랫폼 API를 통합하여 실행 효율성을 향상시킨다.

전략 위험

이동평균은 본질적으로 뒤떨어진 지표입니다. 시장 전환점 동안 신호가 지연되어 최적의 거래 기회 또는 잘못된 신호가 놓이게 될 수 있습니다. 잘못된 매개 변수 설정은 전략 성능에 영향을 미치며 다른 시장 특성 및 시간 틀에 따라 최적화되어야합니다. 고정 비율의 수익 및 스톱 손실은 시장 변동성의 변화에 적응하지 않을 수 있으며 잘못된 매개 변수 설정으로 인한 손실 위험이 있습니다.

전략 최적화 방향

  1. 서로 다른 시간 프레임의 여러 이동 평균을 결합하여 신호 신뢰성을 향상시킬 수 있습니다. 예를 들어, 이중 또는 삼중 이동 평균 크로스오버 (crossover) 입니다.
  2. 수익을 취하고 손실을 중지하는 설정은 ATR과 같은 변동성 지표에 따라 동적으로 조정하거나 후속 중지 전략을 채택하는 것과 같이 더 이상 최적화 될 수 있습니다.
  3. 더 많은 필터링 조건이 추가 될 수 있습니다. 예를 들어 중요한 지원/저항 수준의 가격 돌파, 거래량 변화 등, 신호 품질을 향상시키기 위해.
  4. 실제 적용에서 전략의 적절한 백트테스팅과 검증을 수행하고 단일 무역 위험과 전반적인 유출을 통제하기 위해 자금을 관리해야합니다.

요약

이동평균 크로스오버 전략은 트렌드 추적 및 스톱 로스 컨트롤을 통해 트렌딩 시장에서 이익을 얻을 수 있는 간단하고 실용적인 양적 거래 전략이다. 그러나 전략 자체는 특정 한계를 가지고 있으며 시장 특성과 위험 선호도에 따라 최적화 및 개선되어야 한다. 실제 응용에서는 엄격한 규율 실행과 적절한 위험 통제에주의를 기울여야 한다. 전략 프로그래밍은 파이인 스크립트와 같은 전문 언어를 활용하고 자동화된 전략 실행을 실현하기 위해 거래 플랫폼 API를 통합할 수 있다.


/*backtest
start: 2024-05-01 00:00:00
end: 2024-05-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © syam-mohan-vs @ T7 - wwww.t7wealth.com www.t7trade.com
//This is an educational code done to describe the fundemantals of pine scritpting language and integration with Indian discount broker Dhan. This strategy is not tested or recommended for live trading. 

//@version=5
strategy("Pine & Dhan - Moving Average Crossover Strategy", overlay=true)

//Remove excess signals
exrem(condition1, condition2) =>
    temp = false
    temp := na(temp[1]) ? false : not temp[1] and condition1 ? true : temp[1] and condition2 ? false : temp[1]
    ta.change(temp) == true ? true : false

// Define MA period
ma_period = input(20, title = "MA Length")

// Define target and stop loss levels
target_percentage = input.float(title="Target Profit (%)", defval=2.0)
stop_loss_percentage = input.float(title="Stop Loss (%)", defval=1.0)

// Calculate the MA
ma = ta.sma(close, ma_period)

// Entry conditions
long_entry = close >= ma
short_entry = close < ma

// Calculate target and stop loss prices
target_price = long_entry ? strategy.position_avg_price + (close * (target_percentage / 100)) : strategy.position_avg_price - (close * (target_percentage / 100)) 
stop_loss_price = short_entry ? strategy.position_avg_price + (close * (stop_loss_percentage/ 100)) : strategy.position_avg_price - (close * (stop_loss_percentage / 100)) 

long_entry := exrem(long_entry,short_entry)
short_entry := exrem(short_entry,long_entry)

// Plot the MA
plot(ma, color=color.blue, linewidth=2, title="MA")

// Plot the entry and exit signals
plotshape(long_entry, style=shape.arrowup, color=color.green, size=size.small,location = location.belowbar)
plotshape(short_entry, style=shape.arrowdown, color=color.red, size=size.small,location = location.abovebar)

//Find absolute value of positon size to exit position properly
size = math.abs(strategy.position_size)

//Replace these four JSON strings with those generated from user Dhan account
long_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"B","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"I","sort_order":"1","price":"0"}]}'
long_exit_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"S","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}'
short_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"S","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}'
short_exit_msg = '{"secret":"C0B2u","alertType":"multi_leg_order","order_legs":[{"transactionType":"B","orderType":"MKT","quantity":"1","exchange":"NSE","symbol":"NIFTY1!","instrument":"FUT","productType":"M","sort_order":"1","price":"0"}]}'

// Submit orders based on signals
if(strategy.position_size == 0)
    if long_entry 
        strategy.order("Long", strategy.long,alert_message=long_msg)          

    if short_entry
        strategy.order("Short", strategy.short,alert_message=short_msg)        
    
if(strategy.position_size > 0)
    
    if(short_entry)
        strategy.order("Short", strategy.short, qty = size, alert_message=short_msg)     
    else
        strategy.exit("Long Exit", from_entry="Long", qty = size, stop=stop_loss_price, limit= target_price, alert_message=long_exit_msg)

if(strategy.position_size < 0)
    
    if(long_entry)
        strategy.order("Long", strategy.long, qty = size, alert_message=long_msg)    
    else           
        strategy.exit("Short Exit", from_entry="Short", qty = size, stop=stop_loss_price, limit= target_price, alert_message=short_exit_msg) 



관련

더 많은