Виталий (Автор тем)

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

Страницы: 1
Функция выставления тейк профита, Ошибка в выставлении профита
 
Добрый день.
При выставлении заявки выставляется стоп-профит на нужный уровень, но потом с интервалом пару секунд заявка профита снимается и ставится на том же уровне. Подскажите пожалуйста как исправить?
Спасибо.
function ProfitControl(posNow,acc,emit,class,file)
   local function fn1(param1,param2,param3)
       if(param1==acc and  param2==emit and param3==class)then
           return true
       else
           return false
       end
   end
   local step = tonumber(getParamEx(class,emit,"SEC_PRICE_STEP").param_value)
   local EnterPrice = RoundForStep(EnterPriceUni(posNow,emit,class,acc),step)
   local profitPrice = EnterPrice + SignFunc(posNow) * Profit * step
   local ProfCorrect = false      
   local count = 0
   local index =  SearchItems("stop_orders", 0, getNumberOf("stop_orders")-1, fn1, "account,sec_code,class_code")
   if(index~=nil)then
       for i=1,#index do
           local row = getItem("stop_orders",index[i])
           local flag = bit.band(row.flags,1)    --проверяем активна заявка или нет
           if(flag>0)then
               if(row.stop_order_type~=6 or ProfCorrect==true)then    --6 тип тейк профит
                   local keyNumber = row.order_num
                   DeletProfitByNumber(emit,class,keyNumber,file)
                   count = count + 1
               else
                   local qtyX = row.qtyX
                   local profitPriceX = RoundForStep(row.condition_price,step)    
                   local buySellX = row.condition
                   local signPosX = 0
                   if(buySellX<=4)then                
                       signPosX = -1              
                   elseif(buySellX>=5)then          
                       signPosX = 1              
                   end
                   if(signPosX==SignFunc(posNow) and qtyX==math.abs(posNow) and profitPriceX==profitPrice)then
                       ProfCorrect = true
                   else
                       local keyNumber = row.order_num
                       DeletProfitByNumber(emit,class,keyNumber,file)
                       count = count + 1
                   end
               end
           end
       end
   end
   if(ProfCorrect==false and posNow~=0)then
       local profitSpread = 30 * step
       if(posNow>0)then
           buySell = "S"
       else
           buySell = "B"
       end
       NewStopProfit(acc,emit,class,buySell,math.abs(posNow),profitPrice,0,profitSpread,file,"Функция ProfitControl")
       count = count + 1
   end
   return count
end
Функция нахождения цены входа, Ошибка: attempt to call global 'EnterPriceUni' (a nil value)
 
При написании функции выставления стоп-профит заявки ошибка определения цены входа в строке "local PNnext = PN - direct*qty"
Подскажите пожалуйста где ошибка.
function EnterPriceUni(posNow,emit,class,acc)
   if(posNow==0)then
       return 0
   end
   local function fn1(param1,param2)
       if(param1==acc and  param2==emit)then
           return true
       else
           return false
       end
   end
   local index =  SearchItems("trades", 0, getNumberOf("trades")-1, fn1, "account,sec_code")
   local PN = posNow
   local Sum = 0
   if(index~=nil)then
       for i=#index,1,-1 do
           local row = getItem("trades",index[i])
           local direct
           if(bit.band(row.flags,4)>0)then
               direct = -1    --для продажи
           else
               direct = 1    --для покупки
           end
           local price = row.price
           local qty = row.qty
           local PNnext = PN - direct*qty                      --сдесь ошибка
           if(SignFunc(PNnext)~=SignFunc(PN))then
               Sum = Sum + direct*SignFunc(posNow)*price*math.min(qty,math.abs(PN))
               return Sum/math.abs(posNow)
           else
               Sum = Sum + direct*SignFunc(posNow)*price*qty
           end
           PN = PNnext
       end
   end
   return 0
end
Страницы: 1
Наверх