Тесты показали, что такой программно-аппаратный комплекс позволяет по одному финансовому инструменту обрабатывать более 5000 транзакций в секунду со средним временем выполнения транзакции менее 200 микросекунд. Средняя задержка распространения рыночной информации составляет менее 500 микросекунд.
Спрашивается, каким образом Вы измеряли задержку? Ведь в Windows - не существует стабильных микросекундных счётчиков, уж неговоря и про нанотаймеры (о которых так часто любят хвастать "линуксоиды"). Все эти так называемые "измерения" - это чистой воды развод.
Программный комплекс QUIK создан с применением инструментальных средств разработки Microsoft Visual Studio C++ и Borland Delphi.
Стесняюсь спросить.... Уж не тот ли этот Ваш "неубиваемый/неотключаемый" WINROS (и...соответственно iwr.dll ) Вы причислили "к своим" разработкам с применением Borland Delphi?
Уважаемые разработчики. Честно говоря, уже давно перестал удивляться Вашей профессиональной пригодности... Глядя на то как Вы вот уже 16 лет "допиливаете" и никак не можете допилить QUIK до товарного вида - то, и о работе этого форума - нечему удивляться. Такое ощущение, что Вы взяли человека с улицы - и дали ему задание освоить HTML, основы jscript и сделать уже наконец нормальный форум - а он в итоге... чтоб зря не заморачиваться малость "допилил" для ваших нужд форум на Битриксе.... и тут.. пошлО....:
Очевидно, додуматься, как вставлять и хранить закодированные в формате base64 картинки на форум - это выше ваших сил.... Вам самим-то? не стыдно за свои жалкие поделки?
Если уж не умеете отображать правильно такой контент то, хотя б фильтровали бы его теми же регекспами, а не заставляли других пользователей любоваться на эту "порнографию" размеров в 2 экрана по вертикали.
Суть.... Если не можете - то, хоть воспользуйтесь тем же vBulletin или легковесным но, по крайней мере более функциональным чем ваш текущий форумный движок - punBB. К тому же он ещё и бесплатный.
Предложение: Сделать так, чтоб когда мы выбираем какой-нибудь параметр из "Доступные параметры" -> в "Выбранные параметры" - то, этот параметр - исчезал из "Доступных параметров". А то, получается, можно 2 и более раз добавить один и тот же параметр в "Выбранные ..." и, следовательно - и в получаемую таблицу.
Данное предложение - справедливо и для других диалоговых окон QUIK-а.
Решил, раз уж разработчики невсостоянии сделать нормальный "хелп" к QLUA и QUIK-у - им немного помочь.
Все ссылки на файлы - получены правой кнопкой мыши в разделе "Свойства".
Итак... начнём..
Цитата
QLUA.chm::/ch2.htm QLua является дополнительным компонентом Рабочего места QUIK.
QLua является дополнительным компонентом Рабочего места QUIK. Данный компонент - может быть отключен Вашим брокером. Если это так - обращайтесь в его службу техподдержки.
Цитата
QLUA.chm::/ch4_1_5.htm Значение параметра Описание
Дополнить ещё третьей колонкой "Пример"
Колонку "Описание" - сделать ввиде гиперссылки на подробное описание
NUMRECORDS Число записей - каких записей? Где хранятся/находятся эти записи? ORG Организация - что за организация? Брокер? Биржа? MEMORY Занято памяти - Кем/чем занято? Под что занято? Что за память - где она располагается: ОЗУ/винчестер? LOCALTIME Текущее время - время на компьютере пользователя? MESSAGESSENT Передано сообщений - Что за сообщения? По какому протоколу? BYTESRECV Принято полезных байт - Что ещё за "полезные" байты? А где, в таком случае, смотреть потери? AVGSENT Средняя скорость передачи - средняя в секунду? в час? LASTPINGDURATION Задержка данных при обмене с сервером - в чём измеряется? MAXPINGTIME Время максимальной задержки - в смысле даты или сама величина интервала? MAXPINGDURATION Максимальная задержка данных - за сессию? В чём измеряется?
Цитата
QLUA.chm::/ch4_1_3.htm Функцию sleep не рекомендуется использовать в функциях обратного вызова.
Что будет, если задать "0"?
Какое число задавать? Целое или дробное тоже можно?
Цитата
QLUA.chm::/ch4_1_7.htm Функция для вывода отладочной информации.
Куда именно выводится эта отладочная информация?
Цитата
QLUA.chm::/ch4_2.htm (в рамках умного заказа или вручную через диалог Система/Заказ данных)
Что ещё за "умный" заказ? Где на него ссылка?
Цитата
QLUA.chm::/ch4_2_2.htm Функция вызывается терминалом QUIK при получении обезличенной сделки.
Как насчёт внесистемных сделок? Входят ли они в поток и срабатывает ли на них этот коллбек?
Цитата
QLUA.chm::/ch4_2_21.htm Под сменой сессии подразумевается изменение идентификатора сессии при подключении к серверу QUIK.
Где ссылка на этот идентификатор? Какой у него формальный заголовок?
Цитата
QLUA.chm::/ch4_2_20.htm при этом параметр вызова flag принимает значение «false».
QLUA.chm::/ch4_2_20.htm при этом параметр вызова flag принимает значение «false».
Отличный русскоязычный сайт и форум по QLUA - его украинские владельцы окончательно похоронили. Вычистили все кеши в поисковых системах. Контент более недоступен, а сам домен - выставлен на продажу. http://ww1.qlua.org/
Планируется ли поддержка обновления комментов на основе AJAX? то есть, чтоб не надо было нажимать кнопку в браузере "Обновить", чтоб увидеть новые комменты и т. п.
Есть возможность встроить в сам QUIK этот (forum.quik.ru) официальный форум в формате чата, чтоб не держать открытым браузер и в свободное время параллельно торгам его просматривать и, возможно комментировать.
Вопрос к разработчикам,
Это можете сделать для пользователей Вы сами (как это делают Ваши конкуренты) Это могут сделать другие пользователи. В таком случае, хотелось бы тогда просто получить от Вас, как от владельцев материалов форума - официального согласия.
После "обновления" с версии 6.3.х.х. перестали сохраняться (как-либо) местоположения свёрнутых MDI-окон на "главной" форме вкладки:
Скрытый текст
если принудительно перетащить свёрнутое окно - "туда куда надо" и потом сохранить настройки окон в файл - местоположение свёрнутых окон - не сохраняется. если после того как перемести какое-нибудь свёрнутое окно, попытаться открыть другое свёрнутое - старое свёрнутое - вновь меняет своё местоположение на привязку к нижнему горизонтальному ряду.
Простенький минимально достаточный для создания окна скрипт:
Код
is_run = true
function OnInit()
t_id = AllocTable()
CreateWindow(t_id)
SetWindowCaption(t_id, "thats my table")
end
function main()
while is_run do
sleep(100)
end
end
function OnStop()
DestroyTable(t_id)
is_run = false
return 1000
end
После его работы - создаётся большущее окно без названия и только потом - окно в один столбец но, очень длинное по вертикали. При этом, если передёрнуть скрипт несколько раз - положение окна будет всё время меняться в сторону приращения координат левого верхнего угла по X и по Y. Про функцию SetWindowPos - знаю. И о ней мне говорить не надо. Вопрос:
получается, что на самом деле, при создании окна - собирается какой-то мусор от предыдущих экземпляров - хотя, при остановке скрипта - его LUA VM должна быть полностью разрушена, равно как и переменные ею занимаемые/устанавливаемые.
Почему при создании окна таблицы вылазиет ещё одно большое окно? Внешне это выглядит, как неприятное единовременное мерцание. подозреваю, что это одно и тоже окно но, заданное с большими дефолтными размерами и только потом, они почему-то опять меняются непонятным образом.
Значит ли это, что внутри функции CreateWindow(t_id) - снова меняются размеры окна?
Как уже много раз было сказано и подтверждено разработчиками - виртуальные машины, используемые для QLua-скриптов и QLua-индикаторов - разные. В том числе, у них разный состав глобальных переменных, функций и т. п.
Ниже, с помощью простенького скрипта запущенного в режиме фейк-индикатора мне удалось получить более полный (по сравнению со штатной документацией) список всего того, что поддерживается в окружении QLua-Indicators VM:
Скрытый текст
Код
table os
table io
table _G
table coroutine
table debug
table string
table package
table bit
table Settings
table table
table math
const BAR_TYPICAL =7
const TYPE_CANDLE =3
const TYPE_DASHDOT =6
const TYPE_TRIANGLE_DOWN =11
const BAR_OPEN =1
const TYPE_LINE =1
const TYPE_DASH =7
const TYPE_HISTOGRAM =2
const TYPET_BAR =4
const BAR_LOW =3
const TYPE_TRIANGLE_UP =10
const TYPE_POINT =5
const BAR_VOLUME =5
const BAR_HIGH =2
const BAR_WEIGHTED =8
const BAR_MEDIAN =6
const BAR_CLOSE =4
string const _VERSION =Lua 5.1
function getFuturesHolding
function tostring
function gcinfo
function DelLabel
function SetRangeValue
function IsSubscribed_Level_II_Quotes
function pairs
function getSecurityInfo
function OnCalculate
function assert
function Init
function tonumber
function message
function getTradeDate
function getClassInfo
function load
function Subscribe_Level_II_Quotes
function module
function getDepoEx
function getClientCorrelationCoefs
function getBuySellInfoEx
function getFuturesLimit
function PrintDbgStr
function getQuoteLevel2Ex
function DelAllLabels
function SetLabelParams
function AddLabel
function VMA
function Size
function CalcBuySell
function getMoneyEx
function RGB
function getClientSecurityCoefs
function dofile
function loadstring
function getBuySellInfo
function getPortfolioInfo
function getCandlesByIndex
function getNumCandles
function getInfoParam
function getNumberOf
function sendTransaction
function xpcall
function getDepo
function getMoney
function GetLabelParams
function GetInfoParam
function GetTradeDate
function Unsubscribe_Level_II_Quotes
function require
function getQuoteLevel2
function SearchItems
function setmetatable
function next
function getLinesCount
function getClassesList
function ipairs
function isConnected
function getParamEx
function getDataSourceInfo
function getItem
function collectgarbage
function newproxy
function getOrderByNumber
function getScriptPath
function print
function C
function rawset
function SMA
function unpack
function H
function getfenv
function L
function pcall
function O
function type
function rawequal
function GetValue
function select
function T
function getmetatable
function rawget
function SetValue
function getWorkingFolder
function V
function setfenv
function getPortfolioInfoEx
function getClassSecurities
function error
function loadfile
Среди этого списка - есть некоторые вещи, которые я хотел бы прояснить у разработчиков:
Что такое function getQuoteLevel2Ex . У нас, как бы ведь уже есть не "Ex"
--...
function AddOnParamListener(cls,sec,fn)
return table.insert(OnParamEventListeners,{classcode = cls, seccode = sec, notifier = fn})
end
sim5ticker = Ticker.new("SPBFUT", "SiM5")
AddOnParamListener("SPBFUT","SiM5",sim5ticker:Update())
function OnParam(a, b)
if OnParamEventListeners[1].classcode == a and OnParamEventListeners[1].seccode == b then
OnParamEventListeners[1].notifier()
end
end
--...
Вопрос[ы]:
Как правильно сохранить метод экземпляра класса в совершенно постороннюю таблицу, чтоб потом его вызвать из неё.
Возможно ли и правильно ли хранить ссылку (или даже список ссылок) в конструкторе (new) на экземпляры класса и, если "Да" - то как?
Примечание: код черновой - пишу на ходу по ходу мысли.
Перерыл и старый и новый форум в поисках толковых примеров с использованием метатаблиц и closure но, ничего не нашёл, кроме вариаций стандартных примеров на основе QTable из "хелпов" квика. Таким образом, в этой теме хотелось бы исправить столь досадное недоразумение. Обращение ко всем кому не жалко и кто не считает, что "палит грааль" - поделиться информацией в теме.
act_numTrades = 0
last_numTrades = 0
lastTime = 0
actTime = 0
is_run = true
function OnParam(class_code, sec_code)
if class_code == "SPBFUT" and sec_code == "SiM5" then
act_numTrades = getParamEx(class_code, sec_code, "NUMTRADES").param_value
actTime = getParamEx(class_code, sec_code, "TIME").param_value
if act_numTrades == last_numTrades and actTime == lastTime then do return nil end
else message(tostring(act_numTrades - last_numTrades) .. " " .. tostring(actTime)) end
last_numTrades = act_numTrades
lastTime = actTime
end
end
function main()
while is_run
do
sleep(100)
end
end
function OnStop()
is_run = false
return 1000
end
В общем, бывают моменты - когда он в течении продолжительного времени вполне стабильно и правильно считает, но потом - "всё портится". Такое ощущение, что это как-то связано с кешированием или докачкой данных. если бы код "был неправильным" - он бы даже частично правильно не считал.
local is_run = true
local date_time= ""
function OnAllTrade(alltrade)
date_time = tostring(alltrade.datetime.hour) .. ":" .. tostring(alltrade.datetime.min) .. ":" .. tostring(alltrade.datetime.sec)
message(date_time)
end
function main()
while is_run
do
sleep(100)
end
end
function OnStop()
is_run = false
return 1000
end
Действия: Запускаю простенький тестовый скрипт и... вижу, что время перепрыгивает назад и потом возвращается. Но, всё бы ничего - да только отключение галочки "Получать пропущенные данные" - не спасает.
1. Запустил широкоизвестный (в определённых кругах...) скрипт. 2. Добавил в нём 3 фьючерса: GZM5, SiM5, SRM5 3. Закрыл скрипт через меню квика кнопкой "Остановить". Окно скрипта удалилось, далее QUIK завис секунд на 10. После чего в "ошибках выполнения скрипта" собственно то, что выползло. НИкаких минидампов, разумеется и логов - нет.
1. Ввиду того, что "нормальный" "хелп" разработчики ленятся делать, мотивируя свои бездействия тем, что "... это займёт свыше 200 страниц" - прошу: дополнить каждый пункт из справки "кликабельной" ссылкой на соответствующую релевантную статью с этого форума - дабы, если у пользователя вдруг возникнет в очередной раз непонимание (очередных размытых формулировок из хелпа) - он всегда мог быстро уточнить по ссответствующей ссылке. 2. Если разработчики опять упадут "в лирику", что мол де, people итак схавает и что вообще, "зачем это нужно", хочу спросить: могу ли, в таком случае я декомпилировать файл справки (*.chm) с тем, чтобы самому соответствующим образом дополнить контент и функционал хелпов, а также потом свободно (и не очень... ) его распространять. т.е. даёте ли Вы, разработчики на это своё официальное согласие? 3. Могу ли я использовать части контента с официального хелпа в качестве распространяемого ресурса в своих платных скриптах?
Статья 1280. Право пользователя программы для ЭВМ и базы данных 1. Лицо, правомерно владеющее экземпляром программы для ЭВМ или экземпляром базы данных (пользователь), вправе без разрешения автора или иного правообладателя и без выплаты дополнительного вознаграждения: 1) осуществлять действия, необходимые для функционирования программы для ЭВМ или базы данных (в том числе в ходе использования в соответствии с их назначением), включая запись и хранение в памяти ЭВМ (одной ЭВМ или одного пользователя сети), внесение в программу для ЭВМ или базу данных изменений исключительно в целях их функционирования на технических средствах пользователя, исправление явных ошибок, если иное не предусмотрено договором с правообладателем; 2) изготовить копию программы для ЭВМ или базы данных при условии, что эта копия предназначена только для архивных целей или для замены правомерно приобретенного экземпляра в случаях, когда такой экземпляр утерян, уничтожен или стал непригоден для использования. При этом копия программы для ЭВМ или базы данных не может быть использована в иных целях, чем цели, указанные в подпункте 1 настоящего пункта, и должна быть уничтожена, если владение экземпляром таких программы или базы данных перестало быть правомерным. 2. Лицо, правомерно владеющее экземпляром программы для ЭВМ, вправе без согласия правообладателя и без выплаты дополнительного вознаграждения изучать, исследовать или испытывать функционирование такой программы в целях определения идей и принципов, лежащих в основе любого элемента программы для ЭВМ, путем осуществления действий, предусмотренных подпунктом 1 пункта 1 настоящей статьи. 3. Лицо, правомерно владеющее экземпляром программы для ЭВМ, вправе без согласия правообладателя и без выплаты дополнительного вознаграждения воспроизвести и преобразовать объектный код в исходный текст (декомпилировать программу для ЭВМ) или поручить иным лицам осуществить эти действия, если они необходимы для достижения способности к взаимодействию независимо разработанной этим лицом программы для ЭВМ с другими программами, которые могут взаимодействовать с декомпилируемой программой, при соблюдении следующих условий: 1) информация, необходимая для достижения способности к взаимодействию, ранее не была доступна этому лицу из других источников; 2) указанные действия осуществляются в отношении только тех частей декомпилируемой программы для ЭВМ, которые необходимы для достижения способности к взаимодействию; 3) информация, полученная в результате декомпилирования, может использоваться лишь для достижения способности к взаимодействию независимо разработанной программы для ЭВМ с другими программами, не может передаваться иным лицам, за исключением случаев, когда это необходимо для достижения способности к взаимодействию независимо разработанной программы для ЭВМ с другими программами, а также не может использоваться для разработки программы для ЭВМ, по своему виду существенно схожей с декомпилируемой программой для ЭВМ, или для осуществления другого действия, нарушающего исключительное право на программу для ЭВМ. 4. Применение положений, предусмотренных настоящей статьей, не должно противоречить обычному использованию программы для ЭВМ или базы данных и не должно ущемлять необоснованным образом законные интересы автора или иного правообладателя.
Прошу "Арку" дать развёрнутый комментарий по каждому пункту этой статьи на предмет легальности исследования системы QUIK. А также, значит ли это, что знания полученные из анализа квика можно на вполне законных основаниях (что доказано выше) использовать в своих проектах при условии, что они не будут сильно внешне похожи на квик/либо его модули/плагины?
Прошу реализовать возможность одновременной работы с различными брокерами и, соответственно, зарегистрированными у них счетами из одного квика не перелогиниваясь. Я - понимаю, что это потребует значительной переделки самого квика НО! я думаю, многие бы по достоинству оценили бы эту возможность. К тому же, в иностранных терминалах - такая возможность повсеместно используется.
если непонятно о чём это я: пользователь при входе в квик вводит учётные данные по каждому брокеру, далее, - при выставлении какой-либо заявки - он выбирает соответствующий номер счёта, привязанный к определённому брокеру.
и не надо мне говорить, что это к сожалению не возможно. всё это успешно программируется. ---------------------------------------------
таким образом, прошу:
либо зарегистрировать данное пожелание
либо ответить аргументированным отказом на него
никакие пространственные рассуждения/обсуждения на манер: "а зачем это надо" и т. п. - меня не интересуют.
В этой теме буду выкладывать переходящие из версии к версии баги QUIK и QLUA. Для себя уже давно составил коллекцию уязвимостей скриптов на QLUA и скриптов QLUA-индикаторов. Для справки: QLUA-индикаторов в QUIK используется отдельная усечённая sandbox-реализация LUA VM.
Итак, вот "код", а точнее, BUG в формате OnePageLesson:
Код
--testBUG#0001
Settings=
{
Name = "test Labels",
ChartID1 = "rima",
line =
{
{
Name = "test Labels",
Color = RGB(0,0,255),
Type = TYPE_LINE,
Width = 1
}
}
}
labelparams1 = {
TEXT = "",
IMAGE_PATH = getScriptPath() .. "заведомо отсутствующий файл и путь",
ALIGNMENT = "RIGHT",
YVALUE = 0,
DATE = "19000101",
TIME = "100000",
R = 0,
G = 0,
B = 255,
TRANSPARENCY = 0,
TRANSPARENT_BACKGROUND = 0,
FONT_FACE_NAME = "Arial",
FONT_HEIGHT = 18,
HINT = ""
}
function Init()
lab1 = AddLabel(Settings.ChartID1, labelparams1)
return 1
end
function OnCalculate(index)
return nil
end
function OnDestroy()
DelAllLabels(Settings.ChartID1)
end
Действия:
при успешно загруженном квике создаю график RIM5 с идентификатором "rima"
накладываю на него этот "индикатор". Индикатор успешно наложился, что подтверждается добавлением подписи на pane чарта. (то, что сам индикатор "пустой" - в данном случае, не суть)
сохраняем настройки окон (и, соответственно индикаторов) в файл info.wnd (стандартными средствами через соответствующий пункт меню)
отключаемся от сервера и выключаем квик
пытаемся вновь запустить квик и, ... ждём. долго так ждём, потом опять ждём. а тем временем, на экране:
старина QUIK нам каГбе намекает, что ждать можно чуть меньше чем (ну вы поняли... :) )) )
-----------------------------------
Пояснения: сам файл скрипта-индикатора находится в стандартном месте, в папке LuaIndicators. -----------------------------------
Возможные причины: Индикаторная "песочница" LUA VM слабо устойчива к параметрам и их корректности в функции AddLabel. И похоже даже использование pcall - не спасает. Кроме того, перед запуском QUIK, а точнее QLUA парсит всю папку и подпапки LuaIndicators, пытаясь запустить каждый, находящийся в ней скрипт (а это уже повод для использования в вирусописательстве). -----------------------------------
Методы устранения: все, абсолютно все параметры передаваемые из пользовательских скриптов обязаны проверяться на валидность прежде чем целиком и полностью заглатывать таблицу (в данном случае). То есть, внутри AddLabel (qlua-side) сперва должна быть проверка на валидность параметров. Уверен, что она у вас итак есть. так что спишем на недочёт. Кроме того, для скриптов просто обязан быть watchdog-таймер (даже в интернет-браузерах это есть и пользователю всегда предлагается отключить тормозной скрипт) -----------------------------------
Советую обратить внимание на фразу, что даже если у нас индикатор не наложен ни на один график НО! присутствует в папке индикаторов - баг (зависание) обеспечен.
когда хочешь просмотреть свои сообщения - не работают линки (отправляет на корневой форум). собственно, сама ошибка: сам переход осуществляется через: профиль->сообщения->выбираем сообщение для перехода
Софья, займись уже наконец движком форума, либо воспользуйся бесплатным но, не менее функциональным PunBB или любым другим.
Вопрос[ы]: 1. Для чего в главном файле квика info.exe секция экспорта? 2. значит ли это, что это сделано для того, что часть кода/плагинов писалась независимыми разработчиками и, соответственно, компания просто не стала раскрывать все исходники, а ограничилась лишь интерфейсом взаимодействия лишь с самыми необходимыми функциями? 3. значит ли это, что так сказать, IPluginContext - не совершенен?
Такая ситуация: 1. имеем некую внешнюю C-библиотеку подключенную через "require". В ней создаётся объект и в "вечном" цикле идёт работа с его свойствами/методами. 2. в основном скрипте есть коллбеки в которых идёт своя работа 3. также, в основном скрипте есть код, который не находится в коллбеках и в "майне". --------------------- а теперь, вопросы: а)правильно ли я понимаю порядок выполнения этой программы: Сначала выполняется п.3, потом, п.1. если есть/приходит колбек то, выполнение п.1 приостанавливается на время обработки коллбека и далее возобновляется? б) если сделать "вечный" цикл в одном из коллбеков - то, работа "другого вечного цикла в библиотеке" приостановится на неопределённое время?
--------------- вопросы на самом деле - не глупые, но просто требуют окончательного уточнения
В целях уменьшения задавания "глупых" вопросов на форуме, а также для всесторонней поддержки независимых разработчиков и самого квика, предлагаю раскрыть на коммерческой основе интерфейс системы плагинов в квик (QUIK Plugin API), как это сделано в wealth-lab и других раскрученных торговых системах, ставших де-факто стандартом. Например, цена в 50 000 руб. на мой взгляд, устроила бы обе стороны. Это позволило бы самим пользователям сделать квик более гибким, не быть привязанным к qpile или qlua, несмотря на в принципе, достаточно сильный её (qlua) потенциал, избавило бы от использования всевозможных связок: QUIK-QLUA-"что-то там ещё" QUIK-"что-то там ещё", отчасти, упростило бы решение проблем с многопоточностью и синхронизацией.
Если такая цена для Вас приемлема и Вы, как разработчики, считаете её обоснованной за возможную незначительную упущенную выгоду от потери монопольного создания и продажи плагинов к квику, прошу зарегистрировать данное пожелание.
В связи с тем, что секция экспорта в библиотеке пользовательских контролов имеет открытый интерфейс, могу ли я, сделав к ней QLUA-бинд использовать её в своих программах на qlua?
Вопрос к разработчикам (это значит, что мнение других - меня не интересует): какой смысл был создавать отдельный класс в квике под это дело и свою "песочницу" (sandbox)? Почему когда даже если индикатор не наложен ни на один график НО!!! присутствует в папке "Luaindicators" - он может угробить всю систему, если в нём есть неявные ошибки? Почему бы просто не объединить класс индикаторов и его виртуальную машину с классом скриптов? Вы бы тем самым значительно расширили бы их функциональность и не плодили бы не нужных промежуточных функций, которые работают в одном классе и не работают в другом. Или, вы так сильно боитесь/переживаете за стабильность своего плагина qchart.dll, который отвечает за рисование графиков в квике? Ответ, мол то, что это скажется на общей стабильности самого квика - не принимается - т.к. у вас используются и более опасные конструкции и в большем количестве.
Это облегчит участь многим и облегчит задачу поддержки визуализации в скриптах.
2. Также, прошу сделать доступ к нативным контролам квика из LUA. Это решит сразу 2 проблемы: использование нестабильных сторонних библиотек для визуализации, наманер, vclua и отчасти, проблему с многопоточностью, т.к. основная писанина её поддержки ляжет на Ваши плечи, а не на наши.
Всё это можно достичь созданием классов-обёрток в квике, а из LUA дёргать уже готовые объекты и методы. То есть LUA должен быть абстрагирован от "классо-писательства. Это реально облегчит многим жизнь. Думаю многим интересна будет такая схема абстракции:
Код
myButton = CreateControlByName("QButton");
myButton.Caption = "Кнопка";
MyButton.OnClick()
do smth work
end
CreateTimer(10, "timerEvent");
OntimerEvent
do smth work;
end
3. Также нужна поддержка хуков событий (Events): Я не прошу создания и регистрацию нативных событий, т.к. это далеко нетривиальная задача для квика и LUA. Поэтому прошу лишь на развитой поддержки событий в квике. Те, что есть - этого мало. Смысл в том, чтоб в LUA пользоваться уже готовыми зарегистрированными квиком и в квике колбеками, а не писать это всё дело через псевдомногопоточность на LUA.
Код
HookEvent("OnConnectPre", OnConnectPre); //название события взято для примера и не отражает конкретно именно это событие
OnConnectPre
do smth work
return 0; //если мы хотим, чтобы этот эвент обрабатывался другими скриптами;
return 1;//если мы хотим, чтоб после обработки этого эвента другие скрипты его не обрабатывали
return 2;//если мы хотим, чтоб скрипт остановил свою работу
end;
4. Должна быть модель общей разделяемой памяти для всех скриптов для обмена общими данными. Это надо для систем где одновременно работают разные роботы на разных инструментах. То есть для корректного обмена данными между скриптами-роботами
5. Нужен системно-реализованный класс алертов (алармов или триггеров) и чтоб, его можно было отслеживать вызывать из LUA. К примеру, есть бумага, есть условие по ней, оформленное в виде функции. При срабатывании условия квик вызывает коллбек. На самом деле, это всё относится к п.3. Но, если это невозможно для Вас сделать - чтож, придётся писать далеко нетривиальные "велосипеды" на LUA.
6. Нужен класс TaskManager - для создания и управления параллельными задачами. Можете не реализовывать но, выполните хотя бы остальные пункты. 7. Неплохо было бы иметь такой коллбек, как OnFrame. Скажем, 20-ти миллисекундный интервал устроил бы многих. Что можно делать и для чего он нужен - зависит от того. какие функции из этого списка Вы собираетесь исполнить. Вариантов много, равно, как и реализаций. 8. Неплохо было бы иметь профайлер скриптов и QLUA-дебаггер (исходники Decoda есть в общем доступе, что мешает заточить их, под QUIK как многие разработчики делают для своих программ) ----------------------------------------------------------------------------------------------------------------
Одним словом, нужно много нативных классов, всяких и разных, чтоб не изобретать их в LUA и не думать об их синхронизации. То есть, в идеале, программирование на LUA - должно и ОБЯЗАНО превратиться в callbacks-программирование. В противном случае, у него просто нет шансов. В индустрии 3d-игр - есть 2 основных направления или стиля работы 3d-движков с поддержкой скриптов на LUA:
движки, которые имеют развитую классовую структуру и тем самым, не заставляют скриптописателей писать многочисленные велосипеды. А дают им лишь возможность создавать, удалять, изменять свойства шаблонных классов, которых тьма. В результате, с созданием скриптов может справится даже школьник, а игра - засчёт массовости имеет весьма приличный оборот.
и движки, которые имеют минимум классов, оставляя всё на откуп скриптописателей. Бесспорно, это даёт большую свободу в реализации возможностей и даже некоторые известные игры это используют НО!!! это требует неимоверной квалификации скриптописателя. И как показывает практика или жизнь - такие игры долго не живут. Так вот, QLUA - сейчас на этом уровне.