Skip to main content

5 posts tagged with "trading"

View All Tags

Cách Gọi Hàm trong CommonYFinance

· 2 min read

Giới Thiệu

Module CommonYFinance hỗ trợ tải dữ liệu tài chính từ Yahoo Finance, giúp bạn dễ dàng lấy thông tin giá cổ phiếu để sử dụng trong các bot giao dịch tự động.

1. Cách Import Module CommonYFinance

Trong Jupyter Notebook hoặc file Python, bạn có thể import module như sau:

import sys
sys.path.append('../Common') # Thêm thư mục Common vào đường dẫn
from CommonYFinance import CommonYFinance

2. Gọi Hàm loaddataYFinance

Sử dụng hàm loaddataYFinance để tải dữ liệu giá của một mã chứng khoán trong khoảng thời gian nhất định:

symbol = 'VCB.VN'
from_date = '2025-01-01'
to_date = '2025-03-28'
interval = '1d'

data = CommonYFinance.loaddataYFinance(symbol, from_date, to_date, interval)
print(data.head())

Output Mẫu:

DatetimeAdj CloseCloseHighLowOpenVolume
2025-01-0261471.5761471.5761872.9161204.0161270.902437598
2025-01-0361538.4661538.4661806.0161471.5761471.572543892

3. Tổng Kết

Module CommonYFinance giúp bạn nhanh chóng tải dữ liệu tài chính để phân tích và giao dịch tự động. Bạn có thể mở rộng module để hỗ trợ nhiều nguồn dữ liệu hơn!

Xây Dựng Module Common trong Python cho Giao Dịch Tự Động

· 2 min read

Giới Thiệu

Trong giao dịch tự động, việc quản lý và tải dữ liệu tài chính từ các nguồn đáng tin cậy là rất quan trọng. Bài viết này hướng dẫn cách xây dựng module Common trong Python giúp tải dữ liệu từ Yahoo Finance (YFinance) để sử dụng trong các bot giao dịch tự động.

1. Cấu Trúc Module Common

Chúng ta sẽ tạo một module Python với tên Common để có thể sử dụng trong nhiều dự án giao dịch tự động khác nhau.

Cấu trúc thư mục:

/TradingBotProject
│── /Common
│ ├── __init__.py
│ ├── CommonYFinance.py
│── main.py

2. Nội Dung Của CommonYFinance.py

Tạo file CommonYFinance.py với nội dung sau:

import pandas as pd
import yfinance as yf

class CommonYFinance:
@staticmethod
def loaddataYFinance(symbol, from_date, to_date, interval):
"""
Tải dữ liệu lịch sử của một mã chứng khoán từ Yahoo Finance.

Parameters:
- symbol: Mã chứng khoán (VD: 'VCB.VN')
- from_date: Ngày bắt đầu (YYYY-MM-DD)
- to_date: Ngày kết thúc (YYYY-MM-DD)
- interval: Khung thời gian ('1d', '1h', v.v.)

Returns:
- DataFrame chứa dữ liệu giá
"""
data = yf.download(symbol, start=from_date, end=to_date, interval=interval, auto_adjust=False)
data.reset_index(inplace=True)
data = data.rename(columns={'Date': 'Datetime'})
data.columns = data.columns.droplevel(1) # Xóa cấp độ dư thừa nếu có
data.columns.name = None
return data

@staticmethod
def Hello():
"""Hàm test đơn giản."""
print('Hello')
return '1'

3. Cách Sử Dụng Module Common

Trong file main.py, chúng ta có thể import module CommonYFinance và tải dữ liệu như sau:

import sys
sys.path.append("../Common") # Thêm thư mục Common vào đường dẫn
from CommonYFinance import CommonYFinance

# Cấu hình thông số
symbol = 'VCB.VN'
from_date = '2023-11-01'
to_date = '2023-11-30'
interval = '1d'

# Tải dữ liệu
data = CommonYFinance.loaddataYFinance(symbol, from_date, to_date, interval)
print(data.head())

4. Tổng Kết

Module Common giúp chuẩn hóa quá trình tải dữ liệu tài chính, hỗ trợ phát triển bot giao dịch tự động hiệu quả hơn. Bạn có thể mở rộng module này để tích hợp thêm nhiều nguồn dữ liệu hoặc xử lý chuyên sâu hơn!

