В итоге получаю описанную выше ошибку. подскажите какие поля я не верно заполняю ? Стараюсь снять заявку на акциях.
Пользователь
Сообщений: Регистрация: 23.12.2017
03.04.2018 19:12:47
Не знаю имеет ли это значение, но ордер который я намереваюсь удалить. был выставлен вручную.
Пользователь
Сообщений: Регистрация: 23.12.2017
03.04.2018 19:22:50
И еще поправка более верно ошибка звучит так: "Вы не можете снять ДАННУЮ заявку"
PS Сделайте как нибудь на досуге возможность редактирования тем и сообщений на форуме.
QUIK clients support
Сообщений: Регистрация: 27.01.2015
04.04.2018 11:11:39
Добрый день.
С подобной проблемой уже на форуме обращались. Например здесь можно найти решение:
Также проверьте, что статус у заявки активен, а не исполнен.
Пользователь
Сообщений: Регистрация: 23.12.2017
04.04.2018 12:10:56
Цитата
Egor Zaytsev написал: С подобной проблемой уже на форуме обращались. Например здесь можно найти решение:
Благодарю за ответ, однако мне это не поможет. Заявка точно активна и ORDER_KEY точно передается как string .
Пользователь
Сообщений: Регистрация: 23.12.2017
04.04.2018 12:11:20
Возможно есть еще какие нибудь варианты ?
QUIK clients support
Сообщений: Регистрация: 27.01.2015
04.04.2018 13:42:58
Цитата
Андрей написал: Возможно есть еще какие нибудь варианты ?
В ручном режиме снять заявку удается? Выложите полный скрипт.
Пользователь
Сообщений: Регистрация: 23.12.2017
04.04.2018 16:01:09
Цитата
Egor Zaytsev написал: В ручном режиме снять заявку удается? Выложите полный скрипт.
Да в ручную удается. Снятие ордера делаю из dll через написанную (и протестированную) мною обертку. для sendTransaction. Описание обертки тут:
Функция удаляющая ордера:
Код
double count_time_diff(std::chrono::time_point<std::chrono::system_clock> t)
{
auto end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end - t;
return elapsed_seconds.count();
}
bool deleteOrder(Symb_data params, int order_num, bool is_stopOrder, lua_State *L)
{
lua_settop(L, 0);
bool ans = false;
Ttransaction T(L, params);
int trans_id = T.trans_id();
T.classcode();
T.seccode();
if (is_stopOrder)
{
T.action(order_Action::KILL_STOP_ORDER);
T.stop_order_key(order_num);
}
else
{
T.action(order_Action::KILL_ORDER);
T.order_key(order_num);
}
std::string res = sendTransaction(T);
if (res.compare("") == 0)
{
ans = true;
auto doLoop = [&]()
{
bool ans = false;
std::vector<OrderData> orders;
if (get_Orders_Info(orders, params))
{
for (size_t i = 0; i < orders.size(); i++)
{
if (orders[i].trans_ID == trans_id)
{
ans = true;
break;
}
}
}
return ans;
};
auto start = std::chrono::system_clock::now();
while (count_time_diff(start) <= 30 && doLoop())
{
Sleep(1);
}
if (doLoop())
ans = false;
}
else
{
res = "Ошибка удаления ордера:\n " + res;
msg_ToQuik(L, res, 3);
}
return ans;
}
Да, хоть я и пишу на С++, но все работает. Данная функция справляется со своими задачами на фьючерсах, а вот лимитку на акциях удалить не получается...
Кстати говоря, написал вам тут как делаю, после сам интереса рази пересобрал все быстро в Луа - и понял что поспешил позоже. (луа скрипт сработал в отличии от моего), придется свое творение дебагить получше
Пользователь
Сообщений: Регистрация: 23.12.2017
04.04.2018 16:27:28
Да, моя ошибка. не верный номер ордера передаю.
Пользователь
Сообщений: Регистрация: 23.12.2017
04.04.2018 17:51:06
Egor Zaytsev, Прозьба просмотреть и дать ответ на мой вопрос вот из этой темы:
Похоже все таки какая то ошибка происходит во время стыковки с квиком, так как для фьючерсов описанный мною способ работает верно, а вот для акций - возвращает не верное значение запрашиваемого параметра.