Skip to content

Commit b4d00bf

Browse files
committed
2 parents 3106b50 + 351981e commit b4d00bf

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

src/project_x_py/order_manager.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,9 @@ def place_order(
410410
"customTag": custom_tag,
411411
"linkedOrderId": linked_order_id,
412412
}
413+
414+
# 🔍 DEBUG: Log order parameters to diagnose placement issues
415+
self.logger.debug(f"🔍 Order Placement Request: {payload}")
413416

414417
try:
415418
response = requests.post(
@@ -421,9 +424,14 @@ def place_order(
421424
self.project_x._handle_response_errors(response)
422425

423426
data = response.json()
427+
428+
# 🔍 DEBUG: Log the actual API response to diagnose issues
429+
self.logger.debug(f"🔍 Order API Response: {data}")
430+
424431
if not data.get("success", False):
425-
error_msg = data.get("errorMessage", "Unknown error")
432+
error_msg = data.get("errorMessage") or "Unknown error - no error message provided"
426433
self.logger.error(f"Order placement failed: {error_msg}")
434+
self.logger.error(f"🔍 Full response data: {data}")
427435
raise ProjectXOrderError(f"Order placement failed: {error_msg}")
428436

429437
result = OrderPlaceResponse(**data)
@@ -949,7 +957,20 @@ def search_open_orders(
949957
return []
950958

951959
orders = data.get("orders", [])
952-
return [Order(**order) for order in orders]
960+
# Filter to only include fields that Order model expects
961+
expected_fields = {
962+
'id', 'accountId', 'contractId', 'creationTimestamp', 'updateTimestamp',
963+
'status', 'type', 'side', 'size', 'fillVolume', 'limitPrice', 'stopPrice'
964+
}
965+
filtered_orders = []
966+
for order in orders:
967+
if isinstance(order, dict):
968+
# Only keep fields that Order model expects
969+
filtered_order = {k: v for k, v in order.items() if k in expected_fields}
970+
filtered_orders.append(Order(**filtered_order))
971+
else:
972+
filtered_orders.append(Order(**order))
973+
return filtered_orders
953974

954975
except requests.RequestException as e:
955976
self.logger.error(f"❌ Order search request failed: {e}")

src/project_x_py/orderbook.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,9 +1511,14 @@ def get_market_imbalance(self) -> dict[str, Any]:
15111511
# Calculate volume imbalance at top levels
15121512
top_bid_volume = bids.head(5).select(pl.col("volume").sum()).item()
15131513
top_ask_volume = asks.head(5).select(pl.col("volume").sum()).item()
1514+
1515+
# 🔍 DEBUG: Log orderbook data availability
1516+
self.logger.debug(f"🔍 Orderbook data: {len(bids)} bids, {len(asks)} asks")
1517+
self.logger.debug(f"🔍 Top volumes: bid={top_bid_volume}, ask={top_ask_volume}")
15141518

15151519
total_volume = top_bid_volume + top_ask_volume
15161520
if total_volume == 0:
1521+
self.logger.debug(f"🔍 Zero total volume - returning neutral (bids={len(bids)}, asks={len(asks)})")
15171522
return {
15181523
"imbalance_ratio": 0,
15191524
"direction": "neutral",
@@ -1532,10 +1537,15 @@ def get_market_imbalance(self) -> dict[str, Any]:
15321537
) / trade_flow["total_volume"]
15331538

15341539
# Determine direction and confidence
1535-
if imbalance_ratio > 0.3:
1540+
# 🧪 TEMPORARY: Lower thresholds for low-volatility debugging
1541+
# Normal: 0.3, Debug: 0.05 (much more sensitive)
1542+
bullish_threshold = 0.05 # Was 0.3
1543+
bearish_threshold = -0.05 # Was -0.3
1544+
1545+
if imbalance_ratio > bullish_threshold:
15361546
direction = "bullish"
15371547
confidence = "high" if trade_imbalance > 0.2 else "medium"
1538-
elif imbalance_ratio < -0.3:
1548+
elif imbalance_ratio < bearish_threshold:
15391549
direction = "bearish"
15401550
confidence = "high" if trade_imbalance < -0.2 else "medium"
15411551
else:

0 commit comments

Comments
 (0)