У меня все равно это не заработало. Версия квика 7. Я пытаюсь получить номер сделки из таблицы "Все сделки". Там 19 символов. Мне приходится изварачиваться и делать номер сделки из даты, времени и микросекунд (или милисекунд).
local tradelist = {};
for i = 0,getNumberOf("trades") - 1 do
tradelist[i] = "" ..
getItem("trades",i).datetime.day.."."..getItem("trades",i).datetime.month.."."..getItem("trades",i).datetime.year..";"..
getItem("trades",i).datetime.hour..":"..getItem("trades",i).datetime.min..":"..getItem("trades",i).datetime.sec..";"..
tonumber(string.format("%0.17g", getItem("trades",i).trade_num))..";"..
tonumber(getItem("trades",i).order_num)..";"..
tonumber(getItem("trades",i).trans_id)..";"..
getItem("trades",i).sec_code..";"..
getItem("trades",i).brokerref..";"..
getItem("trades",i).price..";"..
getItem("trades",i).qty..";";
Но при попытке получить номер заявки (order_num, trade_num) - длинное число (19 символов) превращается в число вида 1.2929169375034e+018 Как можно получить обычный номер заявки без e+?
Иван написал: Подскажите пожалуйста рекомендации что еще можно сделать?
В ярлычках квика добавил ключ запуска -clear, теперь всякий мусор прям при запуске квика чистится
Цитата
1.8 Ключи запуска Рабочего места QUIK -clear – очистить служебные файлы, которые содержат торговые данные (info.log (или curr_data.log в зависимости от настроек терминала), acnt.dat, alert.ik, alltrade.dat, trades.dat, orders.dat). Это позволяет ускорить загрузку программы.
только аккуратно, а то вдруг для вас вышеуказанные файлы не мусор
Есть какие-то рекомендации для увеличения скорости работы (быстродействия) квика? Сегодня нашел в папке квика лог в корневой директории (вес 1 ГБ+). Удалил его и квик вроде как быстрее стал работать раза в 3.
Подскажите пожалуйста рекомендации что еще можно сделать? Версия квика 7.
Anton написал: Иван, непонятно, чего вы уцепились за папку LuaIndicators. В этой папке квик ищет именно индикаторы, то есть которые на график. Для скриптов создайте другую папку, "lua", и в нее кладите все либы. Квик сам вам говорит, где он искал, особенно обратите внимание на строки
Цитата
no file 'C:\QUIK\lua\socket\core.lua' no file 'C:\QUIK\lua\socket\core\init.lua'
Здесь квик хочет загрузить библиотеку с именем "socket.core". Для этого он в папке lua ищет подпапку socket, а в ней либо файл core.lua, либо подпапку core, в которой есть скрипт с именем init.lua. Это для всех библиотек так работает, библиотека это либо один файл, либо папка с файлом init.lua.
Я бы хотел что бы у моего скрипта было все в 1 папке и было в 1 папке бибилотеки, которую я специально выделил. Я перенес три вот файла (https://disk.yandex.ru/d/qRNTqf562u3g8Q) mime.lua, socket.lua, ltn12.lua, и добавил вот эту строчку в мой скрипта
Код
if string.find(package.path,'C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?.lua') == nil then
package.path=package.path..';C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?.lua;'
end;
И скрипт начал работать. Но как мне быть с папками mime/, и soket/ Если я их переношу, они перестают работать. Я бы тоже хотел их перенести в папку моего скрипта.
Уже и так даже попробовал и все равно не работает, если поместить это все в папку моего скрипта:
Код
-- if string.find(package.path,'C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?.?') == nil then
-- package.path=package.path..';C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?.?;'
-- end;
-- if string.find(package.path,'C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\mime\\?.?') == nil then
-- package.path=package.path..';C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\mime\\?.?;'
-- end;
-- if string.find(package.path,'C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\socket\\?.?') == nil then
-- package.path=package.path..';C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\socket\\?.?;'
-- end;
Моя идея положить эти библиотеки в папку моего скрипта, но когда я так делаю они перестают работать, работают только когда все добро размещено в папке: C:\QUIK\LuaIndicators Вверху моего скрипта я дополнил путь, библиотеки (скрипты) разместил в соответствующую папке моего скрипта:
Код
if string.find(package.path,'C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?.lua') == nil then
package.path=package.path..';C:\\QUIK\\LuaIndicators\\Git\\EnterTradeLib\\Lua\\?.lua;'
end;
w32 = require("w32"); -> это звуки (они и так находятся)...
http = require("socket.http"); -> а вот это не находится когда я размещаю в папку моего скрипта
...UIK\LuaIndicators\Git\EnterTradeLib\Lua\socket.lua:13: module 'socket.core' not found:
no field package.preload['socket.core']
no file '.\socket\core.lua'
no file 'C:\QUIK\lua\socket\core.lua'
no file 'C:\QUIK\lua\socket\core\init.lua'
no file 'C:\QUIK\socket\core.lua'
no file 'C:\QUIK\socket\core\init.lua'
no file 'C:\QUIK\Include\socket\core.lua'
no file 'C:\QUIK\Include\socket\core.luac'
no file 'C:\QUIK\LuaIndicators\socket\core.lua'
no file 'C:\QUIK\LuaIndicators\socket\core.luac'
no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\core.luac'
no file 'C:\QUIK\LuaIndicators\Git\EnterTradeLib\Lua\socket\core.lua'
no file '.\socket\core.dll'
no file 'C:\QUIK\socket\core.dll'
no file 'C:\QUIK\loadall.dll'
no file
Nikolay написал: Что значит зачем. Lua не имеет встроенной поддержки web soсket. Поэтому необходимы библиотеки (а не программы), чтобы сие действие стало доступно. Ссылки на сборки библиотек недавно обсуждались.
И у меня все работает. Но я бы хотел все это закинуть в папку моего скрипта:
Когда я закидываю все это в папку моего скрипта: C:\QUIK\LuaIndicators\QET\EnterTradeLib\lua\ Это перестает работать: Quik при запуске скрипта пишет: Что не находит таких библиотек.
Как их в эту папку засунуть? Скрипты подключаю так:
Код
w32 = require("w32"); -> вот что интересно это лежит в папке C:\QUIK\LuaIndicators\QET\EnterTradeLib\ и квик его находит
http = require("socket.http"); -> а это нет... находит только когда это лежит в папке C:/Quik/Luaindicators/
Сори за множество вопросов - но здесь в луа реально не так как в PHP с его наймспейсами и прочими фишками...
Вот даже из этого работающего примера я не пойму - зачем нужно ставить дополнительную программу (ну это еще ладно) - ну если мы ее поставил - зачем еще какие-то 2 папки закидывать в luaindicators?
Let_it_go написал: Когда-то скачал робота, который заходит на сайт Смарт Лаб и считывает с него календарь дивидендов, сигналит в КВИК если завтра ожидается дивидендный гэп. Сейчас скрипт не работает, потому что смарт лаб поменял вёрстку дивидендной страницы, но раньше я этот скрипт запускал и всё работало.
Код
if string.find (package.path,'C:\\Program Files (x86)\\Lua\\ 5.1 \\lua\\?.lua') = = nil then
package.path = package.path .. ';C:\\Program Files (x86)\\Lua\\ 5.1 \\lua\\?.lua;'
end
if string.find (package.path,'C:\\Program Files\\Lua\\ 5.1 \\lua\\?.lua') = = nil then
package.path = package.path .. ';C:\\Program Files\\Lua\\ 5.1 \\lua\\?.lua;'
end
require "socket"
is_run = true
http = require 'socket.http'
local address = 'http://smart-lab.ru/dividends/index/order_by_t2_date/desc/'
local ts = {"tr","strong","span"}
local lMax = 91 --число строк в таблице
function do_smart ()
local body = http.request (address)
----------------------
for i = 1 , # ts do
body = string.gsub (body,"( < %s * " .. ts[i] .. "[^ > ] * > )","")
body = string.gsub (body,"( < %s * /" .. ts[i] .. "[^ > ] * > )","")
end
body = string.gsub (body," "," ")
local t={} -- результат
local j=0; local k=0; local text=0;
local m=1;
local n=string.find(body," td > ",m, # body, true );
local x = string.byte (body,n - 1 );
m = m + 3 ;
-----------------
while # body > m do
n = string.find (body, "td>" ,m, # body, true );
if n then local n1 = n;
if x~ = 47 then
x = string.byte (body,n - 1 ); if x = = 47 then n = n - 1 ; end
text = string.sub (body, m,n - 2 ); text = nkdelspace(text);
local len = string.len (text);
if len < 20 then
j = j + 1 ; if j = = 1 then k = k + 1 ; t[k] = {} end
local tt = t[k]; tt[ # tt + 1 ] = text;
if j = = 8 then if k = = lMax then break end
j = 0 end
end
else
x = string.byte (body,n - 1 );
end
m = n1 + 3 ;
else break ;
end
end
trade_date = getParamEx ( "TQBR" ,"GAZP","TRADE_DATE_CODE").param_image
prev_date = getParamEx ( "TQBR" ,"GAZP","PREVDATE").param_image
for k,v in ipairs (t) do
local td = trade_date .. " "
local pd=prev_date.." "
if td==t[k][2] then
message (" Zavtra GAP "..t[k][1].." div = "..t[k][6].." | "..t[k][8],1)
end
if pd==t[k][2] then
message (" Segodnya GAP "..t[k][1].." div = "..t[k][6].." | "..t[k][8],1)
end
end
end
function OnCleanUp ()
sleep (700000)
do_smart ()
end
function OnConnected ()
do_smart ()
end
function OnStop ()
return 100
end
--------------------
function nkdelspace(s)
local len=string.len(s); local z=" "; local x1 = 32 ;
for i = 1 ,len do local x = string.byte (s,i); if x < 32 then x = 32 end
if (x~ = 32 or x1~ = 32 ) then
if z = = "" then z = string.char (x) else z = z .. string.char (x) end
x1 = x; end
end --убираем проблелы
return z;
end
do_smart ()
function main ()
while is_run do
sleep ( 1000 )
end
end
в комплекте скрипта в архиве были библиотеки Socket и mime
Очень актуален вопрос HTTP-запроса для Lua Quik (отказался от идеи читать почту). Что бы запустить этот вариант пришлось:
1) Установить программу Lua 2) Прописать пути вверху скрипта string.find (package.path,'C:\\Program Files... 3) Закинуть в папку luaIndicators/ папки mime & socket
Для меня этот код запуска для решения задачи + установки дополнительной программы = мягко говоря вынос мозга (в сравнении с PHP - где библиотеки подключаются через композер, по нормальному работают require (inclue), где понимаешь что подключаешь...
А здесь совсем не понимаю как устроен луа в плане подключения библиотек. Может кто-нибудь объяснить как работает подключение библиотек в луа.
И есть ли что-то попроще без установки программ что бы запустить простую функцию file_get_contents (http) в lua? Спасибо.
Спасибо - очень помогло. Но у меня заработало получение актуальных фьючерсов только после изменения изменения шаблона поиска для функции gmatch() for test_sec_code in string.gmatch(sec_list, "("..pref.."[^%s,]+)") do -- Перебираем список
BlaZed написал: Яна, у меня когда-то подобная задача стояла
В код зашивать список инструментов так себе идея, если необходимо несколько инструментов отслеживать, то грустно станет списки поддерживать в актуальном состоянии. Динамически будет проще и красивее.
Код
function FindSecCode (class_code,pref,dtmd) -- Определяем инструмент для торговли
local sec_list = getClassSecurities (class_code) -- Получаем список инструментов
for test_sec_code in string.gmatch (sec_list,"( "..pref.." [^,] + )") do -- Перебираем список
local param = getParamEx (class_code,test_sec_code,"DAYS_TO_MAT_DATE")
if (param.result = = "1" ) and (param.param_image~ = "" ) and (param.param_type~ = "0" ) then -- Параметр получен корректно?
if (tonumber(param.param_value) > = dtmd) then return test_sec_code end -- Проверяем дни до экспирации
end
end
end
sec_code = FindSecCode( "SPBFUT" ,"BR", 3 )
if (sec_code) then message ( "actual futures is " .. sec_code) end
Возможно, стоило бы сортировку прикрутить, но сколько не наблюдал, от брокера сразу отсортированный по времени экспирации список прилетает.
Подскажите пожалуйста почему вы остановились именно на 3 днях до экспирации? А не на 1?
Roffild написал: Я уже застолбил это пожелание. Ожидаю реализацию в ближайшие 10 лет...
Ну судя по всему если ближайшие 10 лет - то могу свое решение предложить. Вы всегда знаете первые две буквы кода - например GZ
Получается нужно вычеслить месяц (3 символ) + год (4 символ). Просканировать таблицу текущие торги - фильтруем инструменты по первым двум символам - далее смотрим столбец до даты погашения и ищем самый минимальный срок жизни - это и есть актуальный фьюч.
На каждом окне в Квике в верхнем правом углу есть иконки свернуть окно, уменьшить размер, закрыть окно. А также есть иконка якоря позволяет позволяет переключить инструмент.
Можно ли как-то этот якорь аналогичным образом использовать для lua скриптов?
Сокет смог запустить прочитав этот пост https://smart-lab.ru/blog/401675.php 1) установил программу 2) закинул две папки mime & socket в LuaIndicators 3) подключил в скрипте
Уже и туда и сюда попробовал положить эти библиотеки. Но QUIK все равно их не находит... Не пойму что могу делать не правиьно?
Код
...\QUIK_2\LuaIndicators\Git\EnterTrade.lua:64: module 'socket' not found:
no field package.preload['socket']
no file '.\socket.lua'
no file 'C:\QUIK_2\lua\socket.lua'
no file 'C:\QUIK_2\lua\socket\init.lua'
no file 'C:\QUIK_2\socket.lua'
no file 'C:\QUIK_2\socket\init.lua'
no file 'C:\QUIK_2\Include\socket.lua'
no file 'C:\QUIK_2\Include\socket.luac'
no file 'C:\QUIK_2\LuaIndicators\socket.lua'
no file 'C:\QUIK_2\LuaIndicators\socket.luac'
no file 'C:\Program Files (x86)\Lua\5.1\lua\socket.lua'
no file 'C:\Program Files\Lua\5.1\lua\socket.lua'
no file '.\socket.dll'
no file 'C:\QUIK_2\socket.dll'
no file 'C:\QUIK_2\loadall.dll'
no file 'C:\QUIK_2\Include\socket.dll'
no file 'C:\QUIK_2\LuaIndicators\socket.dll'
Если же использовать SSL, то необходимо иметь luasec. Я стабильно работающую с 5.4 и 5.3 не нашел.
Поэтому, чтобы не зависеть от библиотек lua, уже давно написал себе консольную программку, читающую почту и записывающую в файлы, которые уже скрипт читает и обрабатывает.
1) Очень интересная идея с консольной командой. Можно пример исходник (так понимаю это можно написать через блокнот). Вы ее потом как запускаете - через Quik? 2) Не совсем пойму по вашим ссылкам нужно использовать socket + imap или как? 3) Чем лучше SSL и можно ли без него?
socket - это библиотека для lua. Она включает в себя как lua файлы, так и dll. Она должна быть собрана под нужную версию lua.
imap4 - это тоже библиотека. Поиск любой системе выведет на репозитарий проекта.
Если есть знатоки и у кого-то есть возможность (готов за вознаграждение) - помогите пожалуйста реализовать чтение почты на lua в Quik 8-версии. Нужны исходники Lua-скрипта, который читает почтовый ящик mail.ru и файлы библиотек, которые нужно закинуть в папку quik. У меня не получило найти библиотки и запустить чтение почты.
Нашел более понятный пример, но не пойму где взять библиотеки для подключения?
Код
local imap4 = require "imap4"
local Message = require "pop3.message"
local connection = imap4('imap.qip.ru', 143)
assert(connection:isCapable('IMAP4rev1'))
connection:login('****', '****')
-- Sel ect INBOX with read only permissions.
local info = connection:examine('INBOX')
print(info.exist, info.recent)
-- List info on the 4 most recent mails.
for _,v in pairs(connection:fetch('(UID BODY.PEEK[HEADER.FIELDS (Subject To From Date)])', (info.exist-4)..':*')) do
print("-------------------------")
local msg = Message(v.BODY.value)
print("ID: ", msg:id())
print("subject: ", msg:subject())
print("to: ", msg:to())
print("from: ", msg:from())
print("fr om addr: ", msg:from_address())
print("reply: ", msg:reply_to())
print("reply addr: ", msg:reply_address())
print("trunc: ", msg:is_truncated())
for i,v in ipairs(msg:full_content()) do
if v.text then print(" ", i , "TEXT: ", v.type, #v.text)
else print(" ", i , "FILE: ", v.type, v.file_name or v.name, #v.data) end
end
end
-- close connection
connection:logout()
local version = getInfoParam ( "VERSION" )
local bits = version:sub( 1 , 2 ) = = '7.' and 'x86' or 'x64'
local gSPath = getScriptPath ()
local libs_Path = getScriptPath () .. '\\clibs_' .. bits
package.cpath = libs_Path .. "\\?.dll;" .. libs_Path .. "\\?\\?.dll;" .. package.cpath
package.path = gSPath .. "\\?.lua;" .. gSPath .. "\\?\\?.lua;" .. gSPath .. "\\?\\init.lua;" .. package.path
local imap4 = require 'imap4'
local ssl = require ( "ssl" )
local imapServer = 'imap.yandex.com'
local serverPort = 993
local login = 'login'
local password = 'pass'
-- If in doubt, see RFC 3501:
-- https://tools.ietf.org/html/rfc3501#section-6
-- Create new imap4 connection.
-- Port is optional and defaults to 143.
local connection = imap4(imapServer, serverPort, {protocol = 'tlsv1' })
-- If you are connecting to gmail, yahoo or any other server that needs a SSL
-- connection before accepting commands, uncomment this line:
--
-- connection:enabletls{protocol = 'sslv3'}
--
-- You can skip this step by creating the connection using
--
-- local connection = imap4('imap.gmail.com', 993, {protocol = 'sslv3'})
-- Print the servers capabilities.
print ( table.concat (connection:capability(), ', ' ))
-- Make sure we can do what we came for.
assert(connection:isCapable( 'IMAP4rev1' ))
-- Login. Warning: The credentials are sent in plaintext unless you
-- tunnel the connection over ssh, or use SSL (either via the method shown
-- above or calling connection:starttls(params) before logging in).
connection:login(login, password)
-- connection:lsub() lists all subscribed mailboxes.
for mb, info in pairs(connection:lsub()) do
-- connection:status(mailbox, items) queries status of a mailbox.
-- Note: The mailbox name may contain unescaped whitespace. You are
-- responsible to escape it properly - try ("%q"):format(mb).
local stat = connection:status(mb, {'MESSAGES', 'RECENT' , 'UNSEEN' })
print (mb, stat.MESSAGES, stat.RECENT, stat.UNSEEN)
end
-- Sel ect INBOX with read only permissions.
local info = connection:examine( 'INBOX' )
print (info.exist, info.recent)
-- List info on the 4 most recent mails.
-- See https://tools.ietf.org/html/rfc3501#section-6.4.5
for _,v in pairs(connection:fetch( '(UID BODY.PEEK[HEADER.FIELDS (From Date Subject)])' , (info.exist) .. ': * ')) do
-- `v' contains the response as mixed (possibly nested) table.
-- Keys are stored in the list part. In this example:
--
-- v[1] = "UID", v[2] = BODY
--
-- `v[key]' holds the value of that part, e.g.
--
-- v.UID = 10
--
-- `v.BODY' is the only exception and returns a table of the format
--
-- {parts = part-table, value = response}
--
-- For example:
--
-- v.BODY = {
-- parts = {"HEADER.FIELDS", {"From", "Date", "Subject"}},
-- value = "Fr om: Foo <foo@bar.baz>\r\nDate:..."
-- }
print (v.id, v.UID, v.BODY.value)
local txt = connection:fetch( '(BODY.PEEK[TEXT])' , v.id)
if # txt > 0 then
print (txt[ 1 ].BODY.value)
end
end
-- close connection
connection:logout()
Правильно ли понимаю если у меня по какой-то причине будет в течении дня сгенерировано два одинаковых TRANS_ID с одинаковыми номерами - максимум чем мне это грозит при снятии стоп-лоса, это то, что будет снят только 1, а второй останется болтаться?
UNIX TIME - это просто количество секунд начиная с какой-то даты (1 января 1970г). можно получить через тот же os.date Судя по всему, Вам не это нужно. Просто сами определите для себя какое число Вам требуется и сгенерируйте. тех поддержка в этом месте не причем. Вопрос только и только на Вашей стороне. Хотите, считайте тот же UNIX TIME но с 2000 года или "сожмите" дату до нужного размера (например сложив чила) Или другие варианты которые Вам понравятся.
Мне нужно как-то сгенерировать TRANS_ID - уникальное число со смыслом. А не просто уникальное число.
Sergey Gorokhov написал: Иван, Дополним, судя по всему вопрос не технический, а логический. Нам не важно что вы напишите в TRANS_ID, главное чтобы размер был не больше «2 147 483 647»
Вы сами решите для себя нужна ли Вам вообще os.date("%d%H%M%S"), может ее не надо там указывать и все? если нужна, сами для себя решите зачем, может там достаточно краткого формата ДДММГГ
Если вопрос в том, как в os.date указать выходной формат, то ответ есть в документации на Lua
Таким образом я пытаюсь сгенерировать уникальное число для ID-транзакции. А UNIX TIME как получить?
Для корректной работы с 19-значными номерами заявок, терминал потребуется обновить до версии не ниже 8.4 (лучше сразу выполнить обновление до актуальной версии).
Также заметим, что для работы терминала версии 8.0 и выше, требуется 64 -разрядная операционная система. Если у Вас 32-разрядная ОС, ее также потребуется обновить.
Если бы так просто было обновиться - я бы с удовольствием... Судя по всему проблема в ограничениях на кол-во символов для поля TRANS_ID
TRANS_ID
-
Уникальный идентификационный номер заявки, значение от «1» до «2 147 483 647»
Нашел решение в генерации уникального числа следующим образом:
500 служебный код + os.date("%d%H%M%S") + № контракта (++) Проблема в том что не влажу в число символов.
Можно ли как-то вот это " os.date("%d%H%M%S") " преобразовать в меньшее число символов? По аналогии как md5() но только нужны числа.
Подскажите пожалуйста столкнулся с проблемой - номера заявок очень длинные и когда в функцию
function OnTrade(trade) local trade_num = trade.trade_num; local trans_id = trade.trans_id;
приходит trade_num вместо обычного числа из 18 символов приходит что то типа: 1.952337642788e+018. В результате пишет не возможно создать заявку (стоп-ордер).
Как преобразовать такое число с "e+018" в обычное число сколько бы там не было символов?
Nikolay написал: Ну а форма подачи Вашего произведения говорит больше о рекламе, а не о разработке. Поэтому была озвучена рекомендация о GitHub. Я бы хотел бысто взглянуть на код не продираясь сквозь посторонюю информацию. Тем более, что код открытый, как никак. Скачивать с неизвестного сайта архивы... Это было опасно уже в 1994 году.
Nikolay написал: Такого добра полно на просторах. Такого добра полно на просторах. Кто не писал логгинг и журналы сделок, скринеры, роботы и т.д...
Возможно и полно, возможно есть и платные за небольшую сумму и бесплатные. Возможно есть и очень дорогие. Но мне ни один из них не подошел в рамках того, то что мне повседневно нужно в одном флаконе для рынка Forts (открытие сделок с расчетом позиции, закрытие по частям, автостопы к таким открытым позициям, автозакрытие по параметрам, риск-менеджер с настраиваемыми параметрами, и алерты, которые можно было бы поставить за 1-2 секунды. А самое главное журнал сделок - тот же простой журнал есть в Metatrader. Кроме того я не практикую алготрейдинг (во всяком случае пока и точно для него использовал бы другие готовые инструменты). И мне не было бы необходимым проделывать такую масштабную работу по разработке такого привода и погружении в Lua-скрипт.
Цитата
Nikolay написал: Только не стоит сюда выносить. На СмартЛабе или любой социальной ... будет самое то... Здесь же хотелось бы обсуждать технические вопросы, не более.
Я бы очень хотел видеть такой штатный функционал в рамках самого Quik. Как он мог бы выглядеть оформил в виде такого привода. Metatrader я например не использую по психологическим и иным причинам. Пока для меня Quik 7 является основой.
На данный момент, главное концептуальное неудобство привода пока есть только в том, что он не удобен для тех кто торгует больше 1 инструмента - переключатель не удобный. И чем это не технический вопрос? - вопрос то к поддержке, а не к Вам. Форум насколько полагаю полностью посвящен терминалу.
(PS. Заведите аккаунт на GitHub, поменьше используейте dofile, глобальные переменные и функции, ну и callback не место для сложных действий и точно не для совершения транзакций)
Пока не вижу необходимости в аккаунте GitHub. По поводу того, что вы советуете использовать и не использовать - не вижу в ваших словах конструктивных замечаний. Вы бы предложили какую-то часть кода и сказали бы что вот здесь лучше так, а здесь лучше так и было бы что обсудить и улучшить с технической точки зрения.
Для поддержки - будет желание зарегистрируйте пожелание на совместный проект по разработке вот такого привода для QUIK с журналом сделок, что бы его включить в коробку терминала по умолчанию. Мне очень не хватало подобного функционала на начальном этапе знакомства с терминалом и после когда уже разобрался в нем. Полагаю для многих частных трейдоров это сделает торговлю более удобной, по крайней мере мне это экономит достаточно большое кол-во времени по выставлению заявок, расчету депозита, и текущих сделанных сделках.
Периодически люди пишут комментарии с идеями на доработку - полагаю у этого есть потенциал. А также просьбы адаптировать привод для Quik 8. Мне пока вполне хватило того, что реализовано уже сейчас и для Quik 7. Единственное что еще бы очень хотел реализовать в приоритетном порядке - это автозакрытие и БУ.
Контактные данные для связи есть на моем сайте. Иван.