🚀 Hãy bắt tay vào xây dựng bot giao dịch thông minh của bạn ngay hôm nay!

Hướng dẫn lấy dữ liệu từ MetaTrader 5 bằng Python

· 3 min read

MetaTrader 5 (MT5) là một trong những nền tảng giao dịch phổ biến nhất hiện nay. Với Python, chúng ta có thể dễ dàng lấy dữ liệu từ MT5 để phân tích và xây dựng các chiến lược giao dịch tự động. Trong bài viết này, tôi sẽ hướng dẫn bạn cách lấy dữ liệu từ MT5 bằng Python.

1. Cài đặt thư viện

Đầu tiên, chúng ta cần cài đặt thư viện MetaTrader5 cho Python:

pip install MetaTrader5

2. Kết nối với MetaTrader 5

import MetaTrader5 as mt5
import pandas as pd
from datetime import datetime
import pytz

# Khởi tạo kết nối
if not mt5.initialize():
print("Khởi tạo thất bại!")
quit()

# Hiển thị thông tin phiên bản
print("MetaTrader5 package version:", mt5.__version__)

3. Lấy dữ liệu theo thời gian

Chúng ta có thể lấy dữ liệu theo các khung thời gian khác nhau:

# Lấy dữ liệu 1 phút
rates = mt5.copy_rates_from("EURUSD", mt5.TIMEFRAME_M1, datetime.now(), 1000)

4. Chuyển đổi dữ liệu thành DataFrame

# Chuyển đổi thành DataFrame
df = pd.DataFrame(rates)

# Chuyển đổi timestamp thành datetime
df['time'] = pd.to_datetime(df['time'], unit='s')

# Hiển thị dữ liệu
print(df.head())

5. Các khung thời gian có sẵn

MT5 cung cấp nhiều khung thời gian khác nhau:

  • TIMEFRAME_M1: 1 phút
  • TIMEFRAME_M5: 5 phút
  • TIMEFRAME_M15: 15 phút
  • TIMEFRAME_M30: 30 phút
  • TIMEFRAME_H1: 1 giờ
  • TIMEFRAME_H4: 4 giờ
  • TIMEFRAME_D1: 1 ngày
  • TIMEFRAME_W1: 1 tuần
  • TIMEFRAME_MN1: 1 tháng

6. Ví dụ hoàn chỉnh

import MetaTrader5 as mt5
import pandas as pd
from datetime import datetime
import pytz

# Khởi tạo kết nối
if not mt5.initialize():
print("Khởi tạo thất bại!")
quit()

# Thiết lập múi giờ UTC
timezone = pytz.timezone("Etc/UTC")

# Tạo datetime object trong múi giờ UTC
utc_from = datetime(2024, 1, 1, tzinfo=timezone)

# Lấy 1000 nến H1 của EURUSD từ 1/1/2024
rates = mt5.copy_rates_from("EURUSD", mt5.TIMEFRAME_H1, utc_from, 1000)

# Chuyển đổi thành DataFrame
df = pd.DataFrame(rates)
df['time'] = pd.to_datetime(df['time'], unit='s')

# Hiển thị dữ liệu
print(df.head())

# Đóng kết nối
mt5.shutdown()

7. Lưu ý quan trọng

  1. Múi giờ: MT5 lưu trữ thời gian theo UTC, nên cần chú ý khi làm việc với múi giờ địa phương.

  2. Giới hạn dữ liệu: Số lượng nến có thể lấy được phụ thuộc vào cài đặt "Max. bars in chart" trong MT5.

  3. Kết nối: Cần đảm bảo MT5 đang chạy và có kết nối internet ổn định.

  4. Tài khoản: Một số dữ liệu có thể yêu cầu tài khoản demo hoặc thật.

8. Ứng dụng thực tế

Dữ liệu từ MT5 có thể được sử dụng để:

  • Phân tích kỹ thuật
  • Xây dựng chiến lược giao dịch
  • Backtesting
  • Tạo chỉ báo tùy chỉnh
  • Phân tích thống kê

