<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Просто открыть сделку на инструменте  проблема]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Просто открыть сделку на инструменте  проблема форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sun, 24 May 2026 03:46:37 +0300</pubDate>
		<item>
			<title>Просто открыть сделку на инструменте  проблема</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message37917/topic4511/">Просто открыть сделку на инструменте  проблема</a></b> <i>Работает стабильно код на языке луа но дает ошибку</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Нормально работает но каждый раз после рестарта терминала выдает ошибку error cliring &nbsp;один раз на старте. Это довольно напрягает и можно не заметить что сделка не состоялась. <br />
			<i>14.05.2019 14:44:08, Yerlan.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message37917/topic4511/</link>
			<guid>http://forum.quik.ru/messages/forum10/message37917/topic4511/</guid>
			<pubDate>Tue, 14 May 2019 14:44:08 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Просто открыть сделку на инструменте  проблема</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message37916/topic4511/">Просто открыть сделку на инструменте  проблема</a></b> <i>Работает стабильно код на языке луа но дает ошибку</i> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			====code====
<pre>local ver = '1.4'&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;&nbsp;06.03.2016
local lastPos = 0
local lastPrice = 0
local string_gmatch=string.gmatch
local string_find=string.find
local string_sub=string.sub
local string_len=string.len
local string_format=string.format
local math_modf=math.modf
local SeaGreen=12713921&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;&nbsp;RGB(193, 255, 193)
local RosyBrown=12698111&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;&nbsp;RGB(255, 193, 193)
local logFile
local trades = {} -- Таблица_01 - получили сделку
local _trades = {} -- временная таблица наших сделок для отлова дублей в QUIK ver. 7.1.0
local orders = {}&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;&nbsp;Таблица заявок
local scriptPath = getScriptPath()
local Terminal_Version=getInfoParam('VERSION')

local function versionLess(ver1,ver2)
&nbsp;&nbsp;&nbsp;local begin,ver_1=0
&nbsp;&nbsp;&nbsp;for ver_2 in string_gmatch(ver2,'%d+') do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_,begin,ver_1=string_find(ver1,'(%d+)',begin+1)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ver_1~=ver_2 then return not ver_1 or ver_1+0&#60;ver_2+0 end
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;return false
end
local&nbsp;&nbsp;v = '6.17'
local table_insert
local table_remove
local table_concat
if versionLess(Terminal_Version,v ) then
&nbsp;&nbsp;&nbsp;table_insert=table.ins ert
&nbsp;&nbsp;&nbsp;table_remove=table.remove
&nbsp;&nbsp;&nbsp;table_concat=table.concat
else&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;table_insert=table.sinsert
&nbsp;&nbsp;&nbsp;table_remove=table.sremove
&nbsp;&nbsp;&nbsp;table_concat=table.sconcat
end
-----

local dc = QTABLE_DEFAULT_COLOR

local testQuik = true -- подписка на OnTransReply, OnTrade, OnOrder
--local testQuik = false -- без подписки

function firm_id()
&nbsp;&nbsp;for i = 0, getNumberOf("money_limits") - 1 do
&nbsp;&nbsp;&nbsp;&nbsp;local row = getItem("money_limits", i)
&nbsp;&nbsp;&nbsp;&nbsp;if row ~= nil and row.firmid ~= nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local ss = tostring(string_sub(row.firmid, 2, 2))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ss == "C" or ss == "R" or ss == "B" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return tostring(row.firmid)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;end
&nbsp;&nbsp;return nil
end

