| Цитата |
|---|
| 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
|