← Назад

Order.Balance после снятия заявки

Нужно получить нереализованный объем заявки после ее снятия. Order.Balance показывает полный объем, как узнать именно нереализованный?

Комментарии (24)

Вход или Создать аккаунт, Войдите или зарегистрируйтесь, чтобы оставить комментарий

Mikhail Sukhov
Mikhail Sukhov

D_Alex: Нужно получить нереализованный объем заявки после ее снятия. Order.Balance показывает полный объем, как узнать именно нереализованный?

Дождаться события OrdersChanged.

a.dobryn
a.dobryn Автор

не совсем правильно объяснила =) сначала заявка снимается, потом проверяется, точно ли была снята. Узнаем, что да, была снята. Как уже после её снятия, когда она неактивна, узнать, сколько контрактов оставалось в заявке до её снятия?

Mikhail Sukhov
Mikhail Sukhov

D_Alex: не совсем правильно объяснила =) сначала заявка снимается, потом проверяется, точно ли была снята. Узнаем, что да, была снята. Как уже после её снятия, когда она неактивна, узнать, сколько контрактов оставалось в заявке до её снятия?

Через Order.Balance. То, что он не показывает реальный остаток, говорит об ошибке в передаче данных (помогает ITrader.ProcessDataError). Или вы в программе не дождались того момента, как было получено подтверждение о снятии заявки.

a.dobryn
a.dobryn Автор

показывает не остаток, а полное количество, то есть если было выставлено 10, а осталось 8, то выдает все 10. Хм, гляну ProcessDataError

Mikhail Sukhov
Mikhail Sukhov

D_Alex: показывает не остаток, а полное количество, то есть если было выставлено 10, а осталось 8, то выдает все 10. Хм, гляну ProcessDataError

Проверяйте сразу на Sample. Если он работает, а у вас нет, значит настройки таблиц в Квике правильные, и ошибка у вас в программе.

a.dobryn
a.dobryn Автор

Чудеса, на моем рабочем компе все в порядке. Наверное на том действительно что-то с настройкой квика. Спасибо за помощь =)

a.dobryn
a.dobryn Автор

хотя нет, на рабочем тоже был застигнут этот глюк, причем в одном и том же месте иногда определяет правильно, а иногда - нет О_о и это при одинаковых условиях

Mikhail Sukhov
Mikhail Sukhov

D_Alex: хотя нет, на рабочем тоже был застигнут этот глюк, причем в одном и том же месте иногда определяет правильно, а иногда - нет О_о и это при одинаковых условиях

ITrader.ProcessDataError

a.dobryn
a.dobryn Автор

Mikhail Sukhov: ITrader.ProcessDataError Там чисто. Есть догадка, что определяется неверно, когда при попытке снятия заявки в тот момент она исполняется, буду проверять.

a.dobryn
a.dobryn Автор

в ITrader.ProcessDataError так ничего и не появилось, и вроде выяснили, что это происходит, когда при попытке снять заявку она исполняется частично, и остаток возвращается неправильно, не неисполненную часть, а Volume

Mikhail Sukhov
Mikhail Sukhov

D_Alex: в ITrader.ProcessDataError так ничего и не появилось, и вроде выяснили, что это происходит, когда при попытке снять заявку она исполняется частично, и остаток возвращается неправильно, не неисполненную часть, а Volume

Посмотрел в код, не увидел мест, которое может привести к подобному. Можно проверить. Какой объем у заявки стоит? Что за инструмент? Лучше еще будет, если приведете минимальный код ввиде проверки.

a.dobryn
a.dobryn Автор

Mikhail Sukhov:

D_Alex: в ITrader.ProcessDataError так ничего и не появилось, и вроде выяснили, что это происходит, когда при попытке снять заявку она исполняется частично, и остаток возвращается неправильно, не неисполненную часть, а Volume

Посмотрел в код, не увидел мест, которое может привести к подобному. Можно проверить. Какой объем у заявки стоит? Что за инструмент? Лучше еще будет, если приведете минимальный код ввиде проверки.

сама я этот момент не засекала, но видно по логу и списку сделок в Quik'e, что кусочек заявки исполнился =) инструмент - Сбербанк, все это в QuickJunior. Вот примерный код -


bool b = true;

