XXM

SuperScalp.lua

XXM
Dec 24th, 2020
58
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -- SuperScalp.lua, © hismatullin.h@gmail.com, xsharp.ru
  2. -- с возможностями полного протоколирования действий программы.
  3. local ver = '1.41'  --  11.11.2016
  4. local lastPos = 0
  5. local lastPrice = 0
  6. local string_gmatch=string.gmatch
  7. local string_find=string.find
  8. local string_sub=string.sub
  9. local string_len=string.len
  10. local string_format=string.format
  11. local math_modf=math.modf
  12. local SeaGreen=12713921     --  RGB(193, 255, 193)
  13. local RosyBrown=12698111    --  RGB(255, 193, 193)
  14. local logFile
  15. local trades = {} -- Таблица_01 - получили сделку
  16. local _trades = {} -- временная таблица наших сделок для отлова дублей в QUIK ver. 7.1.0
  17. local orders = {}   --  Таблица заявок
  18. local scriptPath = getScriptPath()
  19. local Terminal_Version=getInfoParam('VERSION')
  20. local function versionLess(ver1,ver2)
  21.     local begin,ver_1=0
  22.     for ver_2 in string_gmatch(ver2,'%d+') do
  23.         _,begin,ver_1=string_find(ver1,'(%d+)',begin+1)
  24.         if ver_1~=ver_2 then return not ver_1 or ver_1+0<ver_2+0 end
  25.     end
  26.     return false
  27. end
  28. local table_insert = table.sinsert
  29. local table_remove = table.sremove
  30. local table_concat = table.sconcat
  31. -----
  32. local dc = QTABLE_DEFAULT_COLOR
  33. local testQuik = true -- подписка на OnTransReply, OnTrade, OnOrder
  34. --local testQuik = false -- без подписки
  35. function firm_id()
  36.   for i = 0, getNumberOf("money_limits") - 1 do
  37.     local row = getItem("money_limits", i)
  38.     if row ~= nil and row.firmid ~= nil then
  39.       local ss = tostring(string_sub(row.firmid, 2, 2))
  40.       if ss == "C" or ss == "R" or ss == "B" then
  41.         return tostring(row.firmid)
  42.       end
  43.     end
  44.   end
  45.   return nil
  46. end
  47. local tostring__ = tostring
  48. function tostring(x)
  49.     if math.tointeger(x) then
  50.         return string_format("%0i",x)
  51.     end
  52.     return tostring__(x)
  53. end
  54.  
  55. local is_forts = true
  56. --настройки
  57. function getInitParameter()
  58.     if is_forts then
  59.         account = 'SPBFUT001ad'
  60.         classCode = 'SPBFUT'
  61.         secCode = 'SiH1'
  62.         OpenSlippage = 50
  63.     else
  64.         account="NL0011100043"
  65.         ClientCode = "1133"
  66.         classCode = 'QJSIM'
  67.         secCode = 'SBER'
  68.         OpenSlippage = 0.5
  69.         firm_id = firm_id()
  70.         message('firm_id = '..firm_id)
  71.     end
  72.     workSize = 5    -- рабочий размер
  73.     logFileName1 = 'logFile1.txt'   -- файл для укороченного протоколирования коллбэков
  74.     logFileName2 = 'logFile2.txt'   -- файл для печати всех полей коллбэков
  75. end
  76. --
  77.  
  78.  
  79. function getHRTime()
  80.     return os.date("%X", os.time())
  81. end
  82. --
  83.  
  84. function event_callback_tblH(t_id, msg, par1, par2)
  85.     if msg == QTABLE_LBUTTONDOWN then   -- нажата левая кнопка мыши
  86.         local mes = ''
  87.         lastPos = futures_position()
  88.         local status = tonumber(getParamEx(classCode, secCode,"status").param_value)
  89.         local mes = secCode..', '..classCode..', нажато: купить-. status = '..status
  90.         message(mes)
  91.         if status ~= 1 or par1 == 1 then -- если бумага не торгуется, заявку не подаем
  92.             Highlight(t_id, par1, par2, RosyBrown, dc, 500)     -- подсветка, RosyBrown
  93.             if status ~= 1 then
  94.                 mes = 'Ошибка: клиринг!'
  95.                 message(mes); io_log(mes);
  96.             end
  97.             return
  98.         end
  99.         Highlight(t_id, par1, par2, SeaGreen, dc, 500)      -- подсветка SeaGreen
  100.         if par1 == 2 and par2 == 1 then
  101.             if lastPos < 0 then
  102.                 mes = secCode..'; нажато: купить, '..-lastPos
  103.                 Buy(classCode, secCode, -lastPos, 'CloseShort')
  104.             --elseif    lastPos == 0 then
  105.             else
  106.                 mes = secCode..'; нажато: купить, '..workSize
  107.                 Buy(classCode, secCode, workSize, 'OpenLong')
  108.             --else
  109.             --  mes = secCode..'; нажато: купить. Мы в лонгах, не покупаем!'
  110.             end
  111.         elseif par1 == 2 and par2 == 2 then -- продать, левая кнопка
  112.             if lastPos > 0 then
  113.                 mes = secCode..'; нажато: продать, '..lastPos
  114.                 Sell(classCode, secCode, lastPos, 'CloseLong')
  115.             --elseif    lastPos == 0 then
  116.             else
  117.                 mes = secCode..'; нажато: продать, '..workSize
  118.                 Sell(classCode, secCode, workSize, 'OpenShort')
  119.             --else
  120.             --  mes = secCode..'; нажато: продать. Мы в шортах, не продаем!'
  121.             end
  122.         elseif par1 == 2 and par2 == 3 then -- закрыть позиции
  123.             if lastPos > 0 then
  124.                 mes = secCode..'; нажато: закрыть лонги, '..lastPos
  125.                 Sell(classCode, secCode, lastPos, 'CloseAll')
  126.             elseif  lastPos < 0 then
  127.                 mes = secCode..'; нажато: закрыть шорты, '..-lastPos
  128.                 Buy(classCode, secCode, -lastPos, 'CloseAll')
  129.             else
  130.                 mes = secCode..'; нажато: закрыть. Нет позиций для закрытия!'
  131.             end
  132.         elseif par1 == 3 and par2 == 1 then
  133.             if lastPos < 0 then
  134.                 mes = secCode..'; нажато: купить-, '..-lastPos
  135.                 BuyBid(classCode, secCode, -lastPos, 'CloseShort')
  136.             --elseif    lastPos == 0 then
  137.             else
  138.                 BuyBid(classCode, secCode, workSize, 'OpenLong')
  139.                 mes = secCode..'; нажато: купить-, '..workSize
  140.             --else
  141.             --  mes = secCode..'; нажато: купить-. Мы в лонгах, не покупаем!'
  142.             end
  143.         elseif par1 == 3 and par2 == 2 then
  144.             if lastPos > 0 then
  145.                 SellOffer(classCode, secCode, lastPos, 'CloseLong')
  146.                 mes = secCode..'; нажато: продать+, '..lastPos
  147.             --elseif    lastPos == 0 then
  148.             else
  149.                 SellOffer(classCode, secCode, workSize, 'OpenShort')
  150.                 mes = secCode..'; нажато: продать+, '..workSize
  151.             --else
  152.             --  mes = secCode..'; нажато: продать+. Мы в шортах, не продаем!'
  153.             end
  154.         elseif par1 == 3 and par2 == 3 then
  155.             mes = secCode..'; нажато: Снять все заявки!'
  156.             KillOrders()
  157.         end
  158.         message(mes); io_log(mes);
  159.     elseif msg == QTABLE_CLOSE then
  160.         OnStop()
  161.     end
  162. end
  163. --
  164.  
  165. QTable ={}
  166. QTable.__index = QTable
  167. -- Создать и инициализировать экземпляр таблицы QTable
  168. function QTable.new()
  169.     local t_id = AllocTable()
  170.     if t_id ~= nil then
  171.         q_table = {}
  172.         setmetatable(q_table, QTable)
  173.         q_table.t_id=t_id
  174.         q_table.caption = ""
  175.         q_table.created = false
  176.         q_table.curr_col=0
  177.         -- таблица с описанием параметров столбцов
  178.         q_table.columns={}
  179.         return q_table
  180.     else
  181.         return nil
  182.     end
  183. end
  184. tblH = QTable:new() -- для ручной торговли
  185. --
  186.  
  187. function get_trans_id()
  188.     local s = tostring(os.clock())
  189.     local x, g = string_find(s, "(%d+)")
  190.     s = string_sub(s, g + 2)
  191.     for i = 1, 3 - string_len(s) do
  192.         s = "0" .. s
  193.     end
  194.     return os.date("%H%M%S") .. s
  195. end
  196. --
  197.  
  198. function send_order(client, class, seccode, account, operation, quantity, price)
  199.     account = 'blablabla'
  200.     local mes = 'send_order, client = '..client..', class = '.. class..', seccode = '..seccode..', account = '..account
  201.     ..', quantity = '..quantity.. ', operation = '..operation.. ', price = '..price
  202.     message(mes)
  203.     local trans_id = get_trans_id()
  204.     rus = false
  205.     --rus = true
  206.     if rus then
  207.         trans_params = {
  208.             CLASSCODE = class,
  209.             CLIENT_CODE = client,
  210.             SECCODE = seccode,
  211.             ACCOUNT = account,
  212.             TYPE = new_type,
  213.             TRANS_ID = trans_id,
  214.             OPERATION = operation,
  215.             QUANTITY = tostring(quantity),
  216.             PRICE = tostring(price),
  217.             ACTION = "NEW_ORDER"
  218.             }
  219.     else
  220.         if operation == "B" then
  221.             operation = 'Покупка'
  222.         else
  223.             operation = 'Продажа'
  224.         end
  225.         trans_params = {
  226.             ["TRANS_ID"] = trans_id,
  227.             ["Комментарий"] = client,
  228.             ["ACTION"] = "Ввод заявки",
  229.             ["CLASSCODE"] = class,
  230.             ["Тип"] = "Лимитированная",
  231.             ["Условие исполнения"] = "Поставить в очередь",
  232.             ["Класс"] = class,
  233.             ["Инструмент"] = seccode,
  234.             ["Количество"] = tostring(quantity),
  235.             ["Цена"] = tostring(price),
  236.             ['К/П'] = operation,
  237.             ["Торговый счет"] = account
  238.             }
  239.     end
  240.     return sendTransaction(trans_params)
  241. end
  242. --
  243.  
  244. function Buy(classCode, secCode, size, action)
  245.     local best_offer = getParamEx(classCode, secCode, "offer").param_value
  246.     local buyPrice = best_offer + (OpenSlippage or 0)
  247.     local res = send_order(action, classCode, secCode, account, "B", size, buyPrice)
  248.     if string_len(res) ~= 0 then
  249.         local mes = 'Ошибка: '..res..', '.. action..', '..secCode..', '.."B"..', '..size..', price='..buyPrice
  250.         message(mes,3); io_log(mes);
  251.     end
  252. end
  253. --
  254.  
  255. function Sell(classCode, secCode, size, action)
  256.     local best_bid = getParamEx(classCode, secCode, "bid").param_value
  257.     local sellPrice = best_bid - (OpenSlippage or 0)
  258.     local res = send_order(action, classCode, secCode, account, "S", size, sellPrice)
  259.     if string_len(res) ~= 0 then
  260.         local mes = 'Ошибка: '..res..', '.. action..', '..secCode..', '.."S"..', '..size..', price='..sellPrice
  261.         message(mes,3); io_log(mes);
  262.     end
  263. end
  264. --
  265.  
  266. function BuyBid(classCode, secCode, size, action)
  267.     local best_bid = getParamEx(classCode, secCode, "bid").param_value
  268.     local buyPrice = best_bid - (OpenSlippage or 0)
  269.     local res = send_order(action, classCode, secCode, account, "B", size, buyPrice)
  270.     message('res = '..res)
  271.     if string_len(res) ~= 0 then
  272.         local mes = 'Ошибка: '..res..', '.. action..', '..secCode..', '.."B"..', '..size..', price='..buyPrice
  273.         message(mes,3); io_log(mes);
  274.     end
  275. end
  276. --
  277.  
  278. function SellOffer(classCode, secCode, size, action)
  279.     local best_offer = getParamEx(classCode, secCode, "offer").param_value
  280.     local sellPrice = best_offer + (OpenSlippage or 0)
  281.     local res = send_order(action, classCode, secCode, account, "S", size, sellPrice)
  282.     if string_len(res) ~= 0 then
  283.         local mes = 'Ошибка: '..res..', '.. action..', '..secCode..', '.."S"..', '..size..', price='..sellPrice
  284.         message(mes,3); io_log(mes);
  285.     end
  286. end
  287. --
  288.  
  289. function KillOrders()
  290.     local NumberOf = getNumberOf("orders")
  291.     for i = 0, NumberOf - 1 do
  292.         local ord = getItem("orders", i)
  293.         if ord.sec_code == secCode and ord.account == account  then
  294.             local order_flag = get_order_status(ord.flags)
  295.             if order_flag.status == "active" then
  296.                 trans_id = get_trans_id()
  297.                 local trans_params = {
  298.                         ["CLASSCODE"] = classCode,
  299.                         ["TRANS_ID"] = trans_id,
  300.                         ["ACTION"] = "KILL_ORDER",
  301.                         ["ORDER_KEY"] = tostring(ord.order_num)
  302.                         }
  303.                 local res =  sendTransaction(trans_params)
  304.                 if 0 < string_len(res) then
  305.                     local mes = 'Ошибка: '..res
  306.                     message(mes,3); io_log(mes);
  307.                 end
  308.             end
  309.         end
  310.     end
  311. end
  312. --
  313.  
  314. function HandleBS()
  315.     local t = tblH.t_id
  316.     AddColumn(t, 1, 'Бумага', true,QTABLE_CACHED_STRING_TYPE,12)
  317.     AddColumn(t, 2, 'ТЧП', true,QTABLE_STRING_TYPE,12)
  318.     AddColumn(t, 3, 'Цена послед.', true,QTABLE_STRING_TYPE,17)
  319.     CreateWindow(t)
  320.     SetWindowCaption(t, "SuperScalp "..ver) --SetWindowCaption(t, "Scalper:"..account)
  321.     SetWindowPos(t, 0, 100, 250, 120)
  322.     local li=InsertRow(t, -1)
  323.     SetCell(t, li, 1, secCode)
  324.     SetCell(t, li, 2, lastPos)
  325.     SetCell(t, li, 3, '7503')   --Ожидание
  326.     local li=InsertRow(t, -1)
  327.     SetCell(t, li, 1, 'Купить')
  328.     SetCell(t, li, 2, 'Продать')
  329.     SetCell(t, li, 3, 'Закрыть')
  330.     local li=InsertRow(t, -1)
  331.     SetCell(t, li, 1, 'купить —')
  332.     SetCell(t, li, 2, 'продать +')
  333.     SetCell(t, li, 3, 'Снять все')
  334.     SetTableNotificationCallback(t,event_callback_tblH)
  335. end
  336. --
  337.  
  338. --прочитать ТТП и вытащить ТЧП.
  339. function futures_position()
  340.     if is_forts then
  341.         local count=getNumberOf("futures_client_holding") --Позиции по клиентским счетам (фьючерсы)
  342.         for i=0,count-1, 1 do
  343.             local row=getItem("futures_client_holding",i)
  344.             if row.trdaccid~=nil then
  345.                 local seccode=row.sec_code      --Код фьючерсного контракта, "Инструмент"
  346.                 local totn=row.totalnet         --Текущие чистые позиции    "ТЧП"
  347.                 if seccode == secCode then
  348.                     return totn
  349.                 end
  350.             end
  351.         end
  352.     else
  353.         local t = getDepoEx(firm_id, ClientCode, secCode, account, 0)
  354.         if t then
  355.             local T = t.currentbal
  356.             SetCell(tblH.t_id, 1, 2, tostring(T))
  357.             positionColor(T)
  358.             return T
  359.         end
  360.     end
  361.     return 0
  362. end
  363. --
  364.  
  365. function positionColor(tot)
  366.     if tot>0 then
  367.         SetColor(tblH.t_id,1,2, SeaGreen, dc, dc, dc)   -- подсветка SeaGreen
  368.     elseif tot<0 then
  369.         SetColor(tblH.t_id,1,2, RosyBrown, dc, dc, dc)  -- подсветка, RosyBrown
  370.     else   
  371.         SetColor(tblH.t_id,1,2,dc, dc, dc, dc)
  372.     end
  373. end
  374. --
  375.  
  376. function get_order_status(flags)
  377.   local rt = {}
  378.   local band = bit.band
  379.   local tobit = bit.tobit
  380.   if band(tobit(flags), 1) ~= 0 and band(tobit(flags), 2) == 0 then
  381.     rt.status = "active"
  382.   elseif band(tobit(flags), 1) == 0 and band(tobit(flags), 2) ~= 0 then
  383.     rt.status = "cancelled"
  384.   elseif band(tobit(flags), 1) == 0 and band(tobit(flags), 2) == 0 then
  385.     rt.status = "filled"
  386.   else
  387.     rt.status = "unknown"
  388.   end
  389.   if band(tobit(flags), 4) ~= 0 then
  390.     rt.operation = "S"
  391.   else
  392.     rt.operation = "B"
  393.   end
  394.   return rt
  395. end
  396. --
  397.  
  398. --запись лога с текущим простым временем
  399. function io_log(str)
  400.     local file, err = io.open(logFile, "a")
  401.     assert(file, "Ошибка записи "..logFile..", \n"..str)
  402.     local str0 = getHRTime()    -- время с миллисекундами
  403.     str0 = str0..'; '.. str
  404.     file:write(str0 .. "\n")
  405.     file:flush()
  406.     file:close()
  407.     return true
  408. end
  409. --
  410.  
  411. if testQuik then
  412.     -- 2.2.17 - Функция вызывается терминалом QUIK при получении ответа на транзакцию пользователя.
  413.     function OnTransReply(reply)
  414.         if reply.account == account then
  415.             if running then
  416.                 local mes =  reply.sec_code..'; OnTrans, o_n '..reply.order_num..', '..tostring(reply.price)..' x '..
  417.                 tostring(reply.quantity)..', t_id = '..reply.trans_id
  418.                 message(mes); io_log(mes);
  419.             end
  420.             toLog(scriptPath..'\\'..logFileName2,reply, 'reply')
  421.         end
  422.     end
  423.     -- 2.2.3 Функция вызывается терминалом QUIK при получении сделки.
  424.     function OnTrade(trade)
  425.         if trade.account == account then    -- только если заявка из нашего счета - 01.11.2014
  426.             if running then
  427.                 if not _trades[trade.trade_num] then
  428.                     local mes = trade.sec_code..'; OnTrade, 1, o_n = '..trade.order_num..', t_n = '..trade.trade_num..' ('..trade.price..'x'..trade.qty..')'
  429.                     message(mes); io_log(mes);
  430.                     _trades[trade.trade_num] = true  -- Добавим в очередь
  431.                     _trades[trade.tradenum] = 1
  432.                     table_insert(trades,trade)
  433.                 else   
  434.                     _trades[trade.tradenum] = _trades[trade.tradenum] + 1
  435.                     local mes = trade.sec_code..'; OnTrade, '.._trades[trade.tradenum]..', o_n = '..trade.order_num..', t_n = '..trade.trade_num..' ('..trade.price..'x'..trade.qty..')'
  436.                     message(mes); io_log(mes);
  437.                 end
  438.                 toLog(scriptPath..'\\'..logFileName2,trade, 'trade')
  439.             end
  440.         end
  441.     end
  442.     --2.2.4 OnOrder Функция вызывается терминалом QUIK при получении новой заявки или при изменении параметров существующей заявки.
  443.     function OnOrder(order)
  444.         if order.account == account then
  445.             local order_flag = get_order_status(order.flags)
  446.             local op = order_flag.operation
  447.             local mes = order.sec_code..'; OnOrder, '..op.. ', o_n = '..order.order_num..' ('..order.price..'x'..order.qty.."), t_id = "..order.trans_id..', flag = '..order.flags..", "..order.brokerref..", balance = "..order.balance..', '..order_flag.status
  448.             io_log(mes)
  449.             toLog(scriptPath..'\\'..logFileName2,order, 'order')
  450.         end
  451.     end
  452. end
  453. --
  454.  
  455. function toLog(file_path,value,txt)
  456.     -- запись в файл параметра value
  457.     -- value может быть числом, строкой или таблицей
  458.     -- file_path  -  путь к файлу
  459.     -- файл открывается на дозапись и закрывается после записи строки
  460.     local now = getHRTime() -- c мс
  461.     if file_path~=nil and value~=nil then
  462.         local lf, err = io.open(file_path, "a")
  463.         assert(lf, "Ошибка записи "..file_path..", \n")
  464.         if lf~=nil then
  465.             lf:write(txt.."\n")
  466.             if type(value)=="string" or type(value)=="number" then
  467.                 lf:write(now.." "..value.."\n")
  468.             elseif type(value)=='boolean' then
  469.                 lf:write(now.." "..tostring(value).."\n")
  470.             elseif type(value)=="table" then
  471.                 lf:write(now.."\n"..table2string(value).."\n")
  472.             end
  473.             lf:flush()
  474.             if io.type(lf)=="file" then lf:close() end
  475.         end
  476.     end
  477. end
  478. --
  479.  
  480. function table2string(table)
  481.     local k,v,str=0,0,""
  482.     for k,v in pairs(table) do
  483.         if type(v)=="string" or type(v)=="number" then
  484.             str=str..k.."="..v..';\n'   --  в 1
  485.             --str=str..k.."="..v..'; '  --  в 2
  486.         elseif type(v)=="table"then
  487.             str=str..k.."={\n"..table2string(v).."};\n"
  488.         elseif type(v)=="function" or type(v)=='boolean' then
  489.             str=str..k..'='..tostring(v)..';\n'
  490.         end
  491.     end
  492.     return str
  493. end
  494. --
  495.  
  496. -- 2.2.8    OnFuturesClientHolding
  497. -- Функция вызывается терминалом QUIK при изменении позиции по срочному рынку.
  498. function OnFuturesClientHolding(tab)
  499.     local sec_code = tab.sec_code
  500.     local totalnet = tab.totalnet
  501.     if running and sec_code == secCode then -- выбираем нужную нам бумагу
  502.         local t= tonumber(totalnet)
  503.         if t ~= nil then
  504.             SetCell(tblH.t_id, 1, 2, tostring(totalnet), totalnet)
  505.             positionColor(t)
  506.         end
  507.     end
  508. end
  509. --
  510. -- 2.2.5  Функция вызывается терминалом QUIK при получении изменений текущей позиции по счету.
  511. -- (ТОЛЬКО ДЛЯ БРОКЕРА).
  512. function OnAccountBalance(acc_bal)
  513.     if acc_bal.sec_code==secCode then
  514.         local t= acc_bal.currentpos
  515.         if t ~= nil then
  516.             SetCell(tblH.t_id, 1, 2, tostring(t))
  517.             positionColor(t)
  518.         end
  519.     end
  520. end
  521.  
  522. --  2.2.18  OnParam
  523. --  Функция вызывается терминалом QUIK при изменении текущих параметров.
  524. function OnParam(class, seccode)
  525.     if seccode == secCode then -- выбираем нужную нам бумагу
  526.         local lp = tonumber(getParamEx(class, seccode, "last").param_value)
  527.         if lp > lastPrice then
  528.             Highlight(tblH.t_id, 1, 3, SeaGreen, dc, 1000)      -- подсветка мягкий, зеленый
  529.             lastPrice = lp  -- цена последней сделки
  530.             SetCell(tblH.t_id, 1, 3, tostring(lastPrice))
  531.         elseif lp < lastPrice then
  532.             Highlight(tblH.t_id, 1, 3, RosyBrown, dc, 1000)     -- подсветка
  533.             lastPrice = lp
  534.             SetCell(tblH.t_id, 1, 3, tostring(lastPrice))
  535.         end
  536.     end
  537. end
  538. --
  539.  
  540. -- 2.2.24 OnStop
  541. -- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при
  542. -- закрытии терминала QUIK.
  543. function OnStop()
  544.     local mes = 'Stop SuperScalp.'
  545.     message(mes); io_log(mes);
  546.     running = false
  547.     DestroyTable(tblH.t_id)
  548. end
  549. --
  550.  
  551. -- 2.2.25 OnInit
  552. -- Функция вызывается терминалом QUIK перед вызовом функции main().
  553. function OnInit()
  554.     getInitParameter()
  555.     logFile = scriptPath..'\\'..logFileName1
  556.     local mes = 'Start SuperScalp '..ver..', QUIK '..Terminal_Version
  557.     message(mes); io_log(mes);
  558.     running = true
  559.     HandleBS()
  560.     lastPos = futures_position()
  561.     SetCell(tblH.t_id, 1, 2, tostring(lastPos))
  562.     positionColor(lastPos)
  563. end
  564. --
  565.  
  566. -- 2.2.26 main
  567. -- Функция, реализующая основной поток выполнения в скрипте.
  568. function main()
  569.     while running do
  570.         sleep(1000)
  571.         if not is_forts then
  572.             local t = getDepoEx(firm_id, ClientCode, secCode, account, 0)
  573.             local T = t.currentbal
  574.             SetCell(tblH.t_id, 1, 2, tostring(T))
  575.             positionColor(T)
  576.         end
  577.        
  578.     end
  579. end
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×