Analisa Mendalam Probabilitas Pola Enggulfing Pattern

BisaAlgoTrade
5 min readApr 21, 2024

--

Saya sering mendengar candlestick pattern memiliki probabilitas masing — masing, salah satunya Enggulfing Pattern. Tetapi berapa probabilitas pattern ini?

Dalam artikel ini saya akan menggunakan python untuk mencari Enggulfing Pattern lalu menghitung akurasinya.

Kriteria Enggulfing Pattern

Karena pattern ini dicari menggunakan kode python maka pelu didefinisikan secara jelas kriteria seperti apa Enggulfing Pattern?

Saya akan mengambil kriteria pattern ini dari artikel di link berikut Price Action. Automating the Engulfing Pattern Trading Strategy — MQL4 Articles (mql5.com).

Secara ringkas aturannya adalah seperti berikut.

Kriteria Enggulfing Pattern

Dari kriteria tersebut dapat dituliskan kedalam python seperti berikut

df['bear_enggulfing'] = (df['low'] < df['low'].shift(1)) & \
(df['high'] > df['high'].shift(1)) & \
(df['close'] < df['open'].shift(1)) & \
(df['open'] > df['close']) & \
(df['open'].shift(1) < df['close'].shift(1))

df['bull_enggulfing'] = (df['low'] < df['low'].shift(1)) & \
(df['high'] > df['high'].shift(1)) & \
(df['close'] > df['open'].shift(1)) & \
(df['open'] < df['close']) & \
(df['open'].shift(1) > df['close'].shift(1))

Definisi Pattern Berhasil atau Gagal

Untuk mendefinisikan pattern berhasil atau gagal terdapat banyak cara, beberapa cara sebagai berikut:

  • Close bar selanjutnya lebih tinggi atau lebih rendah dari close Engulfing Pattern
  • Fix pip bar selanjunya mencapai target Take profit atau Stop Loss
  • Porposional dengan jarak tertinggi dan terendah Enggulfing Pattern dengan risk reward

Dalam artikel ini saya akan menggunakan cara pertama agar mudah dibuat.

bull_corect = len(df[df['bull_enggulfing'] & (df['close'] < df['close'].shift(-shift))])
bull_false = len(df[df['bull_enggulfing'] & (df['close'] > df['close'].shift(-shift))])

bear_corect = len(df[df['bear_enggulfing'] & (df['close'] > df['close'].shift(-shift))])
bear_false = len(df[df['bear_enggulfing'] & (df['close'] < df['close'].shift(-shift))])

Kode diatas digunakan untuk menghitung jumlah pattern yang benar atau salah.

Bull Enggulfing dikatakan benar ketika bar selanjutnya sejumlah shift lebih tinggi dari close Bull Enggulfing Pattern. Salah jika kebalikanya bar selanjutanya sebanyak shift dibawah close pattern.

Untuk Bear Enggulfing perlakuannya sama tetapi kebalikkan dengan Bull Enggulfing Pattern.

Data Pair

Kode tersebut dijalankan di beberapa pair agar dapat diketahui berapa perobabilitas Enggulfing Pattern di pair.

Timeframe di seting ke H4 untuk alasan pastinya tidak kecuali hanya di timeframe ini yang saya punya Selain D1. Lebih memilih H4 karena lebih banyak data yang ada.

Kode untuk membca history data dalam format CSV adalah sebagai berikut.

column_names=['time', 'open', 'high', 'low', 'close', 'volume']
df = pd.read_csv(
'/content/drive/MyDrive/Colab Notebooks/Forex/data/' + pair + '_H4.csv',
index_col=0,
parse_dates=True,
header=None,
names=column_names
)

Code Python

Bagian — bagian kode diatas akan dibuat satu fungsi agar mudah dijalankan, setelah digabungkan menjadi fungsi akan menjadi seperti ini.

def enggulfing_stat(pair, shift):
# Load data
column_names=['time', 'open', 'high', 'low', 'close', 'volume']
df = pd.read_csv(
'/content/drive/MyDrive/Colab Notebooks/Forex/data/' + pair + '_H4.csv',
index_col=0,
parse_dates=True,
header=None,
names=column_names
)

# Find pattern
df['bear_enggulfing'] = (df['low'] < df['low'].shift(1)) & \
(df['high'] > df['high'].shift(1)) & \
(df['close'] < df['open'].shift(1)) & \
(df['open'] > df['close']) & \
(df['open'].shift(1) < df['close'].shift(1))

df['bull_enggulfing'] = (df['low'] < df['low'].shift(1)) & \
(df['high'] > df['high'].shift(1)) & \
(df['close'] > df['open'].shift(1)) & \
(df['open'] < df['close']) & \
(df['open'].shift(1) > df['close'].shift(1))

# Calculate if privit or loss
bull_corect = len(df[df['bull_enggulfing'] & (df['close'] < df['close'].shift(-shift))])
bull_false = len(df[df['bull_enggulfing'] & (df['close'] > df['close'].shift(-shift))])

bear_corect = len(df[df['bear_enggulfing'] & (df['close'] > df['close'].shift(-shift))])
bear_false = len(df[df['bear_enggulfing'] & (df['close'] < df['close'].shift(-shift))])

# Calculate gain
pip_total = np.where(df['bull_enggulfing'] == True, df['close'].shift(-shift) - df['close'], 0).sum() + \
np.where(df['bear_enggulfing'] == True, df['close'] - df['close'].shift(-shift), 0).sum()

pip_digit = 0.1 if 'JPY' in pair else 0.0001

return [pair, \
df.index[0], \
df.index[-1], \
(bull_corect + bear_corect + bull_false + bear_false), \
round((bull_corect + bear_corect) / (bull_corect + bear_corect + bull_false + bear_false) * 100, 2), \
round(pip_total, 2) / pip_digit]