Kết luận

Việc lấy dữ liệu từ MT5 bằng Python mở ra nhiều cơ hội cho việc phân tích và tự động hóa giao dịch. Với thư viện MetaTrader5, chúng ta có thể dễ dàng tích hợp MT5 vào các ứng dụng Python của mình.

Tài liệu tham khảo

Pandas và Phân Tích Dữ Liệu Thị Trường

· 4 min read

Pandas là một thư viện Python mạnh mẽ cho phân tích dữ liệu, đặc biệt hữu ích trong việc xử lý và phân tích dữ liệu thị trường tài chính. Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng Pandas để phân tích dữ liệu thị trường một cách hiệu quả.

1. Series trong Pandas

Series là một cấu trúc dữ liệu một chiều trong Pandas, tương tự như một mảng có nhãn (labeled array).

1.1. Tạo Series

import pandas as pd
import numpy as np

# Tạo Series từ list
prices = pd.Series([100, 102, 98, 103, 101],
index=['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05'],
name='Close Price')
print(prices)

Series Example

1.2. Thao tác với Series

# Tính toán cơ bản
print("Giá trung bình:", prices.mean())
print("Giá cao nhất:", prices.max())
print("Giá thấp nhất:", prices.min())

# Tính phần trăm thay đổi
returns = prices.pct_change()
print("\nPhần trăm thay đổi:")
print(returns)

2. DataFrame trong Pandas

DataFrame là cấu trúc dữ liệu hai chiều, tương tự như bảng tính Excel.

2.1. Tạo DataFrame

# Tạo DataFrame từ dictionary
data = {
'Open': [100, 101, 99, 102, 100],
'High': [103, 104, 100, 105, 102],
'Low': [98, 100, 97, 101, 99],
'Close': [102, 98, 103, 101, 104],
'Volume': [1000, 1200, 800, 1500, 1100]
}

df = pd.DataFrame(data,
index=['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04', '2024-01-05'])
print(df)

DataFrame Example

2.2. Thao tác với DataFrame

# Thống kê cơ bản
print("\nThống kê cơ bản:")
print(df.describe())

# Lọc dữ liệu
high_volume = df[df['Volume'] > 1000]
print("\nNgày có khối lượng > 1000:")
print(high_volume)

# Sắp xếp dữ liệu
sorted_by_volume = df.sort_values('Volume', ascending=False)
print("\nSắp xếp theo khối lượng:")
print(sorted_by_volume)

3. Phân Tích Dữ Liệu Thị Trường

3.1. Tính toán các chỉ số kỹ thuật

# Tính Moving Average
df['MA5'] = df['Close'].rolling(window=5).mean()
df['MA10'] = df['Close'].rolling(window=10).mean()

# Tính RSI
def calculate_rsi(data, periods=14):
delta = data.diff()
gain = (delta.where(delta > 0, 0)).rolling(window=periods).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=periods).mean()
rs = gain / loss
return 100 - (100 / (1 + rs))

df['RSI'] = calculate_rsi(df['Close'])

3.2. Phân tích xu hướng

# Xác định xu hướng
df['Trend'] = np.where(df['MA5'] > df['MA10'], 'Uptrend', 'Downtrend')

# Tính biến động
df['Volatility'] = df['Close'].pct_change().rolling(window=5).std() * 100

4. Bài Tập Thực Hành

4.1. Phân tích dữ liệu giá cổ phiếu

# Đọc dữ liệu từ file CSV
stock_data = pd.read_csv('stock_data.csv', index_col='Date', parse_dates=True)

# Tính toán các chỉ số
stock_data['Returns'] = stock_data['Close'].pct_change()
stock_data['MA20'] = stock_data['Close'].rolling(window=20).mean()
stock_data['MA50'] = stock_data['Close'].rolling(window=50).mean()

# Phân tích xu hướng
stock_data['Trend'] = np.where(stock_data['MA20'] > stock_data['MA50'],
'Uptrend', 'Downtrend')

# Tìm các điểm giao cắt
stock_data['Signal'] = np.where(stock_data['MA20'] > stock_data['MA50'], 1, -1)
stock_data['Position'] = stock_data['Signal'].diff()

