Maxim
|
Дата: 24.02.2013
|
|
|
|
Вопрос разработчикам: есть ли планы реализовать в PlazaTrader, а также в BaseTrader возможность задавать тип смены заявок? Например, столкнулся с необходимостью делать в Плазе замену с режимом regime == 3. А он не сделан. Пока прикрутил костыли к текущей открытой версии. Буду рад, если кто укажет на ошибки. Пока не тестировал. Возможно после тестов обнаружатся ошибки. Добавил PlazaReRegisterRegime.cs Код
/// <summary>
/// Режим замены заявок в Плазе-2
/// </summary>
public enum PlazaReRegisterRegime
{
/// <summary>
/// 0 Не менять объёмы заявок
/// </summary>
SetVolumeFromOldOrderBalance,
/// <summary>
/// 1 Изменить объёмы заявок
/// </summary>
SetVolumeFromNewOrderVolume,
/// <summary>
/// 2 Снять старые заявки, в случае, если указанные новые объёмы совпадают с текущими объёмами в торговой системе – поставить заявки с новыми ценами
/// </summary>
ReRegisterIfOldOrderBalanceAndNewOrderVolumeEquel,
/// <summary>
/// 3 Изменить объемы заявок с учетом сведенной части
/// </summary>
SetVolumeFromNewOrderVolumeMinusMatchingVolume
}
В PlazaTrader.cs добавил: Код
void encodeRegime(Order order, PlazaReRegisterRegime regime)
{
if (regime == PlazaReRegisterRegime.SetVolumeFromOldOrderBalance)
order.Volume = 0;
else if (regime == PlazaReRegisterRegime.SetVolumeFromNewOrderVolume)
order.Balance = -1;
else if (regime == PlazaReRegisterRegime.ReRegisterIfOldOrderBalanceAndNewOrderVolumeEquel)
order.Balance = -2;
else if (regime == PlazaReRegisterRegime.SetVolumeFromNewOrderVolumeMinusMatchingVolume)
order.Balance = -3;
}
PlazaReRegisterRegime decodeRegime(Order order)
{
if (order.Volume == 0)
return PlazaReRegisterRegime.SetVolumeFromOldOrderBalance;
else if (order.Balance == -1)
return PlazaReRegisterRegime.SetVolumeFromNewOrderVolume;
else if (order.Balance == -2)
return PlazaReRegisterRegime.ReRegisterIfOldOrderBalanceAndNewOrderVolumeEquel;
else if (order.Balance == -3)
return PlazaReRegisterRegime.SetVolumeFromNewOrderVolumeMinusMatchingVolume;
else
return PlazaReRegisterRegime.SetVolumeFromNewOrderVolume;
}
/// <summary>
/// Перерегистрировать пару заявок на бирже.
/// </summary>
/// <param name="oldOrder1">Первая заявка, которую нужно снять.</param>
/// <param name="newOrder1">Первая новая заявка, которую нужно зарегистрировать.</param>
/// <param name="oldOrder2">Вторая заявка, которую нужно снять.</param>
/// <param name="newOrder2">Вторая новая заявка, которую нужно зарегистрировать.</param>
/// <param name="regime">Режим замены заявок в Плазе-2.</param>
public void ReRegisterOrderPair(Order oldOrder1, Order newOrder1, Order oldOrder2, Order newOrder2, PlazaReRegisterRegime regime)
{
encodeRegime(newOrder1, regime);
encodeRegime(newOrder2, regime);
base.ReRegisterOrderPair(oldOrder1, newOrder1, oldOrder2, newOrder2);
}
/// <summary>
/// Перерегистрировать заявку на бирже.
/// </summary>
/// <param name="oldOrder">Заявка, которую нужно снять.</param>
/// <param name="newOrder">Новая заявка, которую нужно зарегистрировать.</param>
/// <param name="regime">Режим замены заявок в Плазе-2.</param>
public void ReRegisterOrder(Order oldOrder, Order newOrder, PlazaReRegisterRegime regime)
{
encodeRegime(newOrder, regime);
base.ReRegisterOrder(oldOrder, newOrder);
}
В PlazaTrader.cs изменил методы: Код
/// <summary>
/// Перерегистрировать заявку на бирже.
/// </summary>
/// <param name="oldOrder">Заявка, которую нужно снять.</param>
/// <param name="newOrder">Новая заявка, которую нужно зарегистрировать.</param>
protected override void OnReRegisterOrder(Order oldOrder, Order newOrder)
{
// Определяем режим замены заявок
PlazaReRegisterRegime regime = decodeRegime(newOrder);
// Продолжаем замену. Логика из оригинальной верисии коннектора.
InitNewOrder(newOrder);
var transaction = _transactionManager.Factory.CreateReRegister(oldOrder, newOrder);
transaction
.SetMoveMode(regime)
.SetFirstOrderId(oldOrder.Id)
.SetFirstVolume((int)newOrder.Volume)
.SetFirstPrice(newOrder.Price)
.SetFirstTransactionId(newOrder.TransactionId);
_transactionManager.SendTransaction(transaction);
}
/// <summary>
/// Перерегистрировать пару заявок на бирже.
/// </summary>
/// <param name="oldOrder1">Первая заявка, которую нужно снять.</param>
/// <param name="newOrder1">Первая новая заявка, которую нужно зарегистрировать.</param>
/// <param name="oldOrder2">Вторая заявка, которую нужно снять.</param>
/// <param name="newOrder2">Вторая новая заявка, которую нужно зарегистрировать.</param>
protected override void OnReRegisterOrderPair(Order oldOrder1, Order newOrder1, Order oldOrder2, Order newOrder2)
{
// Определяем режим замены заявок
PlazaReRegisterRegime regime1 = decodeRegime(newOrder1);
PlazaReRegisterRegime regime2 = decodeRegime(newOrder2);
PlazaReRegisterRegime regime = regime1 == regime2 ? regime1 : PlazaReRegisterRegime.SetVolumeFromNewOrderVolume;
// Продолжаем замену. Логика из оригинальной верисии коннектора.
InitNewOrder(newOrder1);
InitNewOrder(newOrder2);
var transaction = _transactionManager.Factory.CreateReRegisterPair(oldOrder1, newOrder1, oldOrder2, newOrder2);
transaction
.SetMoveMode(regime)
.SetFirstOrderId(oldOrder1.Id)
.SetFirstVolume((int)newOrder1.Volume)
.SetFirstPrice(newOrder1.Price)
.SetFirstTransactionId(newOrder1.TransactionId)
.SetSecondOrderId(oldOrder2.Id)
.SetSecondVolume((int)newOrder2.Volume)
.SetSecondPrice(newOrder2.Price)
.SetSecondTransactionId(newOrder2.TransactionId);
_transactionManager.SendTransaction(transaction);
}
В Transaction.cs изменил метод: Код
/// <summary>
/// Установить режим перемещения заявок.
/// </summary>
/// <param name="regime">Тип изменения объема заявок.</param>
/// <returns>Транзакция.</returns>
public Transaction SetMoveMode(PlazaReRegisterRegime regime)
{
CheckType(Messages.FutureReRegister, Messages.OptionReRegister);
return SetField("regime", (Int32)regime);
}
|