Зарегистрировался для развития на форуме Арки и в разделе по программированию на Луа нашел код (
https://forum.quik.ru/forum10/topic5664/)
Смысл в том, что автор хочет продавать актив поштучно пока в портфеле не останется какое-то количество бумаг.
На мой взгляд полезная вещь.
Когда я его попробовал на демо квике, то начались бесконечные продажи (как и у автора).
Судя по записям, проблема не решена.
Может кто подскажет как решить вопрос?
<code class="rainbow" data-language="lua"> while stopped == false do
Quotes_1 = getQuoteLevel2("SPBFUT", "SRU0")
Bid_Count_1 = tonumber(Quotes_1.bid_count)
if Bid_Count_1>1 then
aa= tonumber(Quotes_1.bid[Bid_Count_1].quantity)
SetCell(Table, 1, 1, tostring(aa))
end
local asset = getFuturesHolding("SPBFUT", "SPBFUT****","SRU0",0).totalnet
repeat
if aa>1 and asset>0 then
local ID_B_Order=10
local OrderSell = {
["ACTION"]="NEW_ORDER",
["ACCOUNT"]= "SPBFUT****",
["OPERATION"] = "S",
["CLASSCODE"]="SPBFUT",
["SECCODE"] = "SRU0",
["PRICE"] = "0",
["QUANTITY"] = tostring(1),
["TRANS_ID"] = tostring(ID_B_Order),
["TYPE"] = "M",
}
local Err_Order = sendTransaction(OrderSell)
message(Err_Order)
end
asset=asset-1
sleep(1000)
until asset==5<br />end</code>
начало цикла
P.S. только обычно такую конструкцию не используют
гораздо понятней while is_run do end
в данном коде достаточно поставить после цикла repeat остановку while
типа
stopped = true (или любое число или символ)
т.е. последняя строка примет вид
останется 5 бумаг, если все транзакции сработают. Если нужен контроль за их исполнением, то написали ниже как это делать
Алгоритм примерно такой:
1. Отправляем заявку на продажу. Скрипт запоминает trans_id этой заявки.
2. Через колбек OnOrder получаем информацию о всех заявках. Смотрим, когда у заявки с запомненным trans_id статус поменяется на «исполнена».
3. Как только заявка с запомненным trans_id исполнена, отправляем новую заявку
Врач-бондиатОр, смотрите, тут уже писали, собираю все в кучу.
у Вас в коде
запрашиваете стакан и первую цену бида (но почему то только один раз)
снова один раз запрашиваете количество бумаг
дальше
repeat — until — он заходит в цикл в любом случае один раз… не понятно, почему именно этот вид цикла выбран… ну ладно...
что надо сделать:
1. завести еще одну переменную, в ней хранить номер (trans_id) отправляемой заявки. В Вашем коде каждой заявке Вы присваиваете один и тот же номер. Квик такое пропускает, но в этом нет смысла.
2. Добавить обработку колбека OnOrder, чтобы он сбрасывал в ноль хранимый номер.
т.е. код должне выглядеть примерно так:
т.е. если Active_Trans_Id равен 0, но программа отправляет заявку и присваитвает переменной Active_Trans_Id номер заявки.
В следующем проходе никакая заявка отправляться не будет, так как Active_Trans_Id не равен 0.
Колбек OnOrder смотрит, прошла ли заявка с номером Active_Trans_Id и если прошла, обнуляет Active_Trans_Id.
P.S. код писал в блокноте, не проверял. Под номером заявки, имею ввиде Trans_Id
На случай крайний поменяйте логику условия.