Сергей Качурин (Автор тем)

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

Страницы: 1
OnTransReply по стоп заявкам
 
Здравствуйте

Брокер ВТБ. Акции.

Почему-то не приходят OnTransReply при попытке ПОМЕНЯТЬ стоп.
То есть ставится  корректно всегда. Снимается корректно, а вот при попытке поставить сразу же новый OnTransReply не приходит и стоп не ставится.

Алгоритм такой: при входе ставим стоп -> при изменении цены удаляем стоп -> сразу же ставим новый.

Установка сейчас уже происходит так:
Ждем ответа 10 раз по 100 мл сек — ответ не пришел, значит считаем, что он негативный/или пришел негативный — идем в таблицу и 3 раза ее перебираем с небольшой паузой в поисках активного стопа по нашему инструменту — не находим, то отправляем новый !!! и вся процедура повторяется ( и так 5 раз) . На 6й раз — убиваем позицию и работаем дальше (предполагается, что без ошибок)

И все равно - ответа нет - 8 секунд !! (фото Меняем стопы)
фото 2 - бесчинства брокера (вероятно)

Как быть? Менять брокера (вроде как стоп-заявки на его сервере обрабатываются) ?
Или может быть косяк в коде (функция стопов вынесена отдельно - к ней идет просто обращение абсолютно идентичное в 1й после открытия позиции и последующие разы) ?

Прошу совета профессионалов.

.
"Засыпание" скриптов, Имею три работающих скрипта на Lua, которые периодически (раз в пару дней кто-нибудь из них точно) "засыпают"
 
Здравствуйте!

Имею три работающих скрипта на Lua, которые периодически (раз в пару дней кто-нибудь из них точно) "засыпают" - перестают выдавать проверочные сообщения, но на другие "раздражители" реагируют. (фото 2 - нормальная работа, фото 1 - "засыпание")

Основная проблема в том, что, если сделка случается в таком состоянии скрипта, она всегда заканчивается кучей сообщений с ошибками (типа:  Не могу снять стоп-заявку. Пришел статус 4. и подобными). Хотя в нормальном состоянии скрипта сделки проходят корректно.

Сам скрипт достаточно большой - вот самое парадоксальное место: как видно на фото скрипт игнорирует сообщение каждые 15 минут, но реагирует на закрытие торгового дня !

обе функции так и стоят рядом, в корне основного потока. Ни на какие дополнительные условия не завязаны.



Буду признателен за любую помощь в решении этой загадки
Код
--===============================================
 
   if Here == 0 then  --- сообщение каждые 15 минут. с запомнеными параметрами 
      Here = math.floor(os.clock())
      
   elseif math.floor(os.clock()) == Here + 900 then 
      Here = math.floor(os.clock())
      message ("SBER. I`m here! every 15 min", 1)
      
      message("StartUP - "..tostring(StartUP), 1)
      message("tp[0].open - "..tostring(tp[0].open), 1)
      
      message("StartDOWN - "..tostring(StartDOWN), 1)
      sleep(50)
      
   end
--===============================================   
-- проверка TIME
   local Time = integer
   dt = os.date()        -- системная функция времени/даты
    ddt = string.sub(dt, 10, 14)    -- берем нужные графы
    if ddt == "18:44" then Time = 1      -- тут ставим время выхода из позиций LastOpenBarIndex = DS:Size()
      while Time == 1 do
         to_log("trade day ends ".." close "..tostring(count).." lot(s)")
         message ("SBER trade day ends ".." close "..tostring(count).." lot(s)",1)
         if count > 0 then
            Trade("S",count,lastPrice-p_spread) 
            count = 0
            stv.SetVar("count", 0) 
            if SP == 1 then
               Rem_ST_TP(ST_orderNum)
            end
         end   
         if count < 0 then
            Trade("B",math.abs(count),lastPrice+p_spread)
            count = 0
            stv.SetVar("count", 0) 
            if SP == 1 then
               Rem_ST_TP(ST_orderNum)
            end
         end
         Time = 0
         sleep(900000)  -- 15 минут спим,чтобы недопустить вход до конца торг. сессии
      end
   elseif ddt == "10:00" then
      LastOpenBarIndex = DS:Size()
   end   
