From 1dead3e6febcac05e0b55887dff0a0bb10d21a54 Mon Sep 17 00:00:00 2001 From: ward-taoshi <236940013+ward-taoshi@users.noreply.github.com> Date: Thu, 5 Mar 2026 12:43:32 -0500 Subject: [PATCH] round forex lot sizes to 0.01 --- .../utils/limit_order/market_order_manager.py | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/vali_objects/utils/limit_order/market_order_manager.py b/vali_objects/utils/limit_order/market_order_manager.py index 04b2369e0..19ce35fbd 100644 --- a/vali_objects/utils/limit_order/market_order_manager.py +++ b/vali_objects/utils/limit_order/market_order_manager.py @@ -2,6 +2,7 @@ Modularize the logic that was originally in validator.py. No IPC communication here. """ +import math import time import uuid import threading @@ -290,7 +291,7 @@ def _add_order_to_existing_position(self, existing_position: Position, trade_pai order_resized = True if order_resized: - order_sizes = self.parse_order_size({"value": order.value}, usd_base_price, trade_pair, existing_position.account_size) + order_sizes = self.parse_order_size({"value": order.value}, usd_base_price, trade_pair, existing_position.account_size, use_floor=True) order.quantity, order.leverage, order.value = order_sizes bt.logging.info(f"[ADD_ORDER_DETAIL] order resized to ${order.value} (max position: {max_position_value}, max_cash: {buying_power}") @@ -378,7 +379,7 @@ def enforce_order_cooldown(self, trade_pair_id, now_ms, miner_hotkey) -> str: return msg @staticmethod - def parse_order_size(signal, usd_base_conversion, trade_pair, portfolio_value): + def parse_order_size(signal, usd_base_conversion, trade_pair, portfolio_value, use_floor=False): """ parses an order signal and calculates leverage, value, and quantity """ @@ -390,16 +391,17 @@ def parse_order_size(signal, usd_base_conversion, trade_pair, portfolio_value): if sum(fields_set) != 1: raise ValueError("Exactly one of 'leverage', 'value', or 'quantity' must be set") - if quantity is not None: - value = quantity * trade_pair.lot_size / usd_base_conversion - leverage = value / portfolio_value - elif leverage is not None: - value = leverage * portfolio_value - quantity = (value * usd_base_conversion) / trade_pair.lot_size + if leverage is not None: + quantity = (leverage * portfolio_value * usd_base_conversion) / trade_pair.lot_size elif value is not None: - leverage = value / portfolio_value quantity = (value * usd_base_conversion) / trade_pair.lot_size + if trade_pair.is_forex: + quantity = math.trunc(quantity / 0.01) * 0.01 if use_floor else round(quantity / 0.01) * 0.01 + + value = quantity * trade_pair.lot_size / usd_base_conversion + leverage = value / portfolio_value + return quantity, leverage, value def process_flat_all_order(self, order_uuid, miner_repo_version, miner_hotkey, now_ms):