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

EMA 필터와 함께 시장을 넘나드는 오프나이트 포지션 전략

저자:차오장, 날짜: 2024-11-12 10:49:00
태그:EMAMA

img

이 전략은 EMA 기술 지표에 기반한 크로스 시장 오버나이트 포지션 전략으로 시장 폐쇄 전과 시장 개방 후 거래 기회를 포착하도록 설계되었습니다. 전략은 정확한 시간 제어 및 기술 지표 필터링을 통해 다른 시장 환경에서 지능적인 거래를 달성합니다.

전략 개요

이 전략은 주로 시장 폐쇄 전 특정 시간에 진입하고 다음 날 시장 개장 후 특정 시간에 종료하여 수익을 얻습니다. 트렌드 확인을위한 EMA 지표와 결합하여 여러 글로벌 시장 (미국, 아시아, 유럽) 에서 거래 기회를 찾습니다. 이 전략은 또한 감시되지 않은 운영을 위해 자동화 된 거래 기능을 통합합니다.

전략 원칙

  1. 시간 제어: 다른 시장 거래 시간 기준으로 폐쇄 전 정해진 시간에 입력하고 오픈 후 정해진 시간에 종료
  2. EMA 필터링: 입시 신호를 검증하기 위해 선택적 EMA 지표를 사용합니다.
  3. 시장 선택: 미국, 아시아 및 유럽 시장에 대한 거래 시간 적응을 지원
  4. 주말 보호: 주말 보유 위험을 피하기 위해 금요일 종료 전에 포지션 폐쇄를 강요

전략적 장점

  1. 다중 시장 적응력: 다른 시장 특성에 따라 거래 시간을 유연하게 조정
  2. 포괄적 리스크 관리: 주말 포지션 폐쇄 보호 메커니즘을 포함합니다.
  3. 높은 자동화 수준: 자동 거래 인터페이스 통합을 지원합니다.
  4. 유연한 매개 변수: 조정 가능한 거래 시간 및 기술 지표 매개 변수
  5. 거래 비용 고려: 수수료와 미끄러짐 설정 포함

전략 위험

  1. 시장 변동성 위험: 오버나이트 포지션은 격차 위험과 마주할 수 있습니다.
  2. 시간 의존성: 시장 시간 기간 선택에 영향을 미치는 전략의 효과
  3. 기술 지표 제한: 단일 EMA 지표가 지연을 나타낼 수 있습니다. 제안: 스톱 로스 제한을 설정하고 검증을 위해 더 많은 기술적 지표를 추가합니다.

전략 최적화 방향

  1. 더 많은 기술 지표 조합을 추가
  2. 변동성 필터링 메커니즘 도입
  3. 입력 및 출력 시간 선택 최적화
  4. 적응적인 매개 변수 조정 기능을 추가
  5. 리스크 제어 모듈을 강화

요약

이 전략은 정확한 시간 제어 및 기술 지표 필터링을 통해 신뢰할 수있는 오버나이트 거래 시스템을 달성합니다. 전략 설계는 다중 시장 적응, 위험 통제 및 자동화 거래 요소를 포함한 실용적인 요구 사항을 포괄적으로 고려하여 강력한 실용적 가치를 입증합니다. 지속적인 최적화 및 개선으로이 전략은 실시간 거래에서 안정적인 수익을 얻을 수 있습니다.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-11 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © PresentTrading

// This strategy, titled "Overnight Market Entry Strategy with EMA Filter," is designed for entering long positions shortly before 
// the market closes and exiting shortly after the market opens. The strategy allows for selecting between different global market sessions (US, Asia, Europe) and 
// uses an optional EMA (Exponential Moving Average) filter to validate entry signals. The core logic is to enter trades based on conditions set for a specified period before 
// the market close and to exit trades either after a specified period following the market open or just before the weekend close. 
// Additionally, 3commas bot integration is included to automate the execution of trades. The strategy dynamically adjusts to market open and close times, ensuring trades are properly timed based on the selected market. 
// It also includes a force-close mechanism on Fridays to prevent holding positions over the weekend.

//@version=5
strategy("Overnight Positioning with EMA Confirmation - Strategy [presentTrading]", overlay=true, precision=3, commission_value=0.02, commission_type=strategy.commission.percent, slippage=1, currency=currency.USD, default_qty_type=strategy.percent_of_equity, default_qty_value=10, initial_capital=10000)

// Input parameters
entryMinutesBeforeClose = input.int(20, title="Minutes Before Close to Enter", minval=1)
exitMinutesAfterOpen = input.int(20, title="Minutes After Open to Exit", minval=1)
emaLength = input.int(100, title="EMA Length", minval=1)
emaTimeframe = input.timeframe("240", title="EMA Timeframe")
useEMA = input.bool(true, title="Use EMA Filter")

