7.7. Lệnh
Mô tả cách sử dụng thư viện sau khi người dùng đã đăng nhập. Chi tiết được nêu ra ở cuối chương này.
Được sử dụng cho các hàm đặt lệnh, xem chi tiết lệnh, sửa lệnh, hủy lệnh, danh sách lệnh.
Mô tả các loại lệnh:
LO
Limit Order (Lệnh giới hạn)
Lệnh mua/bán tại mức giá cụ thể hoặc tốt hơn. Hết ngày không khớp sẽ bị hủy.
MP
Market Order (Lệnh thị trường)
Lệnh mua/bán ngay tại giá thị trường tốt nhất hiện có.
MTL
Market To Limit
Lệnh thị trường nhưng nếu không khớp hết, phần còn lại chuyển thành lệnh giới hạn tại giá khớp cuối cùng.
ATO
At The Open
Lệnh mua/bán tại mức giá mở cửa; chỉ có hiệu lực trong phiên khớp lệnh định kỳ mở cửa.
ATC
At The Close
Lệnh mua/bán tại mức giá đóng cửa; chỉ có hiệu lực trong phiên khớp lệnh định kỳ đóng cửa.
MOK
Match Or Kill
Lệnh thị trường, phải khớp toàn bộ ngay lập tức, nếu không khớp hết thì bị hủy toàn bộ.
MAK
Match And Kill
Lệnh thị trường, khớp phần nào được phần đó, phần còn lại bị hủy.
PLO
Post Limit Order
Lệnh giới hạn được đặt sau phiên ATC, chỉ được khớp nếu có lệnh đối ứng trong sổ lệnh. Áp dụng cho phiên sau giờ (PLO).
7.7.1. Đặt lệnh
Cơ sở
username_dnse = 'REPLACE_WITH_YOUR_DNSE_USERNAME'
password_dnse = 'REPLACE_WITH_YOUR_DNSE_PASSWORD'
client_order = client.FiinQuantConnector(
broker='DNSE',
username=username_dnse,
password=password_dnse,
smart_otp=True
).login()
orderbook = client_order.get_orderbook(
account_id='0001009212',
loan_id='13720'
)
order = orderbook.place_order(
ticker='HPG',
side='buy',
order_type='LO',
quantity=1000,
price=27000
)
print(order.summary())Tham số:
ticker
str
Có
Mã chứng khoán cần đặt lệnh (ví dụ: 'SSI').
side
str
Có
Loại giao dịch: 'buy' (mua, long) hoặc 'sell' (bán, short).
order_type
str
Có
Loại lệnh đặt: 'LO', 'MP', 'MTL', 'ATO', 'ATC', 'MOK', 'MAK', 'PLO'. Phái sinh sẽ không có PLO và MP.
quantity
int
Có
Khối lượng đặt lệnh.
price
float
Không
Giá đặt lệnh (chỉ bắt buộc khi order_type='LO').
Mẫu kết quả trả ra là một dictionary chứa các thông tin sau:
{
'id': 131,
'ticker': 'HPG',
'side': 'Buy',
'order_type': 'LO',
'price': 27000.0,
'quantity': 1000,
'filled': 0,
'avg_price': 0.0,
'modified': '29/10/2025 10:57:02',
'created': '29/10/2025 10:57:02',
'status': 'Pending',
'error': None,
'status_code': 200
}Dữ liệu có các thuộc tính:
id
str
Mã định danh của lệnh đặt.
side
str
Hướng giao dịch: NB = Mua, NS = Bán.
ticker
str
Mã chứng khoán/phái sinh.
price
float
Giá đặt lệnh.
quantity
int
Khối lượng đặt lệnh.
order_type
str
Loại lệnh (ví dụ: LO, MP, ATC, ...).
status
str
Trạng thái lệnh (new, filled, canceled, ...).
filled
int
Tổng khối lượng đã khớp.
avg_price
float
Giá khớp trung bình của lệnh.
error
str hoặc None
Thông tin lỗi (nếu có).
created
datetime
Thời điểm tạo lệnh.
modified
datetime
Thời điểm sửa đổi hoặc cập nhật lệnh.
status_code
int
Mã code, nếu thành công là 200
Phái sinh
username_dnse = 'REPLACE_WITH_YOUR_DNSE_USERNAME'
password_dnse = 'REPLACE_WITH_YOUR_DNSE_PASSWORD'
client_order = client.FiinQuantConnector(
broker='DNSE',
username=username_dnse,
password=password_dnse,
smart_otp=True
).login()
orderbook_der = client_order.get_derivative_orderbook(
account_id='0001009212',
loan_id='2278'
)
derivative_order = orderbook_der.place_order(
ticker='41I1FB000',
side='buy',
order_type='MTL',
quantity=10
)
print(derivative_order.summary())Tham số:
ticker
str
Có
Mã phái sinh cần đặt lệnh (ví dụ: '41I1FB000').
side
str
Có
Loại giao dịch: 'buy' (mua, long) hoặc 'sell' (bán, short).
order_type
str
Có
Loại lệnh đặt: 'LO', 'MP', 'MTL', 'ATO', 'ATC', 'MOK', 'MAK', 'PLO'. Phái sinh sẽ không có PLO và MP.
quantity
int
Có
Khối lượng đặt lệnh.
price
float
Không
Giá đặt lệnh (chỉ bắt buộc khi order_type='LO').
take_profit_rate
float
Không (mặc định = 0.0)
Tỷ lệ chốt lời (%), tính trên giá vốn. Khi giá tăng đến mức tương ứng, hệ thống sẽ đặt lệnh chốt lời.
Yêu cầu nếu có: x>0
stop_loss_rate
float
Không (mặc định = 0.0)
Tỷ lệ cắt lỗ (%), tính trên giá vốn. Khi giá giảm đến mức tương ứng, hệ thống sẽ đặt lệnh cắt lỗ.
Yêu cầu nếu có: -1<=x<0
take_profit_delta_price
float
Không (mặc định bằng 0.0)
Khoảng chênh lệch giá tuyệt đối (theo điểm giá) dùng để xác định mức chốt lời. Ưu tiên sử dụng nếu không dùng take_profit_rate.
Yêu cầu nếu có: x>0
stop_loss_delta_price
float
Không (mặc định bằng 0.0)
Khoảng chênh lệch giá tuyệt đối (theo điểm giá) dùng để xác định mức cắt lỗ. Ưu tiên sử dụng nếu không dùng stop_loss_rate.
Yêu cầu nếu có: x>0
take_profit_order_delta_price
float
Không (mặc định bằng 0.0)
Khoảng điểm tuỳ chỉnh của giá đặt so với giá kích hoạt, có thể âm hoặc dương.
stop_loss_order_delta_price
float
Không (mặc định bằng 0.0)
Khoảng điểm tuỳ chỉnh của giá đặt so với giá kích hoạt, có thể âm hoặc dương.
Mẫu kết quả trả ra là một dictionary chứa các thông tin sau:
{
'id': 132,
'ticker': '41I1FB000',
'side': 'Buy',
'order_type': 'MTL',
'price': 27000.0,
'quantity': 10,
'filled': 0,
'avg_price': 0.0,
'modified': '29/10/2025 10:57:02',
'created': '29/10/2025 10:57:02',
'status': 'Pending',
'error': None,
'status_code': 200
}Dữ liệu có các thuộc tính:
id
str
Mã định danh của lệnh đặt.
side
str
Hướng giao dịch: NB = Mua, NS = Bán.
ticker
str
Mã chứng khoán/phái sinh.
price
float
Giá đặt lệnh.
quantity
int
Khối lượng đặt lệnh.
order_type
str
Loại lệnh (ví dụ: LO, MP, ATC, ...).
status
str
Trạng thái lệnh (new, filled, canceled, ...).
filled
int
Tổng khối lượng đã khớp.
avg_price
float
Giá khớp trung bình của lệnh.
error
str hoặc None
Thông tin lỗi (nếu có).
created
datetime
Thời điểm tạo lệnh.
modified
datetime
Thời điểm sửa đổi hoặc cập nhật lệnh.
status_code
int
Mã code, nếu thành công là 200
7.7.2. Chi tiết lệnh
Cơ sở
username_dnse = 'REPLACE_WITH_YOUR_DNSE_USERNAME'
password_dnse = 'REPLACE_WITH_YOUR_DNSE_PASSWORD'
client_order = client.FiinQuantConnector(
broker='DNSE',
username=username_dnse,
password=password_dnse,
smart_otp=True
).login()
orderbook = client_order.get_orderbook(
account_id='0001009212',
loan_id='13720'
)
order_detail = orderbook.get_order_detail(order_id=161)
print(order_detail.summary())Mẫu kết quả trả ra là một dictionary chứa các thông tin sau:
{
'id': 161,
'ticker': 'HPG',
'side': 'Buy',
'order_type': 'LO',
'price': 27000.0,
'quantity': 1000,
'filled': 0,
'avg_price': 0.0,
'modified': '29/10/2025 11:14:12',
'created': '29/10/2025 11:14:12',
'status': 'New',
'error': '',
'status_code': 200
}Phái sinh
username_dnse = 'REPLACE_WITH_YOUR_DNSE_USERNAME'
password_dnse = 'REPLACE_WITH_YOUR_DNSE_PASSWORD'
client_order = client.FiinQuantConnector(
broker='DNSE',
username=username_dnse,
password=password_dnse,
smart_otp=True
).login()
orderbook_der = client_order.get_derivative_orderbook(
account_id='0001009212',
loan_id='2278'
)
order_detail_der = orderbook_der.get_order_detail(order_id=86)
print(order_detail_der.summary())Mẫu kết quả trả ra là một dictionary chứa các thông tin sau:
{
'id': 86,
'ticker': '41I1FB000',
'side': 'Buy',
'order_type': 'MTL',
'price': 0.0,
'quantity': 10,
'filled': 0,
'avg_price': 0.0,
'modified': '29/10/2025 11:18:45',
'created': '29/10/2025 11:18:45',
'status': 'Canceled',
'error': None,
'status_code': 200
}7.7.3. Sửa lệnh (Chỉ sửa được với lệnh đặt là LO)
Cơ sở
username_dnse = 'REPLACE_WITH_YOUR_DNSE_USERNAME'
password_dnse = 'REPLACE_WITH_YOUR_DNSE_PASSWORD'
client_order = client.FiinQuantConnector(
broker='DNSE',
username=username_dnse,
password=password_dnse,
smart_otp=True
).login()
orderbook = client_order.get_orderbook(
account_id='0001009212',
loan_id='13720'
)
modify_order = orderbook.modify_order(
order_id=191,
new_price = 26900,
new_quantity=1000
)
print(modify_order.summary())Tham số:
order_id
int
Có
Mã định danh của lệnh cần sửa đổi.
new_price
float
Có
Giá mới muốn chỉnh sửa (chỉ áp dụng nếu là lệnh 'LO').
new_quantity
int
Có
Khối lượng mới muốn sửa của lệnh (chỉ áp dụng nếu là lệnh 'LO').
Mẫu kết quả trả ra là một dictionary chứa các thông tin sau:
{
'id': 191,
'ticker': 'HPG',
'side': 'Buy',
'order_type': 'LO',
'price': 26900.0,
'quantity': 1000,
'filled': 0,
'avg_price': 0.0,
'modified': '29/10/2025 11:23:54',
'created': '29/10/2025 11:23:54',
'status': 'Pending',
'error': None,
'status_code': 200
}Phái sinh
username_dnse = 'REPLACE_WITH_YOUR_DNSE_USERNAME'
password_dnse = 'REPLACE_WITH_YOUR_DNSE_PASSWORD'
client_order = client.FiinQuantConnector(
broker='DNSE',
username=username_dnse,
password=password_dnse,
smart_otp=True
).login()
orderbook_der = client_order.get_derivative_orderbook(
account_id='0001009212',
loan_id='2278'
)
derivative_modify = orderbook_der.modify_order(
order_id=91,
new_price=1945,
new_quantity=5
)
print(derivative_modify.summary())Tham số:
order_id
int
Có
Mã định danh của lệnh cần sửa đổi.
new_price
float
Có
Giá mới muốn chỉnh sửa (chỉ áp dụng nếu là lệnh 'LO').
new_quantity
int
Có
Khối lượng mới muốn sửa của lệnh (chỉ áp dụng nếu là lệnh 'LO').
Ví dụ 1 hàm bị lỗi:
Lỗi đặt lệnh hoặc sửa lệnh LO với mức giá đặt mua, bán lớn hơn mức giá trần
{
'id': None,
'ticker': None,
'side': 'Unknown',
'order_type': None,
'price': 0.0,
'quantity': 0,
'filled': 0,
'avg_price': 0.0,
'modified': None,
'created': None,
'status': None,
'error': '{
"status":400,
"code":"PRICE_MUST_LESS_THAN_OR_EQUAL_TO_CEILING_PRICE",
"message":"Price must be less than or equal to ceiling price"
}',
'status_code': 400
}7.7.4. Hủy lệnh
Cơ sở
username_dnse = 'REPLACE_WITH_YOUR_DNSE_USERNAME'
password_dnse = 'REPLACE_WITH_YOUR_DNSE_PASSWORD'
client_order = client.FiinQuantConnector(
broker='DNSE',
username=username_dnse,
password=password_dnse,
smart_otp=True
).login()
orderbook = client_order.get_orderbook(
account_id='0001009212',
loan_id='13720'
)
cancel_order = orderbook.cancel_order(order_id=661)
print(cancel_order.summary())Mẫu kết quả trả ra là một dictionary chứa các thông tin sau:
{
'id': 661,
'ticker': 'SSI',
'side': 'Buy',
'order_type': 'LO',
'price': 36500.0,
'quantity': 500,
'filled': 0,
'avg_price': 0.0,
'modified': '29/10/2025 13:57:17',
'created': '29/10/2025 13:57:17',
'status': 'PendingCancel',
'error': None,
'status_code': 200
}Phái sinh
username_dnse = 'REPLACE_WITH_YOUR_DNSE_USERNAME'
password_dnse = 'REPLACE_WITH_YOUR_DNSE_PASSWORD'
client_order = client.FiinQuantConnector(
broker='DNSE',
username=username_dnse,
password=password_dnse,
smart_otp=True
).login()
orderbook_der = client_order.get_derivative_orderbook(
account_id='0001009212',
loan_id='2278'
)
cancel_order_derivative = orderbook_der.cancel_order(order_id=91)
print(cancel_order_derivative.summary())Last updated