Идея взята отсюда - [url]http://quik2dde.ru/viewtopic.php?id=39[/url], автору за него огромное спасибо, но у меня также не пошел ввод/вывод с xml (ошибка ""Error loading module 'LuaXML_lib' from file '.\LuaXML_lib.dll: не найден указанный модуль"), т. к. он в сторонней библиотеке и подключить ее никак не удавалось, хотя файл библиотеки сам присутствовал.
Поэтому захотелось побыстрее получить какой-нибудь более-менее рабочий вариант без ошибок.
Требует для работы vcl.dll - подробнее quik2dde.ru/viewtopic.php?id=26
Внимание !!! Эта версия отправляет реальные заявки на биржу 1 лотом фьючерса Сбербанка по ценам bid и offer. Для работы требуется только вписать свой номер счета на FORTS в этой строке - Account="SPBFUTXXXXX". Скрипт лучше останавливать кнопкой "Остановить" из Quik, а не закрывая его окно - так в его работе ошибок не возникало при многократном перезапуске.
Важно! Вероятнее всего, что это скрипт не работает на акциях, т. к. в данном скрипте производится обновление цены до целых чисел, как на фьючерсах. Для округления цена акций до заданной точности необходимо использовать вместо math.floor в строках, подобных этой - bid1 = math.floor (bid) свою функцию округления.
--[[
Описание: простой привод "продать-купить" 1 фьючерс Сбербанка
Версия: 0.0.1
-
Тестирование:
Версия Quik: 6.13.1.11
Дата проверки работы: 04.07.2014
-
Внешние модули/библиотеки:
vcl.dll
-
!!! Внимание !!! Отправляет реальные заявки на биржу
]]
-- Пути для установленного языка Lua
package.cpath=".\\?.dll;.\\?51.dll;C:\\Program Files (x86)\\Lua\\5.1\\?.dll;C:\\Program Files (x86)\\Lua\\5.1\\?51.dll;C:\\Program Files (x86)\\Lua\\5.1\\clibs\\?.dll;C:\\Program Files (x86)\\Lua\\5.1\\clibs\\?51.dll;C:\\Program Files (x86)\\Lua\\5.1\\loadall.dll;C:\\Program Files (x86)\\Lua\\5.1\\clibs\\loadall.dll;C:\\Program Files\\Lua\\5.1\\?.dll;C:\\Program Files\\Lua\\5.1\\?51.dll;C:\\Program Files\\Lua\\5.1\\clibs\\?.dll;C:\\Program Files\\Lua\\5.1\\clibs\\?51.dll;C:\\Program Files\\Lua\\5.1\\loadall.dll;C:\\Program Files\\Lua\\5.1\\clibs\\loadall.dll"..package.cpath
package.path=package.path..";.\\?.lua;C:\\Program Files (x86)\\Lua\\5.1\\lua\\?.lua;C:\\Program Files (x86)\\Lua\\5.1\\lua\\?\\init.lua;C:\\Program Files (x86)\\Lua\\5.1\\?.lua;C:\\Program Files (x86)\\Lua\\5.1\\?\\init.lua;C:\\Program Files (x86)\\Lua\\5.1\\lua\\?.luac;C:\\Program Files\\Lua\\5.1\\lua\\?.lua;C:\\Program Files\\Lua\\5.1\\lua\\?\\init.lua;C:\\Program Files\\Lua\\5.1\\?.lua;C:\\Program Files\\Lua\\5.1\\?\\init.lua;C:\\Program Files\\Lua\\5.1\\lua\\?.luac;"
require "vcl"
-- Раздел настроек (начало)
ClassCode="SPBFUT" -- класс инструмента - Фьючерсы
SecCode="SRU4" -- Код инструмента - фьючерс Сбербанка 09.14
Account="SPBFUTXXXXX" -- Счет клиента на FORTS !!! Вписать свой !!!
ClientCode=""
FirmId=""
Trans_ID = 0 -- внутренний счетчик номера заявок
Lots = 1 -- Количество лотов
-- Раздел настроек (конец)
-- Интерфейс (начало)
mainForm = VCL.Form("mainForm")
mainForm.Caption = "Privod ver-0-0-1"
mainForm._= { position="podesktopcenter", height=120, width=150,OnClose = "OnFormClose"}
BuyButton = VCL.Button(mainForm,"Buy")
BuyButton._ = {width=40, height=40, caption="BUY", Top=80, Left=30, onclick = "onBuyClick"}
SellButton = VCL.Button(mainForm,"Sell")
SellButton._ = {width=40, height=40, caption="SELL", Top=80, Left=90, onclick = "onSellClick"}
BidLabel = VCL.Label(mainForm,"Bid")
BidLabel._ = {Top = 40, Left = 15}
OfferLabel = VCL.Label(mainForm,"Offer")
OfferLabel._ = {Top = 10, Left = 16}
-- Интерфейс (конец)
-- Раздел внутренних (не callback) функций (начало)
-- Функция отправки заявок
function SendLimitOrder (ClassCode,SecCode,Operation,OrderPrice,Lots)
Trans_ID = Trans_ID + 1
local trans = {
["ACTION"] = "NEW_ORDER",
["CLASSCODE"] = ClassCode,
["SECCODE"] = SecCode,
["ACCOUNT"] = Account,
["OPERATION"] = Operation,
["PRICE"] = tostring(OrderPrice),
["QUANTITY"] = tostring(Lots),
["TRANS_ID"] = tostring(Trans_ID)
}
local res = sendTransaction(trans)
CurrentOrderPrice = OrderPrice
end
--Обработчик кнопки BUY
function onBuyClick(sender)
if ((qt.bid_count+0 == 0) or (qt.offer_count+0 == 0)) then
return
end
local bid = qt.bid[qt.bid_count+0].price
local bid1 = math.floor (bid)
SendLimitOrder (ClassCode,SecCode,"B",bid1,Lots)
end
--Обработчик кнопки SELL
function onSellClick(sender)
if ((qt.bid_count+0 == 0) or (qt.offer_count+0 == 0)) then
return
end
local offer = qt.offer[1].price
local offer1 = math.floor (offer)
SendLimitOrder (ClassCode,SecCode,"S",offer1,Lots)
end
-- Обработчик закрытия формы
function OnFormClose(Sender, CloseAction)
is_run = false
mainForm:Release()
end
function UpdateBidOffer()
-- Функция обновления значений Bid и Offer из стакана
if is_run == false then
return
end
qt = getQuoteLevel2(ClassCode,SecCode)
if qt == nil then
return
end
if ((qt.bid_count+0 == 0) or (qt.offer_count+0 == 0)) then
return
end
local bid = qt.bid[qt.bid_count+0].price
local offer = qt.offer[1].price
BidLabel.Caption = "Buy: "..bid.. " (" .. math.floor(qt.bid[qt.bid_count+0].quantity) .. ") "
OfferLabel.Caption = "Sell: "..offer.. " (" .. math.floor(qt.offer[1].quantity) .. ") "
end
-- Раздел внутренних (не callback) функций Quik-Lua (конец)
function OnInit()
mainForm:Show()
is_run = true
end
function OnStop()
is_run = false
mainForm:Release()
end
function main()
while is_run do
UpdateBidOffer()
sleep(50)
end
end