Господа, добрый день. Я запустил робота с большим количеством транзакций на срочном рынке. Я думал, что верно интерпретировал формулу подсчёта сбора за транзакции. Полагал, что у меня достаточное количество сделок, чтобы не попадать на этот штраф. Но всё же биржа мне начислила этот штраф: 2300 рублей. Прошу подсказать где ошибка в моём коде. По сути формула изложена в самом конце кода: sbor=0.1*(orders*2*1-(trades*comiss*40)) Вот так она выглядит на сайте биржи http://www.moex.com/a3825 Спасибо за помощь.
Код
function Sbor()
local order_line
count=0
for t=getNumberOf("orders"),1,-1 do
order_line=getItem("orders",t-1)
if order_line.class_code=="SPBFUT" then
count=count+1
end
end
orders=count
local deal_line
count=0
comiss=0
for t=getNumberOf("trades"),1,-1 do
trade_line=getItem("trades",t-1)
if trade_line.class_code=="SPBFUT" then
comiss=comiss+trade_line.exchange_comission
count=count+1
end
end
trades=count
sbor=0.1*(orders*2*1-(trades*comiss*40))
tbl:SetValue(1,'sbor', orders.." | "..trades.." | "..comiss.." | "..sbor)
return orders,trades,comiss
end
Let_it_go, Не совсем понятно в чем именно вопрос. В том что Ваши расчеты за сбор не совпадают с биржевыми (тогда вопрос к бирже)? или в том что Вы подали больше неэффективных транзакций чем ожидалось (тогда вопрос к Вам, зачем подавать столько не эффективных транзакций)?
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Let_it_go, Тогда ищите ошибку в формуле. почему у Вас идет умножение на два? И почему Вы умножаете комиссию на количество сделок? в формуле на которую Вы указали этого нет.
Sergey Gorokhov написал: Let_it_go , Тогда ищите ошибку в формуле. почему у Вас идет умножение на два? И почему Вы умножаете комиссию на количество сделок? в формуле на которую Вы указали этого нет.
умножение на два потому что транзакцией считается выставление-снятие. Поэтому я количество заявок умножаю на два.
во-первых непонятно зачем умножаете на 2 и на 1, с математической точки зрения умножение на 1 бессмысленно, во-вторых количество заявок не гарантирует что Вы учли все транзакции, некоторые транзакции могут отвергаться, а я предполагаю, что биржа их тоже учитывает, поэтому Вам нужно считать не количество успешно выставленных заявок, а количество дошедших до биржи транзакций, например через OnTransReply (подробнее см. в справке по Qlua, фильтруйте транзакции по полю status в ответе на транзакцию, чтобы понять какие транзакции дошли до биржи, а значит были учтены ей).
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
и Вы не ответили на второй вопрос. Зачем идет умножение количества сделок на сумму комиссий?
k – балл для транзакции, определенный в соответствии с таблицей 1; f – сбор, уплаченный за заключение сделки; l – балл для сделки, определенный в соответствии с таблицей 1.
параметр f я беру из таблицы моих сделок (столбец комиссия) и умножаю его на величину l l=количество сделок умноженное на балл. В моём случае балл равен 40.
Sergey Gorokhov написал: на мой взгляд, это не так критично как это
ЦитатаLet_it_go написал: trades*comiss
Да, действительно, trades здесь однозначно лишнее.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
function Sbor()
local order_line
count=0
for t=getNumberOf("orders"),1,-1 do
order_line=getItem("orders",t-1)
if order_line.class_code=="SPBFUT" then
count=count+1
end
end
orders=count
local deal_line
count=0
comiss=0
for t=getNumberOf("trades"),1,-1 do
trade_line=getItem("trades",t-1)
if trade_line.class_code=="SPBFUT" then
comiss=comiss+(trade_line.exchange_comission*0.5)
count=count+1
end
end
trades=count
sbor=0.1*(orders*2-comiss*40)
tbl:SetValue(1,'sbor', orders.." | "..trades.." | "..comiss.." | "..sbor)
return orders,trades,comiss
end
Кроме того, есть ещё сбор за ошибочные транзакции. Это когда транзакция отклоняется по тем или иным причинам. Например, не хватило средств для новой заявки или была попытка снять/переставить заявку после её исполнения.
Выше правильно написали: вам нужно считать не количество заявок, а количество транзакций: поставил заявку - одна транзакция, снял - другая транзакция, move - ещё одна транзакция. Из http://www.moex.com/a3825 не понятно, учитывает ли методология расчёта ошибочные транзакции в общем количестве неэффективных транзакций.
Надо делать так, как надо. А как не надо - делать не надо.