python mt5

เริ่มต้น: เขียน Python เทรดบน MT5 แบบง่ายๆ

สวัสดีครับ บทความนี้ เราจะมาเรียนรู้การเขียน 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
  • บัญชีเทรด จะใช้บัญชีจริง หรือบัญชีทดลอง ก็ได้

ตรวจสอบความพร้อมก่อนใช้งาน

วิธีติดตั้ง python 3 11 windows 11

ตรวจสอบ version python ว่าติดตั้งได้ถูกต้องพร้อมใช้งานหรือยัง

python --version
หรือ 
python -V
check version python

ติดตั้งตัว 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]
เชื่อมต่อกับ mt5 ด้วย python
  • LOGIN คือ เลขบัญชีเทรด (ตามรูปตัวอย่าง 1)
  • PWD คือ รหัสผ่านซื้อขาย
  • SERVER คือ ชื่อ Server โบรกเกอร์ที่กำหนดให้ในบัญชีเทรดของท่าน (ตามรูปตัวอย่าง 2)
ข้อมูลบัญชีเทรด eightcap

ดาวน์โหลด library MT เพื่อใช้ในการเชื่อมต่อ กับ MT5

MT.zip
Library Python สำหรับใช้เชื่อมต่อกับ โปรแกรม MetaTrader 5

แตกไฟล์ 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 บัญชีเทรดให้ทันที

ทดสอบ run สคริปต์ python เชื่อมต่อ mt5

เริ่มต้นเขียน Bot ให้เทรดตามเงื่อนไข

หลังจากที่เรา เชื่อมต่อกับ MT5 ได้แล้ว เรามาเขียน bot สำหรับส่งคำสั่ง buy , sell กัน
โดยเงื่อนไขในการ ออก ออเดอร์ เราให้ bot หา รูปแบบแท่งเทียน (Candlestick pattern) ที่เราต้องการ
รูปแบบแท่งเทียนสามารถอ่านเพิ่มเติมได้ที่บทความ https://www.forexinthai.com/1045/

รูปแบบแท่งเทียนที่เราจะนำมาใช้ เพื่อ ออก ออเดอร์ ในบทความนี้ คือ Morning star pattern และ Bearish Evening Start นะครับ

morning star pattern

จากเงื่อนไขรูปแบบ 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 ได้

เปิดสิทธิ์ให้ alog trading python ส่งคำสั่งเทรดได้

จากนั้น คลิก run.bat เพื่อให้ bot ทำงาน

เมื่อรูปแบบแท่งเทียนตรงตามเงื่อนไข bot ก็จะทำการสร้างออเดอร์ให้ และ bot ก็จะหยุดทำงาน ถ้าต้องการให้ bot ทำงาน จะต้อง คลิก run.bat ใหม่

ทดสอบ run สคริปต์ python bot

ผลงาน

ตัวอย่างผลงาน กำไร $17.57 (ทุน $18.95)
นี้เป็นเพียงผลงาน ไม่ได้การันตีว่า ทุก order จะทำกำไรได้ 100 % นะครับ

ผลงาน bot

ท่านสามารถดาวน์โหลดไฟล์ สคริปต์ทั้งหมด ได้ในจากลิงค์ด้านล่าง

python-mt5.zip
ตัวอย่างไฟล์ทั้งหมดในบทความ

สรุป

การเขียนสคริปต์ Python เพื่อเชื่อมต่อกับ MT5 (MetaTrader 5) เปิดโอกาสให้นักเทรดพัฒนาศักยภาพในการเทรดของตนอย่างมากมาย โดยใช้ประโยชน์จากข้อมูลและอัลกอริธึมที่ได้จากโปรแกรม. ในยุคที่ปัญญาประดิษฐ์ (AI) มีบทบาทเพิ่มขึ้นในทุกด้านของชีวิต, การเรียนรู้และสร้างสรรค์ไอเดียใหม่ๆ สำหรับการเทรดด้วยเทคนิคการเขียนโปรแกรมจึงเป็นทักษะที่มีค่าอย่างยิ่ง. การประยุกต์ใช้ AI ในการวิเคราะห์และการตัดสินใจทางการเงินสามารถช่วยให้นักเทรดได้เปรียบในตลาด และส่งเสริมการตัดสินใจที่มีข้อมูลมากขึ้น ด้วยการเขียนสคริปต์ Python เชื่อมต่อกับ MT5, นักเทรดสามารถนำเสนอวิธีการเทรดที่เป็นระบบและมีประสิทธิภาพสูงได้.

แหล่งข้อมูล