BULLS & BEARS, как получить линию разности быков и медведей с помощью индикаторов на Луа
 
Здравствуйте.

Пытаюсь слегка изменить выложенные разработчиком индикаторы: получить Линию разности Быков и Медведей..
Соединил их вместе:

Думал, BULLS() возвращает значение (но если tostring, то печатает "function: F028E025" - примерно, tonumber - nil).

Предположил, что значение сидит в Out (func = Out1- Out2), но выходит nil, а дальше ошибка, что ожидается число..Вроде логично, ведь период 13 и первые 12 значений скорее всего пустые.
Убрал под if Out1~=nil and Out2~=nil .. и вот тут началось самое интересное - индикатор просто пропал из списка доступных индикаторов!
Возможно, это встроенная защита от ошибок ..
Джуниор 7.0.0.289

Подскажите, пожалуйста, начинающему в чём ошибка.

Код
Settings = {
Name = "*line_1", 
round = "off",
Period = 13, 
Metod = "EMA", --SMA, EMA, VMA, SMMA, VMA 
VType = "Close", --Open, High, Low, Close, Volume, Median, Typical, Weighted, Difference 
line = {
      Name = "LINE", 
      Type = TYPE_LINE, 
      Color = RGB(255, 0, 0)
      }
}
   
function Init() 
   func1 = BULLS()
   func2 = BEARS()
   message (tostring(Out1), 1)
   if Out1~=nil and Out2~=nil
      func = Out1- Out2
   end
   return #Settings.line
end

function OnCalculate(Index) 
   return func1(Index, Settings) and func2(Index, Settings)
end

function BULLS() --Bulls Power ("BULLS")
   local Bulls_MA=MA()
return function (I, Fsettings, ds)
local Out1 = nil
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 13)
local M = (Fsettings.Metod or "EMA")
local VT = (Fsettings.VType or "Close")
local R = (Fsettings.round or "off")
local b_ma = Bulls_MA(I, {Period=P, Metod = M, VType=VT, round=R}, ds)
if I>=P and b_ma then
   Out1 = Value(I, "High", ds)-b_ma
else Out1 = b_ma end
   return rounding(Out1, R),0
end
end

function BEARS() --Bears Power ("BEARS")
   local Bears_MA=MA()
return function (I, Fsettings, ds)
local Out2 = nil
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 13)
local M = (Fsettings.Metod or "EMA")
local VT = (Fsettings.VType or "Close")
local R = (Fsettings.round or "off")
local b_ma = 0

b_ma=Bears_MA(I, {Period=P, Metod = M, VType=VT, round=R}, ds)
if I>=P and b_ma then
   Out2 = Value(I, "Low", ds)-b_ma
else Out2 = b_ma end
   return rounding(Out2, R),0
end
end

function MA() --Moving Average ("MA")
local t_SMA = F_SMA()
local t_EMA = F_EMA()
local t_VMA = F_VMA()
local t_SMMA = F_SMMA()
local t_WMA = F_WMA()
return function(I, Fsettings, ds)
   local Out = nil
   local Fsettings=(Fsettings or {})
   local P = (Fsettings.Period or 9)
   local M = (Fsettings.Metod or "EMA")
   local VT = (Fsettings.VType or "Close")
   local R = (Fsettings.round or "off")
   if M == "SMA" then
      Out = t_SMA(I, P, VT, ds, R)
   elseif M == "EMA" then
      Out = t_EMA(I, P, VT, ds, R)
   elseif M == "VMA" then
      Out = t_VMA(I, P, VT, ds, R)
   elseif M == "SMMA" then
      Out = t_SMMA(I, P, VT, ds, R)
   elseif M == "WMA" then
      Out = t_WMA(I, P, VT, ds, R)
   else
      Out = nil
   end
   return rounding(Out, R)
end
end
------------------------------------------------------------------
--Moving Average SMA, EMA, VMA, SMMA, VMA
------------------------------------------------------------------
--[[Simple Moving Average (SMA)
SMA = sum(Pi) / n
]]
function F_SMA()
return function (I, Period, VType, ds, round) 
local Out = nil
   if I >= Period then
      local sum = 0
      for i = I-Period+1, I do
         sum = sum +Value(i, VType, ds)
      end
      Out = sum/Period
   end 
   return rounding(Out,round)