local is_forts = true
--настройки
function getInitParameter()
&nbsp;&nbsp;&nbsp;if is_forts then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account = ''
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classCode = ''
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;secCode = 'RIM9'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenSlippage = 50
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLASS_CODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 'SPBFUT'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Код класса
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SEC_CODE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 'RIM9'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Код инструмента
&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;account="NL0011100043"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClientCode = "99914"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classCode = 'QJSIM'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;secCode = 'SBER'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OpenSlippage = 0.5
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firm_id = firm_id()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message('firm_id = '..firm_id)
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;workSize = 4 -- рабочий размер
&nbsp;&nbsp;&nbsp;logFileName1 = 'logFile1.txt'&nbsp;&nbsp;&nbsp;-- файл для укороченного протоколирования коллбэков
&nbsp;&nbsp;&nbsp;logFileName2 = 'logFile2.txt'&nbsp;&nbsp;&nbsp;-- файл для печати всех полей коллбэков
end
---------------------------------------------------------
-- Округляет число до указанной точности
math_round = function(num, idp)
&nbsp;&nbsp;local mult = 10^(idp or 0)
&nbsp;&nbsp;return math.floor(num * mult + 0.5) / mult
end
-- Приводит переданную цену к требуемому для транзакции по инструменту виду
GetCorrectPrice = function(price) -- STRING
&nbsp;&nbsp; -- Получает точность цены по инструменту
&nbsp;&nbsp; local scale = getSecurityInfo(CLASS_CODE, SEC_CODE).scale
&nbsp;&nbsp; -- Получает минимальный шаг цены инструмента
&nbsp;&nbsp; local PriceStep = tonumber(getParamEx(CLASS_CODE, SEC_CODE, "SEC_PRICE_STEP").param_value)
&nbsp;&nbsp; -- Если после запятой должны быть цифры
&nbsp;&nbsp; if scale &#62; 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;price = tostring(price)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Ищет в числе позицию запятой, или точки
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local dot_pos = price:find('.')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local comma_pos = price:find(',')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Если передано целое число
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if dot_pos == nil and comma_pos == nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Добавляет к числу ',' и необходимое количество нулей и возвращает результат
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; price = price..','
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i=1,scale do price = price..'0' end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return price
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else -- передано вещественное число&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Если нужно, заменяет запятую на точку 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if comma_pos ~= nil then price:gsub(',', '.') end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Округляет число до необходимого количества знаков после запятой
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; price = math_round(tonumber(price), scale)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Корректирует на соответствие шагу цены
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; price = math_round(price/PriceStep)*PriceStep
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; price = string.gsub(tostring(price),'&#91;&#92;.&#93;+', ',')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return price
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp; else -- После запятой не должно быть цифр
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Корректирует на соответствие шагу цены
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;price = math_round(price/PriceStep)*PriceStep
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return tostring(math.floor(price))
&nbsp;&nbsp; end
end

-- Возвращает корректную цену для рыночной заявки по текущему инструменту (принимает 'S',или 'B')
GetPriceForMarketOrder = function(operation) -- STRING
&nbsp;&nbsp; -- Получает минимальный шаг цены инструмента
&nbsp;&nbsp; local PriceStep = tonumber(getParamEx(CLASS_CODE, SEC_CODE, "SEC_PRICE_STEP").param_value)
&nbsp;&nbsp; -- В зависимости от направления
&nbsp;&nbsp; if operation == 'B' then -- BUY
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Пытается получить максимально возможную цену для инструмента
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local PriceMax = tonumber(getParamEx(CLASS_CODE,&nbsp;&nbsp;SEC_CODE, 'OFFER').param_value)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Если максимально возможная цена получена
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if PriceMax ~= nil and PriceMax ~= 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Возвращает ее в нужном для транзакции формате
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return GetCorrectPrice(PriceMax)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Иначе, максимально возможная цена не получена
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Получает цену последней сделки
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; local Last = tonumber(getParamEx(CLASS_CODE,&nbsp;&nbsp;SEC_CODE, 'LAST').param_value)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Возвращает ее в нужном для транзакции формате, увеличив перед этим на 50 шагов цены
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return GetCorrectPrice(Last + 50*PriceStep)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- SELL
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Пытается получить минимально возможную цену для инструмента
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local PriceMin = tonumber(getParamEx(CLASS_CODE,&nbsp;&nbsp;SEC_CODE, 'BID').param_value)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Если минимально возможная цена получена
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if PriceMin ~= nil and PriceMin ~= 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Возвращает ее в нужном для транзакции формате
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return GetCorrectPrice(PriceMin)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- Иначе, минимально возможная цена не получена
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Получает цену последней сделки
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; local Last = tonumber(getParamEx(CLASS_CODE,&nbsp;&nbsp;SEC_CODE, 'LAST').param_value)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- Возвращает ее в нужном для транзакции формате, уменьшив перед этим на 50 шагов цены
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return GetCorrectPrice(Last - 50*PriceStep)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp; end 
end

