Skip to content

feat: Улучшить алгоритм автокурса - занимать позицию в диапазоне#71

Merged
dapi merged 4 commits intomasterfrom
feature/69-position-aware-autorate
Jan 20, 2026
Merged

feat: Улучшить алгоритм автокурса - занимать позицию в диапазоне#71
dapi merged 4 commits intomasterfrom
feature/69-position-aware-autorate

Conversation

@dapi
Copy link
Copy Markdown

@dapi dapi commented Dec 24, 2025

Summary

Решает проблему #69: текущий алгоритм автокурса при попытке занять позицию в диапазоне (например, 5-10) перепрыгивает все позиции выше, вместо того чтобы остаться внутри целевого диапазона.

Что сделано

  • Добавлен новый калькулятор PositionAware с паттерном Strategy
  • Реализованы use cases:
    • UC-1..UC-4: Базовая логика без перепрыгивания позиций выше
    • UC-6: Адаптивный GAP для плотных рейтингов
    • UC-8: Исключение своего обменника из расчёта
    • UC-9: Защита от манипуляторов с аномальными курсами
  • Обратная совместимость: по умолчанию используется Legacy калькулятор

Архитектура

AutorateCalculators::Base (абстрактный)
├── Legacy      - старое поведение (по умолчанию)
└── PositionAware - новое, с учётом позиций выше

Выбор калькулятора через поле calculator_type в ExchangeRate.

Конфигурация

Gera.configure do |config|
  config.our_exchanger_id = 999           # ID обменника для исключения
  config.anomaly_threshold_percent = 50.0 # порог аномалий
end

Миграция

# Включить новый алгоритм для направления
exchange_rate.update!(calculator_type: 'position_aware')

Test plan

  • Все существующие тесты проходят
  • Добавлены unit-тесты для Legacy калькулятора
  • Добавлены unit-тесты для PositionAware калькулятора (UC-1..UC-9)
  • Протестировать на staging с реальными данными BestChange

Closes #69

🤖 Generated with Claude Code

when 'position_aware'
AutorateCalculators::PositionAware
else
AutorateCalculators::Legacy
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

otherwise - raise error

# @param [Float] Порог аномальной комиссии для защиты от манипуляторов (UC-9)
# Если комиссия отличается от медианы более чем на этот процент - считается аномальной
mattr_accessor :anomaly_threshold_percent
@@anomaly_threshold_percent = 50.0
Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добавь в README пример как пользоваться этой конфигурацией

Copy link
Copy Markdown
Author

@dapi dapi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

aded moments

@dapi dapi changed the base branch from legacy to master December 25, 2025 08:19
dapi and others added 3 commits December 25, 2025 11:21
Добавлен новый калькулятор PositionAware, который гарантирует,
что обменник займёт позицию внутри целевого диапазона, а не перепрыгнет выше.

Реализованные use cases:
- UC-1..UC-4: Базовая логика без перепрыгивания позиций выше
- UC-6: Адаптивный GAP для плотных рейтингов
- UC-8: Исключение своего обменника из расчёта (Gera.our_exchanger_id)
- UC-9: Защита от манипуляторов с аномальными курсами

Архитектура:
- Паттерн Strategy: Legacy (старое поведение) и PositionAware (новое)
- Выбор калькулятора через поле calculator_type в ExchangeRate
- Обратная совместимость: по умолчанию используется Legacy

Конфигурация:
- Gera.our_exchanger_id - ID обменника для исключения из расчёта
- Gera.anomaly_threshold_percent - порог аномалий (по умолчанию 50%)

Closes #69

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
… README

- В autorate_calculator_class бросаем ArgumentError для неизвестных типов
- Добавлена документация по конфигурации автокурса в README

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@dapi
Copy link
Copy Markdown
Author

dapi commented Jan 20, 2026

⚠️ Конфликт слияния

Этот PR имеет конфликт с master после влития PR #81 (Use Manul for external rates).

Причина: Калькуляторы используют старый формат данных BestChange, а master теперь использует Manul API.

ТЗ и план решения: #89

dapi added a commit that referenced this pull request Jan 20, 2026
Adapts PR #71 (position-aware autorate) for current master:
- Add AutorateCalculators::Legacy and PositionAware with Strategy pattern
- Use Manul API instead of BestChange::Service for external rates
- Use ActiveJob (perform_later) instead of Sidekiq (perform_async)
- Add calculator_type column to exchange_rates for selecting algorithm
- Add our_exchanger_id and anomaly_threshold_percent config options

The PositionAware calculator prevents "jumping over" positions above
the target range, with adaptive GAP and anomaly protection.

Closes #69

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Улучшить алгоритм автокурса: занимать позицию в диапазоне, а не перепрыгивать всех

1 participant