end
end

--[[Exponential Moving Average (EMA)
EMAi = (EMAi-1*(n-1)+2*Pi) / (n+1)
]]
function F_EMA() 
local EMA_TMP={}
return function(I, Period, VType, ds, round)
local Out = nil
   if I == 1 then
      EMA_TMP[I]=rounding(Value(I, VType, ds),round)
   else
      EMA_TMP[I]=rounding((EMA_TMP[I-1]*(Period-1)+2*Value(I, VType, ds)) / (Period+1),round)
      EMA_TMP[I-2]=nil
   end
   
   if I >= Period then
      Out = EMA_TMP[I]
   end
   return rounding(Out,round)
end
end

--[[
William Moving Average (WMA)
( Previous WILLMA * ( Period - 1 ) + Data ) / Period
]]
function F_WMA()
   local WMA_TMP={}
return function(I, Period, VType, ds, round)
local Out = nil
   if I == 1 then
      WMA_TMP[I]=rounding(Value(I, VType, ds),round)
   else
      WMA_TMP[I]=rounding((WMA_TMP[I-1]*(Period-1)+Value(I, VType, ds)) / Period,round)
     WMA_TMP[I-2]=nil
   end
   if I >= Period then
      Out = WMA_TMP[I]
   end
   return rounding(Out,round)
end
end

--[[Volume Adjusted Moving Average (VMA)
VMA = sum(Pi*Vi) / sum(Vi)
]]
function F_VMA()
return function (I, Period, VType, ds, round)
local Out = nil
   if I >= Period then
      local sum = 0
      local sumV = 0
      for i = I-Period+1, I do
         sum = sum +Value(i, VType, ds)*Value(i, "Volume", ds)
         sumV = sumV +Value(i, "Volume", ds)
      end
      Out = sum/sumV
   end
   return rounding(Out,round)
end
end

--[[Smoothed Moving Average (SMMA)
SMMAi = (sum(Pi) - SMMAi-1 + Pi) / n
]]
function F_SMMA()
local SMMA_TMP={}
return function(I, Period, VType, ds, round)
local Out = nil
   if I >= Period then
      local sum = 0
      for i = I-Period+1, I do
         sum = sum +Value(i, VType, ds)
      end
      
      if I == Period then
         SMMA_TMP[I]=rounding((sum-Value(I, VType, ds)+Value(I, VType, ds)) / Period, round)
      else
         SMMA_TMP[I]=rounding((sum-SMMA_TMP[I-1]+Value(I, VType, ds)) / Period, round)
      end
      SMMA_TMP[I-2]=nil
      Out = SMMA_TMP[I]
   end
   return rounding(Out,round)
end
end


function rounding(num, round) 
if round and string.upper(round)== "ON" then round=0 end
if num and tonumber(round) then
   local mult = 10^round
   if num >= 0 then return math.floor(num * mult + 0.5) / mult
   else return math.ceil(num * mult - 0.5) / mult end
else return num end
end

function Value(I,VType,ds) 
local Out = nil
VType=(VType and string.upper(string.sub(VType,1,1))) or "A"
   if VType == "O" then      --Open
      Out = (O and O(I)) or (ds and ds:O(I))
   elseif VType == "H" then    --High
      Out = (H and H(I)) or (ds and ds:H(I))
   elseif VType == "L" then   --Low
      Out = (L and L(I)) or (ds and ds:L(I))
   elseif VType == "C" then   --Close
      Out = (C and C(I)) or (ds and ds:C(I))
   elseif VType == "V" then   --Volume
      Out = (V and V(I)) or (ds and ds:V(I)) 
   elseif VType == "M" then   --Median
      Out = ((Value(I,"H",ds) + Value(I,"L",ds)) / 2)
   elseif VType == "T" then   --Typical
      Out = ((Value(I,"M",ds) * 2 + Value(I,"C",ds))/3)
   elseif VType == "W" then   --Weighted
      Out = ((Value(I,"T",ds) * 3 + Value(I,"O",ds))/4) 
   elseif VType == "D" then   --Difference
      Out = (Value(I,"H",ds) - Value(I,"L",ds))
   elseif VType == "A" then   --Any
      if ds then Out = ds[I] else Out = nil end
   end
