GRAPH ARBITRAGE — минимальный публикационный пакет
=================================================

Архив соответствует требованиям MQL5: корень MQL5, проектные файлы находятся
только в подпапках GraphArbitrage. Исполняемые .ex5 отсутствуют.

1. Экспорт шести M1-потоков
--------------------------
Скомпилируйте:
  MQL5/Scripts/GraphArbitrage/GRAPH_ARBITRAGE_EXPORT_M1.mq5

Укажите шесть реально доступных в терминале символов/потоков. По умолчанию
предполагаются EURGBP.pro/EURGBP, EURUSD.pro/EURUSD, GBPUSD.pro/GBPUSD.
CSV создаются в:
  MQL5/Files/GraphArbitrage/Data/

Экспортёр пишет POINT и DIGITS из SYMBOL_POINT/SYMBOL_DIGITS. Это исключает
универсальное угадывание точности символа при новом экспорте.

2. Установка Python
-------------------
Откройте терминал/консоль в:
  MQL5/Files/GraphArbitrage/Python

python -m venv .venv
Windows:
  .venv\Scripts\pip install -r requirements.txt
  set PYTHONPATH=src
Linux/macOS:
  .venv/bin/pip install -r requirements.txt
  export PYTHONPATH=src

3. Проверки
-----------
python -m graph_arbitrage self-test
python -m pytest -q
python -m graph_arbitrage audit-data --input ../Data

4. Бэктест
----------
python -m graph_arbitrage backtest --input ../Data --output ../Results --starting-capital-usd 100000 --commission-bps 1 --slippage-bps 1 --parity

Результаты создаются локально в MQL5/Files/GraphArbitrage/Results/:
- best_cycle_per_minute.csv
- equity_curve_usd.csv
- cost_sensitivity.csv
- summary.json
- четыре PNG отчёта

5. Технические контракты
------------------------
- outer join без forward fill;
- duplicate minutes запрещены;
- секунды не округляются молча;
- Ask = Close + Spread * Point и Ask >= Bid;
- float64 для rate/multiplier массивов;
- полностью invalid-минута не проходит через argmax как цикл 0;
- tie-break при одинаковом executable rate: pro;
- --parity сравнивает векторизованный и независимый построчный расчёт поминутно.

6. Ограничение точного воспроизведения опубликованных чисел
---------------------------------------------------------
В архив не включены готовые результаты и файлы самой статьи. Точные опубликованные
991 выбранная минута и 135 504,86 USD требуют тех же шести исходных M1-потоков,
на которых выполнялся исторический эксперимент. На истории другого брокера/сервера
числа закономерно будут отличаться. M1-данные сами по себе не доказывают тиковую
одновременность и live-исполнимость трёх ног.
