Перебор параметров
Зачем перебирать параметры
Зачастую в торговых стратегиях возникает необходимость подобрать какой-либо параметр на основе исторических данных. Для этого оказывается полезным интерфейс перебора параметров.
Передача параметров в стратегию
На странице с отправкой стратегии имеется возможность передавать стратегии набор параметров для перебора. Для этого внизу страницы в поле Имя параметра нужно ввести имя параметра, а в соседнее поле ввести значения параметра. Все значения могут быть целыми или вещественными с точкой в качестве разделителя.
Рассмотрим способы задания параметров:
Постоянная:
Список значений через запятую:
Диапазон значений с шагом: (start, end, step):
После ввода поля значений параметра нужно добавить эти значения, нажав на кнопку Добавить. В таком случае параметры, заданные способами 1 и 2, передадутся как есть, а параметры, заданные диапазоном значений с шагом, раскроются в список параметров автоматически и отобразятся в таблице параметров.
Интерфейс перебора параметров позволяет добавлять несколько различных параметров, а также отключать перебор, задавая значение по умолчанию (default value):
Пример задания нескольких серий параметров. 2 значения для double_param и 4 значения для int_param дают 4 * 2 = 8 комбинаций. Здесь мы также видим, что, если осуществляется перебор параметра, то для него необязательно указывать значение по умолчанию.
Пример отключения перебора параметра double_param, значение по умолчанию равно 0. Для параметра int_param значение по умолчанию игнорируется, так как включен перебор этого параметра:
Чтение параметров из стратегии
Все переданные стратегии параметры можно извлечь из файла конфигурации, передаваемого в конструктор стратегии пользователя UserStrategy.
В C++ параметры файла конфигурации приводятся к нужному типу с помощью метода as<param_type>(default_value)
.
При этом если вы не выберете значения для параметра, для него будет использовано значение по умолчанию default_value
.
В Python можно воспользоваться стандартным преобразованием типов.
#include "participant_strategy.h"
using namespace hftbattle;
namespace {
class UserStrategy : public ParticipantStrategy {
public:
// Параметры стратегии, которые хочется подобрать.
int int_param;
double double_param;
Microseconds time_param;
explicit UserStrategy(const JsonValue& config) {
// Читаем целочисленный параметр, который обязательно должен быть указан в JSON файле.
int_param = config["int_param"].as<int>();
// Читаем вещественный параметр.
// Если его нет в JSON файле, то он будет равен значению по умолчанию, т.е. 3.14.
double_param = config["double_param"].as<double>(3.14);
// Читаем временной параметр.
// ! Временной параметр по умолчанию необходимо указывать с единицей измерения (литералом).
// Возможные литералы:
// h — часы,
// min — минуты,
// s — секунда,
// ms — миллисекунды,
// us — микросекунды.
time_param = config["time_param"].as<Microseconds>(3s);
}
};
} // namespace
REGISTER_CONTEST_STRATEGY(UserStrategy, user_strategy)
# -*- coding: utf-8 -*-
from py_defs import *
from py_defs import Decimal as Price
from common_enums import *
# В конструктор стратегии участника передается файл конфигурации.
# В файл конфигурации из веб-интерфейса можно передать параметры стратегии.
def init(strat, config):
# Параметры стратегии, которые хочется подобрать.
# Тип параметра определяется только тем, как вы его зададите в JSON.
# Числовые значения не надо заключать в кавычки.
global int_param, double_param, time_param
int_param = config["int_param"]
# Читаем вещественный параметр. Если его нет в JSON файле, то он будет равен значению по умолчанию, т.е. 3.14.
double_param = config.get("double_param", 3.14)
# Здесь тоже хранится число.
time_param = config["time_param"]