Так на всякий случай спрошу, если я куплю фьюч по рынку, затем через 2 минуты, ещё раз докуплю фьюч, я увижу среднюю цену позиции в эффект.цена.поз? или в другом месте нужно смотреть?
Так на всякий случай спрошу, если я куплю фьюч по рынку, затем через 2 минуты, ещё раз докуплю фьюч, я увижу среднюю цену позиции в эффект.цена.поз? или в другом месте нужно смотреть?
Да, верно, это и есть Средневзвешенная цена открытия.
Так на всякий случай спрошу, если я куплю фьюч по рынку, затем через 2 минуты, ещё раз докуплю фьюч, я увижу среднюю цену позиции в эффект.цена.поз? или в другом месте нужно смотреть?
Да, верно, это и есть Средневзвешенная цена открытия.
погуглил что да как вродь всё правильно написал, но пишет nil позиция открыта, в лонг. tas=TABLE getFuturesHolding("SPBFUT","70180ZB", "SiM9",4) message (tostring(tas))
Так на всякий случай спрошу, если я куплю фьюч по рынку, затем через 2 минуты, ещё раз докуплю фьюч, я увижу среднюю цену позиции в эффект.цена.поз? или в другом месте нужно смотреть?
Да, верно, это и есть Средневзвешенная цена открытия.
погуглил что да как вродь всё правильно написал, но пишет nil позиция открыта, в лонг. tas=TABLE getFuturesHolding("SPBFUT","70180ZB", "SiM9",4) message (tostring(tas))
В параметре мы допустили опечатку. Правильно так: avrposnprice
Благодарю вас! так заработало. только я до сих пор не понимаю, почему в "Таблица моих сделок" цена одна купли, а по эффект.цена позиции другая. я уже не понимаю на какую мне смотреть)))
Sergey, Этот параметр считает и транслирует биржа, можете поинтересоваться у нее какая формула расчета. В биржевом потоке это параметр waprice из таблицы position потока FORTS_POS_REPL
Sergey Gorokhov написал: Sergey, Этот параметр считает и транслирует биржа, можете поинтересоваться у нее какая формула расчета. В биржевом потоке это параметр waprice из таблицы position потока FORTS_POS_REPL
И снова я к вам вернулся)) в общем протестил что да как, и вот что выходит перед покупкой с прошлой сделки в "эффект.цена позиции" осталась цена 65212 (позиций нет) short по маркету. в "Таблица заявок" цена 65103 а в "эффект.цена позиции" цена стала 65209(это средняя цена всех предыдущих сделок как я понял), такой цены в стакане в Bid Ask нет. так что это не то что нужно =(( мне нужна текущая цена текущей позиции.
Sergey написал: так что это не то что нужно =(( мне нужна текущая цена текущей позиции.
Что Вы понимаете под "текущая цена текущей позиции"? биржа транслирует то что Вам нужно, если да в каком параметре? Следует понимать что на срочном рынке (в отличии от фондового и валютного рынков), позиции ведет и транслирует биржа, а не QUIK. Следовательно если биржа не транслирует нужную Вам цифру то и в QUIK ее нет.
Sergey написал: так что это не то что нужно =(( мне нужна текущая цена текущей позиции.
Что Вы понимаете под "текущая цена текущей позиции"? биржа транслирует то что Вам нужно, если да в каком параметре? Следует понимать что на срочном рынке (в отличии от фондового и валютного рынков), позиции ведет и транслирует биржа, а не QUIK. Следовательно если биржа не транслирует нужную Вам цифру то и в QUIK ее нет.
Окей тогда я проще опишу) фьюч, я допустим, покупаю по 105, затем через минуту я покупаю по 107, средняя цена у меня будет 106, а перед этим я делал ещё 100 сделок, так вот в чём вопрос, как мне получить цифру 106, моей текущей позиции. смысл в том, что я покупаю по маркету, и сразу же выставляю стоп, ну а стоп мне нужно выставить ОТ цены моей позиции +- прибыль - убыток
Sergey написал: Окей тогда я проще опишу)фьюч, я допустим, покупаю по 105, затем через минуту я покупаю по 107, средняя цена у меня будет 106, а перед этим я делал ещё 100 сделок, так вот в чём вопрос, как мне получить цифру 106, моей текущей позиции.смысл в том, что я покупаю по маркету, и сразу же выставляю стоп, ну а стоп мне нужно выставить ОТ цены моей позиции +- прибыль - убыток
Получилось только способом перебора строк в таблице сделок (с последних) до совпадения с текущей позицией. Цены сделок пройденных строк суммируются (с минусом для шортов) и делится всё на текущий открытый объём (шортовая позиция с минусом). За 100% точность вычисления не ручаюсь. Вопросы в точности возникают при перевороте позиции бОльшим объёмом. Тут нужно проверять. Ну и если сделок в trades уже нет, то ничего не получится. Но это хоть что-то...
Код
SEC = "SiU9"
function GetPosePrice(sec) -- Расчёт средней цены от конца таблицы сделок до совпадения суммарных объёмов с объёмом текущей позиции (лонги - плюс; шорты - минус)
local sumVol, sumPriceVol = 0, 0
for i=getNumberOf("trades")-1,0,-1 do
local dealTblLine = getItem("trades", i)
if dealTblLine ~= nil and type(dealTblLine) == "table" then
if dealTblLine.sec_code == sec then --and dealTblLine.account == ACCOUNT then
if Tradeflags2table(dealTblLine.flags).operation == "B" then -- B
sumPriceVol = sumPriceVol + dealTblLine.qty * dealTblLine.price
sumVol = sumVol + dealTblLine.qty
else -- S
sumPriceVol = sumPriceVol + dealTblLine.qty * dealTblLine.price * (-1)
sumVol = sumVol + dealTblLine.qty * (-1)
end
-- message("qty = " .. tostring(dealTblLine.qty) .. "; price = " .. tostring(dealTblLine.price) .. "; sumVol = " .. tostring(sumVol) .. "; sumPriceVol = " .. tostring(sumPriceVol), 1)
end
end
if (sumVol == curQuikPoseVol) then -- Если объём во всех осмотренных строках сделок равен нужному
if tonumber(sumPriceVol) and ((tonumber(sumVol) or 0) ~= 0) then
-- message("Выход 1", 1)
return sumPriceVol / sumVol
else
-- message("Выход 2", 1)
return nil
end
end
end
message("Недостаточно записей в таблице сделок для определения средней цены позиции", 1)
return nil -- Нужный объём по имеющимся записям сделок не подобран
end
function GetPoseVol() -- Получение текущей позиции
local i
for i=getNumberOf("futures_client_holding")-1,0,-1 do
if getItem("futures_client_holding",i)["sec_code"] == SEC then
return tonumber(getItem("futures_client_holding",i)["totalnet"])
end
end
return nil
end
function Tradeflags2table(flags) -- Определение направления сделки
-- operation("B" for Buy, "S" for Sell)
local t={}
local band=bit.band
if band(flags, 4)~=0 then t.operation="S" else t.operation='B' end
return t
end
function main()
message("Скрипт запущен", 1)
curQuikPoseVol = GetPoseVol()
if (tonumber(curQuikPoseVol) or 0) ~= 0 then
curQuikPoseAvgPrice = GetPosePrice(SEC)
if (tonumber(curQuikPoseAvgPrice) or 0 > 0) then
message("Текущий объём = " .. tostring(curQuikPoseVol) .. "; Средняя цена позиции = " .. tostring(curQuikPoseAvgPrice), 1)
end
elseif curQuikPoseVol == 0 then
message("Открытая позиция отсутствует", 1)
end
message("Скрипт остановлен", 1)
end