From 3367005f6d39519ef818b967c991a620d6989a68 Mon Sep 17 00:00:00 2001 From: Kyle Widmann Date: Tue, 18 Feb 2025 06:52:49 -0500 Subject: [PATCH 1/2] Updating stream to handle connection error --- .gitignore | 3 ++- oanda_client/oanda.py | 50 ++++++++++++++++++++++--------------------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 0a77a8d..47e20bc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .coverage .venv -**/__pycache__/* \ No newline at end of file +**/__pycache__/* +**/*.log \ No newline at end of file diff --git a/oanda_client/oanda.py b/oanda_client/oanda.py index 11b65e9..e9875e7 100644 --- a/oanda_client/oanda.py +++ b/oanda_client/oanda.py @@ -16,6 +16,7 @@ from pytrade.interfaces.account import IAccount from pytrade.interfaces.client import IClient from pytrade.models import Order +from pytrade.logging import get_logger from v20.account import Account from v20.instrument import Candlestick as v20Candlestick from v20.order import MarketOrderRequest # type: ignore @@ -71,6 +72,7 @@ def __init__(self, config_path: str = os.environ.get("V20_CONFIG", DEFAULT_PATH) dict() ) self._stream_tasks: list[asyncio.Task] = [] + self.logger = get_logger() @property def account(self) -> IAccount: @@ -248,30 +250,30 @@ async def _stream_candles( granularity: Granularity, callback: Callable[[Candlestick], None], ): - try: - interval = 60 * MINUTES_MAP[granularity] - previous_candle = None - candle = self.get_candle(instrument, granularity) - previous_candle = candle - initial_delay = (2 * interval) - ( - (datetime.now(timezone.utc) - candle.timestamp).seconds - ) - callback(candle) - await asyncio.sleep(initial_delay) - while True: + while True: + try: + interval = 60 * MINUTES_MAP[granularity] + previous_candle = None candle = self.get_candle(instrument, granularity) - - # Handle clase where we grab previous candle again - if candle.timestamp == previous_candle.timestamp: - await asyncio.sleep(1) - continue - previous_candle = candle + initial_delay = (2 * interval) - ( + (datetime.now(timezone.utc) - candle.timestamp).seconds + ) callback(candle) - await asyncio.sleep(interval) - - except asyncio.CancelledError: - pass - except Exception as err: - print(err) - sys.exit(1) + await asyncio.sleep(initial_delay) + while True: + candle = self.get_candle(instrument, granularity) + + # Handle clase where we grab previous candle again + if candle.timestamp == previous_candle.timestamp: + await asyncio.sleep(1) + continue + + previous_candle = candle + callback(candle) + await asyncio.sleep(interval) + + except asyncio.CancelledError: + pass + except Exception as err: + self.logger.error("Exception encountered streaming candles", exc_info=err) From 664494d9ded5489ace375aaac471d32e3f6e6e00 Mon Sep 17 00:00:00 2001 From: Kyle Widmann Date: Tue, 18 Feb 2025 06:55:24 -0500 Subject: [PATCH 2/2] lint fixes --- oanda_client/oanda.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/oanda_client/oanda.py b/oanda_client/oanda.py index e9875e7..8add8eb 100644 --- a/oanda_client/oanda.py +++ b/oanda_client/oanda.py @@ -1,6 +1,5 @@ import asyncio import os -import sys from abc import abstractmethod from datetime import datetime, timezone from typing import Callable, Tuple @@ -15,8 +14,8 @@ ) from pytrade.interfaces.account import IAccount from pytrade.interfaces.client import IClient -from pytrade.models import Order from pytrade.logging import get_logger +from pytrade.models import Order from v20.account import Account from v20.instrument import Candlestick as v20Candlestick from v20.order import MarketOrderRequest # type: ignore @@ -276,4 +275,6 @@ async def _stream_candles( except asyncio.CancelledError: pass except Exception as err: - self.logger.error("Exception encountered streaming candles", exc_info=err) + self.logger.error( + "Exception encountered streaming candles", exc_info=err + )