← Zurück

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

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

War dieses Thema hilfreich?

Thema teilen

Kommentare (24)

Anmelden oder Konto erstellen, Melden Sie sich an oder registrieren Sie sich, um einen Kommentar zu hinterlassen

Mikhail Sukhov
Mikhail Sukhov

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

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

a.dobryn
a.dobryn Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

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

a.dobryn
a.dobryn Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

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

a.dobryn
a.dobryn Autor

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

a.dobryn
a.dobryn Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

ITrader.ProcessDataError

a.dobryn
a.dobryn Autor

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

a.dobryn
a.dobryn Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

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

a.dobryn
a.dobryn Autor

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 Autor

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

a.dobryn
a.dobryn Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

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

a.dobryn
a.dobryn Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

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

a.dobryn
a.dobryn Autor

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

Mikhail Sukhov
Mikhail Sukhov

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

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

a.dobryn
a.dobryn Autor

Mikhail Sukhov:

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

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

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

Mikhail Sukhov
Mikhail Sukhov

D_Alex:

Mikhail Sukhov:

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

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

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

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

a.dobryn
a.dobryn Autor

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.