TGB, исправленный скрипт не виснет Вы вместо брызжания проверьте тест. ------------------- если есть другие проблемы , то пишите я исправлю. ---------------------- И очевидно, и у кого что болит тот о том и говорит
nikolz написал: _sk_ ,вот Ваш тест с исправленными Вашими ошибками. Работает без проблем.
Вы до сих пор не поняли, что у _sk_ нет проблем со скритом ( он делает flag = true и все у него хорошо ). Его интерисует странное поведение скрипта когда flag =false и это нормально. Вообще, из того что видно невооруженным взглядом, у вас постоянный зуд отметиться на форуме (как у собачки, выпущенной на прогулку :: ). Зачем вы работаете на форуме «прокладкой» между комментариями? Явно, что у вас проблемы с вашими комплексами и вы пытаетесь здесь их скомпенсировать. Но вы до сих пор не научились выделять фрагменты текстов комментариев, которые вы цитируете. Вас можно пожалеть (девочки точно не любят), но вы постоянно спамите на форуме и скоро переполните его базу :: . Меня это беспокоит и только поэтому я на вас реагирую :: .
Вы не поняли, я исправил у него ошибки и можете делать хоть faLSE
Сегодня в Сбербанке повторилось. Дата торгов была вчера. И естественно вчерашний день пропал. -------------- Проблема решилась лишь после разрыва связи , длительного ожидания и установки связи заново. ---------------- Так как такую и подобные проблемы наблюдал неоднократно, то хочу высказать свое предположение о ее источнике. =================== проблема возникает, если установить соединение до начала торгов, либо в момент начала. Предположу, что при этом происходит не полная загрузка с сервера начальных данных, но после начала торгов сервер не проверяет некорректность данных у клиентов а продолжает работу с неполными либо с неверными данными. ============ Полагаю, это недоработка разработчиков QUIK. Но это лишь мои предположения. =============== Проблема решается иногда лишь перезагрузкой но после начала торгов и длительного ожидания.
если бы сделали возможность подгружать в архив данные из файлов , то было бы совсем хорошо. но и без этого все вполне работает и историю можно подгружать но без графического изображения.
Г.Растопаефф написал: Сбербанк предоставляет торговый доступ только к валютным парам USD_RUB и EUR_RUB. Посоветуйте пожалуйста российского брокера без кухни, который поддерживает QUIK и предоставит доступ к торгам по всем или большинству валютных пар Мосбиржи или СПбиржи.
у сбербанка есть все валюты имеющиеся на мос бирже
_sk_, вот Ваш тест с исправленными Вашими ошибками. Работает без проблем.
Код
local flag =false -- можно и false и true
local foregroundColor = RGB(0, 0, 0)
local backgroundColor = RGB(192, 255, 192)
local function setTableColors(foregroundColor, backgroundColor)
local nRows, nCols = GetTableSize(tableId)
if nRows and nCols then
for row = 1, nRows do
for col = 1, nCols do
SetColor(tableId, row, col,
backgroundColor, foregroundColor,
backgroundColor, foregroundColor)
end
end
end
end
local function ensureWindowOpened()
if tableId == nil then return end
if IsWindowClosed(tableId) then
CreateWindow(tableId)
SetWindowPos(tableId, 0, 0, 300, 100)
SetWindowCaption(tableId, "hang_test")
InsertRow(tableId, 1)
InsertRow(tableId, 2)
SetCell(tableId, 1, 1, "11")
SetCell(tableId, 1, 2, "12")
SetCell(tableId, 2, 1, "21")
SetCell(tableId, 2, 2, "22")
SetSelectedRow(tableId, 1)
end
setTableColors(foregroundColor, backgroundColor)
end
function OnInit(scriptPath)
tableId = AllocTable()
AddColumn(tableId, 1, "col1", true, QTABLE_STRING_TYPE, 5)
AddColumn(tableId, 2, "col2", true, QTABLE_STRING_TYPE, 5)
SetTableNotificationCallback(tableId, function(tId, msg, par1, _)
if msg == QTABLE_SELCHANGED then
SetSelectedRow(tId, 1)
end
end)
ensureWindowOpened()
end
local function run()
ensureWindowOpened()
if tableId then
SetSelectedRow(tableId, 2)
end
end
function OnStop(flag)
DestroyTable(tableId);
interrupted = true
end
function main()
message("STARTED", 1)
while not interrupted do
run()
if flag then
sleep(0)
end
end
message("SHUTDOWN", 1)
end
в колбеке в этой функции Вы уничтожаете окно ---------------------------- local function closeWindow() local t = tableId tableId = nil if t then DestroyTable(t) end end ------------------ А в main вы уничтожаете nil. Очевидно у Вас все вылетает по ошибке и вы вместо того чтобы правильно сделать ставите pcall ---------------- Т е не зная причину Вы блокируете сообщение об ошибке. полный дилетантизм.
зачем закрывать окно и в колбеке и в main? ---------------------------- function OnStop(flag) pcall(closeWindow) interrupted = true end
function main() message("STARTED", 1) while not interrupted do run() if flag then sleep(0) end end pcall(closeWindow) message("SHUTDOWN", 1) end ====================
читайте внимательно документацию прежде чем писать тесты. ---------------- Например, OnStop - Функция вызывается терминалом QUIK при остановке скрипта из диалога управления и при закрытии терминала QUIK.
Функция возвращает количество миллисекунд, которое дается скрипту на завершение работы.
Если функция не возвращает число, то таймаут завершения работы скрипта остается равным 5 секундам.
По истечении интервала времени, данного скрипту на завершение работы, функция main() завершается принудительно. При этом возможна потеря системных ресурсов.
=======================
Т е Вам дали время на завершение потока майн
Там и надо закрывать окна. А Вы делаете это в колбеке.
nikolz написал: Предположу, что это ошибка автора скрипта, так как в нем не учитывается многопоточность.
Филосов :: . Укажите конкретно в чем ошибка автора. --- Ошибки автора нет. Есть ошибка в QUIK, состоящая в том, что длинные участки фрагментов кода скрипта на "чистом Lua" (без вызова C-функций) блокируют переключение потоков обслуживающего колбеки и выполняющего main. Я не буду повторять свои комментарии по этому поводу. Читайте форум.
ошибка автора в отсутствии знаний. И Ваша тоже так как Вы пишите про "чистый луа" который существует лишь в виде функций на чистом СИ. Это профанация и дилетанты вам верят.
_sk_ написал: 1) В числах разделитель разрядов должен быть точкой. 2) Если после знака равно стоит строка, её надо взять в кавычки. 3) В самом конце строк таблицы stop нужны запятые, а не точки с запятой, как сейчас в некоторых местах. 4) TRANS_ID должно быть числом.
Спасибо. Я имел ввиду сделать из вышенаписанного кода массив для sendtransaction?
для этого надо все параметры записать либо в кавычках либо с помощью функции tostring()
_sk_ написал: Берём следующий скрипт. Если в первой строке стоит flag = true, то скрипт нормально запускается и останавливается из меню скриптов. Если в первой строке поставить flag = false, происходит зависание терминала при остановке скрипта. В зависимости от значения переменной flag либо имеется sleep(0) в функции main(), либо отсутствует на пути выполнения кода.
У меня зависание воспроизводится в терминалах версий 10.0.0 и 10.0.1.
Три вопроса: 1) Может ли кто-то ещё подтвердить, что зависание происходит (чтобы исключить особенность моего компьютера)? 2) Знает ли кто-то причину такого поведения? 3) Что разработчики терминала могут сказать по этому поводу?
Сам скрипт:
Код
local flag = true -- если установить в false, то при остановке скрипта происходит зависание (убирается sleep(0) в функции main)
local foregroundColor = RGB ( 0 , 0 , 0 )
local backgroundColor = RGB ( 192 , 255 , 192 )
local interrupted = false
local tableId
local function setTableColors (foregroundColor, backgroundColor)
local nRows, nCols = GetTable Size (tableId)
if nRows and nCols then
for row = 1 , nRows do
for col = 1 , nCols do
SetColor (tableId, row, col,
backgroundColor, foregroundColor,
backgroundColor, foregroundColor)
end
end
end
end
local function ensureWindowOpened ()
if tableId = = nil then
return
end
if IsWindowClosed (tableId) then
CreateWindow (tableId)
SetWindowPos (tableId, 0 , 0 , 300 , 100 )
SetWindowCaption (tableId, "hang_test" )
InsertRow (tableId, 1 )
InsertRow (tableId, 2 )
SetCell (tableId, 1 , 1 , "11" )
SetCell (tableId, 1 , 2 , "12" )
SetCell (tableId, 2 , 1 , "21" )
SetCell (tableId, 2 , 2 , "22" )
SetSelectedRow (tableId, 1 )
end
setTableColors(foregroundColor, backgroundColor)
end
local function closeWindow ()
local t = tableId
tableId = nil
if t then
DestroyTable (t)
end
end
function OnInit (scriptPath)
tableId = AllocTable ()
AddColumn (tableId, 1 , "col1" , true , QTABLE_STRING_TYPE, 5 )
AddColumn (tableId, 2 , "col2" , true , QTABLE_STRING_TYPE, 5 )
SetTableNotificationCallback (tableId, function (tId, msg, par1, _)
if msg = = QTABLE_SELCHANGED then
SetSelectedRow (tId, 1 )
end
end )
ensureWindowOpened()
end
local function run ()
ensureWindowOpened()
if tableId then
SetSelectedRow (tableId, 2 )
end
end
function OnStop (flag)
pcall(closeWindow)
interrupted = true
end
function main ()
message ( "STARTED" , 1 )
while not interrupted do
run()
if flag then
sleep ( 0 )
end
end
pcall(closeWindow)
message ( "SHUTDOWN" , 1 )
end
причина зависания вероятнее всего в том, что функция main будет исполнена один раз до загрузки всех необходимых для корректной работы данных. Предположу, что это ошибка автора скрипта, так как в нем не учитывается многопоточность.
Sergey Gorokhov, По большому счету так как каналы связи без проблем - оптика 100 Мбод, а сервер и терминалы - это ваше произведение , то хрень тоже Ваше произведение .
сегодня у сбера вообще полный .... подключение к серверу есть работает стакан и TTT -------------- но не работают графики и ГЛАВНОЕ нет фирмы брокера - т е сбербанка и следовательно нет никакого портфеля ------------------
nikolz написал: пардон, поправлю, интенсивно создаете объекты или расширяете таблицы, но не уничтожаете не нужные объекты
Так и не смог найти причину, так как ошибка плавающая. Переписал код по другому - ошибка исезла. Все таки гарантировано, что это проблема в Квике не могу на данный момент сказать.
Рекомендую по возможности не создавать новые таблицы вместо старых, а просто очищать старые. В итоге у вас не будет объектов для уничтожения и частое обращение к куче за новым блоком памяти.
Дмитрий написал: Не могу нигде найти описание ошибки "attempt to perform arithmetic on a table value" - в переводе "попытка выполнить арифметику над табличным значением". Ну а почему нельзя выполнить арифметику над табличным значением? Или что имеется ввиду?
скорее всего, значение таблицы не является числом. Возможно что это либо функция либо таблица. покажите скрипт, если хотите помощь.
nikolz написал: и откуда взялся график после экспирации GAZR-12.22?
мне хотелось бы отобрзить после даты экспирации GAZR-12.22 графики: 1) историю цены GAZR-12.22 до его собственной экспирации 2) историю цены GAZR-03.23 и др. до даты экспирации GAZR-12.22 и после
Возможно не понял, но после экспирации фьючерса его нет, т к он выполнен. --------------- Зачем Вам это, если не секрет. По-моему мнению это не имеет практической пользы.
Шорты осиновые написал: 1. Как можно отобразить график фьючерса с истекшим сроком действия? 2. При замене истекшего инструмента, напрмер GAZR-12.22 на GAZR-03.23, склеиваются графики не GAZR-12.22 + GAZR-03.23, а части графиков GAZR-03.23 до и после экспирации GAZR-12.22?
и откуда взялся график после экспирации GAZR-12.22?
поправил, чтобы тест бесконечно не работал при втором запуске
Код
local code_class1 = "TQBR"
local code_paper1 = "GAZP"
local interval1 = INTERVAL_TICK
local code_class2 = "TQBR"
local code_paper2 = "SBER"
local interval2 = INTERVAL_TICK
------------------------
local function my_cb_CDS(my_table_data_, code_class_, code_paper_, interval_, cntr)
message(code_paper_,1)
Sleep(100);
end
-----------------------------------------------------------------------------------------------------------int main:-----------------------------------------------------------------------------------------------------
local n=20;
function main()
while n>0 do
if my_table1==nil then my_table1, err = CreateDataSource(code_class1, code_paper1, interval1);
if my_table1 then
my_table1:SetUpdateCallback(function(idx)my_cb_CDS(my_table_data1, code_class1, code_paper1, interval1) end)
end
end
if my_table2==nil then my_table2, err = CreateDataSource(code_class2, code_paper2, interval2);
if my_table2 then
my_table2:SetUpdateCallback(function(idx)my_cb_CDS(my_table_data2, code_class2, code_paper2, interval2) end)
end
end
-------------------------
-- message(tostring(my_table1:Size()),1)
sleep(1000)
n=n-1
end
-------------------------
end -- end main()
function OnInit(script_path)
end
local code_class1 = "TQBR"
local code_paper1 = "GAZP"
local interval1 = INTERVAL_TICK
local code_class2 = "TQBR"
local code_paper2 = "SBER"
local interval2 = INTERVAL_TICK
------------------------
local function my_cb_CDS(my_table_data_, code_class_, code_paper_, interval_, cntr)
message(code_paper_,1)
Sleep(100);
end
-----------------------------------------------------------------------------------------------------------int main:-----------------------------------------------------------------------------------------------------
function main()
while not stopped do
if my_table1==nil then my_table1, err = CreateDataSource(code_class1, code_paper1, interval1);
if my_table1 then
my_table1:SetUpdateCallback(function(idx)my_cb_CDS(my_table_data1, code_class1, code_paper1, interval1) end)
end
end
if my_table2==nil then my_table2, err = CreateDataSource(code_class2, code_paper2, interval2);
if my_table2 then
my_table2:SetUpdateCallback(function(idx)my_cb_CDS(my_table_data2, code_class2, code_paper2, interval2) end)
end
end
-------------------------
message(tostring(my_table1:Size()),1)
sleep(1000)
end
-------------------------
end -- end main()
function OnInit(script_path)
end
я отвечал на вопрос темы, повторю свой ответ. скрипт написан в целом рабочий ---------------------- подтверждаю что при первом запуске подписка не происходит при втором происходит. ---------------------- Подписка при первом запуске вроде бы произойдет если ручками установить флаги инструментов в заказе данных через меню. -------------- Иначе никакие танцы с бубном проблему не решают. =============== считаю, что такое поведение функции подписки мягко сказать - странное.
Nikolay написал: Да, счета и субсчета (т.е. коды) у брокера. Однозначно связать счет и код клиента нельзя, т.к. в таблице кодов больше ничего нет. Но.
Смотрим на таблицу money_limits (Лимиты по денежным средствам), для нее код имеет смысл. В ней есть фирма, есть счет, есть код клиента. Так и выходит, что можно только сказать - а можно ли с этим кодом, на этом счете, по этой фирме что-то сделать. Кодов же много может быть. На одном есть деньги, на другом нет. Хотя подать транзакцию можно, раз доступен код по фирме, счету. Ну и сколько брокеров не видел, фирма для срочного рынка отличается от фондового. По ней, как минимум, отсечь недоступные классы инструментов. И выбирая инструмент, по его классу даем список сочетаний доступных счетов, субсчетов.
Очевидно не правильно объяснил. Да у брокера в амбарной книге записано сколько денег вы ему дали и сколько у вас на ИИС Но бирже это по... ---------------------- Поэтому брокеру Вы можете что угодно сообщать Это никакого отношения к торговле на бирже не имеет так как биржа знает лишь брокера. -------------------------- Более того, если у Вас будет маржин кол, и денег не хватит на одной записи в амбарной книге, то брокер спишет с другой записи. ---------------------- Все эти субсчета - это лишь строчки текста в амбарной книге брокера. Реально с финансами брокер ничего делать не может это делают лишь финансовые организации. -------------- Поэтому все эти коды клиентов и ваши записки брокеру с какого счета взять деньги лишь ваши хотелки и добрая воля брокера поиграть с вами в ваши желания. --------------------- Примерно так.
Добрый день, всем! -------------- Вопрос в продолжении темы топика ------------ Если код клиента нужен для идентификация клиента и таких кодов в терминале может быть несколько ( иначе этот код тождественно равен UID терминала), то почему этого кода вообще нет в заявке на фьючерсы и опционы. как в этом случае различаем клиентов? ------------------ Мое мнение, прежнее - код клиента - это атавизм . Поэтому в документации QLUA этот параметр в транзакции можно не заполнять. ------------------ Хотелось бы услышать начальника транспортного цеха.
nikolz написал: ------------------------ Возможно изначально он был обязателен, но сейчас он подобен аппендиксу у человека. --------------------------- Типа есть, но нафиг нужен.
Нужен. Я меня счет один, а два кода клиента. И необходимо указывать тот, с которого идет торговля. Это субсчет - на одном ИИС, другой простой. На одном есть деньги, на другом нет.
На самом деле это вам лишь видимость. Такая игра кошки с мышкой. Вы сами не торгуете. ИИС это такое искусственное нагромождение с ограничением Ваших прав распоряжение. Поэтому у Вас для как бы счета. но на бирже торгует брокер вас там нет факт исполнения вашего поручения вы можете реально увидеть лишь в его отчете. Терминал квик не является каким либо документом подтверждающим факт исполнения Он лишь подтверждает факт отправки вашего поручения брокеру. Брокер имеет полное право сделать со сделкой все что захочет. ---------------------- Прикольно но факт, реально заключение сделки произойдет лишь на клиринге, так как брокер не имеет право проводить расчеты по сделке. ---------------------- Брокер лишь подает ваши заявки и списывает с вас свое вознаграждение . ----------------------- прикольно, но во времена глобальной компьютеризации брокер - это тоже аппендикс в торговле на бирже.
открываете Руководство пользователя QUIK Раздел 6. Совместная работа с другими приложениями Импорт транзакций Формат .tri-файла с параметрами транзакций Примеры строк, которые могут содержаться в файле -------------- и там есть пример
Тейк-профит и стоп-лимит Лукойл, покупка 1 лота, активация тейк-профита при достижении цены 2000 с отступом в 5% и защитным спредом в 3%, стоп-цена 2222, цена лимитированной заявки 2255, время действия с 10:00:01 по 19:45:45
Nikolay написал: Да, счета и субсчета (т.е. коды) у брокера. Однозначно связать счет и код клиента нельзя, т.к. в таблице кодов больше ничего нет. Но.
Смотрим на таблицу money_limits (Лимиты по денежным средствам), для нее код имеет смысл. В ней есть фирма, есть счет, есть код клиента. Так и выходит, что можно только сказать - а можно ли с этим кодом, на этом счете, по этой фирме что-то сделать. Кодов же много может быть. На одном есть деньги, на другом нет. Хотя подать транзакцию можно, раз доступен код по фирме, счету. Ну и сколько брокеров не видел, фирма для срочного рынка отличается от фондового. По ней, как минимум, отсечь недоступные классы инструментов. И выбирая инструмент, по его классу даем список сочетаний доступных счетов, субсчетов.
теперь я Вам поясню а за одно и себе напомню, про код клиентов, код фирмы и торговый счет. -------- На бирже торгует брокер, а не его клиенты. Код клиента нужен опять же лишь брокеру. Это как бы метка. Она нужна брокеру (бирже она пофиг) чтобы в конце торгового дня списать комиссионные с клиентов и раздать им сальдо. Поэтому код клиента не является обязательным при подаче заявки, так как брокер знает кто подает по UID терминала и автоматом пометит клиента. --------------- Вот поэтому нам и нет надобности знать код клиента и где либо его выставлять. ------------------------ Возможно изначально он был обязателен, но сейчас он подобен аппендиксу у человека. --------------------------- Типа есть, но нафиг нужен.
Пока вам объяснял, то сам вспомнил то, что забыл. ---------------------------- На бирже нет торговых счетов клиентов. ------------------------------- Клиенты все есть лишь в амбарной книге брокера. ---------------------------- Поэтому правильно будет то, что торговый счет - это счет брокера на бирже, куда брокер слил деньги всех клиентов как свои. -------------------------------------- Так как на бирже торгует брокер, а не его клиенты -------------------- Новое, это хорошо забытое старое. ------------------ вопрос снят.
Nikolay написал: Не разработчик, но, кажется, соответствие идет от фирмы, не счета. Счет от класса инструмента. Также от класса инструмента фирма. И по уже по фирме проверяем, что код клиента и счет для одной фирмы.
в качестве примера, что Вы не правы. Предположим несколько клиентов выставляют заявки на одну и ту же акцию Так как класс один и тот же то и фирма одна и та же. Тогда как связать код клиента с его торговым счетом, где его деньги лежат?
это ошибка, которая возникает при частом выделении памяти приложениями. Симптомы Приложения, которые часто выделяют память, могут испытывать случайные ошибки из памяти. Такие ошибки могут привести к другим ошибкам или неожиданному поведению в затронутых приложениях.
Причина Сбои в распределении памяти могут возникать из-за задержки, связанные с ростом размера файла страницы для поддержки дополнительных требований к памяти в системе. Возможной причиной этих сбоев является настройка размера файла страницы в качестве «автоматического». Автоматический размер файла страницы начинается с небольшого файла страницы и автоматически растет по мере необходимости. Корпорация Майкрософт подтвердила, что это проблема в Windows 10. -------------------- Возможно Вы в луа скрипте активно создаете и уничтожаете объекты. Но надо смотреть скрипт.
Nikolay написал: Не разработчик, но, кажется, соответствие идет от фирмы, не счета. Счет от класса инструмента. Также от класса инструмента фирма. И по уже по фирме проверяем, что код клиента и счет для одной фирмы.
если я правильно понимаю, то фирма - это код брокера на бирже поэтому она одна и та же для конкретной биржи а код клиента - это код клиента брокера, который брокер сообщает бирже, когда выставляет заявку А счет торговый - это счет на который клиент заводит деньги и лимит по которому контролирует брокер перед тем как послать заявку на биржу. ---------------- В итоге с одного терминала можно посылать заявки от разных клиентов каждый клиент может иметь несколько торговых счетов но фирма, которая пошлет эти заявки на биржу будет одна и та же - это ее код на бирже. ------------------- код фирмы будет разный лишь для разных бирж и возможно для разных секций. ----------------- Но счета где деньги лежат - связаны в первую очередь с клиентами и потом через код фирмы с биржей. ------------------------- Вопрос остается в силе.
Добрый день, решил написать робота, который работает со всеми доступными в терминале кодами клиентов и вдруг откуда не возьмись появился ... затык. ----------------------- Вопрос: ---------------- Каким образом ,т е на основе каких таблиц или функций, можно установить соответствие кода клиента (таблица client_codes) торговому счету (таблица trade_accounts) ------------------- Спасибо
Дмитрий написал: Добрый день! Вопрос почему то приходит ответ на сделку 2-3-4 раза в function OnTrade(trade_data) [img]file:///C:/Users/algon/OneDrive/%D0%98%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F/inet/%D1%81%D0%B4%D0%B5%D0%BB%D0%BA%D0%B8.JPG[/img]
так как нет никакой картинки, то попробую гадать по звездам - возможно это заявка исполняется кусками?