Ошибка при попытке получить значение из таблицы OnTrade()

Страницы: 1
RSS
Ошибка при попытке получить значение из таблицы OnTrade()
 
Такой вот просто код:

Код
table_order = { ["CLASSCODE"]="",
      ["ACTION"]="",
      ["ACCOUNT"]="",
      ["OPERATION"] = "",
      ["SECCODE"] = "",
      ["PRICE"] = 0,
      ["QUANTITY"] = ""
   }
function OnTrade(order)
   table_order = order
end

function OnStop()
   is_run = 0
end

function main()
   while is_run do
   table_order = OnTrade()
   message(tostring(table_order.PRICE),3)
   sleep(1000)
   end
end
вылазит: trans3.lua:28: attempt to index global 'table_order' (a nil value).
откуда nil? сделки в системе уже были...
 
Здравствуйте,
это некорректная запись
Код
table_order = OnTrade()


уберите эту строку
 
Цитата
Sergey Gorokhov пишет:
Здравствуйте,
это некорректная запись
Код
 table_order = OnTrade() 


уберите эту строку
А как мне получить таблицу из OnTrade() корректно?
 
Николай Бехтерев,
У Вас для этого уже все написано.
Все что нужно удалить строку и все.
Далее, согласно коду при появлении новой сделки Вы получите сообщение
 
Цитата
Sergey Gorokhov пишет:
Николай Бехтерев ,
У Вас для этого уже все написано.
Все что нужно удалить строку и все.
Далее, согласно коду при появлении новой сделки Вы получите сообщение
Да, ошибка ушла, но пишет после сделки nil :(
 
Николай Бехтерев,
Это уже другая история.
Во первых PRICE неправильно писать.
Так как Lua регистрозависимый язык. Нужно писать маленькими буквами.

Во вторых, как было сказано работать будет только при новых сделках. То есть если сделки были ДО запуска скрипта, то скрипт их не увидит.
Если хотите чтобы отображался номер последней сделки, нужно использовать getItem
 
Цитата
Sergey Gorokhov пишет:
Николай Бехтерев ,
Это уже другая история.
Во первых PRICE неправильно писать.
Так как Lua регистрозависимый язык. Нужно писать маленькими буквами.

Во вторых, как было сказано работать будет только при новых сделках. То есть если сделки были ДО запуска скрипта, то скрипт их не увидит.
Если хотите чтобы отображался номер последней сделки, нужно использовать getItem
Да мне не только номер нужен, просто на номере я решил проверить получил ли я таблицу.
При запущенyом скрипте и table_order.price получил всё тот же nill пока не убрал в определении ["PRICE"] = 0. Выходит определять таблицу в топике не надо было?
 
Николай Бехтерев,

Объявлять таблицу надо было, а объявлять параметры не надо было.
Вы в колбеке все равно делаете присвоение, поэтому параметры задавать излишне.
 
Николай Бехтерев,
Нет, параметры все таки лучше задать, так как если колбека не будет то опять будет ошибка.
Только задать правильно, то есть маленькими буквами
 
Цитата
Sergey Gorokhov пишет:
Николай Бехтерев ,
Нет, параметры все таки лучше задать, так как если колбека не будет то опять будет ошибка.
Только задать правильно, то есть маленькими буквами
Ох, а у вас там разный регистр для каждой позиции получается или можно всё мелкими буквами оформить?
 
Цитата
Николай Бехтерев пишет:
Ох, а у вас там разный регистр для каждой позиции получается или можно всё мелкими буквами оформить?
Вы неверно поняли рекомендацию.
Вам НЕ нужно все писать маленькими буквами.
Вам нужно писать все именно так как в документации и никак иначе.
 
Цитата
Николай Бехтерев пишет:
table_order = OnTrade()
Sergey Gorokhov, а разве это правильно - вручную вызывать функцию обратного вызова?

Цитата
Николай Бехтерев пишет:
message(tostring(table_order.PRICE),3)
Разве не надо было подобный оператор разместить в теле самой функции OnTrade(), а не в main() ?
 
А, это я просто невнимательно прочитал Ваши ответы :)
 
