Помогите с задачей на Яндекс Контест

Осталось сделать последнюю задачу, но всё никак не выходит. Задание следующее:

Для простоты будем считать, что существует только один инструмент, которым вы торгуете(акции, облигации или шапки на рынке, сути не имеет).В каждый момент времени, у этого инструмента есть цена. Также, ограничимся лишь одной ценой, никаких других параметров не будет. Стратегии торговли соответственно могут либо покупать инструмент, либо продавать. Покупая, вы создаете позицию. Позиция характеризуется двумя параметрами: цена входа позиции(price), объем позиции(volume). Допустим, в данный момент времени цена актива 100. Вы покупаете этот актив по этой цене объемом 2.5. Таким образом, на эту позицию вы тратите 100 * 2.5 = 250 средств. В общем случае, если цена актива price, а объем вашей позиции volume, то на открытие позиции вы тратите price * volume средств. Также актив можно продавать. В этой задаче продажа актива, это по сути закрытие позиции. Закрыть можно только открытую позицию, причем полностью. Пример: цена актива была 100, размер позиции 2.5. Вы потратили 1002.5 = 250 средств. Когда цена стала 300, вы решили эту позицию закрыть. Закрывая позицию, вы получите 3002,5 = 750 средств. Итого, вы заработали 750 - 250 = 500 единиц. Однако, если цена стала не 300, а 20, то, закрывая позицию, вы получите 20 * 2.5 = 50 средств. Итого 250 - 50 = 200 единиц убытка.

Ваша задача -- придумать стратегию торговли. В тестирующей системе реализован класс:

class AccountInterface {
public:
 virtual double GetAvailBalance() const = 0;
 virtual int OpenPosition(double positionSize) = 0;
 virtual void ClosePosition(int positionId) = 0;
};
GetAvailBalance()-- возвращает текущий размер доступных средств
OpenPosition(double positionSize) - открывает позицию по текущей цене
объемом positionSize. Возвращает уникальный индекс позиции.
ClosePosition(int positionId) - закрывает позицию с указанными индексом.

Будет создан объект этого класса и передан вашей программе. Напишите абстрактный класс ModuleBase. Этот класс будет задавать интерфейс для любой торговой стратегии. У него должно быть два public метода:

void OnTick(double price); // Этот метод будет вызываться у вашей стратегии
всякий раз, когда приходит новая цена актива
void CloseAll(); // Этот метод будет вызываться у вашего актива, если
появится необходимость закрыть все позиции, которые открыла ваша стратегия

Для простоты сразу сделаем следующее ограничение: Вы знаете, что цена актива колеблется от 1 до 10, только в этом отрезке. Причем каждая новая котировка -- равновероятно берется именно из отрезка от 1 до 10. Актив изменяется исключительно по этим правилам. Исходя из этого предположения, напишите класс ModuleBorders. Этот класс будет наследником ModuleBase Конечно же, у него должно быть 2 public метода:

OnTick(double price);
CloseAll();

А также public конструктор:

ModuleBorders(AccountInterface* account);

Он принимает на вход объект аккаунта, а именно, указатель на него. Вашему модулю будет передан реализованный объект аккаунта, именно с помощью его методов вы сможете открывать / закрывать позиции, а также следить за текущим размером доступных средств. Как отмечалось в начале задачи, у вас несколько торговых стратегий. Так вот, для управления этими стратегиями, реализуйте класс ModulesRouter

class ModulesRouter {
public:
 void OnTick(double price);
 void AddModule(ModuleBase* ptr);
 void CloseAll();
};

Этот класс хранит указатели на объекты торговых стратегий ModuleBase*. Стратегий может быть несколько(одна ваша, а также со стороны теструющей системы)

OnTick(double price); // Этот метод будет вызываться всякий раз, когда
приходит новая котировка. Класс должен вызвать метод OnTick у всех модулей,
которых он хранит

    AddModule(ModuleBase* ptr); /// Этот метод позволяет добавить новый модуль
    в класс
    CloseAll(); // Этот метод должен вызвать метод CloseAll у всех модулей,
    которых ваш класс хранит

Критерии оценивания: Тестирующая система создаст объект наследник класса AccountInterface. В этом объекте будет реализована вся логика AccountInterface. Также она создаст объект ModulesRouter, несколько торговых модулей ModuleBase и передаст их в ModulesRouter.

Вот мой код, но его система не принимает( Помогите пожалуйста, товарищи!

class ModuleBase {
public:
    virtual void OnTick(double price) = 0;
    virtual void CloseAll() = 0;
};

class ModuleBorders : public ModuleBase {
public:
    ModuleBorders(AccountInterface* account) : account_(account), positionId_(-1) {}

    void OnTick(double price) override {
        if (positionId_ == -1 && price < 2) {
            positionId_ = account_->OpenPosition(account_->GetAvailBalance() / price);
        } else if (positionId_ != -1 && price > 8) {
            account_->ClosePosition(positionId_);
            positionId_ = -1;
        }
    }

    void CloseAll() override {
        if (positionId_ != -1) {
            account_->ClosePosition(positionId_);
            positionId_ = -1;
        }
    }

private:
    AccountInterface* account_;
    int positionId_;
};

class ModulesRouter {
public:
    void OnTick(double price) {
        for (auto& module : modules_) {
            module->OnTick(price);
        }
    }

    void AddModule(ModuleBase* ptr) {
        modules_.push_back(ptr);
    }

    void CloseAll() {
        for (auto& module : modules_) {
            module->CloseAll();
        }
    }

private:
    std::vector<ModuleBase*> modules_;
};

Ответы (1 шт):

Автор решения: Potato Man

У тебя ошибка в ModuleBorders:

class ModuleBorders : public ModuleBase{
public:
    double sumOfID;
    double kof;
    int positionId_;
    ModuleBorders(AccountInterface* account_){
        account = account_;
    }
    void OnTick(double price){
         if (positionId_ == -1 && price < 2) {
            positionId_ = account->OpenPosition(account->GetAvailBalance() / price);
        } else if (positionId_ != -1 && price > 8) {
            account->ClosePosition(positionId_);
            positionId_ = -1;
        }
    }
    void CloseAll(){
        while(ids.size()!=0){
            account->ClosePosition(ids[ids.size()]);
            ids.pop_back();
        }
    }
};```
→ Ссылка