не записывает больше одной сделки в файлик

Страницы: 1
RSS
не записывает больше одной сделки в файлик, CSV файл
 
Коллеги, добрый день! Я новичок в программировании луа, и у меня возникла проблема. Есть скрипт, который записывает в файл csv данные об отправленной транзакции в систему, далее скрипт проверяет состояние стопа и фиксирует, если стоп выполнен. И вот после этого происходят чудеса: если появляется ещё одна сделка, то скрипт её открывает, но вот в файлик уже ничего не записывается, и в итоге ломается учёт, так как скрипт не видит записи о номере стопа в файлике. Подскажите, пожалуйста, как это можно починить?
Код
-- Функция вызывается терминалом, когда с сервера приходит новая информация о транзакциях
function OnTransReply(trans_reply)
   -- Если пришла информация по нашей транзакции
   if trans_reply.trans_id == id_done then
      -- Если данный статус уже был обработан, выходит из функции, иначе запоминает статус, чтобы не обрабатывать его повторно
      if trans_reply.status == LastStatus then return else LastStatus = trans_reply.status      end
      -- Выводит в сообщении статусы выполнения транзакции
      if  trans_reply.status == 1   then -- транзакция активна
         --message('OnTransReply(): По транзакции №'..trans_reply.trans_id..' УСПЕШНО ВЫСТАВЛЕНА заявка №'..trans_reply.order_num..' по цене '..trans_reply.price..' объемом '..trans_reply.quantity,3) 
     end
     if  trans_reply.status ==3   then -- транзакция выполнена, запись в журнал
         --message(trans_reply.result_msg,1)
         --message('OnTransReply(): По транзакции №'..trans_reply.trans_id..' УСПЕШНО ВЫПОЛНЕНА заявка №'..trans_reply.order_num..' по цене '..trans_reply.price..' объемом '..trans_reply.quantity,3) 
        OrderNum = trans_reply.order_num 
        OrderTime=trans_reply.datetime 
        OrderPrice=trans_reply.price 
        OrderQuantity=trans_reply.quantity 
        OrderCond=TP 
        OrderInstr =trans_reply.sec_code
        Ordcomment=trans_reply.brokerref
        local tradeline= os.date("%c", os.time(trans_reply.datetime))..";"..
        OrderInstr..";"..
        OrderQuantity ..";".. 
        OrderCond..";"..
        OrderPrice..";"..
        OrderNum ..";"..
        "Open_order"..";"..
        ACCOUNT..";"..
        Ordcomment..";"..
        "Created".."\n"
        CSV:seek("end",0)
        CSV:write(tradeline); --записали значения в файлик
        CSV:flush(); --сохранили файлик
     end
   end
      -- Если пришла информация по нашей стоп-транзакции
   if trans_reply.trans_id == id_take then
      -- Если данный статус уже был обработан, выходит из функции, иначе запоминает статус, чтобы не обрабатывать его повторно
      if trans_reply.status == TakeStatus then return else TakeStatus = trans_reply.status end
      -- Выводит в сообщении статусы выполнения транзакции
     if  trans_reply.status == 3   then -- транзакция активна
          Stopnumb =trans_reply.order_num
         SlTpOrderTime=trans_reply.datetime 
         SlTpOrderPrice=trans_reply.price 
         SlTpOrderQuantity=trans_reply.quantity 
         SlTpOrderCond=TP
         SlTpOrderInstr=trans_reply.sec_code
        SlComment=trans_reply.brokerref
       --message('OnTransReply(): По транзакции №'..trans_reply.trans_id..' ВЫПОЛНЕНА заявка №'..trans_reply.order_num..' по цене '..trans_reply.price..' объемом '..trans_reply.quantity,3) 
        local Stopline= os.date("%c", os.time(trans_reply.datetime))..";"..
        SlTpOrderInstr..";"..
        SlTpOrderQuantity ..";"..
        SlTpOrderCond ..";"..
        SlTpOrderPrice ..";"..
        Stopnumb ..";"..
        "Take_Stop_order"..";"..
        ACCOUNT..";"..
        SlComment..";"..
        "Created".."\n"
        CSV:seek("end",0)
        CSV:write(Stopline); --записали значения в файлик
        CSV:flush(); --сохранили файлик
     end
   end
end
 
Яна, Господи, какой ужас! Для новичка в программировании кода раз в пять больше, чем нужно. :smile:

Пока не глядя на код:
1. Данные об отправленной транзакции Вам не нужны, уверен на 99.999%.
2. Скрипт ничего не должен видеть "в файлике" - работайте в ОЗУ!

Теперь смотрим код:
1. OnTransReply - это информация о транзакции, но никак не о сделке. Лично я пользуюсь только OnTrade, что и другим советую. Кстати, учтите, что прерывания приходят пачками, обычно по три штуки на одно событие. Ага, Вы это вроде как учитываете, но ТАКОЙ учёт от ошибок не гарантирует: если проскочит прерывание с другой айдишкой (а оно проскочит - проверено!), а потом снова прилетит по этой же транзакции, то Вы уже перезапишете свой id_done, и посчитаете неверно.
 
Цитата
Владимир написал:
Яна, Господи, какой ужас! Для новичка в программировании кода раз в пять больше, чем нужно. ::

Пока не глядя на код:
1. Данные об отправленной транзакции Вам не нужны, уверен на 99.999%.
2. Скрипт ничего не должен видеть "в файлике" - работайте в ОЗУ!

Теперь смотрим код:
1. OnTransReply - это информация о транзакции, но никак не о сделке. Лично я пользуюсь только OnTrade, что и другим советую. Кстати, учтите, что прерывания приходят пачками, обычно по три штуки на одно событие. Ага, Вы это вроде как учитываете, но ТАКОЙ учёт от ошибок не гарантирует: если проскочит прерывание с другой айдишкой (а оно проскочит - проверено!), а потом снова прилетит по этой же транзакции, то Вы уже перезапишете свой id_done, и посчитаете неверно.
Владимир, за оценку я признательна, но из практического совета дан только замена на OnTrade, что вообще никак не соотносится с моим вопросом.
 
Яна, Главный совет вовсе не про OnTrade - работайте в ОЗУ! Передавать данные через файл - это источник вечных глюков.
 
Цитата
Владимир написал:
Яна, Главный совет вовсе не про OnTrade - работайте в ОЗУ! Передавать данные через файл - это источник вечных глюков.
Слушайте, а ведь вы оказались правы полностью! У меня у робота есть признак - его название, который передается в систему при выставлении ордеров, и я в итоге из функции почти на 100 строк для проверки данных сделала на 40 строк, и все берется из системы. Не догнала сразу всю полноту вашего коммента. Спасибо!
Страницы: 1
Читают тему
Наверх