Analisa Mendalam Probabilitas Pola Enggulfing Pattern
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.
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.