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