Fungsi diatas dapat dijalankan dengan loop agar mudah mendapatkan semua hasil di berbagai pair.

list_pair = [
"EURUSD",
"EURCAD",
"EURGBP",
"EURCHF",
"EURJPY",
"EURAUD",
"EURNZD",
"GBPUSD",
"GBPCAD",
"GBPCHF",
"GBPNZD",
"GBPAUD",
"GBPJPY",
"USDCHF",
"CADCHF",
"AUDCHF",
"CHFJPY",
"NZDCHF",
"AUDUSD",
"AUDJPY",
"AUDNZD",
"AUDCAD",
"USDJPY",
"CADJPY",
"NZDJPY",
"NZDUSD",
]
result = []

for pair in list_pair:
result.append(enggulfing_stat(pair, 1))

result = pd.DataFrame(
result,
columns=["pair", "start_date", "end_date", "count", "accuration", "pip_total"],
)

Hasil

Akhirnya sampai pada bagian yang paling menyenangkan, hasil probabilitas yang ditemukan. Teidak usah lama lagi ini hasilnya.


+--------+---------------------+---------------------+-------+------------+---------------------+
| pair | start_date | end_date | count | accuration | pip_total |
+--------+---------------------+---------------------+-------+------------+---------------------+
| EURUSD | 2008-02-06 16:00:00 | 2024-02-15 08:00:00 | 1803 | 48.14 | -2000.0 |
| EURCAD | 2008-01-21 12:00:00 | 2024-02-15 08:00:00 | 1964 | 49.95 | 700.0 |
| EURGBP | 2008-02-06 12:00:00 | 2024-02-15 08:00:00 | 1784 | 49.72 | 1700.0 |
| EURCHF | 2008-02-06 08:00:00 | 2024-02-15 08:00:00 | 1838 | 48.42 | 400.0 |
| EURJPY | 2008-01-22 00:00:00 | 2024-02-15 08:00:00 | 1513 | 49.83 | 236.2 |
| EURAUD | 2008-01-21 16:00:00 | 2024-02-15 08:00:00 | 1616 | 50.99 | -600.0 |
| EURNZD | 2008-01-31 20:00:00 | 2024-02-15 08:00:00 | 1641 | 49.79 | -1300.0 |
| GBPUSD | 2008-02-06 08:00:00 | 2024-02-15 08:00:00 | 1836 | 52.02 | 3300.0 |
| GBPCAD | 2008-01-31 16:00:00 | 2024-02-15 12:00:00 | 1982 | 48.23 | -3300.0 |
| GBPCHF | 2008-02-05 08:00:00 | 2024-02-15 12:00:00 | 1878 | 51.49 | 4800.0 |
| GBPNZD | 2008-01-24 00:00:00 | 2024-02-15 12:00:00 | 1680 | 50.24 | 1000.0 |
| GBPAUD | 2008-02-04 12:00:00 | 2024-02-15 12:00:00 | 1743 | 51.18 | 3400.0 |
| GBPJPY | 2008-02-06 08:00:00 | 2024-02-15 12:00:00 | 1535 | 49.51 | 106.4 |
| USDCHF | 2008-02-06 04:00:00 | 2024-02-15 08:00:00 | 1791 | 49.53 | -100.0 |
| CADCHF | 2008-01-31 16:00:00 | 2024-02-15 08:00:00 | 1886 | 50.16 | -899.9999999999999 |
| AUDCHF | 2008-02-01 12:00:00 | 2024-02-15 08:00:00 | 1704 | 51.06 | -500.0 |
| CHFJPY | 2008-02-05 16:00:00 | 2024-02-15 08:00:00 | 1614 | 48.2 | -50.99999999999999 |
| NZDCHF | 2008-01-31 16:00:00 | 2024-02-15 12:00:00 | 1608 | 48.32 | 0.0 |
| AUDUSD | 2008-01-07 16:00:00 | 2024-02-15 08:00:00 | 1551 | 51.77 | 1200.0 |
| AUDJPY | 2008-02-06 12:00:00 | 2024-02-15 08:00:00 | 1486 | 51.35 | 72.19999999999999 |
| AUDNZD | 2008-01-28 16:00:00 | 2024-02-15 08:00:00 | 1711 | 46.87 | -2400.0 |
| AUDCAD | 2007-09-20 04:00:00 | 2024-02-15 08:00:00 | 1661 | 50.57 | 700.0 |
| USDJPY | 2008-01-22 00:00:00 | 2024-02-15 08:00:00 | 1354 | 47.93 | 167.89999999999998 |
| CADJPY | 2008-01-21 20:00:00 | 2024-02-15 08:00:00 | 1571 | 49.4 | -136.79999999999998 |
| NZDJPY | 2008-01-31 16:00:00 | 2024-02-15 12:00:00 | 1545 | 49.64 | 44.699999999999996 |
| NZDUSD | 2008-02-04 20:00:00 | 2024-02-15 12:00:00 | 1541 | 48.8 | -500.0 |
+--------+---------------------+---------------------+-------+------------+---------------------+

Setelah dijalankan didapat dari hasil diatas. Masih banyak hal yang bisa ditingkatkan seperti.

  • Metode mentukkan pattern berhasil atau gagal
  • Timeframe lainya
  • Pair gold atau index

Hasil diatas akan berbeda hasilnya jika point-point yang saya sebutkan diatas dijalankan, perlu dilakukan penelitian lebih lanjut.

Ikuti artikel ini karna akan saya update untuk mengoptimalkan hasil atau mendeteksi pattern lainya.

Terimakasih sudah membaca.

--

--