4.2. Phân tích hiệu suất

# Tính toán hiệu suất
def calculate_performance(data):
# Tính lợi nhuận tích lũy
data['Cumulative Returns'] = (1 + data['Returns']).cumprod()

# Tính các chỉ số hiệu suất
total_return = data['Cumulative Returns'].iloc[-1] - 1
annual_return = (1 + total_return) ** (252/len(data)) - 1
volatility = data['Returns'].std() * np.sqrt(252)
sharpe_ratio = annual_return / volatility

return {
'Total Return': total_return,
'Annual Return': annual_return,
'Volatility': volatility,
'Sharpe Ratio': sharpe_ratio
}

performance = calculate_performance(stock_data)
print("\nHiệu suất đầu tư:")
for metric, value in performance.items():
print(f"{metric}: {value:.2%}")

5. Lưu ý Quan Trọng

  1. Xử lý dữ liệu thiếu:

    • Sử dụng fillna() để điền giá trị thiếu
    • Sử dụng dropna() để loại bỏ dữ liệu thiếu
  2. Tối ưu hiệu suất:

    • Sử dụng vectorization thay vì vòng lặp
    • Tránh sử dụng apply() khi có thể
  3. Lưu trữ dữ liệu:

    • Sử dụng to_csv() để lưu DataFrame
    • Sử dụng to_pickle() cho dữ liệu lớn

6. Kết luận

Pandas cung cấp một bộ công cụ mạnh mẽ cho việc phân tích dữ liệu thị trường. Với các tính năng như Series, DataFrame, và các hàm phân tích, chúng ta có thể dễ dàng xử lý và phân tích dữ liệu thị trường một cách hiệu quả.

Tài liệu tham khảo

Xây Dựng Bot Giao Dịch Margin Tự Động với Binance, EMA, MACD, ATR và OCO

· 5 min read

1. Giới thiệu

Bài viết này hướng dẫn cách xây dựng một bot giao dịch margin tự động trên sàn Binance sử dụng Python. Bot sử dụng các chỉ báo kỹ thuật phổ biến như EMA, MACD, ATR để xác định điểm vào/ra lệnh, quản lý lệnh với OCO (One Cancels the Other), và ghi log giao dịch lên Google Sheets.


2. Các thành phần chính

  • Binance API: Giao tiếp với sàn để lấy dữ liệu và đặt lệnh.
  • TA-Lib: Tính toán các chỉ báo kỹ thuật (EMA, MACD, ATR).
  • WebSocket: Nhận dữ liệu nến (kline) thời gian thực.
  • Google Sheets: Lưu lại lịch sử giao dịch.
  • Quản lý lệnh OCO: Đặt đồng thời Take Profit và Stop Loss.
  • Margin Trading: Hỗ trợ cả LONG và SHORT với vay tài sản tự động.

3. Hướng dẫn cài đặt môi trường và thư viện

3.1. Cài đặt Python và các thư viện cần thiết

# Cài Python >= 3.8
# Cài pip nếu chưa có

# Cài các thư viện cần thiết
pip install python-binance websocket-client ta-lib numpy gspread oauth2client

Lưu ý:

  • TA-Lib có thể cần cài đặt thêm thư viện hệ thống (trên Windows: download binary, trên Ubuntu: sudo apt install ta-lib).
  • Tạo file binanceconfig.py chứa API_KEY và API_SECRET của bạn.

3.2. Ví dụ file cấu hình binanceconfig.py

API_KEY = "YOUR_BINANCE_API_KEY"
API_SECRET = "YOUR_BINANCE_API_SECRET"

4. Luồng hoạt động tổng quát

  1. Kết nối WebSocket để nhận dữ liệu nến mới nhất.
  2. Tính toán EMA, MACD, ATR trên dữ liệu lịch sử.
  3. Xác định tín hiệu vào lệnh dựa trên giao cắt MACD và xu hướng EMA.
  4. Tự động đặt lệnh margin (LONG/SHORT) khi có tín hiệu.
  5. Đặt lệnh OCO để quản lý Take Profit và Stop Loss.
  6. Theo dõi và cập nhật lệnh: Dời Stop Loss theo ATR, kiểm tra trạng thái lệnh.
  7. Ghi log giao dịch lên Google Sheets.
  8. Tự động trả nợ khi đóng lệnh SHORT.

