простенький робот со скользяшками.
интересующие куски кода:
вопрос у меня следующего характера. сигналы получаю по идентификатору скользяшки.
НО! функция OnOrder срабатывает три или четыре раза с одинаковыми флагами
вот возвращаемая таблица по функции
withdraw_datetime={week_day=1;hour=0;ms=0;mcs=0;day=1;month=1;sec=0;year=1601;
min=0;};price=10242;value_entry_type=0;balance=0;repo_value_balance=0;value=20
484;qty=2;passive_only_order=0;class_code=SPBFUT;activation_time=0;userid=*****;expiry=-1;flags=28;linkedorder=0;ordernum=********;sec_code=SRH6;s
ide_qualifier=0;client_code=********;firmid=SPBFUT;datetime={week_day=2;hour=13
;ms=937;mcs=937000;day=15;month=12;sec=52;year=2015;min=13;};yield=0;reject_re
ason=;capacity=0;acnt_type=0;repo2value=0;start_discount=0;min_qty=0;ext_order
_flags=0;exec_type=0;order_num=******;repovalue=0;repoterm=0;accruedint=0
;account=******;seccode=SRH6;uid=******;brokerref=********;exchange_code=;settl
ecode=;price2=0;trans_id=1;bank_acc_id=;
и таких строчек несколько. соответственно несколько.
временами заявка срабатывает, а таблица FUTURES_CLIENT_HOLDINGS не обновляет количество в позиции и выставляется новая заявка, которая превышает лимит по возможному количеству.
возврат количества
как мне контролировать, чтобы только одна заявка заявка выставлялась?
интересующие куски кода:
Код |
---|
TRANS_ID = 1 function main() while is_run do sleep(350) robot() end end function robot() --сигнал на вход if (price ~= 0) and (need_order) and (quantity_total() < Maximum_quantity) and (quantity_total() > 0-Maximum_quantity) then --проверка на цену, необходимость выставления заявки и что текущее количество не больше разрешенного для лонга/шорта SetOrder("B", price, 1) --выставляем заявку need_order = false --условие, что есть заявка, то новую не ставим end end function SetOrder(type, price, qua) -- подать заявку Status = tonumber(getParamEx(ClassCode, SecCode, "status").param_value); if (Status ~= 1) then writeToLog("Status of " .. SecCode .. " is " .. Status) return end if (qua == 0) then writeToLog("QUANTITY is 0") return end if (price == 0) then writeToLog("Price is 0") return end local trans = { ["CLASSCODE"]=ClassCode, ["SECCODE"]=SecCode, ["ACTION"]="NEW_ORDER", ["ACCOUNT"]=ACCOUNT, ["CLIENT_CODE"]=CLIENT_CODE, ["TYPE"]="L", ["OPERATION"]=type, ["QUANTITY"]=tostring(qua), ["PRICE"]=tostring(price), ["TRANS_ID"]=TRANS_ID } local res = sendTransaction(trans) end function OnOrder(trans_reply) -- обработка событий по заявке nord = trans_reply["order_num"] -- номер заявки ORDERNUM if nord==nil or nord==0 or nord=="0" then message("Заявка не выставилась",1) need_order = true return elseif tostring(trans_reply["trans_id"]) == tostring(TRANS_ID) then writeToLog(table2string(trans_reply)) if trans_reply["flags"] == 24 or trans_reply["flags"] == 26 or trans_reply["flags"] == 28 then if trans_reply["balance"] == 0 then need_order = true --здесь условие, что выставленная заявка выполнилась и дальше контроль только на превышение разрешенного от депо end end end end |
вопрос у меня следующего характера. сигналы получаю по идентификатору скользяшки.
НО! функция OnOrder срабатывает три или четыре раза с одинаковыми флагами
вот возвращаемая таблица по функции
withdraw_datetime={week_day=1;hour=0;ms=0;mcs=0;day=1;month=1;sec=0;year=1601;
min=0;};price=10242;value_entry_type=0;balance=0;repo_value_balance=0;value=20
484;qty=2;passive_only_order=0;class_code=SPBFUT;activation_time=0;userid=*****;expiry=-1;flags=28;linkedorder=0;ordernum=********;sec_code=SRH6;s
ide_qualifier=0;client_code=********;firmid=SPBFUT;datetime={week_day=2;hour=13
;ms=937;mcs=937000;day=15;month=12;sec=52;year=2015;min=13;};yield=0;reject_re
ason=;capacity=0;acnt_type=0;repo2value=0;start_discount=0;min_qty=0;ext_order
_flags=0;exec_type=0;order_num=******;repovalue=0;repoterm=0;accruedint=0
;account=******;seccode=SRH6;uid=******;brokerref=********;exchange_code=;settl
ecode=;price2=0;trans_id=1;bank_acc_id=;
и таких строчек несколько. соответственно несколько.
временами заявка срабатывает, а таблица FUTURES_CLIENT_HOLDINGS не обновляет количество в позиции и выставляется новая заявка, которая превышает лимит по возможному количеству.
возврат количества
Код |
---|
function quantity_total() --подсчет количество позиций local q_total=0 for i = 0,getNumberOf("FUTURES_CLIENT_HOLDINGS") - 1 do if getItem("FUTURES_CLIENT_HOLDINGS",i).sec_code == SecCode then -- ЕСЛИ строка по нужному инструменту q_total = getItem("FUTURES_CLIENT_HOLDINGS",i).totalnet if q_total== nil then return 0 else return q_total -- возвращаем количество позиций end end; end; return 0 end |
как мне контролировать, чтобы только одна заявка заявка выставлялась?