Цитата
Sergey Gorokhov пишет:
Цитата
Николай Бехтерев пишет:
Ох, а у вас там разный регистр для каждой позиции получается или можно всё мелкими буквами оформить?
Вы неверно поняли рекомендацию.
Вам НЕ нужно все писать маленькими буквами.
Вам нужно писать все именно так как в документации и никак иначе.
Код
stop = 100
table_order = {   
      ["order_num "] = 0,
      ["class_code"] = "",
      ["account"] = "",
      ["sec_code"] = "",
      ["qty"] = "",
      ["price"] = 0,
      ["flags"] = 0,
            }
GUN = 0
FIRE = 0
transaction = {   
            ["TRANS_ID"] = "",
            ["CLASSCODE"] = "", 
            ["ACTION"] = "",
            ["ACCOUNT"] = "",
            ["SECCODE"] = "",
            ["QUANTITY"] = "",
            ["OPERATION"] = "",
            ["STOPPRICE"] = "",
            ["PRICE"] = "",
            }

zed_is_dead = 100
is_run = 1
ID = 1
table_order.flags = 1

function OnTrade(order)
   table_order = order
end

function OnTransReply()
   table_order = order
end

function OnStop()
   is_run = 0
end

function main()
   while is_run do
   
   if zed_is_dead ~= table_order.order_num then
         zed_is_dead = table_order.order_num
         transaction.TRANS_ID = tostring(ID)
         transaction.CLASSCODE = table_order.class_code
         transaction.ACTION = "NEW_STOP_ORDER"
         transaction.ACCOUNT = table_order.account
         transaction.SECCODE = table_order.sec_code 
         transaction.QUANTITY = tostring(table_order.qty)
         ID = ID + 1
         a = tostring(table_order.flags)
         message(a,3)
            if bit.band(table_order.flags,4) > 0 then
               transaction.OPERATION = "B"
               GUN = table_order.price + stop
               FIRE = table_order.price + stop + stop
               transaction.STOPPRICE = tostring(GUN)
               transaction.PRICE = tostring(FIRE)
               --a = tostring(table_order.flags)
               else
               GUN = table_order.price - stop
               FIRE = table_order.price - stop - stop
               transaction.OPERATION = "S"
               transaction.STOPPRICE = tostring(GUN)
               transaction.PRICE = tostring(FIRE)
            end
                  transaction.TYPE = "M"
         transaction.STOP_ORDER_KIND = "SIMPLE_STOP_ORDER"
         transaction.EXPIRY_DATE = "GTC"
      sendTransaction(transaction)
      --message(a,3)
      end
   sleep(1000)
   end
end
 
Слепил такой вот код на выставление стопов после сделки.
На первый раз пролетает нормально, выставляет стоп. На второй круг вылазит ошибка:
45: attempt to index global 'table_order' (a nil value)
45 строка: if zed_is_dead ~= table_order.order_num then
Когда это table_order превращается в nil?
 
Цитата
Николай Бехтерев пишет:
Когда это table_order превращается в nil?
Вот здесь

Код
function OnTransReply()
   table_order = order
end
 
Цитата
Sergey Gorokhov пишет:
Цитата
Николай Бехтерев пишет:
Когда это table_order превращается в nil?
Вот здесь
Код
 function OnTransReply()
   table_order = order
end
 
Вводить третью промежуточную таблицу?
 
Цитата
Николай Бехтерев пишет:
Вводить третью промежуточную таблицу?

Смотря чего Вы хотите добиться.
Сейчас, в событии OnTransReply, Вы присваиваете значение table_order из переменной order, которая не существует.
То что она есть в событии OnTrade не значит что ее можно использовать где попало.
 
Цитата
Sergey Gorokhov пишет:
Цитата
Николай Бехтерев пишет:
Вводить третью промежуточную таблицу?

Смотря чего Вы хотите добиться.
Сейчас, в событии OnTransReply, Вы присваиваете значение table_order из переменной order, которая не существует.
То что она есть в событии OnTrade не значит что ее можно использовать где попало.
Спасибо, эта функция OnTransReply в скрипте просто следствие моей невнимательности
Страницы: 1
Читают тему
Наверх