while(b)
{							
	CancelOrder(Cnum + 1);
	if (IsOrderCanceled(Cnum + 1) == false)
	{
		using (System.IO.StreamWriter file = new System.IO.StreamWriter(@"d:\log.txt", true))
		{
			file.WriteLine("Заявка со страйком {0} не снята", StrikesTableR2[Cnum + 1].Strike);
		}
	}	
	if (IsOrderDone(Cnum + 1))
		b = false;		
							
}

int n = GetOrderBalance(Cnum + 1);  //вот здесь бывает неверное определение

и код вспомогательных функций


void CancelOrder(int num)
{         
	MainWindow.Instance.CancelOrder(MainWindow.Instance._ordersWindow.Orders[GetOrderNum(StrikesTableR2[num].Strike)]);
}

bool IsOrderDone(int num)
{
	return MainWindow.Instance._ordersWindow.Orders[GetOrderNum(StrikesTableR2[num].Strike)].State == OrderStates.Done;
}

bool IsOrderCanceled(int num)
{           
    return MainWindow.Instance._ordersWindow.Orders[GetOrderNum(StrikesTableR2[num].Strike)].IsCanceled();
}

int GetOrderNum(double price)
{
	int i;          
	for (i = MainWindow.Instance._ordersWindow.Orders.Count() - 1; i >= 0; i--)
		if (MainWindow.Instance._ordersWindow.Orders[i].Price == price)
			return i;
}

возможно, тут и в коде косяки - он индусский весьма 😊 но в случаях, когда заявка нормально снимается или исполняется целиком - срабатывает верно

Mikhail Sukhov
Mikhail Sukhov

D_Alex: возможно, тут и в коде косяки - он индусский весьма 😊 но в случаях, когда заявка нормально снимается или исполняется целиком - срабатывает верно

Да уж. Я мало что понял в этих хитросплетениях. Выделите код в минимальный проект, где бы бага воспроизводилась. Сейчас в этом коде искать смысла нет баги - ошибка может быть в любом месте, вплоть до неправильного получения заявки (не та заявка).

a.dobryn
a.dobryn Автор

Хорошо, постараемся сделать минимальный проект =)

a.dobryn
a.dobryn Автор

Получилось воспроизвести багу в тестовом проекте =) логики тут нет, но действия похожи Выложила сюда После старта просто нажать на "Тест", отправится заявка и запустится "реакция" =) Здесь скрин

Mikhail Sukhov
Mikhail Sukhov

D_Alex: Получилось воспроизвести багу в тестовом проекте =) логики тут нет, но действия похожи Выложила сюда После старта просто нажать на "Тест", отправится заявка и запустится "реакция" =) Здесь скрин

Попытался скомпилировать. Не получилось. Какая версия S#?

a.dobryn
a.dobryn Автор

а что говорит? 2.6

Mikhail Sukhov
Mikhail Sukhov

D_Alex: а что говорит? 2.6

Обновитесь до последней версии. Если ошибка не уйдет, будем дальше смотреть.

a.dobryn
a.dobryn Автор

Обновилась, не помогло. Помогло другое - поставила перед определением остатка sleep в одну секунду. Теперь определяет правильно =) странно, но ведь как раз перед этим определяется, что заявка точно уже снята/исполнена?

Mikhail Sukhov
Mikhail Sukhov

D_Alex: Обновилась, не помогло.

Код примера остался неизменный?

a.dobryn
a.dobryn Автор

Mikhail Sukhov:

D_Alex: Обновилась, не помогло.

Код примера остался неизменный?

неизменный =) вообще ничего не меняла, закомпилилось сразу

Mikhail Sukhov
Mikhail Sukhov

D_Alex:

Mikhail Sukhov:

D_Alex: Обновилась, не помогло.

Код примера остался неизменный?

неизменный =) вообще ничего не меняла, закомпилилось сразу

Быть этого не может. Том стоит статус OrderStatus.Done, который теперь называется Accepted.

a.dobryn
a.dobryn Автор

Mikhail Sukhov:

D_Alex:

Mikhail Sukhov:

D_Alex: Обновилась, не помогло.

Код примера остался неизменный?

неизменный =) вообще ничего не меняла, закомпилилось сразу

Быть этого не может. Том стоит статус OrderStatus.Done, который теперь называется Accepted.

Странно О_о все dll в папке References поменяла на новые. Или там чего перелинковать надо?

Mikhail Sukhov
Mikhail Sukhov

D_Alex: Странно О_о все dll в папке References поменяла на новые. Или там чего перелинковать надо?

MainWindow.xaml.cs Строка 265:

if (order.Status == OrderStatus.Done)

Описание OrderStatus.