5. Sơ đồ luồng hoạt động

Sơ đồ luồng hoạt động bot giao dịch margin Binance

flowchart TD
A[Kết nối WebSocket] --> B{Nhận nến mới}
B -->|Nến đóng| C[Tính EMA, MACD, ATR]
C --> D{Tín hiệu vào lệnh?}
D -->|Có| E[Đặt lệnh Margin + OCO]
D -->|Không| B
E --> F[Theo dõi lệnh, dời SL]
F --> G{TP/SL khớp?}
G -->|Có| H[Ghi log, trả nợ (nếu SHORT)]
G -->|Không| F
H --> B

6. Giải thích chi tiết từng hàm trong code

6.1. Hàm on_open, on_close

  • on_open(ws): In ra thông báo khi kết nối WebSocket được mở.
  • on_close(ws, status, message): In ra thông báo khi kết nối WebSocket đóng.

6.2. Hàm round_decimals_upmin_LOT_SIZE

  • round_decimals_up(number, decimals): Làm tròn số lên với số chữ số thập phân xác định.
  • min_LOT_SIZE(symbol, quantity): Lấy bước khối lượng tối thiểu cho từng cặp giao dịch, đảm bảo lệnh hợp lệ với sàn.

6.3. Hàm on_message

  • Nhận dữ liệu nến mới từ WebSocket.
  • Khi nến đóng, cập nhật dữ liệu, tính toán EMA, MACD, ATR.
  • Kiểm tra tín hiệu giao cắt MACD và xu hướng EMA để xác định vào lệnh LONG/SHORT.
  • Đặt lệnh margin và lệnh OCO (TP/SL) tương ứng.
  • Dời Stop Loss động theo ATR nếu giá đi đúng hướng.
  • Kiểm tra trạng thái lệnh, tự động trả nợ khi đóng lệnh SHORT.
  • Ghi log giao dịch lên Google Sheets.

6.4. Các hàm liên quan đến Binance API

  • client.klines: Lấy dữ liệu nến lịch sử.
  • client.new_margin_order: Đặt lệnh margin (BUY/SELL).
  • client.new_margin_oco_order: Đặt lệnh OCO (TP/SL).
  • client.margin_borrow: Vay coin để SHORT.
  • client.margin_repay: Trả nợ coin khi đóng lệnh SHORT.
  • client.cancel_margin_oco_order: Hủy lệnh OCO cũ khi dời SL.
  • client.margin_order: Kiểm tra trạng thái lệnh TP/SL.

6.5. Ghi log Google Sheets

  • gsheets_append_trade: Ghi thông tin giao dịch lên Google Sheets để theo dõi lịch sử.

7. Best Practices & Lưu ý khi vận hành bot

  • Bảo mật API: Không commit file API lên Git, dùng biến môi trường.
  • Quản lý vốn: Chỉ giao dịch với số vốn nhỏ, kiểm soát rủi ro.
  • Kiểm tra kỹ thuật: Test kỹ trên tài khoản demo trước khi chạy thật.
  • Xử lý lỗi mạng/API: Bổ sung try/except, log lỗi để bot không dừng đột ngột.
  • Theo dõi log: Luôn kiểm tra log giao dịch để phát hiện bất thường.
  • Cập nhật thư viện: Đảm bảo các thư viện luôn ở phiên bản ổn định.

8. Kết luận

Bot này là ví dụ thực tế về tự động hóa giao dịch margin với Python, Binance API và các chỉ báo kỹ thuật. Bạn có thể mở rộng thêm các chiến lược, quản lý vốn, hoặc tích hợp thêm cảnh báo Telegram, Discord...


Lưu ý:

  • Đoạn mã chỉ mang tính chất tham khảo, không phải lời khuyên đầu tư.
  • Hãy kiểm tra kỹ và thử nghiệm trên tài khoản demo trước khi áp dụng thực tế.

Nếu bạn cần giải thích chi tiết hơn hoặc muốn mở rộng thêm chức năng nào, hãy để lại bình luận nhé!