Платформа на FastAPI с модульным backend, тёмным профессиональным frontend и подготовленными API-контрактами для live-сигналов, news alert и будущей интеграции с MT4.
CanonicalMarketService и интерфейс RealMarketDataProvider для всех рыночных endpoint: GET /price/{symbol}, GET /market, GET /chart/{symbol}/{tf}, а также GET /api/price/{symbol}, GET /api/market, GET /api/canonical/chart/{symbol}/{tf}.TwelveDataProvider; YahooProvider сохранён только как optional historical fallback для свечей (статус delayed) и больше не используется как live пользовательская цена.data_status (real | unavailable | delayed), source, source_symbol, last_updated_utc, is_live_market_data.unavailable и frontend показывает warning по live-ценам./api/market (без выдуманных значений).GET/HEAD / и GET/HEAD /health стабилизированы для Render health-check, /ideas/market больше не запускает fanout на весь DEFAULT_PAIRS, а live-сигналы и market-candles получили TTL-кэш/деградацию без synthetic чисел.current_price и унифицированным timeframe.backend/chat_service.py и endpoint POST /api/chat с безопасным forex-only prompt, без API-ключей на frontend.backend/sentiment_provider.py, модель SentimentSnapshot, safe mock/external provider схема и интеграция sentiment в analytics response и signal engine как подтверждающий фактор.idea_id, хранятся в JSON storage, не исчезают между обновлениями и обновляются по тем же symbol + timeframe + setup_type, пока жизненный цикл активен./api/ideas теперь сначала берёт реальные свечи через ChartDataService (тот же источник, что и GET /api/chart/{symbol}?tf={timeframe}), вычисляет latest_close, передаёт в AI последние 40 свечей и валидирует entry/stopLoss/takeProfit по deviation-лимитам M15 0.3% / H1 0.5% / H4 1.0%; при ошибке AI автоматически включается market-aligned fallback с levels_source, levels_validated, entry_deviation_pct и meta./ideas.data_status=unavailable возвращается нейтральное объяснение без выдуманных рыночных данных./ideas/market остаётся обратносуместимым для текущего UI: старые поля сохранены, но дополнительно всегда возвращаются idea_id, symbol, timeframe, status, sentiment, version, change_summary./ideas теперь сохраняет прежний layout, но разделяет short scenario в списке и desk-style full card в modal detail-view: краткая карточка остаётся компактной, а полная показывает detail_brief, сценарии, аналитические секции и итоговый trading plan.result, entry_price, exit_price, pnl_percent, rr, duration, а в GET /ideas/market возвращается агрегированный блок statistics (total_trades, wins, losses, winrate, avg_rr, avg_pnl, max_win, max_loss)./api/ideas: при наличии исторических свечей теперь всегда публикуется минимум один сценарий на symbol/timeframe (включая fallback range/developing), убраны жёсткие блокировки по live snapshot/current_price, а debug-логирование дополнено этапами candles_count / features_built / signal_created / reason_if_skipped.CREATED → WAITING → TRIGGERED → ACTIVE → TP_HIT / SL_HIT → ARCHIVED, а обновления теперь пишутся в updates[] с timestamp/event/explanation и не создают новые карточки, если совпадает symbol + timeframe.smc, ict, pattern, harmonic_pattern, volume, cum_delta, divergence, fundamental) и weighted scoring decision model с полем decision.weighted_score и причинно-следственным current_reasoning.app/services/idea_narrative_llm.py: backend отправляет в OpenRouter только факты анализа (symbol/timeframe/direction/status/entry/SL/TP/RR + SMC/ICT/pattern/volume/delta/divergence/fundamental + delta изменений), валидирует строгий JSON-ответ, делает один retry при невалидном формате и включает детерминированный fallback только как аварийный режим (narrative_source: llm|fallback).backend/pattern_detector.py и backend/pattern_visualization.py.Double Top/Bottom, Head and Shoulders, Inverse Head and Shoulders, Triangle, Wedge, Flag) теперь определяются по OHLCV-свечам как дополнительный подтверждающий фактор, а не как замена текущего signal scoring.chartPatterns, patternSummary, patternSignalImpact, а в analytics feature layer добавлен patternFeatures и отдельная pattern-компонента composite score.Актуальные сигналы и Архив сигналов.SignalStatus, SignalStats, ChartAnnotation, LiquidityZone, OrderBlockZone и группировка activeSignals/archiveSignals.successRate / failureRate.Подробнее, адаптивную компоновку и расширенный detail-view.data/analytics слой для сигналов: adapters/connectors, normalization models, feature extraction, fundamental scoring и composite signal scoring.tick data, bid/ask quotes, futures data, open interest, options chain, news feed, economic calendar подготовлены отдельные коннекторы, типы и runtime-статусы источников.GET /api/analytics/capabilities и GET /api/analytics/signals/{symbol}./ideas, /news, /calendar и /heatmap/page сохранены и продолжают работать через прежние маршруты.active/open/closed), уникальное описание, вероятность и прогресс до TP/SL.M15 до W1 и расширенный набор major/cross пар: EURUSD, GBPUSD, USDJPY, USDCHF, AUDUSD, USDCAD, EURGBP, EURJPY, GBPJPY, EURCHF.Основные backend-модули:
backend/data_provider.pybackend/feature_builder.pybackend/signal_engine.pybackend/risk_engine.pybackend/portfolio_engine.pybackend/news_provider.pyapp/services/signal_hub.pyapp/services/news_service.pyapp/services/mt4_bridge.pyGET /healthGET /api/healthGET /signals/liveGET /ideas/marketGET /news/marketGET /calendar/eventsGET /heatmapGET /api/signalsGET /api/signals/activeGET /api/signals/{id} — поддерживает и lookup по signal_id, и обратную совместимость для symbol lookupGET /api/signals/{id}/newsPOST /api/signalsPATCH /api/signals/{id}/statusGET /api/signals/lookup/{symbol}GET /api/legacy/signals/{symbol}GET /api/newsGET /api/news/relevantGET /api/news/{id}POST /api/news/webhookPOST /api/news/ingestGET /api/mt4/signals — read-only polling контракт для будущего советникаPOST /api/mt4/export — подготовка export payload для MT4/bridge слояGET /api/analytics/capabilities — показывает, какие наборы данных уже работают и какие пока заглушкиGET /api/analytics/signals/{symbol} — отдаёт нормализованный analytics bundle, вычисленные признаки, данные по графическим паттернам, sentiment, compositeScoreBreakdown, sentimentImpact, fundamental score и composite signal scorePOST /api/chat — backend-only forex assistant. Ответ имеет контракт:{
"reply": "...",
"source": "openai",
"dataStatus": "live|fallback",
"warnings": []
}
Если OpenAI недоступен или выключен, сервер честно возвращает fallback-ответ без выдуманных market data.
Сигнал теперь поддерживает:
id/signal_idinstrument/symbolstatus (active, hit, missed, cancelled, expired)status_label_rudirectionsignalDateTimeside/actionentrystopLoss/stop_losstakeProfit/take_profittakeProfitssignalTimestatedescriptionprobabilityprogressToTPprogressToSLchartDataannotationszoneslevelsliquidityAreasprojectedCandlesrelatedNewschartPatternspatternSummarypatternSignalImpactsentimentidea_idcreatedAt/created_at_utcupdatedAt/updated_at_utcКаждая идея теперь имеет устойчивую идентичность и lifecycle:
idea_idsymboltimeframesetup_typestatus (created, waiting, triggered, active, tp_hit, sl_hit, archived)biasconfidenceentry_zonestop_losstake_profitsentimentrationalecreated_atupdated_atversionchange_summaryupdates[] (timestamp, event_type, explanation)current_reasoningdecision (weighted scoring + факторы confluence)entry_explanation_ru / stop_explanation_ru / target_explanation_rushort_scenario_ru / short_text — сверхкраткий сценарий для карточки спискаheadline / summary / full_text / update_explanation / narrative_source — структурированный narrative-слой от LLM с сохранением обратной совместимости APIdetail_brief.header — market price / daily change / bias / confidence / confluencedetail_brief.scenarios — primary / swing / invalidationdetail_brief.sections[] — секции (smc_ict, chart_patterns, harmonic, waves, fundamental, wyckoff, volume_profile, divergences, cumdelta, sentiment, liquidity) только при реально доступных данныхdetail_brief.trade_plan — entry / stop / take profits / R:R / primary / alternative scenarioresult (win / loss / breakeven)entry_priceexit_pricepnl_percentrrdurationВажно:
symbol и timeframe, пока lifecycle активен;idea_id;symbol и timeframe всегда остаются в ответе API;Ответ GET /api/signals дополнительно содержит:
stats.totalstats.activestats.hitstats.missedstats.cancelledstats.expiredstats.successRatestats.failureRateactiveSignalsarchiveSignalsНовость нормализуется в контракт с полями:
idtitledescriptioninstrumentrelatedInstrumentscurrencyimpacteventTimepublishedAt/published_atstatussourceisRelevantToSignalrelatedSignalIdssoundPlayedcreatedAtupdatedAtСистема подготовлена для следующих источников:
Если внешние данные недоступны, платформа:
data_status=unavailable;M15, M30, H1, H4, D1, W1.HTF → MTF → LTF, чтобы не ограничиваться только H1.EURUSD, GBPUSD, USDJPY, USDCHF, AUDUSD, USDCAD, EURGBP, EURJPY, GBPJPY, EURCHF.pip install -r requirements.txt
uvicorn app.main:app --host 0.0.0.0 --port 8000
# либо совместимый entrypoint для деплоя
uvicorn main:app --host 0.0.0.0 --port 8000
uvicorn app.main:app --host 0.0.0.0 --port $PORT
# либо если платформа запускает корневой модуль
uvicorn main:app --host 0.0.0.0 --port $PORT
/news продолжает работать как отдельная страница.Эндпоинты GET /api/mt4/signals и POST /api/mt4/export подготавливают инфраструктуру для будущего советника MT4:
magicNumber, riskPercent, brokerSymbol, timeframe, comment;label=proxy.Архитектура разбита на отдельные модули:
app/schemas/analytics.py — внутренние нормализованные модели, feature/result контракты и composite/fundamental score типы.app/services/analytics/providers.py — provider interfaces, mock providers для market microstructure/derivatives и RSS/stub providers для news/calendar.app/services/analytics/connectors.py — adapters/connectors по типам данных.app/services/analytics/normalizer.py — normalization layer в единые внутренние модели.app/services/analytics/features.py — feature extraction layer.app/services/analytics/fundamental.py — scoring layer для news relevance / impact / direction / time decay.app/services/analytics/composite.py — composite score из technical/orderflow/derivatives/fundamental.app/services/analytics/service.py — orchestration service и API-ready output.spreadorder book imbalancedelta / cumulative deltafutures/spot basisOI changeput/call OI ratioput/call volume ratioIV skewnews impact scoremacro event impact scorepattern score + patternFeaturessentiment как supplementary contrarian layerbackend.signal_engine для technical component composite score.~0.10–0.15, который только усиливает или ослабляет confidence, но не создаёт сигнал сам по себе.mock, чтобы безопасно разрабатывать контракт и downstream-логику.stub до подключения проверенного live source.mock providers, а не как реальные биржевые feed-коннекторы.unavailable..env, без хранения реальных секретов в репозитории.OPENROUTER_API_KEY=
OPENROUTER_MODEL=deepseek/deepseek-chat
OPENROUTER_TIMEOUT=30
CHAT_ENABLED=true
SENTIMENT_PROVIDER=mock
OANDA_SENTIMENT_BASE_URL=
OANDA_SENTIMENT_API_KEY=
SENTIMENT_WEIGHT=0.12
TWELVEDATA_API_KEY=
TWELVEDATA_TIMEOUT=4
TWELVEDATA_OUTPUTSIZE=50
long >= 65% → contrarian bearishshort >= 65% → contrarian bullishextreme >= 70%sentimentcompositeScoreBreakdown.sentimentsentimentImpactunavailable/mock без выдумывания данных.invalidated, а при новом lifecycle создаётся новая запись./ideas оставлен компактным, а depth анализа перенесён в modal full card.