Сделка по точному времени сервера

Страницы: 1
RSS
Сделка по точному времени сервера
 
Есть простая задача, выставить заявку максимально рано в предторговый период 09:45:00 - 09:59:59 мск
Несколько дней потратил написал вот такой скипт, но где-то от моего взора прячется ошибка
Код
base_time = "09:45:00"  
WORK_DONE = false
stime = tostring(GetInfoParam("SERVERTIME")) 

   function FixTime(V)
      V=tostring(V)
      local Out = os.date("!*t",os.time())
      local len = string.len(V)
      if len>6 then
         Out.hour,Out.min,Out.sec = string.match(V,"(%d%d)%p(%d%d)%p(%d%d)")
      elseif len==6 then
         Out.hour,Out.min,Out.sec  = string.match(V,"(%d%d)(%d%d)(%d%d)")
      elseif len==5 then
         Out.hour,Out.min,Out.sec  = string.match(V,"(%d)(%d%d)(%d%d)")
      end
      return Out
   end

function main()

while true do
 if os.time(FixTime(stime)) < os.time(FixTime(base_time)) then
   WORK_DONE=false
 elseif not WORK_DONE then
   WORK_DONE=true
transaction = {}
transaction['TRANS_ID'] = '????'
transaction['CLASSCODE'] = '????'
transaction['ACTION'] = 'Ввод заявки'
transaction['Торговый счет'] = '??????????????'
transaction['К/П'] = 'Продажа'
transaction['Тип'] = 'Лимитная'
transaction['Тип по цене'] = 'По разным ценам'
transaction['Тип по остатку'] = 'Поставить в очередь'
transaction['Тип ввода значения цены'] = 'По цене'
transaction['Назначение заявки'] = 'По умолчанию'
transaction['Тип события активации заявки'] = 'Обычная заявка'
transaction['Режим'] = '????'
transaction['Инструмент'] = '??????'
transaction['Цена'] = '????'
transaction['Лоты'] = '1'
transaction['Примечание'] = ''
transaction['Объем заявки'] = ''
transaction['Код внешнего пользователя'] = ''
transaction['Время активации'] = ''
transaction['Доп. инфо'] = ''
transaction['Фирма торгового счета'] = ''
   end
   sleep(1000)
end
end
 
Цитата
Александр написал:
но где-то от моего взора прячется ошибка
Опишите симптомы
 
Цитата
Опишите симптомы
время сервера 10:00 выставляю в фаиле 9:50 заявка исполняется
если же выставляю 10:01, то при достижении времени сервера 10:01 сделка не исполняется, а процесс циклически продолжается
 
Александр,

У Вас функция FixTime не правильная.
При указании "9:50" Вы отправляете строку размером 4 символа, а в функции у Вас проверка для строки 5, 6 и больше 6 символов.
Если же указать "09:50" - 5 символов, то функция string.match не сможет корректно обработать строку т.к. в ней требуются параметры с секундами, т.е. "09:50:00"

либо переделайте функцию, либо указывайте время правильно.
 
stime = tostring(GetInfoParam("SERVERTIME"))

Вы здесь прочитали время сервера при старте скрипта, а потом в цикле это значение не обновляете. Потому и не срабатывает
 
Цитата
swerg написал:
stime = tostring(GetInfoParam("SERVERTIME"))

Вы здесь прочитали время сервера при старте скрипта, а потом в цикле это значение не обновляете. Потому и не срабатывает
Спасибо, теперь работает  :smile:  
 
Вот финальный вариант вдруг кому будет полезен
Код
-- Вместо ??? поставить свои значения
p='????' -- Id транзакции
base_time = "09:45:00" -- точное время в которое исполнится заявка
  
   function FixTime(V)
      V=tostring(V)
      local Out = os.date("!*t",os.time())
      local len = string.len(V)
      if len>6 then
         Out.hour,Out.min,Out.sec = string.match(V,"(%d%d)%p(%d%d)%p(%d%d)")
      elseif len==6 then
         Out.hour,Out.min,Out.sec = string.match(V,"(%d%d)(%d%d)(%d%d)")
      elseif len==5 then
         Out.hour,Out.min,Out.sec = string.match(V,"(%d)(%d%d)(%d%d)")
      end
      return Out
   end

function main()
while true do
stime = tostring(GetInfoParam("SERVERTIME")) 
 if os.time(FixTime(stime)) < os.time(FixTime(base_time)) then
 elseif os.time(FixTime(stime)) >= os.time(FixTime(base_time)) then
      transaction = {}
transaction['TRANS_ID'] = p
transaction['CLASSCODE'] = '?????'
transaction['ACTION'] = '?????'
transaction['Торговый счет'] = '???????????'
transaction['К/П'] = '???????'
transaction['Тип'] = '??????'
transaction['Тип по цене'] = '???????'
transaction['Тип по остатку'] = '??????'
transaction['Тип ввода значения цены'] = '???????'
transaction['Назначение заявки'] = '?????'
transaction['Тип события активации заявки'] = '?????'
transaction['Режим'] = '?????'
transaction['Инструмент'] = '?????'
transaction['Цена'] = '????'
transaction['Лоты'] = '????'
transaction['Примечание'] = ''
transaction['Объем заявки'] = ''
transaction['Код внешнего пользователя'] = ''
transaction['Время активации'] = ''
transaction['Доп. инфо'] = ''
transaction['Фирма торгового счета'] = ''
result = sendTransaction(transaction)
   if result ~= "" then
       message(string.format("Транзакция %s не прошла          проверку на стороне терминала QUIK [%s]",
       transaction.TRANS_ID, result))
   else
       message(string.format("Транзакция %s отправлена",
       transaction.TRANS_ID))
               stop() -- отключение скрипта
          -- os.exit(0) -- выключение Quik
   end
   end
   sleep(1000)
end
end

 
Столкнулся с проблемой следующего характера
Скрипт работает  только когда начинается торговая сессий в 10:00:01
До этого момента os.time(FixTime(stime)) >= os.time(FixTime(base_time)) всегда верное значение выдает.
Можно еще конечно брать время операционной системы, но там погрешность в синхронизации и нету уверенности даже если на операционной системе сделать синхронизацию по квантовым часам, что на стороне сервера на столько же точные данные.
Еще вариант спамить заявками каждые 10 миллисекунд (думаю через какое-то время брокер даст по рукам, за такое)
Буду рад если есть еще идеи как это можно реализовать. Может зацепится за первый пакет который приходит всегда в 09:45:00.... или еще  как-то...  
 
Цитата
Александр написал:
До этого момента os.time(FixTime(stime)) >= os.time(FixTime(base_time)) всегда верное значение выдает.

Добавьте в код логирование и посмотрите что с чем сравнивается.
Страницы: 1
Читают тему
Наверх