diff --git a/Dockerfile b/Dockerfile index a061939..4d188be 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,12 +11,15 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ wget \ curl \ + dpkg-dev \ && rm -rf /var/lib/apt/lists/* -# Install TA-Lib C library +# Install TA-Lib C library (with ARM64 support) RUN wget -q http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz \ && tar -xzf ta-lib-0.4.0-src.tar.gz \ && cd ta-lib \ + && wget -q -O config.guess 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD' \ + && wget -q -O config.sub 'https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD' \ && ./configure --prefix=/usr \ && make \ && make install \ diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 0000000..d848dfe --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,31 @@ +# Local development override - mounts source code for hot reload +x-engine-image: &engine-image + image: tf-engine:local + +x-ui-image: &ui-image + image: tf-ui:local + +services: + engine: + <<: *engine-image + volumes: + - /Users/bnair/Documents/Crypto/engine:/data/engine + - /Users/bnair/Documents/Crypto/shared:/data/shared + - /Users/bnair/Documents/TradeFinder/src:/app/src:ro + user: root + + ui: + <<: *ui-image + volumes: + - /Users/bnair/Documents/Crypto/engine:/data/engine # DuckDB needs write access for WAL + - /Users/bnair/Documents/Crypto/shared:/data/shared + - /Users/bnair/Documents/TradeFinder/src:/app/src:ro + user: root + + optimizer: + <<: *engine-image + user: root + + backtester: + <<: *engine-image + user: root diff --git a/pyproject.toml b/pyproject.toml index d63fc7e..9c5ff48 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,6 +58,9 @@ dependencies = [ "structlog>=24.1.0", "rich>=13.7.0", + # Redis + "redis>=5.0.0", + # HTTP client "httpx>=0.26.0", ] diff --git a/src/tradefinder/core/main.py b/src/tradefinder/core/main.py index 24593ec..676bb26 100644 --- a/src/tradefinder/core/main.py +++ b/src/tradefinder/core/main.py @@ -396,21 +396,18 @@ async def _determine_equity(settings: Settings, adapter: BinanceUSDMAdapter | No def _register_signal_handlers(shutdown_event: asyncio.Event) -> None: """Register signal handlers that trigger a graceful shutdown.""" - loop = asyncio.get_running_loop() def _handle(sig: signal.Signals) -> None: logger.info("Shutdown signal received", signal=sig.name) shutdown_event.set() - def _handle_signal(signum: int, frame: object) -> None: - shutdown_event.set() - for sig in (signal.SIGINT, signal.SIGTERM): try: loop.add_signal_handler(sig, partial(_handle, sig)) - except (NotImplementedError, RuntimeError): - signal.signal(sig, _handle_signal) + logger.debug("Registered async signal handler", signal=sig.name) + except (NotImplementedError, RuntimeError, OSError) as e: + logger.debug("Could not register async signal handler", signal=sig.name, error=str(e)) async def _sleep_or_cancel(delay: float, shutdown_event: asyncio.Event) -> None: @@ -431,3 +428,7 @@ async def _initialize_adapter(adapter: BinanceUSDMAdapter, symbols: list[str]) - await adapter.configure_hedge_mode(True) for symbol in symbols: await adapter.configure_margin_type(symbol, MarginType.ISOLATED) + + +if __name__ == "__main__": + main()