
この戦略は,EMAの技術指標に基づいたクロスマーケットの夜間ポジション戦略であり,市場閉店前と開店後の取引機会を捉えることを目的としています. この戦略は,正確な時間制御と技術指標のフィルタリングにより,異なる市場環境下でスマートな取引を実現します.
戦略は,市場閉店前の特定の時間に入場し,次の日の開業後の特定の時間に出場することによって利益を得ます. EMA指標をトレンド確認として組み合わせて,複数のグローバル市場での取引機会を探します. 戦略は,自動取引機能を統合し,無人值守操作を実現します.
この戦略は精密な時間制御と技術指標のフィルタリングにより,信頼性の高い夜間取引システムを実現している.戦略の設計は,多市場適応,リスク管理,自動化取引などの要素を含む実戦需要を全面的に考慮し,強力な実用価値を有している.継続的な最適化と改善により,この戦略は,実体取引で安定した収益を期待している.
/*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)