s_mike@rambler.ru написал: TGB, прекратите фантазировать.этот код (усложненный) работает в сотнях (может тысячах, я не знаю) копий роботов, из числа выложенных на сайте и написанных под заказ.
Вы что, никогда не сталкивались с ситуацией, когда программы использовались сотнями тысячами пользователями и в этих программах потом обнаруживались ошибки?
Старатель написал: код в сообщении #24 в частности.
Выполненные мною в Lua 5.3 (5.4) тесты атомарности операций вставки/удаления полей в таблицу показали, что эти операции (в условиях реализован-ной многопоточности QLua) все-таки атомарны. Возможно?, есть ситуации, не охваченные тестированием, когда атомарности может не быть. Если же таких ситуаций нет, то мое утверждение, что выложенный Старателем код Queue (с описанием редко возникающей ошибки) создает потокоопасные очереди, ошибочное.
TGB, прекратите фантазировать.
этот код (усложненный) работает в сотнях (может тысячах, я не знаю) копий роботов, из числа выложенных на сайте и написанных под заказ.
Daniil Pozdnyakov написал: s_mike@rambler.ru, здравствуйте, Могли бы Вы, пожалуйста, указать версию вашего терминала. Также убедительная просьба прислать код, на котором указанная Вами проблема воспроизводится, и скриншот окна всплывающей ошибки.
Когда задают вопрос про версию, это означает, что никто даже и не пошевелился, чтобы найти ошибку. Она проявляется на любой версии
ккогда спрашивают код скрипта, это означает, что никто даже не почесался прочитать первые три сообщения ветки
когда спрашивают скриншот окна сообщения, это значит, что никто даже не пробовал поискать в текстах терминала слово "видеопамяти "
Даниил, вам спихнули эту проблему, потому что все равно никто не решить не может?
Евгений написал: Разработчики ответьте на вопросы, почему вызываются функции обратного вызова при перезагрузке квика? Так и задумано? или это ошибка?
так и должно быть. Торговая сессия установлена прошлым днём, а вы подключились к новому серверу. Либо вы вообще не подключались в этот торговый день к серверу, а сделки в этот торговый день были.
Roman Azarov написал: s_mike@rambler.ru, здравствуйте!
К сожалению, при переходе по предоставленной ссылке получаем сообщение от сервера об отсутствии доступа к директории. Просьба предоставить корректную ссылку или уточнить, что имеется в виду под "активной" работой с метками. О каком количестве меток идет речь?
Странно.
нажал на ссылку с тексте сообщения - страница замечательно открылась. Да и скачивания с этой страницы идут каждый день, счетчик растет, значит, со страницей проблем нет.
Это скрипт, который выводит профиль рынка.
он выводит много меток на график. За предыдущие дни (за каждый день) он выводит 50-100 меток (addlabel) и оставляет их в покое. Текущий день обрабатывается путем начального вывода тей же сотни меток и их перестановок при помощи replacelabel
При этом количество выставленных меток в течение дня (практически) не увеличивается, а количество свободной видеопамяти уменьшается.
Тест, который продемонстрирует проблему, может выглядеть так:
выставляем 100 меток посредством createlabel и потом раз в секунду заменяем первую на вторую, вторую на третью и так по кругу. Наблюдаем и удивляемся.
----
дополнительно, не относящееся к теме ремарка. Очень жаль, что bmp метки терминал может взять только из файла, и нет возможности передать картинку напрямую по памяти, минуя диск. львиная часть затрат мощности при активной работе с метками идет на бесполезную последовательность конверирование растра в бмп формат -> запись файла -> чтение файла -> раскодировка файла в растр.
Понятно, что не сделаете, но я все же "зарегистрируйте, пообещайте". Булычев в свое время думал об этом, но не надумал, как выясняется.
if (L0 >= L1) CU = L0 - L1; else CD = L1 - L0; if (L1 >= L2) CU = CU + L1 - L2; else CD = CD + L2 - L1; if (L2 >= L3) CU = CU + L2 - L3; else CD = CD + L3 - L2;
if (CU + CD != 0) LRSI = CU / (CU + CD); val1[i] = LRSI; i--; }
Dobrota написал: Кто-нибудь может поделиться индикатором скользящей средней Laguerre? Я бы и сам мог написать, но формулу не до конца понял. Может, кто-нибудь может подсказать?
Для меня вот совершенно очевидно, что тип integer обязан быть в языке - это первый язык, который я встретил за долгие годы программирования, в котором его нет! И что? Его нет и не будет - как ни аргументируй.
про ассемблер слышал разработчик операционных систем? А про Forth? Неужели про Бейсик тоже не в курсах? И про все остальные скриптовые языки со слабой типизацией тоже нет? Никогда не использовали sql ?
языков , которых по вашему мнению не существует, абсолютное большинство.
Пришлите, пожалуйста, пример описанного поведения (с описанной ошибкой и количеством свободной на момент получения видеопамяти) и скрипт на котором оно воспроизводится. Какая версия терминала Вами используется?
на видеокарте 1080ти на момент получения сообщения о нехватке памяти остаётся ещё 7 гигабайт свободными. Версия 9.1
Удивительно, но удалось заставить 9.1 демо отображать метку.
После бубна и гимна России по него удалил диаграмму полностью, создал ее заново, дал тот же идентификатор - и чудо свершилось, метка появилась!
Как объяснить происходящее - я не представляю. Возможно, техподдержка сможет.
Из наблюдений.
После удаления диаграммы и создания ее заново метки начали нумероваться с 1. Каждая следующая метка дает инкремент в номере на 1. До удаления диаграммы номера меток, которые создавались этим скриптом, стартовали с 250, также давали инкремент, но не рисоваться не желали.
Похоже, на диаграмме "были установлены" 249 меток, которые увидеть не представлялось возможным (по неясной причине). Ну не было, смотрел, не увидел ни одной, даже сильно выше и ниже графика.
Как так, почему так - покрыто тайной завесы. Но в механизме меток у терминала квик какие-то беды, и их много.
В 8.13 боевой выставляет картинку на диаграмму, а в 9.1 демо - нет. Оба терминала на одной машине, запущены одновременно, идентификаторы идентичны, проверено, скопировано через буфер обмена.
Как такое может быть? Отчего это может зависеть? Индусов в программисты наняли?
При активной работе с метками терминал через некоторое время начинает тупить и в результате вываливается с диагностикой о нехватке видеопамяти.
Свободной видеопамяти еще много гигабайт. Скрипт просто переставляет метки посредством SetLabel. Написать тест из 10 строчек кода вы должны суметь сами.
Почему вываливается если видеопамяти полно? Почему расходуется видеопамять при использовании SetLabel?
Я уже много раз вам указывал на эту ошибку (и не только я). Много раз она "будет исправлена в очередной версии ПО"
function main() message(tostring( AddLabel("gazp", {HINT="zzzzz",TEXT="",TRANSPARENCY=0,DATE=20210730,IMAGE_PATH="нет такого файла",TIME=40500,YVALUE=284.51,ALIGNMENT="RIGHT"} ))) end
Эта функция возвращает успех, номер метки. А не должна. Ошибка тянется с 2013 года, но компания Арка не чешется абсолютно.
Отдельный привет Алексею Иванникову. У вас полно ошибок, которые вы не исправляете годами или не в состоянии исправить.. Открывайте ваши регистрации или куда вы все это пишете, ищите. Можете поискать по форуму.
И ещё нужно учитывать, что на тиковых интервалах все свечи имеют разное время. Непонятно, что вы хотите увидеть, вычитая значение Газпрома в один момент времени из значения Лукойла в другой момент.
Юрий написал: Требуется из приложения на QT C++ одновременное подключение через Trans2QUIK.dll к нескольким QUIK, для получения сделок в реальном времени и сведения их в единую базу. Вопрос как организовать одновременное подключение Trans2QUIK.dll к нескольким квикам?
Идеологически правильно для каждого действия сначала подключать trans2quik к нужному терминалу, при завершении действия отключаться
Может вы тоже подскажете, как это делается обобщенно через win32 ф-ции библиотеки w32 конкретно для стакана? Название активного окна (стакан) и выделенная в стакане строка. И как в макросе ожидать нажатие клавиш.
нужно написать свой скрипт, который рисует вам стакан (так же как это делает сам терминал), ловить действия пользователя в нем стандартными средствами и запускать нужные вам обработчики.
Но так горазда больше оверхеда по ведению онлайн еще одного стакана, хотя ф-цию нужно запускать на разовой основе. Неужели прочитать окно стакана нельзя?
Доступа к экранной таблице терминала, отображающей стакан, нет.
Что касается оверхеда - если это напишет программист с правильным пониманием мироустройства вселенной, то вы запустите 100 стаканов в скрипте и какого либо неудобства не почувствуете.
Может вы тоже подскажете, как это делается обобщенно через win32 ф-ции библиотеки w32 конкретно для стакана? Название активного окна (стакан) и выделенная в стакане строка. И как в макросе ожидать нажатие клавиш.
нужно написать свой скрипт, который рисует вам стакан (так же как это делает сам терминал), ловить действия пользователя в нем стандартными средствами и запускать нужные вам обработчики.
Константин Рейм написал: Ставим лимитную заявку роботом, поверх этой заявки (по той же цене) робот ставит метку в виде линии (можно сначала метку поставить потом заявку), в результате имеем на графике две линии одна из них это заявка, другая - метка, т.к. цены заявки и метки равны, на графике видим только метку, а заявка казалось бы лежит под меткой, но при наведении курсора на линию и попытке перетащить метку - цепляется не метка, а заявка. Есть ли какой то способ зацепить именно метку, а не заявку.
повторный Init() без OnDestroy() в индикаторе, При смене инструмента графика в Lua индикаторе перечитывается файл без предварительного срабатывания OnDestroy()
Sergey Hlynovskii написал: Здравствуйте BlaZed , Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Похоже, у каждого вновь прибывшего сотрудникпа Арка свой маленький блокнотик, в который он чирикает пожелалки карандашиком.
в 2013 году Михаил Булычев дважды обещал мне исправить эту проблему - в приватной переписке и на этом форуме тоже.
Потом я поднимал эту тему в ином разрезе. Написал, что в момент смены инструмента на вызывается destroy() уже на этом форуме. Алексей Иванников попросил сделать скрипт и прислать , чтобы "провести исследования". Как понимаю, в надежде, чтобы я отвязался. Я прислал. 6 строчек. После длительных обсуждений и "проверок на непротиворечивость и соответствие политике компании" признали, ну и дальше по тексту, "в одной из следующих версий". В результате потеряли блокнотик, или рыбу завернули неудачно в ту самую страничку.
Сергей Горохов, помнится, тоже поучаствовал, и с его блокнотиком тоже беда приключилась. Или просто карандашик сломался и записать было нечем.
а вы какую рыбу любите, Сергей?
P.S. Номера обращений не нужно спрашивать, поиск по форуму даст все ответы.
Sergey Gorokhov написал: Терминал подключается к серверу, начинает качать данные и сообщает скрипту isLimitsLoaded=true, т.е. на сервере все лимиты действительно загружены
Это действительно странно, что вы отвечаете в разделе "Программирование" и тем более имеете право принимать решения.
Цитата
Mixa написал: А вслед за лимитами - уведомление "лимиты загружены". Отдельно для каждой секции. Таким образом, в какое бы время не подключился клиент, уведомление "лимиты загружены" должно быть отправлено после лимитов.
Цитата
Sergey Gorokhov написал: этому вопросу уже очень и очень много лет
Потому что этим вопросом занимается человек, мало понимающий в программировании.
миха, прекращай.
не нравится Горохов - не задавай ему вопросы. Ищи ответы в другом месте.
Доступ к Settings.line из кода индикатора, Пропадает доступ к массиву line структуры Settings в индикаторе после добавления индикатора на график и последующего изменения какого-либо параметра.
Andrey Bezrukov написал: Контрактов во всех сделках - Общее количество - Объем совершенных в текущей сессии сделок, штук.
Контракт и переводится как сделка. Вы можете дать вменяемый ответ, можно ссылкой на статью. Почему из вас надо сутками ответ выбивать?
О каких контрактах идет речь на скрине выше(акции Five)?
контракт - это обязательство, которое возникает вследствие сделки по определённым активам. Например, на акциях Газпрома возникает позиция по акциям, на фьючерсах Газпрома возникает позиция по контрактам. Контракт есть обязательство выполнить определенные действия к какому то сроку (например купить или продать акции)
не нужно наезжать, сначала имеет смысл определиться в терминологии.
Пользуюсь Квиком в версии Сбербанка. Прошу помощи в следующем.
Хочу создать смс оповещение когда цена закрытия на часовом интервале станет меньше moving average с периодом, скажем 9. Другое оповещение, это когда цена закрытия, скажем, на часовом интервале станет меньше нижней границы Bollinger bands.
Есть ли в квике такая штатная возможность или нужно программировать?
swerg написал: Считаю это ошибкой, которую разработчики QUIK должны исправить. Интерфейс у терминала русский, по умолчанию для русских букв штатные upper / lower должны корректно работать.
Каждая уважающая себя среда должна иметь кроме прочего, исполняемую в ней игрушку. Я таких для терминала quik не встречал.
Одно время была очень популярна игра 2048б мне заказывали ее написать для какого-то сайта. Вот ее вариант для quik, нарисовал под пиво:
Код
local stopped
game = {
cell = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
best = 0,
-- key = nil,
-- t = nil,
colors = { [0] = QTABLE_DEFAULT_COLOR,
[2] = RGB(248,248,255),
[4] = RGB(255,239,213),
[8] = RGB(255,222,173),
[8] = RGB(255,218,185),
[16] = RGB(205,92,92),
[32] = RGB(255,69,0),
[64] = RGB(238,238,0),
[128] = RGB(238,118,33),
[256] = RGB(255,160,122),
[512] = RGB(255,0,0),
[1028]= RGB(238,18,137),
[2048]= RGB(139,0,0)
},
create_table =
function(self)
self.t = AllocTable()
for i = 1,4 do
AddColumn(self.t, i, "", true, QTABLE_INT_TYPE, 10)
end
CreateWindow(self.t)
SetWindowPos(self.t,100,100,300,130)
for i = 1,4 do
InsertRow(self.t,i)
end
SetTableNotificationCallback(self.t,
function(_t, msg, _p, key)
if msg == QTABLE_VKEY then
self.key = key
elseif msg == QTABLE_CLOSE then
stopped = true
end
end)
SetWindowCaption(self.t, "2048 game by www.bot4sale.ru")
end,
draw =
function(self)
local cell = self.cell
for row=1,4 do
for column=1,4 do
local value = cell[(row-1)*4 + column]
SetCell(self.t,row,column,value==0 and "" or tostring(value))
SetColor(self.t,row,column,game.colors[value],0,game.colors[value],0)
end
end
end,
incr =
function(self)
local t,open = self.cell,{}
for i=1,16 do
if t[i]==0 then
open[#open+1]=i
end
end
t[open[math.random(#open)]] = math.random()<0.1 and 4 or 2
end,
pack =
function(self,ofr,oto,ost,ifr,ito,ist)
local t = self.cell
for outer=ofr,oto,ost do
local skip = 0
for inner=ifr,ito,ist do
local i = outer+inner
if t[i]==0 then
skip=skip+1
else
if skip>0 then
t[i-skip*ist],t[i],self.diff = t[i],0,true
end
end
end
end
end,
comb =
function(self,ofr,oto,ost,ifr,ito,ist)
local t = self.cell
for outer=ofr,oto,ost do
for inner=ifr,ito-ist,ist do
local i,j = outer+inner,outer+inner+ist
if t[i]>0 and t[i]==t[j] then
t[i],t[j],self.diff,self.best = t[i]*2,0,true,math.max(self.best,t[i]*2)
end
end
end
end,
move =
function(self,dir)
local loopdata = { {0,12,4,1,4,1},
{0,12,4,4,1,-1},
{1,4,1,0,12,4},
{1,4,1,12,0,-4}
}
local ofr,oto,ost,ifr,ito,ist = table.unpack(loopdata[dir])
self:pack(ofr,oto,ost,ifr,ito,ist)
self:comb(ofr,oto,ost,ifr,ito,ist)
self:pack(ofr,oto,ost,ifr,ito,ist)
end,
full =
function(self)
local t = self.cell
for r=0,12,4 do
for c=1,4 do
local i,v = r+c,t[r+c]
if (v==0) or (c>1 and t[i-1]==v) or (c<4 and t[i+1]==v) or (r>0 and t[i-4]==v) or (r<12 and t[i+4]==v) then
return false
end
end
end
return true
end,
play =
function(self)
math.randomseed(os.time())
self:incr()
self:incr()
while not stopped do
self:draw()
if self.best == 2048 then
message("Поздравляю!\n\nwww.bot4sale.ru")
break
end
if self:full() then
message("Game Over!")
break
end
self.diff = false
if self.key==0x25 then -- Left
self:move(1)
elseif self.key==0x27 then -- Right
self:move(2)
elseif self.key==0x26 then -- Up
self:move(3)
elseif self.key==0x28 then -- Down
self:move(4)
end
self.key = nil
if self.diff then
self:incr()
end
sleep(100)
end
end,
rules =
function()
message("Правила игры:\n\nВ каждом раунде появляется плитка номинала «2» или «4». Нажатием стрелки игрок может скинуть все плитки игрового поля в одну из 4 сторон. Если при сбрасывании две плитки одного номинала «налетают» одна на другую, то они превращаются в одну, номинал которой равен сумме соединившихся плиток. После каждого хода на свободной секции поля появляется новая плитка номиналом «2» или «4». Если при нажатии кнопки местоположение плиток или их номинал не изменится, то ход не совершается. Если в одной строчке или в одном столбце находится более двух плиток одного номинала, то при сбрасывании они начинают соединяться с той стороны, в которую были направлены.\nЛевый столбец с номерами строк участия в игре не принимает.\n\ns_mike@rambler.ru")
end
}
local game = game
--------------------------------------------------
function main()
game:create_table()
game:rules()
game:play()
end
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир написал: s_mike@rambler.ru, Да, Вам слушать этот бред явно противопоказано. ::
Меня это блеяние про МОЖНО сделать достало ещё много лет назад. Так СДЕЛАЙТЕ, наконец, "простейшую таблицу под любым соусом при помощи метаметодов", чтобы у таблицы заявок строки не пропадали при обрыве связи! Что, не можете? Способны только языком чесать? А что происходит с этими долбаными таблицами "с любыми свойствами" после DeleteRow - не подскажете? А то я от этого говна вообще отказался. Что до loadstring - эта "deprecated" чуть ли не единственная приличная функция во всём языке, и я ею активно пользуюсь.
вам следует научиться различать таблицы языка луа и оконный табличный интерфейс расширения qlua.
Владимир, вы хам и невежда. Я больше вам писать не буду. К сожалению, на этом форуме невозможно заблокировать вас и не читать то, что вы пишете.
поэтгму я предлагаю остальным посетителям форума более не отвечать вам с целью очищения атмосферы от запахов.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир написал: TGB, Да хрен с ними, с "неокрепшими умами" - пущай укрепляются! Не в инкубаторе же их держать! ::
Все-таки это таблицы как деревья. С обращениям к их элементам как к многомерным массивам. И ничего не надо "с помощью них строить" - всё уже построено. Мой ТРЕТИЙ коммент в этот форум содержал фразу:
В общем, с языком почти всё ясно: граф (точнее, дерево) объектов построить можно, а простейшую таблицу или даже массив - нельзя. Остаётся разобраться со строковыми переменными: способна ли эта loadstring интерпретировать строки как операторы языка (или, скажем, функции), то есть имеется ли здесь техническая возможность программирования данными.
Не нужно слушать этот бред.
простейшие таблицы, что одномерные, что многомерные, что фиксированного размера, что динамические, на луа делаются под любым соусом при помощи метаметодов. Можно сделать матрицу вообще с любыми свойствами, а не только с заранее заданными.
Глебов Александр написал: суммарные обновляемые объемы сделок для каждого ценового уровня внутри дня
Как-то так:
Код
local Volume = {}
local function Claster (alltrade)
if alltrade.sec_code = = sec and alltrade.class_code = = class then
Volume[alltrade.price] = (Volume[alltrade.price] or 0 ) + alltrade.qty
end
end
function OnInit ()
for i = 0 , getNumberOf ( "all_trades" ) - 1 do
Claster( getItem ( "all_trades" , i))
end
end
function OnAllTrade (alltrade)
Claster(alltrade)
end
Можно SearchItems задействовать для боле быстрого поиска.
можно. Но в этом случае индикатор будет подвешивать терминал в случае запуска на ликвидном инструменте ближе к концу торговой сессии. А если таких индикаторов будет несколько - терминал умрет.
s_mike@rambler.ru написал: Вот такой вариант. Но не в таблицу выводит, а рисует на графике.
Знакомо.Неинтересно.
вывести результаты в таблицу на порядок (или на два порядка) проще, чем нарисовать все эти уровни и на графике.
Поэтому ответ на ваш вопрос о возможности реализации на lua имеет вполне себе утвердительный ответ.
А в чем конкретно состоит ответ на мой вопрос, кроме "посмотреть на Ваш график", а мне нужны данные для дальнейшей обработки?
если вам хочется обрабатывать результаты, можно просто читать базу соответствующего дня и получать в луа сразу готовую таблицу с разблюдовкой по ценам сделок. Базы лежат в виде отдельных файлов в текстовом виде в формате языка луа.
Ну, собственно, это я и пытаюсь выяснить - какими средствами QLUA можно читать базу текущего дня и получать готовую таблицу?
Вот такой функцией читают файлы базы индикатор из архива, ссылку на который я писал выше
Код
-----------------------------------------------------------------------------------------------------------------------------------
-- Чтение таблицы из файла в массива или таблицу. Вырезает сигнатуру из файла
-- Параметры:
-- Имя файла
-- Функция декодирования (или nil)
-- Возвращает:
-- Таблицу или nil
-- Сообщение об ошибке или nil
-- Полное имя читаемого файла
ifuse(`table',`read',`
function table.read(filename,decode)
m4_assert(type(filename) == "string","Вместо строки передано (" .. type(filename) .. ") " .. tostring(filename))
m4_assert(type(decode) == "function" or decode == nil,"Вместо функции или nil передано (" .. type(decode) .. ") " .. tostring(decode))
filename = io.makepath(filename,".dat")
local result
local f,status = io.open(filename,"r")
if f then
local str = f:read("*a")
f:close()
local _,_,s = string.find(str,"^%-%-%s.*%s%-%-\n(.*)$")
str = s or str
if decode then
str = decode(str)
end
status,result = pcall(loadstring("return " .. str))
if status then
status = nil
else
status = "Файл поврежден" ifdef(`DEBUG',`.. ": " .. result')
result = nil
end
end
return result,status,filename
end
')
тут есть немного того, что вам не потребуется (инструкции препроцессора, декодирование), просто выкиньте это лишнее.
Таблица в файле содержит две подтаблицы. [1] это общие итоги по дню [2] это таблица данных по каждой торговой цене дня
Последовательность полей
Код
dnl Общие данные за день
pushdef(`COUNTER', 0) dnl Поля в разделе DAT_TOTALS
define(`TOTAL_VOLUME_BUY', m4_inc(`COUNTER')) dnl Объём покупок за день
define(`TOTAL_VOLUME_SELL', m4_inc(`COUNTER')) dnl Объём продаж за день
define(`TOTAL_VOLUME', m4_inc(`COUNTER')) dnl Объём за день
define(`TOTAL_MAXVOLUME', m4_inc(`COUNTER')) dnl Максимальный объём, прошедший по какой-либо цене за день
define(`TOTAL_TRADES_BUY', m4_inc(`COUNTER'))
define(`TOTAL_TRADES_SELL', m4_inc(`COUNTER'))
define(`TOTAL_TRADES', m4_inc(`COUNTER'))
define(`TOTAL_MAXTRADES', m4_inc(`COUNTER')) dnl Максимальное кол-во сделок, прошедших по какой-либо цене за день
define(`TOTAL_MINPRICE', m4_inc(`COUNTER')) dnl Минимальная цена дня
define(`TOTAL_MAXPRICE', m4_inc(`COUNTER')) dnl Максимальная цена дня
define(`TOTAL_TABLE_SIZE', COUNTER) dnl Размер таблицы total
popdef(`COUNTER')
Код
dnl Структура данных по конкретной цене
pushdef(`COUNTER', 0) dnl Поля в разделе DAT_DATA
define(`VOLUME_BUY', m4_inc(`COUNTER'))
define(`VOLUME_SELL', m4_inc(`COUNTER'))
define(`TRADES_BUY', m4_inc(`COUNTER'))
define(`TRADES_SELL', m4_inc(`COUNTER'))
define(`VOLUME_BS', m4_inc(`COUNTER'))
define(`TRADES_BS', m4_inc(`COUNTER'))
define(`PRICE_TABLE_SIZE', COUNTER) dnl Размер таблицы по одной конкретной цене
popdef(`COUNTER')
s_mike@rambler.ru написал: Вот такой вариант. Но не в таблицу выводит, а рисует на графике.
Знакомо.Неинтересно.
вывести результаты в таблицу на порядок (или на два порядка) проще, чем нарисовать все эти уровни и на графике.
Поэтому ответ на ваш вопрос о возможности реализации на lua имеет вполне себе утвердительный ответ.
А в чем конкретно состоит ответ на мой вопрос, кроме "посмотреть на Ваш график", а мне нужны данные для дальнейшей обработки?
если вам хочется обрабатывать результаты, можно просто читать базу соответствующего дня и получать в луа сразу готовую таблицу с разблюдовкой по ценам сделок. Базы лежат в виде отдельных файлов в текстовом виде в формате языка луа.
Владимир написал: s_mike@rambler.ru, Вот уж АБСОЛЮТНО до лампочки! Достаточно взглянуть в начало текста: Версия:5.05 Требования:Quik 8.6 Размер:1.57 MB и любому дебилу ясно, что это никак не Lua.
Достаточно взглянуть в конец: Адаптировано для работы с библиотекой bot4sale.dll и любому дебилу...
прекрасно.
как вы замечательно про дебила-то... Сами, никто за язык не тянул.
скрипт этот я написал как раз на луа. Это чистый незамутненнвй луа, который просто помещен в контейнер.
Владимир написал: s_mike@rambler.ru, 1. Вы что, предполагаете самостоятельно разработать и графическую библиотеку? Если нет, то сложность представления данных в виде таблицы или графика ОДНОГО порядка. 2. Нет там ответа на его вопрос, ибо совершено очевидно, что вся тамошняя хрень написана НЕ на Lua.
В сообщении на экране www.bot4sale.ru будет оформлена как ссылка, тут все в порядке. Но при нажатии на эту ссылку открывается проводник, а не браузер. Думаю, что и с другими типами (call-to и прочими будет то же самое)
По умолчанию приложением для открытия URL назначен Хром.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Владимир написал: swerg, Ну хватит тяфтяфкать, милок! За слова свои отвечать квалификации не хватает - понимаю, но тогда уж приличнее помолчать
Программирование давно и далеко ушло от Фортрана на БЭСМ-6. И даже от Кернигана с Ричи.
Самое простое, что можно сделать для расширения кругозора, это обратиться к Википедии. Окажется, что существует несколько разных способов организации строкового типа. Я даже ссылку вам дам на русском языке: Строковый тип
P.S. Про ваше героическое прошлое мне известно, про удивительный скрипт тоже. Убедительная просьба больше не хамить, всему есть предел.
Владимир написал: s_mike@rambler.ru, Это Вы с зеркалом разговорились, сударь? Повторяю для бестолковых: Единственная таблица, из которой я получаю данные для торговли - это ТТТ, а она непустая даже если вообще не соединяться с сервером.
ну ладно. Вот вам несколько примеров. Исключительно чтобы ваша дурь и глупый апломб были всем видны.
1. Таблица текущих торгов пуста после установки терминала до первого подключения к брокеру
2. Ттт пуста, если в ней нет ни одного инструмента.
3. ТТТ пуста, если запрещены к получению все добавленные в нее колонки параметров. Зависит от набора полей.
4. Ттт пуста утром, если в наcтройках стоит флаг очистки при смене торговой даты. Зависит от набора полей.
5.ттт пуста после очистки данных до начала их перезакачки с сервера брокеоа
наверняка есть и другие моменты и их более чем достаточно.
P.S. Да, мне известно о вашем героическом прошлом, чудесном скрипте и стиве джобсе, который носил вам кофе.
Прошу прощения, действительно, допустил ошибку в ответе. Вызов OnParam происходит при изменении параметра(ов) и, в текущей реализации, функции действительно неизвестно, значение каких конкретно параметров было изменено.
Пожелание по добавлению параметра (массива) для OnParam зарегистрировали, постараемся его рассмотреть. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
В случае, если необходимо зарегистрировать какие-либо пожелания по прочим функциям обратного вызова, просим описать их явным образом.
Это пожелание за последние 6-7 лет регистрировалось раза 3, столько же раз было признано целесообразным и 0 раз было реализовано.