Vic (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
получить текущую эффективную цену позиции
 
Цитата
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
Страницы: 1
Наверх