1 (2021-11-18 16:12:14 отредактировано ecoreon)

Тема: Как перезапустить скрипт или предотвратить остановку из-за nil ошибки?

Есть такая часть скрипта Quik Lua, проверяющая снятие заявки  (см. ниже).
Однако периодически (с вероятностью 15-20% в день) скрипт останавливается, если на стороне брокера не подгружается лимит по бумаге, т.к. в результате программа получает значение по лимиту nil и не может сравнить значение.

Как сделать перезапуск остановленного скрипта после ошибки или предотвратить остановку скрипта при получении значения nil?

tbl_shares = getDepoEx(m_firm, m_client, m_sec, m_acc, 2)
qb = tbl_shares.locked_buy/lot
K1= {
     ['ACTION']='KILL_ORDER',
     ['CLASSCODE']=m_class,
        ['SECCODE']=m_sec,
     ['ORDER_KEY']=tostring(key_b3),
     ['TRANS_ID']=tostring(id_b3)
    }
Err_K1 = sendTransaction(K1)
while tbl_shares.locked_buy/lot==qb do
    sleep(200)
        tbl_shares = getDepoEx(m_firm, m_client, m_sec, m_acc, 2)
end

2 (2021-11-18 16:43:00 отредактировано swerg)

Re: Как перезапустить скрипт или предотвратить остановку из-за nil ошибки?

tbl_shares = getDepoEx(m_firm, m_client, m_sec, m_acc, 2)
if tbl_shares then
    ....
end

и весь код, использующий tbl_shares, убрать под этот if

3 (2021-11-18 18:56:56 отредактировано ecoreon)

Re: Как перезапустить скрипт или предотвратить остановку из-за nil ошибки?

swerg пишет:
tbl_shares = getDepoEx(m_firm, m_client, m_sec, m_acc, 2)
if tbl_shares then
    ....
end

и весь код, использующий tbl_shares, убрать под этот if

спасибо!!

а если так?

if getDepoEx(m_firm, m_client, m_sec, m_acc, 2) then
      tbl_shares = getDepoEx(m_firm, m_client, m_sec, m_acc, 2)
      qb = tbl_shares.locked_buy/lot
      K1= {
           ['ACTION']='KILL_ORDER',
           ['CLASSCODE']=m_class,
           ['SECCODE']=m_sec,
           ['ORDER_KEY']=tostring(key_b3),
           ['TRANS_ID']=tostring(id_b3)
          }
      Err_K1 = sendTransaction(K1)
      while tbl_shares.locked_buy/lot==qb do
          sleep(200)
          if getDepoEx(m_firm, m_client, m_sec, m_acc, 2) then
               tbl_shares = getDepoEx(m_firm, m_client, m_sec, m_acc, 2)
          end
      end
end

4

Re: Как перезапустить скрипт или предотвратить остановку из-за nil ошибки?

Но зачем?

5

Re: Как перезапустить скрипт или предотвратить остановку из-за nil ошибки?

swerg пишет:

Но зачем?

Чаще всего ошибка вылетала при исполнении цикла while

Ввёл в код ещё промежуточную переменную на значение getdepoex, чтобы уж наверняка:

ts=getdepoex(...)
If ts then
  tbl_shares = ts
  ...
end

И внутри while тоже.

Но теперь вся программа стала работать в 1.5 раза дольше, уменьшение sleep до 100 не особо ускоряет

6

Re: Как перезапустить скрипт или предотвратить остановку из-за nil ошибки?

ecoreon пишет:
swerg пишет:

Но зачем?

Чаще всего ошибка вылетала при исполнении цикла while

привет! считайте лимиты сами, вам понадобятся НаПокупкуНеМаржин(не помню как параметр на lua) из портфеля клиента и параметры d_long и d_short из таблицы купить/продать, но если у вас такой косячный брокер, то лучше эти параметры сохранять в файл(иногда). а цикл уберите.