Интересная тема. Только истинные мастера могли в процессе отправки торгового приказа и получения рещультата его выполнения придумать столько гемороя.. я же всегда стремился к простоте. Поэтому задам простой вопрос.
По параметру ["TRANS_ID"] можно идентифицировать транзакцию в функции function OnTransReply(trans_reply) . Если trans_reply.status == 3, значит всё Ок. Если >3 значит ничего не получилось.. Теперь возникает вопрос с тем, что повторно отосланный на сервер торговый приказ будет иметь уже другой "TRANS_ID", обработка которого при нормальном (без отказов) выполнении всех транзакций, в функции OnTransReply будет совсем другой. Так вот вопрос: Можно ли послать повторный приказ на сервер с тем же "TRANS_ID", что и раннее неудавшийся? Тогда бот просто не заметит неудавшуюся тразакцию и будет обрабатывать реплаи по "TRANS_ID" требующейся в алгоритме операции, а не по порядковому номеру транзакции?
Оказывается, что тут на форуме в ответах "продвинутых" можно набраться ошибок, которые поставят вас в тупик.. что и случилось. Неработающий код был собран из ответов на вопросы заданные в других темах. Там я почерпнул ложное знание о параметрах, передаваемых в транзакцию для снятия стопзаявок.
Привожу здесь правильный код, что бы другие могли это найти. Для снятия стопа в транзакции важно правильно заполнить два поля
O! Сам нашёл. Пытался передать в числовой тип таблицу с параметрами стопордера ))) Нужно получать значения стопордера из "stop_orders" в какую-нибудь таблицу..
any = { } Total = getNumberOf("stop_orders") for Index = 0, Total - 1 do any = getItem("stop_orders",Index) if bit.band(any.flags, 1) > 0 OrderNumber = any.order_num message("Стопзаявка № = "..tostring(OrderNumber).." активна",1) end end
Total = getNumberOf("stop_orders") for Index = 0, Total - 1 do OrderNumber = getItem("stop_orders",Index).order_num +0
перебирает стопзаявки в таблице далее желательно найти среди них активную. Для этого изобрёл во такой код
if bit.band(getItem("stop_orders",Index)["flags"],1)>0 then message("заявка активна",1) end
пытался обратиться к заявке не по индексу, а по номеру OrderNumber, полученному при переборе, но ничего не получается. А каждый раз перебирать не хочется. Как написать обращение к стопзаявке по её номеру с проверкой статуса?
В рабочем квике код работает, в демо тот же код не работает. Склоняюсь к проблеме с демоквиком. Возможно у меня тут глюки, но переустанавлмвать сегодня уже не буду. Оставлю до понедельника... но всё равно всёэто очень радостно..
function OnQuote(class_code, sec_code) message(tostring(p_classcode).." "..tostring(p_seccode),1) if class_code==p_classcode and sec_code==p_seccode then message(tostring(START_FLAG),1) tb=getQuoteLevel2(class_code, sec_code)
то замечательно выводит это в сообщении..
а второй оператор - мёртвый, то есть в if условие не выполняется..
Вечером только закончил отладку, как бот вообще перестал работать. Выяснилось, что функция
function OnQuote(class_code, sec_code) --message(tostring(START_FLAG),1) if class_code==p_classcode and sec_code==p_seccode then message(tostring(START_FLAG),1) tb=getQuoteLevel2(class_code, sec_code) OFFER_PRICE = tb.offer[1].price BID_PRICE = tb.bid[math.ceil(tb.bid_count-0)].price GRAPH_TAG = "MA_FAST" number_of_candles=getNumCandles(GRAPH_TAG) t,_,legend=getCandlesByIndex(GRAPH_TAG,0,number_of_candles-1,1) MA_F = t[0].close START_FLAG = true message(tostring(START_FLAG),1) end end
не работает. сообщения из первого оператора mtssage проходят, а из второго ещё нет. Днём работала, и на реальном счёте в реальном квике работает. Но вставлена в другой бот..
Может это случиться из-за того , что я напорол чего-то в другом месте программы? Вроде не счем не связана.. Или это сюрпризы демодоступа?