1) отправляю ордер или удаляю его 2) момент неопределённости (нельзя считать, что ордера нет, нельзя считать, что ордер есть) 3) ордер размещён на бирже(удалён с биржи), либо "ордер/запрос отклонён из-за..."
Весь вопрос в том, когда наступает состояние (2)?
Если внутри функции OrderSend() до возврата из неё, то (2) - не наши проблемы. Если возврат из OrderSend() происходит когда ещё длится момент неопределённости, то это уже серьёзные проблемы для нас.
1) отправляю ордер или удаляю его 2) момент неопределённости (нельзя считать, что ордера нет, нельзя считать, что ордер есть) 3) ордер размещён на бирже(удалён с биржи), либо "ордер/запрос отклонён из-за..."
Весь вопрос в том, когда наступает состояние (2)?
Если внутри функции OrderSend() до возврата из неё, то (2) - не наши проблемы. Если возврат из OrderSend() происходит когда ещё длится момент неопределённости, то это уже серьёзные проблемы для нас.
Когда функция OrderSEnd вернула значение а TRADE_RETCODE_PLACED
Это означает,что ордер выставлен на биржу и мы можем получить его билет.
Когда функция OrderSEnd вернула значение а TRADE_RETCODE_PLACED
Это означает,что ордер выставлен на биржу и мы можем получить его билет.
Спасибо! Для меня это очень важно. Просто у меня сейчас в коде ошибки типа таких:
Лимит установлен > позиция открывается > новый лимит (частичного тейк профита) установлен > позиция мгновенно закрылась (на стоп вынесли быстрым рынком - отрабатывают такой редкий сценарий).
Так вот, почему-то в моём коде, на запрос "отменить частичный тейк профит сразу после установки" от сервера время от времени приходит реткод 100013.
Стал разбираться и выяснил, что вообще не могу удалять ордера мгновенно. Надо ждать после выставления.
Стал проверять статус и тут бах! Статус ордера говорит о том, что он ещё не на бирже =/
Спасибо ещё раз. Буду считать, что этот факт установлен наверняка.
Спасибо! Для меня это очень важно. Просто у меня сейчас в коде ошибки типа таких:
Лимит установлен > позиция открывается > новый лимит (частичного тейк профита) установлен > позиция мгновенно закрылась (на стоп вынесли быстрым рынком - отрабатывают такой редкий сценарий).
Так вот, почему-то в моём коде, на запрос "отменить частичный тейк профит сразу после установки" от сервера время от времени приходит реткод 100013.
Стал разбираться и выяснил, что вообще не могу удалять ордера мгновенно. Надо ждать после выставления.
Стал проверять статус и тут бах! Статус ордера говорит о том, что он ещё не на бирже =/
Спасибо ещё раз. Буду считать, что этот факт установлен наверняка.
Ошибку буду искать у себя в рассуждениях.
Всё очень просто.
OrderSend() - синхронная команда - отправили ордер и пока не получили ответ, то и делать ничего не надо.
В промежутке между запросом и ответом ничего опрашивать не нужно (не имеет никакого смысла).
OrderSend() - синхронная команда - отправили ордер и пока не получили ответ, то и делать ничего не надо.
В промежутке между запросом и ответом ничего опрашивать не нужно (не имеет никакого смысла).
Если бы так просто! =(
Михаил, помогите, пожалуйста, понять, почему мой тестовый эксперт не работает на RTS во время активного рынка... Точнее эксперт-то работает, а вот ордера удаляются через раз.
Когда статус ордера ORDER_STATE_PLACED - ордер удаляется, а вот когда статус ORDER_STATE_STARTED или ORDER_STATE_REQUEST_ADD - ордер 100% всегда не удаляется.
Почему такая фигня происходит?
Вопрос к разработчикам: неужели нельзя отправлять самый критически важный торговый запрос без сложного и крайне ненадёжного опроса сервера о статусе ордера?
Или вы считаете, что это нормально, когда сервер возвращает мне TRADE_RETCODE_INVALID (Неправильный запрос) на вполне адекватный код с просьбой удалить 100% существующий и действующий лимитный ордер?
Вот код эсперта для фьючерса на RTS:
#property copyright"Fry"#property version"1.01"MqlTradeResult result;
MqlTradeRequest req;
uint retcode=0;
ulong ticket =0;
int count =0;
intOnInit(){Print("Инициализация тестового эксперта"); return(INIT_SUCCEEDED);}
voidOnTick()
{
if(ticket) // если ордер уже открыт
{
PrintOrderState();
Delete();
count++;
if(count>50) ExpertRemove();
}
else Open(); // открываем ордер
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Удаляет лимитный ордер ticket
!!! Все проблемы здесь !!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/void Delete()
{
ZeroMemory(result);
ZeroMemory(req);
req.action=TRADE_ACTION_REMOVE;
req.order =ticket;
Print("Попытаемся удалить тестовый лимитный ордер №(",ticket,")...");
bool noneed=OrderSend(req,result);
retcode=result.retcode; // результатif(retcode==TRADE_RETCODE_PLACED) {ticket=0; Print("...Ордер успешно удалён.");}
elsePrint("------======!!! Сервер сообщил (",RetCodeToString(),") !!!======------");
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Сообщает в лог текущий статус ордера ticket
!!! Работает как надо. Код проверен !!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/void PrintOrderState()
{
ResetLastError();
//выделяем ордер для выяснения статусаif(OrderSelect(ticket))
{
ResetLastError();
long state=OrderGetInteger(ORDER_STATE);
if (!state)Print("OrderGetInteger() не сообщила статус. Ошибка№(",GetLastError(),")!");
elsePrint("Действующий ордер №(",ticket,"). Его текущий статус (",EnumToString((ENUM_ORDER_STATE)state),").");
}
// убедимся, что ордера действительно нет в списке действующихelseif(GetLastError()!=ERR_TRADE_ORDER_NOT_FOUND) Print("Провал OrderSelect(). Ошибка№(",GetLastError(),")!");
// ордера действительно нет в списке действующихelsePrint("В данный момент ордер №(",ticket,") действующий, но его почему-то нет в списке действующих ордеров терминала.");
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Открывает лимитный ордер (на покупку объёмом 1 лот с удалением от рынка 500 и со стопом 2000)
!!! Работает как надо. Код проверен !!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/void Open()
{
ZeroMemory(result);
ZeroMemory(req);
// получаем адекватную инфу о свежем тикеMqlTick tick;
if(!SymbolInfoTick(Symbol(),tick)){Print("Не удалось получить свежую котировку. Ошибка№", GetLastError()); return;}
req.price =int(tick.ask-500); // цена BUY-ордера складывается из текущего аска минус отступ ордера
req.sl =int(tick.ask-2000); // стоп лосс на 2000 удаляем от аска
req.action =TRADE_ACTION_PENDING; // Тип выполняемого действия (Установить отложенный ордер)
req.symbol =Symbol(); // Имя торгового инструмента
req.type_filling=ORDER_FILLING_RETURN; // Тип исполнения (исполниять до полного набора позиции)
req.type_time =ORDER_TIME_DAY; // Время действия ордера (до конца дня)
req.volume =1; // объём позиции
req.type =ORDER_TYPE_BUY_LIMIT; // отложенный ордер на покупку
req.comment ="test limit order"; // комментарий к ордеруPrint("Открываем тестовый лимитный ордер на покупку по цене (",req.price,")...");
bool noneed=OrderSend(req,result);
retcode=result.retcode; // результатPrint("...сервер сообщил (",RetCodeToString(),").");
if(retcode==TRADE_RETCODE_PLACED) {ticket=result.order; Print("Ордер размещен на бирже. Тикет ордера =",ticket);}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Возвращает значение кода возврата согласно документации
!!! Работает как надо. Код проверен !!!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/string RetCodeToString()
{
switch(retcode)
{
caseTRADE_RETCODE_REQUOTE : return("Реквота");
caseTRADE_RETCODE_DONE : return("Выполнено");
caseTRADE_RETCODE_DONE_PARTIAL : return("Выполнено частично");
caseTRADE_RETCODE_REJECT : return("Запрос отвергнут");
caseTRADE_RETCODE_CANCEL : return("Запрос отменен трейдером");
caseTRADE_RETCODE_PLACED : return("Приказ принят");
caseTRADE_RETCODE_ERROR : return("Ошибка обработки запроса");
caseTRADE_RETCODE_TIMEOUT : return("Запрос отменен по истечению времени");
caseTRADE_RETCODE_INVALID : return("Неправильный запрос");
caseTRADE_RETCODE_INVALID_VOLUME : return("Неправильный объем в запросе");
caseTRADE_RETCODE_INVALID_PRICE : return("Неправильная цена в запросе");
caseTRADE_RETCODE_INVALID_STOPS : return("В запросе неправильный стоп или тейк профит");
caseTRADE_RETCODE_TRADE_DISABLED : return("Торговля запрещена");
caseTRADE_RETCODE_MARKET_CLOSED : return("Рынок закрыт");
caseTRADE_RETCODE_NO_MONEY : return("Нет достаточных денежных средств для выполнения запроса");
caseTRADE_RETCODE_PRICE_CHANGED : return("Цены изменились");
caseTRADE_RETCODE_PRICE_OFF : return("Отсутствуют котировки для обработки запроса");
caseTRADE_RETCODE_INVALID_EXPIRATION: return("Неверная дата истечения ордера в запросе");
caseTRADE_RETCODE_ORDER_CHANGED : return("Состояние ордера изменилось");
caseTRADE_RETCODE_TOO_MANY_REQUESTS : return("Слишком частые запросы");
caseTRADE_RETCODE_NO_CHANGES : return("В запросе нет изменений");
caseTRADE_RETCODE_SERVER_DISABLES_AT: return("Автотрейдинг запрещен сервером");
caseTRADE_RETCODE_CLIENT_DISABLES_AT: return("Автотрейдинг запрещен клиентским терминалом");
caseTRADE_RETCODE_LOCKED : return("Запрос заблокирован для обработки");
caseTRADE_RETCODE_FROZEN : return("Ордер или позиция заморожены");
caseTRADE_RETCODE_INVALID_FILL : return("Указан неподдерживаемый тип исполнения ордера по остатку");
caseTRADE_RETCODE_CONNECTION : return("Нет соединения с торговым сервером");
caseTRADE_RETCODE_ONLY_REAL : return("Операция разрешена только для реальных счетов");
caseTRADE_RETCODE_LIMIT_ORDERS : return("Достигнут лимит на количество отложенных ордеров");
caseTRADE_RETCODE_LIMIT_VOLUME : return("Достигнут лимит на объем ордеров и позиций для данного символа");
caseTRADE_RETCODE_INVALID_ORDER : return("Неверный или запрещённый тип ордера");
caseTRADE_RETCODE_POSITION_CLOSED : return("Позиция с указанным POSITION_IDENTIFIER уже закрыта");
default : return("Неизвестный код возврата: "+(string)retcode);
}
}
Приоритеты в коде:
1) сделать код таким, чтобы не бомбить сервер заранее "дохлыми" запросами, когда уже понятно, что сервер вернёт 10013.
2) сделать код таким, чтобы запрос на удаление ордера наверняка отправлялся (то есть предельно упростить все проверки перед OrderSend())
3) сделать код таким, чтобы ордер удалялся как можно быстрее (в рамках возможностей OrderSend()), то есть не пропускать лишние тики в ожидании статуса.
Михаил, помогите, пожалуйста, понять, почему мой тестовый эксперт не работает на RTS во время активного рынка... Точнее эксперт-то работает, а вот ордера удаляются через раз.
Когда статус ордера ORDER_STATE_PLACED - ордер удаляется, а вот когда статус ORDER_STATE_STARTED или ORDER_STATE_REQUEST_ADD - ордер 100% всегда не удаляется.
Почему такая фигня происходит?
Вопрос к разработчикам: неужели нельзя отправлять самый критически важный торговый запрос без сложного и крайне ненадёжного опроса сервера о статусе ордера?
Или вы считаете, что это нормально, когда сервер возвращает мне TRADE_RETCODE_INVALID (Неправильный запрос) на вполне адекватный код с просьбой удалить 100% существующий и действующий лимитный ордер?
Вот код эсперта для фьючерса на RTS:
Приоритеты в коде:
1) сделать код таким, чтобы не бомбить сервер заранее "дохлыми" запросами, когда уже понятно, что сервер вернёт 10013.
2) сделать код таким, чтобы запрос на удаление ордера наверняка отправлялся (то есть предельно упростить все проверки перед OrderSend())
3) сделать код таким, чтобы ордер удалялся как можно быстрее (в рамках возможностей OrderSend()), то есть не пропускать лишние тики в ожидании статуса.
(я тоже слегка исправил код выше, но суть не менял, только каменты)
Про КЛИЕНТ-СЕРВЕР... Естественно мой рабочий движок для лимитных ордеров обрабатывает события OnTrade, а логику совершения торговых действий я выстраиваю совсем не так.
Здесь я предельно упростил код, чтобы показать сам факт того, что ордер "не совсем чтобы на бирже" после OrderSend() или если он на бирже, то "не совсем чтобы всегда доступен для удаления".
И даже когда ордер выделяется - не всегда он удаляется!
(я тоже слегка исправил код выше, но суть не менял, только каменты)
Про КЛИЕНТ-СЕРВЕР... Естественно мой рабочий движок для лимитных ордеров обрабатывает события OnTrade, а логику совершения торговых действий я выстраиваю совсем не так.
Здесь
я предельно упростил код, чтобы показать сам факт того, что ордер "не
совсем чтобы на бирже" после OrderSend() или если он на бирже, то "не
совсем чтобы всегда доступен для удаления".
И даже когда ордер выделяется - не всегда он удаляется!
ЗЫ только что проверял на демо счёте.
Я тоже только что проверил - всё работает! (У Вас демо в Открывашке или БКС ?)
1) То что OrderSelect() выделяет ордер, вовсе не означает, что ордер действующий =). Часто ордер ещё ~ секунду после исполнения выделяется, а уже потом переходит в список истории.
2) А может быть и так, что ордер 100% существует (даже действующий, или выполняется сейчас, или ещё что-то с ним). При этом он вообще ничем не выделяется! Ни OrderSelect(), ни HistoryOrderSelect()! И это происходит довольно часто!
3) Правильно обрабатывать возврат из OrderSelect() надо так как я показал внутри PrintOrderState().
Спрашивайте здесь, что будет не понятно...
К сожалению вопрос остаётся открытым =(
Проверяю догадку так:
1) OrderSend в result сообщила TRADE_RETCODE_PLACED
2) После этого выделяю ордер по тикету и OrderGetInteger(ORDER_STATE,state) сообщила в state ORDER_STATE_REQUEST_ADD.
Из документации это значит:
"Ордер в состоянии регистрации (выставление в торговую систему)"
Как переводится эта фраза на язык биржевого исполнения для ФОРТС?
Это проблема задержки синхронизации статусов и реального состояния дел?
Или это факт? То есть после TRADE_RETCODE_PLACED ордер нифига не на бирже в очереди?
Надо бы проверить однозначно, но сейчас у меня нет возможности.
Можно проверить последовательность возврата кода TRADE_RETCODE_PLACED с тикетом ордера и момент регистрации биржевого ID у заявки в очереди.
1) отправляю ордер или удаляю его
2) момент неопределённости (нельзя считать, что ордера нет, нельзя считать, что ордер есть)
3) ордер размещён на бирже(удалён с биржи), либо "ордер/запрос отклонён из-за..."
Весь вопрос в том, когда наступает состояние (2)?
Если внутри функции OrderSend() до возврата из неё, то (2) - не наши проблемы.
Если возврат из OrderSend() происходит когда ещё длится момент неопределённости, то это уже серьёзные проблемы для нас.
Постараюсь описать ситуацию предельно коротко:
1) отправляю ордер или удаляю его
2) момент неопределённости (нельзя считать, что ордера нет, нельзя считать, что ордер есть)
3) ордер размещён на бирже(удалён с биржи), либо "ордер/запрос отклонён из-за..."
Весь вопрос в том, когда наступает состояние (2)?
Если внутри функции OrderSend() до возврата из неё, то (2) - не наши проблемы.
Если возврат из OrderSend() происходит когда ещё длится момент неопределённости, то это уже серьёзные проблемы для нас.
Когда функция OrderSEnd вернула значение а TRADE_RETCODE_PLACED
Это означает,что ордер выставлен на биржу и мы можем получить его билет.
Когда функция OrderSEnd вернула значение а TRADE_RETCODE_PLACED
Это означает,что ордер выставлен на биржу и мы можем получить его билет.
Спасибо! Для меня это очень важно. Просто у меня сейчас в коде ошибки типа таких:
Лимит установлен > позиция открывается > новый лимит (частичного тейк профита) установлен > позиция мгновенно закрылась (на стоп вынесли быстрым рынком - отрабатывают такой редкий сценарий).
Так вот, почему-то в моём коде, на запрос "отменить частичный тейк профит сразу после установки" от сервера время от времени приходит реткод 100013.
Стал разбираться и выяснил, что вообще не могу удалять ордера мгновенно. Надо ждать после выставления.
Стал проверять статус и тут бах! Статус ордера говорит о том, что он ещё не на бирже =/
Спасибо ещё раз. Буду считать, что этот факт установлен наверняка.
Ошибку буду искать у себя в рассуждениях.
Спасибо! Для меня это очень важно. Просто у меня сейчас в коде ошибки типа таких:
Лимит установлен > позиция открывается > новый лимит (частичного тейк профита) установлен > позиция мгновенно закрылась (на стоп вынесли быстрым рынком - отрабатывают такой редкий сценарий).
Так вот, почему-то в моём коде, на запрос "отменить частичный тейк профит сразу после установки" от сервера время от времени приходит реткод 100013.
Стал разбираться и выяснил, что вообще не могу удалять ордера мгновенно. Надо ждать после выставления.
Стал проверять статус и тут бах! Статус ордера говорит о том, что он ещё не на бирже =/
Спасибо ещё раз. Буду считать, что этот факт установлен наверняка.
Ошибку буду искать у себя в рассуждениях.
Всё очень просто.
OrderSend() - синхронная команда - отправили ордер и пока не получили ответ, то и делать ничего не надо.
В промежутке между запросом и ответом ничего опрашивать не нужно (не имеет никакого смысла).
Всё очень просто.
OrderSend() - синхронная команда - отправили ордер и пока не получили ответ, то и делать ничего не надо.
В промежутке между запросом и ответом ничего опрашивать не нужно (не имеет никакого смысла).
Если бы так просто! =(
Михаил, помогите, пожалуйста, понять, почему мой тестовый эксперт не работает на RTS во время активного рынка... Точнее эксперт-то работает, а вот ордера удаляются через раз.
Когда статус ордера ORDER_STATE_PLACED - ордер удаляется, а вот когда статус ORDER_STATE_STARTED или ORDER_STATE_REQUEST_ADD - ордер 100% всегда не удаляется.
Почему такая фигня происходит?
Вопрос к разработчикам: неужели нельзя отправлять самый критически важный торговый запрос без сложного и крайне ненадёжного опроса сервера о статусе ордера?
Или вы считаете, что это нормально, когда сервер возвращает мне TRADE_RETCODE_INVALID (Неправильный запрос) на вполне адекватный код с просьбой удалить 100% существующий и действующий лимитный ордер?
Вот код эсперта для фьючерса на RTS:
Приоритеты в коде:
1) сделать код таким, чтобы не бомбить сервер заранее "дохлыми" запросами, когда уже понятно, что сервер вернёт 10013.
2) сделать код таким, чтобы запрос на удаление ордера наверняка отправлялся (то есть предельно упростить все проверки перед OrderSend())
3) сделать код таким, чтобы ордер удалялся как можно быстрее (в рамках возможностей OrderSend()), то есть не пропускать лишние тики в ожидании статуса.
ЗЫ Кто из разработчиков отвечает за ФОРТС?
Если бы так просто! =(
Михаил, помогите, пожалуйста, понять, почему мой тестовый эксперт не работает на RTS во время активного рынка... Точнее эксперт-то работает, а вот ордера удаляются через раз.
Когда статус ордера ORDER_STATE_PLACED - ордер удаляется, а вот когда статус ORDER_STATE_STARTED или ORDER_STATE_REQUEST_ADD - ордер 100% всегда не удаляется.
Почему такая фигня происходит?
Вопрос к разработчикам: неужели нельзя отправлять самый критически важный торговый запрос без сложного и крайне ненадёжного опроса сервера о статусе ордера?
Или вы считаете, что это нормально, когда сервер возвращает мне TRADE_RETCODE_INVALID (Неправильный запрос) на вполне адекватный код с просьбой удалить 100% существующий и действующий лимитный ордер?
Вот код эсперта для фьючерса на RTS:
Приоритеты в коде:
1) сделать код таким, чтобы не бомбить сервер заранее "дохлыми" запросами, когда уже понятно, что сервер вернёт 10013.
2) сделать код таким, чтобы запрос на удаление ордера наверняка отправлялся (то есть предельно упростить все проверки перед OrderSend())
3) сделать код таким, чтобы ордер удалялся как можно быстрее (в рамках возможностей OrderSend()), то есть не пропускать лишние тики в ожидании статуса.
ЗЫ Кто из разработчиков отвечает за ФОРТС?
Разработчики тут не причём.
Советую Вам почитать о приложениях КЛИЕНТ-СЕРВЕР.
У Вас не правильная логика советника.
Вот так будет работать:
Разработчики тут не причём.
Советую Вам почитать о приложениях КЛИЕНТ-СЕРВЕР.
У Вас не правильная логика советника.
Вот так будет точно работать:
неа. Не работает =(
(я тоже слегка исправил код выше, но суть не менял, только каменты)
Про КЛИЕНТ-СЕРВЕР... Естественно мой рабочий движок для лимитных ордеров обрабатывает события OnTrade, а логику совершения торговых действий я выстраиваю совсем не так.
Здесь я предельно упростил код, чтобы показать сам факт того, что ордер "не совсем чтобы на бирже" после OrderSend() или если он на бирже, то "не совсем чтобы всегда доступен для удаления".
И даже когда ордер выделяется - не всегда он удаляется!
ЗЫ только что проверял на демо счёте.
неа. Не работает =(
(я тоже слегка исправил код выше, но суть не менял, только каменты)
Про КЛИЕНТ-СЕРВЕР... Естественно мой рабочий движок для лимитных ордеров обрабатывает события OnTrade, а логику совершения торговых действий я выстраиваю совсем не так.
Здесь я предельно упростил код, чтобы показать сам факт того, что ордер "не совсем чтобы на бирже" после OrderSend() или если он на бирже, то "не совсем чтобы всегда доступен для удаления".
И даже когда ордер выделяется - не всегда он удаляется!
ЗЫ только что проверял на демо счёте.
Я тоже только что проверил - всё работает! (У Вас демо в Открывашке или БКС ?)
Я тоже только что проверил - всё работает!
Ну как это работает? Запустил Ваш код.
Множество раз сообщает подобный бред:
Кроме того... Хотите удивлю Вас?
1) То что OrderSelect() выделяет ордер, вовсе не означает, что ордер действующий =). Часто ордер ещё ~ секунду после исполнения выделяется, а уже потом переходит в список истории.
2) А может быть и так, что ордер 100% существует (даже действующий, или выполняется сейчас, или ещё что-то с ним). При этом он вообще ничем не выделяется! Ни OrderSelect(), ни HistoryOrderSelect()! И это происходит довольно часто!
3) Правильно обрабатывать возврат из OrderSelect() надо так как я показал внутри PrintOrderState().
Вот такая вот фигня =(