Sumber dimuat naik... memuat...

Strategi Posisi Sepanjang Malam Pasar dengan Penapis EMA

Penulis:ChaoZhang, Tarikh: 2024-11-12 10:49:00
Tag:EMAMA

img

Strategi ini adalah strategi kedudukan semalaman merentasi pasaran berdasarkan penunjuk teknikal EMA, yang direka untuk menangkap peluang perdagangan sebelum pasaran ditutup dan selepas pasaran dibuka.

Ringkasan Strategi

Strategi ini terutamanya memperoleh pulangan dengan memasuki pada masa tertentu sebelum pasaran ditutup dan keluar pada masa tertentu selepas pasaran dibuka pada hari berikutnya. Digabungkan dengan penunjuk EMA untuk pengesahan trend, ia mencari peluang perdagangan di pelbagai pasaran global (AS, Asia, Eropah). Strategi ini juga mengintegrasikan fungsi perdagangan automatik untuk operasi tanpa pengawasan.

Prinsip Strategi

  1. Kawalan Masa: Masuk pada masa tetap sebelum tutup dan keluar pada masa tetap selepas dibuka berdasarkan waktu dagangan pasaran yang berbeza
  2. Penapisan EMA: Gunakan penunjuk EMA pilihan untuk mengesahkan isyarat kemasukan
  3. Pemilihan pasaran: Sokongan penyesuaian masa dagangan untuk pasaran AS, Asia, dan Eropah
  4. Perlindungan hujung minggu: Memaksa penutupan kedudukan sebelum penutupan Jumaat untuk mengelakkan risiko memegang hujung minggu

Kelebihan Strategi

  1. Kebolehsesuaian pelbagai pasaran: Penyesuaian masa dagangan yang fleksibel mengikut ciri pasaran yang berbeza
  2. Kawalan Risiko Komprehensif: Termasuk mekanisme perlindungan penutupan kedudukan hujung minggu
  3. Tahap Automasi Tinggi: Menyokong integrasi antara muka perdagangan automatik
  4. Parameter fleksibel: Masa dagangan yang boleh disesuaikan dan parameter penunjuk teknikal
  5. Pertimbangan Kos Dagangan: Termasuk persediaan komisen dan slippage

Risiko Strategi

  1. Risiko Volatiliti Pasaran: Posisi semalam mungkin menghadapi risiko jurang
  2. Kebergantungan Masa: Keberkesanan strategi dipengaruhi oleh pemilihan tempoh masa pasaran
  3. Sekatan penunjuk teknikal: Penunjuk EMA tunggal mungkin menunjukkan kelewatan Cadangan: Tetapkan had stop-loss, tambah lebih banyak penunjuk teknikal untuk pengesahan

Arahan Pengoptimuman Strategi

  1. Tambah lebih banyak gabungan penunjuk teknikal
  2. Memperkenalkan mekanisme penapisan turun naik
  3. Mengoptimumkan pilihan masa masuk dan keluar
  4. Tambah fungsi penyesuaian parameter adaptif
  5. Meningkatkan modul kawalan risiko

Ringkasan

Strategi ini mencapai sistem perdagangan semalam yang boleh dipercayai melalui kawalan masa yang tepat dan penapisan penunjuk teknikal. Reka bentuk strategi secara komprehensif mempertimbangkan keperluan praktikal, termasuk penyesuaian pelbagai pasaran, kawalan risiko, dan elemen perdagangan automatik, menunjukkan nilai praktikal yang kuat. Melalui pengoptimuman dan penambahbaikan berterusan, strategi ini mempunyai potensi untuk mencapai pulangan yang stabil dalam perdagangan langsung.


/*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)


Berkaitan

Lebih lanjut