return Out
end
Снятие стоп-заявок, ответ на транзакцию
 
снимаю стоп-заявку по номеру  - примерно каждый 4й -5й раз приходит Статус "4", но заявка снимается. Причем сразу после сообщения о снятии заявки.. Не могу понять как с этим бороться.
Код
-- СНИМАЕМ СТОПЫ 
function Rem_ST_TP(ST_orderNum)
   trans_id = trans_id + 1
   message("2 ST_orderNum"..ST_orderNum, 1)
   local transaction={
                    ["TRANS_ID"] = tostring(trans_id),
                    ["ACTION"] = "KILL_STOP_ORDER",
                    ["CLASSCODE"] = p_classcode,
                    ["SECCODE"] = p_seccode,
               ["STOP_ORDER_KEY"] = tostring(ST_orderNum+0),
               ["COMMENT"]             = "ТЭЙК-ПРОФИТ и СТОП-ЛОСС"   
   }
    local res=sendTransaction(transaction)
   message ("res "..tostring(res), 1)   
   while is_run and trans_Status == nil do 
      sleep(10);
   end;
    
   -- Запоминает значение
    local Status = trans_Status;
   -- Очищает глобальную переменную
    trans_Status = nil;
    -- Если транзакция не выполнена по какой-то причине
   if Status ~= 3 then
      -- Выводит сообщение с ошибкой
      message("Status ~= 3: "..tostring(Status) ..". Снятие ПРОФИТ-ЛОСС не удалось!\nОШИБКА: "..trans_result_msg);
     
      -- Возвращает FALSE
      -- return false;
   else
      -- Выводит сообщение
      message('Снят ТЭЙК & ЛОСС: '..trans_id);
      OrderNum_CLOSE = nil;
     SP = 0
     ST_orderNum = nil
   end;
   
end
Вот такие сообщения приходят: в порядке поступления - сверху вниз

14:22:01  2 ST_orderNum"..ST_orderNum
14:22:01
14:22:01 Стоп-заявка с № [ST_orderNum] снята.
14:22:01 Не удается снять стоп-заявку № [ST_orderNum].
14:22:01 Status ~= 3: 4. Снятие ПРОФИТ-ЛОСС не удалось! ОШИБКА: Не удается снять стоп-заявку № [ST_orderNum].

Получается, что OnTransReply отвечает мне дважды на один и тот же запрос?...но запрос то один..

Расскажите, пожалуйста, как это победить и как работает логика ответа на транзакции в  Quik ?
Значение поля "номер стоп-заявки", Выдает ошибку всеми возможными способами
 
Получаю номер стоп заявки из таблицы и пытаюсь ее снять через ["STOP_ORDER_KEY"]
получаю ошибку или "не указано значение поля" - если вводить сразу полученную переменную = ST_orderNum
либо "Неправильно указан номер заявки: "1314760.000000" - если вводить через функции

перепробовано уже:
math.floor(ST_orderNum)
tostring(ST_orderNum)
math.abs(ST_orderNum)

Каким же должен быть формат данного поля?
Обращение к конкретному окну Quik и конкретной вкладке
 
Здравствуйте!

1. Возможно ли обращение к конкретному окну программы, если запущено более одного экземпляра? (действие -  развернуть на весь экран)

2. Возможно ли обращение к конкретной вкладке внутри окна? (действие -  развернуть на весь экран, то есть перейти на нее)

Скрипт делает скрин экрана по событию, было бы крайне удобно при работе несколькими скриптами скринить именно нужную вкладку в нужном экземпляре программы.
Версия 7.2 - Идентификаторы, Изменились поля идентификаторов
 
В версии 7.0 у каждого индикатора было своё (независимое, уникальное) поле Идентификатор. Данное поле позволяло скрипту однозначно идентифицировать получаемую информацию.
В версии 7.2, устанавливая идентификатор к любому Графику любого Инструмента, я получаю сквозную установку данного идентификатора для данного типа Графика на всех Инструментах.

Пример в скринах. Ставлю идентификатор к Прайс на Br - такой же выскакивает на всех Инструментах..

Как взять данные Прайс Br и Si, например. И быть уверенным, что это данные именно с этих Инструментов?
Страницы: 1
Наверх