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:

Giá trị
Tên lệnh
Mô tả

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ố:

Tham số
Kiểu dữ liệu
Bắt buộc
Mô tả

ticker

str

Mã chứng khoán cần đặt lệnh (ví dụ: 'SSI').

side

str

Loại giao dịch: 'buy' (mua, long) hoặc 'sell' (bán, short).

order_type

str

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

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:

Tên thuộc tính
Kiểu dữ liệu
Mô tả

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ố:

Tham số
Kiểu dữ liệu
Bắt buộc
Mô tả

ticker

str

Mã phái sinh cần đặt lệnh (ví dụ: '41I1FB000').

side

str

Loại giao dịch: 'buy' (mua, long) hoặc 'sell' (bán, short).

order_type

str

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

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:

Tên thuộc tính
Kiểu dữ liệu
Mô tả

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ố:

Tên tham số
Kiểu dữ liệu
Bắt buộc
Mô tả

order_id

int

Mã định danh của lệnh cần sửa đổi.

new_price

float

Giá mới muốn chỉnh sửa (chỉ áp dụng nếu là lệnh 'LO').

new_quantity

int

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ố:

Tên tham số
Kiểu dữ liệu
Bắt buộc
Mô tả

order_id

int

Mã định danh của lệnh cần sửa đổi.

new_price

float

Giá mới muốn chỉnh sửa (chỉ áp dụng nếu là lệnh 'LO').

new_quantity

int

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