function isModule(modname)
&nbsp;&nbsp;&nbsp;if not package.loaded&#91;modname&#93; then&nbsp;&nbsp;&nbsp;-- Если модуль modname не загружен ранее
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i, v in ipairs(package.loaders) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local loader = v(modname)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if type(loader) == 'function' then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;package.preload&#91;modname&#93; = loader
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return true
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
end
--
local modname = "socket.socket"
local isSocket
local _mes
if isModule(modname) then
&nbsp;&nbsp;&nbsp;isSocket = require(modname)
else&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;_mes = modname..' No exist!'; message(_mes,3)
end


function getHRTime()
&nbsp;&nbsp;&nbsp;-- возвращает время с милисекундами или без них, в зависимости от наличия socket.socket
&nbsp;&nbsp;&nbsp;if isSocket then 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local now = socket.gettime() 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return string_format("%s,%03d",os.date("%X",now),select(2,math_modf(now))*1000)
&nbsp;&nbsp;&nbsp;else 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return os.date("%X", os.time()) 
&nbsp;&nbsp;&nbsp;end
end
--

function event_callback_tblH(t_id, msg, par1, par2)
&nbsp;&nbsp;&nbsp;if msg == QTABLE_LBUTTONDOWN then&nbsp;&nbsp;&nbsp;-- нажата левая кнопка мыши
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local mes = ''
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastPos = futures_position()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local status = tonumber(getParamEx(classCode, secCode,"status").param_value)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if status ~= 1 or par1 == 1 then -- если бумага не торгуется, заявку не подаем
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Highlight(t_id, par1, par2, RosyBrown, dc, 500)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- подсветка, RosyBrown
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if status ~= 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = 'error cliring'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message(mes); io_log(mes);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Highlight(t_id, par1, par2, SeaGreen, dc, 500)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- подсветка SeaGreen
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if par1 == 2 and par2 == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if lastPos &#60; 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: Buy, '..-lastPos
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buy(classCode, secCode, -lastPos, 'CloseShort')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif &nbsp;&nbsp;&nbsp;lastPos == 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: Buy, '..workSize
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buy(classCode, secCode, workSize, 'OpenLong')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: Buy. My v longah ne pokupaem!'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif par1 == 2 and par2 == 2 then&nbsp;&nbsp;&nbsp;-- продать, левая кнопка
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if lastPos &#62; 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: Sell, '..lastPos
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sell(classCode, secCode, lastPos, 'CloseLong')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif &nbsp;&nbsp;&nbsp;lastPos == 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: Sell, '..workSize
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sell(classCode, secCode, workSize, 'OpenShort')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: Sell. my v shortah ne prodaem!'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif par1 == 2 and par2 == 3 then&nbsp;&nbsp;&nbsp;-- закрыть позиции
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if lastPos &#62; 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: закрыть лонги, '..lastPos
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Sell(classCode, secCode, lastPos, 'CloseAll')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif &nbsp;&nbsp;&nbsp;lastPos &#60; 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: закрыть шорты, '..-lastPos
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buy(classCode, secCode, -lastPos, 'CloseAll')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: закрыть. No position for close!'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif par1 == 3 and par2 == 1 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if lastPos &#60; 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: Buy-, '..-lastPos
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BuyBid(classCode, secCode, -lastPos, 'CloseShort')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif &nbsp;&nbsp;&nbsp;lastPos == 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BuyBid(classCode, secCode, workSize, 'OpenLong')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: Buy-, '..workSize
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: Buy-. My v longah ne pokupaem!'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif par1 == 3 and par2 == 2 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if lastPos &#62; 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SellOffer(classCode, secCode, lastPos, 'CloseLong')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: Sell+, '..lastPos
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif &nbsp;&nbsp;&nbsp;lastPos == 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SellOffer(classCode, secCode, workSize, 'OpenShort')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: Sell+, '..workSize
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: Sell+. Мmy v shortah ne prodaem!'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif par1 == 3 and par2 == 3 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mes = secCode..'; Pressed: Remove all orders!'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KillOrders()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message(mes); io_log(mes);
&nbsp;&nbsp;&nbsp;elseif msg == QTABLE_CLOSE then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnStop()
&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;&nbsp;
end
--

