простенький робот со скользяшками.
интересующие куски кода:
вопрос у меня следующего характера. сигналы получаю по идентификатору скользяшки.
НО! функция 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 |
как мне контролировать, чтобы только одна заявка заявка выставлялась?