// Market Selection Input
marketSelection = input.string("US", title="Select Market", options=["US", "Asia", "Europe"])

// Timezone for each market
marketTimezone = marketSelection == "US" ? "America/New_York" :
                 marketSelection == "Asia" ? "Asia/Tokyo" :
                 "Europe/London"  // Default to London for Europe

// Market Open and Close Times for each market
var int marketOpenHour = na
var int marketOpenMinute = na
var int marketCloseHour = na
var int marketCloseMinute = na

if marketSelection == "US"
    marketOpenHour := 9
    marketOpenMinute := 30
    marketCloseHour := 16
    marketCloseMinute := 0
else if marketSelection == "Asia"
    marketOpenHour := 9
    marketOpenMinute := 0
    marketCloseHour := 15
    marketCloseMinute := 0
else if marketSelection == "Europe"
    marketOpenHour := 8
    marketOpenMinute := 0
    marketCloseHour := 16
    marketCloseMinute := 30

// 3commas Bot Settings
emailToken = input.string('', title='Email Token', group='3commas Bot Settings')
long_bot_id = input.string('', title='Long Bot ID', group='3commas Bot Settings')
usePairAdjust = input.bool(false, title='Use this pair in PERP', group='3commas Bot Settings')
selectedExchange = input.string("Binance", title="Select Exchange", group='3commas Bot Settings', options=["Binance", "OKX", "Gate.io", "Bitget"])

// Determine the trading pair based on settings
var pairString = ""
if usePairAdjust
    pairString := str.tostring(syminfo.currency) + "_" + str.tostring(syminfo.basecurrency) + (selectedExchange == "OKX" ? "-SWAP" : "") 
else
    pairString := str.tostring(syminfo.currency) + "_" + str.tostring(syminfo.basecurrency)

// Function to check if it's a trading day (excluding weekends)
isTradingDay(t) =>
    dayOfWeek = dayofweek(t, marketTimezone)
    dayOfWeek >= dayofweek.monday and dayOfWeek <= dayofweek.friday

// Function to get the timestamp for market open and close times
getMarketTimes(t) =>
    y = year(t, marketTimezone)
    m = month(t, marketTimezone)
    d = dayofmonth(t, marketTimezone)
    marketOpenTime = timestamp(marketTimezone, y, m, d, marketOpenHour, marketOpenMinute, 0)
    marketCloseTime = timestamp(marketTimezone, y, m, d, marketCloseHour, marketCloseMinute, 0)
    [marketOpenTime, marketCloseTime]

// Get the current time in the market's timezone
currentTime = time

// Calculate market times
[marketOpenTime, marketCloseTime] = getMarketTimes(currentTime)

// Calculate entry and exit times
entryTime = marketCloseTime - entryMinutesBeforeClose * 60 * 1000
exitTime = marketOpenTime + exitMinutesAfterOpen * 60 * 1000

// Get EMA data from the specified timeframe
emaValue = request.security(syminfo.tickerid, emaTimeframe, ta.ema(close, emaLength))

// Entry condition with optional EMA filter
longCondition = close > emaValue or not useEMA

// Functions to create JSON strings
getEnterJson() =>
    '{"message_type": "bot", "bot_id": "' + long_bot_id + '", "email_token": "' + emailToken + '", "delay_seconds": 0, "pair": "' + pairString + '"}'

getExitJson() =>
    '{"action": "close_at_market_price", "message_type": "bot", "bot_id": "' + long_bot_id + '", "email_token": "' + emailToken + '", "delay_seconds": 0, "pair": "' + pairString + '"}'

// Entry Signal
entrySignal = isTradingDay(currentTime) and currentTime >= entryTime and currentTime < marketCloseTime and dayofweek(currentTime, marketTimezone) != dayofweek.friday

// Exit Signal
exitSignal = isTradingDay(currentTime) and currentTime >= exitTime and currentTime < marketCloseTime

// Entry Logic
if strategy.position_size == 0 and longCondition
    strategy.entry("Long", strategy.long, alert_message=getEnterJson())

// Exit Logic
if  strategy.position_size > 0
    strategy.close("Long", alert_message=getExitJson())

// Force Close Logic on Friday before market close
isFriday = dayofweek(currentTime, marketTimezone) == dayofweek.friday
if  strategy.position_size > 0  // Close 5 minutes before market close on Friday
    strategy.close("Long", comment="Force close on Friday before market close", alert_message=getExitJson())

// Plotting entry and exit points
plotshape( strategy.position_size == 0 and longCondition, title="Entry", text="Entry", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)
plotshape( strategy.position_size > 0, title="Exit", text="Exit", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)

// Plot EMA for reference
plot(useEMA ? emaValue : na, title="EMA", color=color.blue)


관련

더 많은