QTable ={}
QTable.__index = QTable
-- Создать и инициализировать экземпляр таблицы QTable
function QTable.new()
&nbsp;&nbsp;&nbsp;local t_id = AllocTable()
&nbsp;&nbsp;&nbsp;if t_id ~= nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q_table = {}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setmetatable(q_table, QTable)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q_table.t_id=t_id
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q_table.caption = ""
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q_table.created = false
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q_table.curr_col=0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- таблица с описанием параметров столбцов
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q_table.columns={}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return q_table
&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return nil
&nbsp;&nbsp;&nbsp;end
end
tblH = QTable:new() -- для ручной торговли
--

function get_trans_id()
&nbsp;&nbsp;&nbsp;local s = tostring(os.clock())
&nbsp;&nbsp;&nbsp;local x, g = string_find(s, "(%d+)")
&nbsp;&nbsp;&nbsp;s = string_sub(s, g + 2)
&nbsp;&nbsp;&nbsp;for i = 1, 3 - string_len(s) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s = "0" .. s
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;return os.date("%H%M%S") .. s
end
--
--- Функция отправки ордера
function send_order(client, class, seccode, account, operation, quantity, price)
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;local gcp=GetPriceForMarketOrder(operation) 
&nbsp;&nbsp;&nbsp;local trans_id = get_trans_id()
&nbsp;&nbsp;&nbsp;local trans_params = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLASSCODE = class,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CLIENT_CODE = client,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SECCODE = seccode,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACCOUNT = account,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TYPE = new_type,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRANS_ID = trans_id,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OPERATION = operation,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;QUANTITY = tostring(quantity),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRICE = tostring(gcp),
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACTION = "NEW_ORDER"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;return sendTransaction(trans_params)
end
--

function Buy(classCode, secCode, size, action)
&nbsp;&nbsp;&nbsp;local best_offer = getParamEx(classCode, secCode, "offer").param_value
&nbsp;&nbsp;&nbsp;local buyPrice = best_offer + (OpenSlippage or 0)
&nbsp;&nbsp;&nbsp;local res = send_order(action, classCode, secCode, account, "B", size, buyPrice)
&nbsp;&nbsp;&nbsp;if string_len(res) ~= 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local mes = 'Error: '..res..', '.. action..', '..secCode..', '.."B"..', '..size..', price='..buyPrice
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message(mes,3); io_log(mes);
&nbsp;&nbsp;&nbsp;end
end
--

function Sell(classCode, secCode, size, action)
&nbsp;&nbsp;&nbsp;local best_bid = getParamEx(classCode, secCode, "bid").param_value
&nbsp;&nbsp;&nbsp;local sellPrice = best_bid - (OpenSlippage or 0)
&nbsp;&nbsp;&nbsp;local res = send_order(action, classCode, secCode, account, "S", size, sellPrice)
&nbsp;&nbsp;&nbsp;if string_len(res) ~= 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local mes = 'Error: '..res..', '.. action..', '..secCode..', '.."S"..', '..size..', price='..sellPrice
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message(mes,3); io_log(mes);
&nbsp;&nbsp;&nbsp;end
end
--

