สวัสดีครับ บทความนี้ เราจะมาเรียนรู้การเขียน Python เพื่อการเทรดบน MT5 ทีละขั้นตอน เนื้อหานี้ เหมาะกับท่านที่มีพื้นฐานการเขียนโปรแกรมมาก่อนนะครับ
ในบทความนี้ท่านจะได้เรียนรู้เกี่ยวกับ
- การเชื่อมต่อ python กับ MT5
- การกำหนดค่าให้ python ส่งคำสั่งซื้อขายบน MT5 ได้
- การเขียนสูตร สำหรับตรวจจับรูปแบบแท่งเทียน
สารบัญเนื้อหา คลิกเพื่ออ่านในหัวข้อต่างๆ
สิ่งจำเป็นต้องมี
- คอมพิวเตอร์ OS : Windows 11
- Python 3.11 ติดตั้งผ่าน Microsoft Store ได้เลย
- Windows Terminal ติดตั้งผ่าน Microsoft Store ได้เลย
- โปรแกรม Editor : Notepad++ , Visual Studio Code หรือ อื่นๆ ที่ถนัด
- MetaTrader 5
- บัญชีเทรด จะใช้บัญชีจริง หรือบัญชีทดลอง ก็ได้
ตรวจสอบความพร้อมก่อนใช้งาน
ตรวจสอบ version python ว่าติดตั้งได้ถูกต้องพร้อมใช้งานหรือยัง
python --version
หรือ
python -V
ติดตั้งตัว library
pip install MetaTrader5
pip install pandas
เปิดบัญชีเทรด และ ติดตั้งโปรแกรม MT5
ในตัวอย่างโบรกเกอร์ที่ผมใช้ คือโบรก eightcap เป็นโบรกเกอร์ที่เหมาะสำหรับใช้เทรดทองคำ
เพราะมีสเปรดต่ำและมีความเสถียรสูง
กำหนดค่าบัญชีเทรด สำหรับใช้เชื่อมต่อ MT5
สร้างไฟล์ .env สำหรับเก็บค่าตัวแปร ข้อมูลบัญชีเทรดเพื่อใช้สำหรับการเชื่อมต่อกับ MT5 มีข้อมูลดังนี้
DIR="EightCap MetaTrader 5"
LOGIN=5016127
PWD="xxxx"
SERVER="Eightcap-Live"
SYMBOL="XAUUSD"
อธิบายค่าตัวแปรต่าง ๆ
- DIR คือ ชื่อโฟล์เดอร์ ที่ติดตั้งโปรแกรม MT5 ตามโบรกเกอร์ที่ท่านใช้ ตัวอย่าง โบรกเกอร์ EightCap ชื่อโฟล์เดอร์คือ EightCap MetaTrader 5 จะอยู่ใน Path C:\Program Files\[โฟล์เดอร์ โบรกเกอร์ MetaTrader5]
- LOGIN คือ เลขบัญชีเทรด (ตามรูปตัวอย่าง 1)
- PWD คือ รหัสผ่านซื้อขาย
- SERVER คือ ชื่อ Server โบรกเกอร์ที่กำหนดให้ในบัญชีเทรดของท่าน (ตามรูปตัวอย่าง 2)
ดาวน์โหลด library MT เพื่อใช้ในการเชื่อมต่อ กับ MT5
แตกไฟล์ MT.zip ไว้ในโฟลเดอร์เดียวกันกับ ไฟล์ .env
เริ่มต้นเขียน Python
ไฟล์ bot.py
import MT as mt
import pandas as pd
import os
import time
import socket
import ta
from time import sleep
from dotenv import load_dotenv
load_dotenv()
folder_dir = os.getenv('DIR')
login = int(os.getenv('LOGIN'))
pwd = os.getenv('PWD')
server = os.getenv('SERVER')
symbol = os.getenv('SYMBOL')
path = "C:/Program Files/" + folder_dir +"/terminal64.exe"
strategy_name = "Candlestick Bot"
if __name__ == '__main__':
# connect to MetaTrader5 Terminal
if not mt.initialize(path=path,login=login, server=server,password=pwd):
print("Initialize() failed, error code =", mt.last_error())
quit()
print(" _____ ___ _____ _ _")
print("| ______ _ __ _____ _|_ _|_ __ |_ _| |__ __ _(_)")
print("| |_ / _ \| '__/ _ \ \/ | || '_ \ | | | '_ \ / _` | |")
print("| _| (_) | | | __/> < | || | | | | | | | | (_| | |")
print("|_| \___/|_| \___/_/\_|___|_| |_ |_| |_| |_|\__,_|_|")
print("")
สร้างไฟล์ run.bat สำหรับเรียกใช้
start python bot.py
ทดสอบ Run สคริปต์ Python เชื่อมต่อ MT5
ลองดับเบิลคลิก ที่ไฟล์ run.bat เพื่อ run สคริปต์ bot.py
ถ้าไม่มีอะไรผิดพลาด โปรแกรม MT5 จะเปิดขึ้นมา พร้อม Login บัญชีเทรดให้ทันที
เริ่มต้นเขียน Bot ให้เทรดตามเงื่อนไข
หลังจากที่เรา เชื่อมต่อกับ MT5 ได้แล้ว เรามาเขียน bot สำหรับส่งคำสั่ง buy , sell กัน
โดยเงื่อนไขในการ ออก ออเดอร์ เราให้ bot หา รูปแบบแท่งเทียน (Candlestick pattern) ที่เราต้องการ
รูปแบบแท่งเทียนสามารถอ่านเพิ่มเติมได้ที่บทความ https://www.forexinthai.com/1045/
รูปแบบแท่งเทียนที่เราจะนำมาใช้ เพื่อ ออก ออเดอร์ ในบทความนี้ คือ Morning star pattern และ Bearish Evening Start นะครับ
จากเงื่อนไขรูปแบบ Morning star pattern และ Bearish Evening Start เขียนเป็นสูตร ได้ดังนี้
function is_morning_star ตรวจจับ รูปแบบ Morning star pattern return ค่าเป็น True / False
#buy
def is_morning_star(df):
# เงื่อนไขสำหรับแท่งเทียนแต่ละวัน
first_candle_bearish = df['close2'] > df['open2']
small_body_second_day = abs(df['close1'] - df['open1']) <= (df['high1'] - df['low1']) / 3
third_candle_bullish = df['close'] > df['open']
# ตำแหน่งของแท่งเทียนวันที่สองและสาม
second_candle_gap_down = df['open1'] < df['close2']
third_candle_closes_above_first_midpoint = df['close'] > (df['open2'] + (df['close2'] - df['open2']) / 2)
# ตรวจสอบทั้งสามแท่งเทียน
morning_star = first_candle_bearish & small_body_second_day & second_candle_gap_down & third_candle_bullish & third_candle_closes_above_first_midpoint
return morning_star
function is_bearish_evening_star ตรวจจับ รูปแบบ Bearish Evening Start return ค่าเป็น True / False
#sell
def is_bearish_evening_star(df):
# เงื่อนไขสำหรับแท่งเทียนแต่ละวัน
first_candle_bullish = df['close2'] > df['open2']
small_body_second_day = abs(df['close1'] - df['open1']) <= (df['high1'] - df['low1']) / 3
third_candle_bearish = df['close'] < df['open']
# ตำแหน่งของแท่งเทียนวันที่สองและสาม
second_candle_gap_up = df['open1'] > df['close2']
third_candle_closes_below_first_midpoint = df['close'] < (df['open2'] + (df['close2'] - df['open2']) / 2)
# ตรวจสอบทั้งสามแท่งเทียน
evening_star = first_candle_bullish & small_body_second_day & second_candle_gap_up & third_candle_bearish & third_candle_closes_below_first_midpoint
return evening_star
เขียน function market_order สำหรับ สร้าง ออเดอร์
def market_order(symbol, volume, order_type, deviation, magic, stoploss, take_profit,strategy_name):
order_type_dict = {
'buy': mt.ORDER_TYPE_BUY,
'sell': mt.ORDER_TYPE_SELL
}
price_dict = {
'buy': mt.symbol_info_tick(symbol).ask,
'sell': mt.symbol_info_tick(symbol).bid
}
request = {
"action": mt.TRADE_ACTION_DEAL,
"symbol": symbol,
"volume": volume, # FLOAT
"type": order_type_dict[order_type],
"price": price_dict[order_type],
"sl": stoploss, # FLOAT
"tp": take_profit, # FLOAT
"deviation": deviation, # INTERGER
"magic": magic, # INTERGER
"comment": strategy_name,
"type_time": mt.ORDER_TIME_GTC,
"type_filling": mt.ORDER_FILLING_IOC, # mt.ORDER_FILLING_FOK if IOC does not work
}
order_result = mt.order_send(request)
return (order_result)
เขียน function get_signal สำหรับตรวจว่าตรงตาม pattern buy หรือ sell หรือไม่
def get_signal(symbol, timeframe):
global strategy_name
rates = mt.copy_rates_from_pos(symbol, timeframe, 1, 100)
# Create a DataFrame
df = pd.DataFrame(rates)
df['time'] = pd.to_datetime(df['time'], unit='s')
df.set_index('time', inplace=True)
df['rsi'] = ta.momentum.rsi(df['close'], window=14)
rsi = df.iloc[-1];
ohlc = mt.copy_rates_from_pos(symbol, timeframe, 1, 3)
ohlc_df = pd.DataFrame(ohlc)[['time', 'open', 'high', 'low', 'close']]
ohlc_df['time'] = pd.to_datetime(ohlc_df['time'], unit='s')
ohlc_df['open2'] = ohlc_df['open'].shift(2)
ohlc_df['high2'] = ohlc_df['high'].shift(2)
ohlc_df['low2'] = ohlc_df['low'].shift(2)
ohlc_df['close2'] = ohlc_df['close'].shift(2)
ohlc_df['open1'] = ohlc_df['open'].shift(1)
ohlc_df['high1'] = ohlc_df['high'].shift(1)
ohlc_df['low1'] = ohlc_df['low'].shift(1)
ohlc_df['close1'] = ohlc_df['close'].shift(1)
ohlc_df['rsi'] = rsi['rsi']
candle = ohlc_df.iloc[-1];
if candle['high1'] - candle['low1'] == 0:
return False
is_buy = False
is_sell = False
print(f"----------------------------------------")
print(f" Check All ")
print(f"----------------------------------------")
buy_patterns = {
"morning_star": is_morning_star(candle)
}
for key, pattern in buy_patterns.items():
print(f"{key}: {pattern}")
if pattern == True:
is_buy = True
strategy_name = key
break
sell_patterns = {
"bearish_evening_star": is_bearish_evening_star(candle)
}
for key, pattern in sell_patterns.items():
print(f"{key}: {pattern}")
if pattern == True:
is_sell = True
strategy_name = key
break
print(f"----------------------------------------")
print(f" BUY: {is_buy}")
print(f"----------------------------------------")
print(f"----------------------------------------")
print(f" SELL: {is_sell}")
print(f"----------------------------------------")
#print(candle)
print(ohlc_df)
if is_buy:
return 'buy'
elif is_sell:
return 'sell'
else:
return False
ตั้งค่า ออเดอร์
timeframe = mt.TIMEFRAME_M1 คือ Timeframe M1 ( 1 นาที ต่อ แท่งเทียน)
volume = 0.02 คือ lot size
sl = 400 คือ จำนวน point ที่จะ stoploss ตัดขาดทุน
tp = 400 คือ จำนวน point ที่จะ take profit ตัดทำกำไร
เขียนให้ bot ทำการตรวจสอบ เป็น Loop
if __name__ == '__main__':
# connect to MetaTrader5 Terminal
if not mt.initialize(path=path,login=login, server=server,password=pwd):
print("Initialize() failed, error code =", mt.last_error())
quit()
print(" _____ ___ _____ _ _")
print("| ______ _ __ _____ _|_ _|_ __ |_ _| |__ __ _(_)")
print("| |_ / _ \| '__/ _ \ \/ | || '_ \ | | | '_ \ / _` | |")
print("| _| (_) | | | __/> < | || | | | | | | | | (_| | |")
print("|_| \___/|_| \___/_/\_|___|_| |_ |_| |_| |_|\__,_|_|")
print("")
timeframe = mt.TIMEFRAME_M1
volume = 0.02
deviation=20
magic=30
stoploss=0.0
take_profit=0.0
sl = 400
tp = 400
trading_allowed = True
while trading_allowed:
# Careful! Loop can open infinite positions!
signal = get_signal(symbol, timeframe)
print('signal', signal)
print('########################################################################################################\n')
if signal == 'buy' and mt.positions_total() == 0:
price = mt.symbol_info_tick(symbol).ask
point = mt.symbol_info(symbol).point
stoploss = price - sl * point
take_profit = price + tp * point
res = market_order(symbol, volume, 'buy',deviation, magic, stoploss, take_profit,strategy_name)
trading_allowed = False
elif signal == 'sell' and mt.positions_total() == 0:
point = mt.symbol_info(symbol).point
price = mt.symbol_info_tick(symbol).bid
stoploss = price + sl * point
take_profit = price - tp * point
res = market_order(symbol, volume, 'sell',deviation, magic, stoploss, take_profit,strategy_name)
trading_allowed = False
sleep(1)
สคริปต์ bot.py พร้อมสำหรับใช้งาน
import MT as mt
import pandas as pd
from time import sleep
import os
from dotenv import load_dotenv
import time
import socket
import ta
load_dotenv()
folder_dir = os.getenv('DIR')
login = int(os.getenv('LOGIN'))
pwd = os.getenv('PWD')
server = os.getenv('SERVER')
symbol = os.getenv('SYMBOL')
path = "C:/Program Files/" + folder_dir +"/terminal64.exe"
strategy_name = "Candlestick Bot"
# Create by: Admin | Forex In Thai
# https://www.forexinthai.com
def market_order(symbol, volume, order_type, deviation, magic, stoploss, take_profit,strategy_name):
order_type_dict = {
'buy': mt.ORDER_TYPE_BUY,
'sell': mt.ORDER_TYPE_SELL
}
price_dict = {
'buy': mt.symbol_info_tick(symbol).ask,
'sell': mt.symbol_info_tick(symbol).bid
}
request = {
"action": mt.TRADE_ACTION_DEAL,
"symbol": symbol,
"volume": volume, # FLOAT
"type": order_type_dict[order_type],
"price": price_dict[order_type],
"sl": stoploss, # FLOAT
"tp": take_profit, # FLOAT
"deviation": deviation, # INTERGER
"magic": magic, # INTERGER
"comment": strategy_name,
"type_time": mt.ORDER_TIME_GTC,
"type_filling": mt.ORDER_FILLING_IOC, # mt.ORDER_FILLING_FOK if IOC does not work
}
order_result = mt.order_send(request)
return (order_result)
#sell
def is_bearish_evening_star(df):
# เงื่อนไขสำหรับแท่งเทียนแต่ละวัน
first_candle_bullish = df['close2'] > df['open2']
small_body_second_day = abs(df['close1'] - df['open1']) <= (df['high1'] - df['low1']) / 3
third_candle_bearish = df['close'] < df['open']
# ตำแหน่งของแท่งเทียนวันที่สองและสาม
second_candle_gap_up = df['open1'] > df['close2']
third_candle_closes_below_first_midpoint = df['close'] < (df['open2'] + (df['close2'] - df['open2']) / 2)
# ตรวจสอบทั้งสามแท่งเทียน
evening_star = first_candle_bullish & small_body_second_day & second_candle_gap_up & third_candle_bearish & third_candle_closes_below_first_midpoint
return evening_star
#buy
def is_morning_star(df):
# เงื่อนไขสำหรับแท่งเทียนแต่ละวัน
first_candle_bearish = df['close2'] > df['open2']
small_body_second_day = abs(df['close1'] - df['open1']) <= (df['high1'] - df['low1']) / 3
third_candle_bullish = df['close'] > df['open']
# ตำแหน่งของแท่งเทียนวันที่สองและสาม
second_candle_gap_down = df['open1'] < df['close2']
third_candle_closes_above_first_midpoint = df['close'] > (df['open2'] + (df['close2'] - df['open2']) / 2)
# ตรวจสอบทั้งสามแท่งเทียน
morning_star = first_candle_bearish & small_body_second_day & second_candle_gap_down & third_candle_bullish & third_candle_closes_above_first_midpoint
return morning_star
def get_signal(symbol, timeframe):
global strategy_name
rates = mt.copy_rates_from_pos(symbol, timeframe, 1, 100)
# Create a DataFrame
df = pd.DataFrame(rates)
df['time'] = pd.to_datetime(df['time'], unit='s')
df.set_index('time', inplace=True)
df['rsi'] = ta.momentum.rsi(df['close'], window=14)
rsi = df.iloc[-1];
ohlc = mt.copy_rates_from_pos(symbol, timeframe, 1, 3)
ohlc_df = pd.DataFrame(ohlc)[['time', 'open', 'high', 'low', 'close']]
ohlc_df['time'] = pd.to_datetime(ohlc_df['time'], unit='s')
ohlc_df['open2'] = ohlc_df['open'].shift(2)
ohlc_df['high2'] = ohlc_df['high'].shift(2)
ohlc_df['low2'] = ohlc_df['low'].shift(2)
ohlc_df['close2'] = ohlc_df['close'].shift(2)
ohlc_df['open1'] = ohlc_df['open'].shift(1)
ohlc_df['high1'] = ohlc_df['high'].shift(1)
ohlc_df['low1'] = ohlc_df['low'].shift(1)
ohlc_df['close1'] = ohlc_df['close'].shift(1)
ohlc_df['rsi'] = rsi['rsi']
candle = ohlc_df.iloc[-1];
if candle['high1'] - candle['low1'] == 0:
return False
is_buy = False
is_sell = False
print(f"----------------------------------------")
print(f" Check All ")
print(f"----------------------------------------")
buy_patterns = {
"morning_star": is_morning_star(candle)
}
for key, pattern in buy_patterns.items():
print(f"{key}: {pattern}")
if pattern == True:
is_buy = True
strategy_name = key
break
sell_patterns = {
"bearish_evening_star": is_bearish_evening_star(candle)
}
for key, pattern in sell_patterns.items():
print(f"{key}: {pattern}")
if pattern == True:
is_sell = True
strategy_name = key
break
print(f"----------------------------------------")
print(f" BUY: {is_buy}")
print(f"----------------------------------------")
print(f"----------------------------------------")
print(f" SELL: {is_sell}")
print(f"----------------------------------------")
#print(candle)
print(ohlc_df)
if is_buy:
return 'buy'
elif is_sell:
return 'sell'
else:
return False
if __name__ == '__main__':
# connect to MetaTrader5 Terminal
if not mt.initialize(path=path,login=login, server=server,password=pwd):
print("Initialize() failed, error code =", mt.last_error())
quit()
print(" _____ ___ _____ _ _")
print("| ______ _ __ _____ _|_ _|_ __ |_ _| |__ __ _(_)")
print("| |_ / _ \| '__/ _ \ \/ | || '_ \ | | | '_ \ / _` | |")
print("| _| (_) | | | __/> < | || | | | | | | | | (_| | |")
print("|_| \___/|_| \___/_/\_|___|_| |_ |_| |_| |_|\__,_|_|")
print("")
timeframe = mt.TIMEFRAME_M1
volume = 0.02
deviation=20
magic=30
stoploss=0.0
take_profit=0.0
sl = 400
tp = 400
trading_allowed = True
while trading_allowed:
# Careful! Loop can open infinite positions!
signal = get_signal(symbol, timeframe)
print('signal', signal)
print('########################################################################################################\n')
if signal == 'buy' and mt.positions_total() == 0:
price = mt.symbol_info_tick(symbol).ask
point = mt.symbol_info(symbol).point
stoploss = price - sl * point
take_profit = price + tp * point
res = market_order(symbol, volume, 'buy',deviation, magic, stoploss, take_profit,strategy_name)
trading_allowed = False
elif signal == 'sell' and mt.positions_total() == 0:
point = mt.symbol_info(symbol).point
price = mt.symbol_info_tick(symbol).bid
stoploss = price + sl * point
take_profit = price - tp * point
res = market_order(symbol, volume, 'sell',deviation, magic, stoploss, take_profit,strategy_name)
trading_allowed = False
sleep(1)
เปิดใช้ Algo Trading
คลิกที่ ปุ่ม Algo Trading ให้เป็นสีเขียว เพื่ออนุญาต ให้ส่งคำสั่งซื้อขายผ่าน library ได้
จากนั้น คลิก run.bat เพื่อให้ bot ทำงาน
เมื่อรูปแบบแท่งเทียนตรงตามเงื่อนไข bot ก็จะทำการสร้างออเดอร์ให้ และ bot ก็จะหยุดทำงาน ถ้าต้องการให้ bot ทำงาน จะต้อง คลิก run.bat ใหม่
ผลงาน
ตัวอย่างผลงาน กำไร $17.57 (ทุน $18.95)
นี้เป็นเพียงผลงาน ไม่ได้การันตีว่า ทุก order จะทำกำไรได้ 100 % นะครับ
ท่านสามารถดาวน์โหลดไฟล์ สคริปต์ทั้งหมด ได้ในจากลิงค์ด้านล่าง
สรุป
การเขียนสคริปต์ Python เพื่อเชื่อมต่อกับ MT5 (MetaTrader 5) เปิดโอกาสให้นักเทรดพัฒนาศักยภาพในการเทรดของตนอย่างมากมาย โดยใช้ประโยชน์จากข้อมูลและอัลกอริธึมที่ได้จากโปรแกรม. ในยุคที่ปัญญาประดิษฐ์ (AI) มีบทบาทเพิ่มขึ้นในทุกด้านของชีวิต, การเรียนรู้และสร้างสรรค์ไอเดียใหม่ๆ สำหรับการเทรดด้วยเทคนิคการเขียนโปรแกรมจึงเป็นทักษะที่มีค่าอย่างยิ่ง. การประยุกต์ใช้ AI ในการวิเคราะห์และการตัดสินใจทางการเงินสามารถช่วยให้นักเทรดได้เปรียบในตลาด และส่งเสริมการตัดสินใจที่มีข้อมูลมากขึ้น ด้วยการเขียนสคริปต์ Python เชื่อมต่อกับ MT5, นักเทรดสามารถนำเสนอวิธีการเทรดที่เป็นระบบและมีประสิทธิภาพสูงได้.
แหล่งข้อมูล