function BuyBid(classCode, secCode, size, action)
&nbsp;&nbsp;&nbsp;local best_bid = getParamEx(classCode, secCode, "bid").param_value
&nbsp;&nbsp;&nbsp;local buyPrice = best_bid - (OpenSlippage or 0)
&nbsp;&nbsp;&nbsp;local res = send_order(action, classCode, secCode, account, "B", size, buyPrice)
&nbsp;&nbsp;&nbsp;if string_len(res) ~= 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local mes = 'Error: '..res..', '.. action..', '..secCode..', '.."B"..', '..size..', price='..buyPrice
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message(mes,3); io_log(mes);
&nbsp;&nbsp;&nbsp;end
end
--

function SellOffer(classCode, secCode, size, action)
&nbsp;&nbsp;&nbsp;local best_offer = getParamEx(classCode, secCode, "offer").param_value
&nbsp;&nbsp;&nbsp;local sellPrice = best_offer + (OpenSlippage or 0)
&nbsp;&nbsp;&nbsp;local res = send_order(action, classCode, secCode, account, "S", size, sellPrice)
&nbsp;&nbsp;&nbsp;if string_len(res) ~= 0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local mes = 'Error: '..res..', '.. action..', '..secCode..', '.."S"..', '..size..', price='..sellPrice
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message(mes,3); io_log(mes);
&nbsp;&nbsp;&nbsp;end
end
--

function KillOrders()
&nbsp;&nbsp;&nbsp;local NumberOf = getNumberOf("orders")
&nbsp;&nbsp;&nbsp;for i = 0, NumberOf - 1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local ord = getItem("orders", i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ord.sec_code == secCode and ord.account == account&nbsp;&nbsp;then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local order_flag = get_order_status(ord.flags)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if order_flag.status == "active" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trans_id = get_trans_id()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local trans_params = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;"CLASSCODE"&#93; = classCode,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;"TRANS_ID"&#93; = trans_id,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;"ACTION"&#93; = "KILL_ORDER",
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#91;"ORDER_KEY"&#93; = tostring(ord.order_num)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local res =&nbsp;&nbsp;sendTransaction(trans_params)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if 0 &#60; string_len(res) then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local mes = 'Error: '..res
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message(mes,3); io_log(mes);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
end
--

function HandleBS()
&nbsp;&nbsp;&nbsp;local t = tblH.t_id
&nbsp;&nbsp;&nbsp;AddColumn(t, 1, 'Bumaga', true,QTABLE_CACHED_STRING_TYPE,12)
&nbsp;&nbsp;&nbsp;AddColumn(t, 2, 'Tcp', true,QTABLE_STRING_TYPE,12)
&nbsp;&nbsp;&nbsp;AddColumn(t, 3, 'Last price.', true,QTABLE_STRING_TYPE,17)
&nbsp;&nbsp;&nbsp;CreateWindow(t)
&nbsp;&nbsp;&nbsp;SetWindowCaption(t, "SuperScalp "..ver)&nbsp;&nbsp;&nbsp;--SetWindowCaption(t, "Scalper:"..account)
&nbsp;&nbsp;&nbsp;SetWindowPos(t, 0, 100, 250, 120)
&nbsp;&nbsp;&nbsp;local li=InsertRow(t, -1)
&nbsp;&nbsp;&nbsp;SetCell(t, li, 1, secCode)
&nbsp;&nbsp;&nbsp;SetCell(t, li, 2, lastPos)
&nbsp;&nbsp;&nbsp;SetCell(t, li, 3, '7503')&nbsp;&nbsp;&nbsp;--Ожидание
&nbsp;&nbsp;&nbsp;local li=InsertRow(t, -1)
&nbsp;&nbsp;&nbsp;SetCell(t, li, 1, 'Buy')
&nbsp;&nbsp;&nbsp;SetCell(t, li, 2, 'Sell')
&nbsp;&nbsp;&nbsp;SetCell(t, li, 3, 'Close')
&nbsp;&nbsp;&nbsp;local li=InsertRow(t, -1)
&nbsp;&nbsp;&nbsp;SetCell(t, li, 1, 'Buy —')
&nbsp;&nbsp;&nbsp;SetCell(t, li, 2, 'Sell +')
&nbsp;&nbsp;&nbsp;SetCell(t, li, 3, 'Close All')
&nbsp;&nbsp;&nbsp;SetTableNotificationCallback(t,event_callback_tblH)
end
--

--прочитать ТТП и вытащить ТЧП.
function futures_position()
&nbsp;&nbsp;&nbsp;if is_forts then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local count=getNumberOf("futures_client_holding") --Позиции по клиентским счетам (фьючерсы)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for i=0,count-1, 1 do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local row=getItem("futures_client_holding",i)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if row.trdaccid~=nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local seccode=row.sec_code&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--Код фьючерсного контракта, "Инструмент"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local totn=row.totalnet&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--Текущие чистые позиции&nbsp;&nbsp;&nbsp;"ТЧП"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if seccode == secCode then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return totn
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local t = getDepoEx(firm_id, ClientCode, secCode, account, 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if t then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local T = t.currentbal
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCell(tblH.t_id, 1, 2, tostring(T))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;positionColor(T)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return T
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;return 0
end
--

function positionColor(tot)
&nbsp;&nbsp;&nbsp;if tot&#62;0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetColor(tblH.t_id,1,2, SeaGreen, dc, dc, dc)&nbsp;&nbsp;&nbsp;-- подсветка SeaGreen
&nbsp;&nbsp;&nbsp;elseif tot&#60;0 then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetColor(tblH.t_id,1,2, RosyBrown, dc, dc, dc)&nbsp;&nbsp;&nbsp;-- подсветка, RosyBrown
&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetColor(tblH.t_id,1,2,dc, dc, dc, dc)
&nbsp;&nbsp;&nbsp;end 
end
--

function get_order_status(flags)
&nbsp;&nbsp;local rt = {}
&nbsp;&nbsp;local band = bit.band
&nbsp;&nbsp;local tobit = bit.tobit
&nbsp;&nbsp;if band(tobit(flags), 1) ~= 0 and band(tobit(flags), 2) == 0 then
&nbsp;&nbsp;&nbsp;&nbsp;rt.status = "active"
&nbsp;&nbsp;elseif band(tobit(flags), 1) == 0 and band(tobit(flags), 2) ~= 0 then
&nbsp;&nbsp;&nbsp;&nbsp;rt.status = "cancelled"
&nbsp;&nbsp;elseif band(tobit(flags), 1) == 0 and band(tobit(flags), 2) == 0 then
&nbsp;&nbsp;&nbsp;&nbsp;rt.status = "filled"
&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;rt.status = "unknown"
&nbsp;&nbsp;end
&nbsp;&nbsp;if band(tobit(flags), 4) ~= 0 then
&nbsp;&nbsp;&nbsp;&nbsp;rt.operation = "S"
&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;rt.operation = "B"
&nbsp;&nbsp;end
&nbsp;&nbsp;return rt
end
--

--запись лога с текущим простым временем
function io_log(str)
&nbsp;&nbsp;&nbsp;local file, err = io.open(logFile, "a")
&nbsp;&nbsp;&nbsp;assert(file, "Error write "..logFile..", &#92;n"..str)
&nbsp;&nbsp;&nbsp;local str0 = getHRTime()&nbsp;&nbsp;&nbsp;-- время с миллисекундами
&nbsp;&nbsp;&nbsp;str0 = str0..'; '.. str
&nbsp;&nbsp;&nbsp;file:write(str0 .. "&#92;n")
&nbsp;&nbsp;&nbsp;file:flush()
&nbsp;&nbsp;&nbsp;file:close()
&nbsp;&nbsp;&nbsp;return true
end
--

if testQuik then
&nbsp;&nbsp;&nbsp;-- 2.2.17 - Функция вызывается терминалом QUIK при получении ответа на транзакцию пользователя.
&nbsp;&nbsp;&nbsp;function OnTransReply(reply)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if reply.account == account then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if running then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local mes =&nbsp;&nbsp;reply.sec_code..'; OnTrans, o_n '..reply.order_num..', '..tostring(reply.price)..' x '..
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tostring(reply.quantity)..', t_id = '..reply.trans_id
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message(mes); io_log(mes);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toLog(scriptPath..'&#92;&#92;'..logFileName2,reply, 'reply')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;-- 2.2.3 Функция вызывается терминалом QUIK при получении сделки.
&nbsp;&nbsp;&nbsp;function OnTrade(trade)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if trade.account == account then&nbsp;&nbsp;&nbsp;-- только если заявка из нашего счета - 01.11.2014
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if running then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not _trades&#91;trade.trade_num&#93; then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local mes = trade.sec_code..'; OnTrade, 1, o_n = '..trade.order_num..', t_n = '..trade.trade_num..' ('..trade.price..'x'..trade.qty..')'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message(mes); io_log(mes);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_trades&#91;trade.trade_num&#93; = true&nbsp;&nbsp;-- Добавим в очередь
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_trades&#91;trade.tradenum&#93; = 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table_insert(trades,trade)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_trades&#91;trade.tradenum&#93; = _trades&#91;trade.tradenum&#93; + 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local mes = trade.sec_code..'; OnTrade, '.._trades&#91;trade.tradenum&#93;..', o_n = '..trade.order_num..', t_n = '..trade.trade_num..' ('..trade.price..'x'..trade.qty..')'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message(mes); io_log(mes);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toLog(scriptPath..'&#92;&#92;'..logFileName2,trade, 'trade')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;--2.2.4&nbsp;&nbsp;&nbsp;OnOrder&nbsp;&nbsp;&nbsp;Функция вызывается терминалом QUIK при получении новой заявки или при изменении параметров существующей заявки.
&nbsp;&nbsp;&nbsp;function OnOrder(order)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if order.account == account then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local order_flag = get_order_status(order.flags)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local op = order_flag.operation
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;io_log(mes)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;toLog(scriptPath..'&#92;&#92;'..logFileName2,order, 'order')
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;end
end
--

function toLog(file_path,value,txt)
&nbsp;&nbsp;&nbsp;-- запись в файл параметра value
&nbsp;&nbsp;&nbsp;-- value может быть числом, строкой или таблицей
&nbsp;&nbsp;&nbsp;-- file_path&nbsp;&nbsp;-&nbsp;&nbsp;путь к файлу
&nbsp;&nbsp;&nbsp;-- файл открывается на дозапись и закрывается после записи строки
&nbsp;&nbsp;&nbsp;local now = getHRTime()&nbsp;&nbsp;&nbsp;-- c мс
&nbsp;&nbsp;&nbsp;if file_path~=nil and value~=nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local lf, err = io.open(file_path, "a")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;assert(lf, "Ошибка записи "..file_path..", &#92;n")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if lf~=nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lf:write(txt.."&#92;n")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if type(value)=="string" or type(value)=="number" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lf:write(now.." "..value.."&#92;n")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif type(value)=='boolean' then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lf:write(now.." "..tostring(value).."&#92;n")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif type(value)=="table" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lf:write(now.."&#92;n"..table2string(val ue).."&#92;n")
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lf:flush()
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if io.type(lf)=="file" then&nbsp;&nbsp;&nbsp;lf:close() end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
end
--

function table2string(table)
&nbsp;&nbsp;&nbsp;local k,v,str=0,0,""
&nbsp;&nbsp;&nbsp;for k,v in pairs(table) do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if type(v)=="string" or type(v)=="number" then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str=str..k.."="..v..';&#92;n'&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;в 1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--str=str..k.."="..v..'; '&nbsp;&nbsp;&nbsp;--&nbsp;&nbsp;в 2
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif type(v)=="table"then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str=str..k.."={&#92;n"..table2string(v).."};&#92;n"
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif type(v)=="function" or type(v)=='boolean' then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str=str..k..'='..tostring(v)..';&#92;n'
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;return str
end
--

-- 2.2.8&nbsp;&nbsp;&nbsp;OnFuturesClientHolding
-- Функция вызывается терминалом QUIK при изменении позиции по срочному рынку.
function OnFuturesClientHolding(tab)
&nbsp;&nbsp;&nbsp;local sec_code = tab.sec_code
&nbsp;&nbsp;&nbsp;local totalnet = tab.totalnet
&nbsp;&nbsp;&nbsp;if running and sec_code == secCode then -- выбираем нужную нам бумагу
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local t= tonumber(totalnet)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if t ~= nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCell(tblH.t_id, 1, 2, tostring(totalnet), totalnet)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;positionColor(t)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
end
--
-- 2.2.5&nbsp;&nbsp;Функция вызывается терминалом QUIK при получении изменений текущей позиции по счету.
-- (ТОЛЬКО ДЛЯ БРОКЕРА).
function OnAccountBalance(acc_bal)
&nbsp;&nbsp;&nbsp;if acc_bal.sec_code==secCode then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local t= acc_bal.currentpos
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if t ~= nil then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCell(tblH.t_id, 1, 2, tostring(t))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;positionColor(t)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end
end

--&nbsp;&nbsp;&nbsp;2.2.18&nbsp;&nbsp;&nbsp;OnParam
--&nbsp;&nbsp;&nbsp;Функция вызывается терминалом QUIK при изменении текущих параметров.
function OnParam(class, seccode)
&nbsp;&nbsp;&nbsp;if seccode == secCode then -- выбираем нужную нам бумагу
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local lp = tonumber(getParamEx(class, seccode, "last").param_value)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if lp &#62; lastPrice then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Highlight(tblH.t_id, 1, 3, SeaGreen, dc, 1000)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- подсветка мягкий, зеленый
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastPrice = lp&nbsp;&nbsp;&nbsp;-- цена последней сделки
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCell(tblH.t_id, 1, 3, tostring(lastPrice))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif lp &#60; lastPrice then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Highlight(tblH.t_id, 1, 3, RosyBrown, dc, 1000)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-- подсветка
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastPrice = lp
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCell(tblH.t_id, 1, 3, tostring(lastPrice))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;end&nbsp;&nbsp;&nbsp;
end
--

-- 2.2.24 OnStop
-- Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при
-- закрытии терминала QUIK.
function OnStop()
&nbsp;&nbsp;&nbsp;local mes = 'Stop SuperScalp.'
&nbsp;&nbsp;&nbsp;message(mes); io_log(mes);
&nbsp;&nbsp;&nbsp;running = false
&nbsp;&nbsp;&nbsp;DestroyTable(tblH.t_id)
end
--

-- 2.2.25 OnInit
-- Функция вызывается терминалом QUIK перед вызовом функции main().
function OnInit()
&nbsp;&nbsp;&nbsp;getInitParameter()
&nbsp;&nbsp;&nbsp;logFile = scriptPath..'&#92;&#92;'..logFileName1
&nbsp;&nbsp;&nbsp;local mes = 'Start SuperScalp '..ver..', QUIK '..Terminal_Version
&nbsp;&nbsp;&nbsp;message(mes); io_log(mes);
&nbsp;&nbsp;&nbsp;running = true
&nbsp;&nbsp;&nbsp;HandleBS()
&nbsp;&nbsp;&nbsp;lastPos = futures_position()
&nbsp;&nbsp;&nbsp;SetCell(tblH.t_id, 1, 2, tostring(lastPos))
&nbsp;&nbsp;&nbsp;positionColor(lastPos)
end
--

-- 2.2.26 main
-- Функция, реализующая основной поток выполнения в скрипте.
function main()
&nbsp;&nbsp;&nbsp;while running do
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sleep(1000)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not is_forts then
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local t = getDepoEx(firm_id, ClientCode, secCode, account, 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local T = t.currentbal
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetCell(tblH.t_id, 1, 2, tostring(T))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;positionColor(T)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;end
end
</pre>
============= <br />
			<i>14.05.2019 14:41:53, Yerlan.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message37916/topic4511/</link>
			<guid>http://forum.quik.ru/messages/forum10/message37916/topic4511/</guid>
			<pubDate>Tue, 14 May 2019 14:41:53 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
