26

Re: Обмен данными между Lua-скриптами в QUIK

delphiec пишет:

kalikazandr а в чем проблема использовать внешнюю БД, для обмена данными?

Проблема в том, что я не спец в программировании. Для меня ООП, БД, SQLite и т.д. - какая-то магия.
Для того, что бы отправить для другого скрипта сообщение типа:
"я купил тут", "ты продай там"
и получить ответ: "позиция закрыта" - StaticVar более чем достаточно и использование БД не вижу смысла.

Вот, когда понадобится обмен данными между скриптами из разных терминалов (а у меня их 4), тогда изучу и прикручу БД.
Спасибо.

27

Re: Обмен данными между Lua-скриптами в QUIK

delphiec пишет:

kalikazandr а в чем проблема использовать внешнюю БД, для обмена данными?

По-моему, это "из пушки по воробьям".
Да, есть задачи, где разумнее все сваливать в БД. Но для простого обмена или, те более, "обмена сигналами" - предложенная библиотека, думаю, работает быстрее и требуем меньше ресурсов.

28

Re: Обмен данными между Lua-скриптами в QUIK

kalikazandr пишет:

Вот, когда понадобится обмен данными между скриптами из разных терминалов (а у меня их 4)

А такая задача есть?
Я просто всё думаю: прикрутить обмен между несколькими терминалами, или никому не надо?

29 (2015-08-16 12:11:57 отредактировано CyberTrader)

Re: Обмен данными между Lua-скриптами в QUIK

Надо.

swerg пишет:
delphiec пишет:

kalikazandr а в чем проблема использовать внешнюю БД, для обмена данными?

По-моему, это "из пушки по воробьям".
Да, есть задачи, где разумнее все сваливать в БД. Но для простого обмена или, те более, "обмена сигналами" - предложенная библиотека, думаю, работает быстрее и требуем меньше ресурсов.

Использование БД целесообразно при обмене большим объёмом данных. Чтобы перекинуться "парой слов" между скриптами использование БД - неоправданно и дорого (в плане производительности).

30

Re: Обмен данными между Lua-скриптами в QUIK

swerg пишет:

А такая задача есть?
Я просто всё думаю: прикрутить обмен между несколькими терминалами, или никому не надо?

Было-бы очень хорошо, у меня 2 брокера и по 2 терминала на каждого: для фондового, для срочного рынков.
Сейчас через файл общение - медленно.

31

Re: Обмен данными между Lua-скриптами в QUIK

Было-бы очень хорошо, у меня 2 брокера и по 2 терминала на каждого: для фондового, для срочного рынков.
Сейчас через файл общение - медленно.

Попробуй мою либу http://quik2dde.ru/viewtopic.php?pid=1572#p1572, там через SQLite сможешь обмениваться довольно быстро. Я через неё 5 стаканов гонял, каждый тик.

32

Re: Обмен данными между Lua-скриптами в QUIK

delphiec пишет:

Попробуй мою либу http://quik2dde.ru/viewtopic.php?pid=1572#p1572, там через SQLite сможешь обмениваться довольно быстро. Я через неё 5 стаканов гонял, каждый тик.

"довольно быстро" это не показатель, и 5 стаканов тоже

< - > на выходе у вас нет таблицы. Сериализация на входе и выходе...
< - > совсем не понятна необходимость вашей .dll, при беглом осмотре создается впечатление, что вы из Тулы в Москву хотите быстро через Пекин добраться...

33

Re: Обмен данными между Lua-скриптами в QUIK

Друзья,
давайте сбавим обороты и воздержимся от высказываний в стиле "не понятно зачем" и прочих красочных сравнений.
Что-то не понятно, что-то хочется уточнить, предложить другую идею - велком  ветку соответствующей библиотеки высказываться и обсуждать, но корректно!

34

Re: Обмен данными между Lua-скриптами в QUIK

kalikazandr пишет:
swerg пишет:

Если этот код расположен внутри main() разных скриптов (или в хотя бы один скрипт содержит данную проверку в main()) - то, т.к. все main() разных скриптов выполняются параллельно (грубо говоря одновременно) в разных потоках, здесь уже могут быть коллизии, когда два скрипта одновременно выполнят проверку условия и для обоих скриптов окажется значение переменной одинаковым.

В колбеке скрипт-координатор начинает видеть, что какой-то скрипт организовал с ним связь через StaticVar.
Все последующее общение происходит в main обоих скриптов.
Конечно пока и при действующей конструкции не возникало "коллизий" из-за малой вероятности события, которое может привести к попытке одновременной записи в соответствующее поле StaticVar из разных скриптов.
Наверное, есть смысл сделать два отдельных флага на чтение и запись и 2 соответствующих поля.
Спасибо.

Попросите swerg добавить критические секции в библиотеку. Если ему лень - берите w32 и мьютексы вам в руки.

35

Re: Обмен данными между Lua-скриптами в QUIK

Замечу, что в данном случае (для решения проблемы kalikazandr) нужны критические секции не внутри библиотеки StaticVar (они там как раз есть, но работают ведь только на момент записи/получения значений из контейнеров), а срит. секции, доступные для Lua-скрипта.

И я уже когда-нибудь таки доберусь сделать таковые! мечтается тут с user-дата поработать и сделать этакие красивые классо-подобный интерфейс.
Но руки, как обычно, не доходят. Или стимула нет )

36

Re: Обмен данными между Lua-скриптами в QUIK

swerg пишет:

Замечу, что в данном случае (для решения проблемы kalikazandr) нужны критические секции не внутри библиотеки StaticVar (они там как раз есть, но работают ведь только на момент записи/получения значений из контейнеров), а срит. секции, доступные для Lua-скрипта.

И я уже когда-нибудь таки доберусь сделать таковые! мечтается тут с user-дата поработать и сделать этакие красивые классо-подобный интерфейс.
Но руки, как обычно, не доходят. Или стимула нет )

Спасибо, нет нужды, все работает ровно:
stv.SetVar(1, "купи")
stv.SetVar(-1, "купил")

37

Re: Обмен данными между Lua-скриптами в QUIK

С индикаторами не работает StaticVar
Индикатор отправляет заявку в начале нового бара и через StaticVar отправляет данные о заявке.
Робот в колбеке видит заявку, проверяет StaticVar, забирает данные - все гуд.

Заявка исполняется, робот выставляет заявку на закрытие позиции и 1 раз в интервал(который на графике) проверяет условия:
1. стоп_лосса;
2. изменение таймфрейма на графике(индикатор отправляет новый таймфрейм в StaticVar: stv.SetVar(scode.."int", int))
3. индикатор решил закрыть позицию по сигналу и в StaticVar отправил stv.SetVar(scode, "close")

В итоге дамп: потоком была предпринята попытка прочитать или записать данные на виртуальные адрес, к которому он не имеет соответствующего доступа.
И это, если индикатор на один график добавить, если на 2 и более графиков, то исключение ловится сразу.

Функции GetVar и SetVar не дожидаются пока освободится виртуальный адрес, это не правильно. Надо как-то сделать, чтобы пока одна функция делает запись в ячейку, вторая, вызванная из другого(их) потока(ов) и обращающаяся к той же ячейки вставала в очередь (приостанавливая при этом выполнение скрипта, в котором была вызвана).

38

Re: Обмен данными между Lua-скриптами в QUIK

kalikazandr пишет:

Функции GetVar и SetVar не дожидаются пока освободится виртуальный адрес

Если вы в самом деле сможете объяснить каждое слово в этой фразе - будет здорово. Особенно если вы расскажете как "освобождать виртуальный адрес".

Но это не важно, важно другое: приведите, пожалуйста, конкретный код, приводящий к проблеме, тогда можно будет с ней разобраться и пофиксить.

39 (2015-09-24 15:16:48 отредактировано kalikazandr)

Re: Обмен данными между Lua-скриптами в QUIK

swerg пишет:

... и пофиксить.

выслал архив на почту

40

Re: Обмен данными между Lua-скриптами в QUIK

Вопросы:
1) Вызовет ли исключение GetVar одного скрипта если другой скрипт еще не закончил SetVar ?
2) GetVar будет приостанавливать скрипт если другой не закончил запись?
3) При обращении двух скриптов к GetVar одновременно (из main() ) коллизии возможны?

41

Re: Обмен данными между Lua-скриптами в QUIK

e-rogov пишет:

1) Вызовет ли исключение GetVar одного скрипта если другой скрипт еще не закончил SetVar ?

Нет.

e-rogov пишет:

2) GetVar будет приостанавливать скрипт если другой не закончил запись?

Если один скрипт вызвал GetVar или SetVar, а другой скрипт тоже вызвал GetVar или SetVar, то второй скрипт будет приостановлен до тех пор, пока не закончится работа GetVar или SetVar в первом скрипте.

e-rogov пишет:

3) При обращении двух скриптов к GetVar одновременно (из main() ) коллизии возможны?

Коллизий не будет. Подробнее см. ответ на вопрос 2).

42 (2016-01-12 19:45:42 отредактировано elab)

Re: Обмен данными между Lua-скриптами в QUIK

Возможно ли добавление в эту библиотеку функции
onChangeData(NameSpace, var_name)
или
onChangeData(NameSpace, var_list)

43

Re: Обмен данными между Lua-скриптами в QUIK

swerg,

luaopen_staticvar возвращает boolean

Как-то это некомфортно - по сложившейся традиции внешние lua библиотеки возвращают сам объект...

44

Re: Обмен данными между Lua-скриптами в QUIK

elab пишет:

Возможно ли добавление в эту библиотеку функции
onChangeData(NameSpace, var_name)
или
onChangeData(NameSpace, var_list)

В смысле чтобы уведомить другой скрипт о том, что значение изменилось?
Я давно думаю о такой возможности (фактически - вызов из одного скрипта функции в другом выходит, но пока не придумал механизма.
Если речь про другое - просьба уточнить.

45

Re: Обмен данными между Lua-скриптами в QUIK

Прочитал на форуме quik (жаль, что здесь человек постеснялся написать) по сути претензию о том, что данная библиотека умеет только копировать данные в себя или из себя, при этом не позволяя сделать такое хранилище, чтобы к нему непосредственно шло обращение без необходимости копирования данных.
Замечание вполне справедливое.
В самом деле, надо лишь изменить взгляд на интерфейс библиотеки. Я думаю, что дано реализовать что-то вроде такого:

// получим ссылку на таблицу в глобальном хранилище (фактически мета-таблица будет, конечно)
table1 = stv.GetTableRef("table1")
// а далее работаем с ней как с обычной таблицей
table1["price"] = 8.7
table1["qty"] = 9
if table.tradenum = nil then
...
    table1.tradenum = GetTradeNum()
...
// аналогично и в других скриптах берём ссылку на ту же глоб. таблицу
table = stv.GetTableRef("table1")
table.tradenum = .. // записали номер сделки для этого скрипта, которым требуется поделиться
...

Какие будут мысли/предложения?

46 (2017-05-07 10:51:29 отредактировано s_mike)

Re: Обмен данными между Lua-скриптами в QUIK

Ничего придумывать не надо, все уже есть у вас в руках.

t = setmetatable({}, {

__index = function(tbl,k)

return GetNessesaryValueFromSTV(k)

end


} )


А функция getnessasatyvaluefromsfv просто получает нужные данные из библиотеки.

При этом данные в библиотеке надо хранить в виде простых типов, а не составных

Получение данных со стороны скрипта выглядит обычным способом адресации к полю таблицы  t

47

Re: Обмен данными между Lua-скриптами в QUIK

Здравствуйте, swerg.

Очень нужная библиотека, использую ее для вывода данных из разных скриптов в одну таблицу рабочего места Quik, в lua это, к сожалению, невозможно. По поводу обращения без необходимости копирования данных и уведомления другого скрипта об изменении значения - это как раз, то, что нужно для моего примера, было бы здорово, если бы такая возможность была реализована.

48

Re: Обмен данными между Lua-скриптами в QUIK

nero333 пишет:

Здравствуйте, swerg.

Очень нужная библиотека, использую ее для вывода данных из разных скриптов в одну таблицу рабочего места Quik, в lua это, к сожалению, невозможно. По поводу обращения без необходимости копирования данных и уведомления другого скрипта об изменении значения - это как раз, то, что нужно для моего примера, было бы здорово, если бы такая возможность была реализована.

Добрый день!

А можно увидеть какой-то более развёрнутый пример того, как используете вы, и что именно надо бы сделать? как вам это видится (с точки зрения синтаксиса Lua скрипта)?

49 (2017-08-25 15:27:56 отредактировано nero333)

Re: Обмен данными между Lua-скриптами в QUIK

Например, хотим сделать сообщение из какого-то скрипта в общую таблицу сообщений:
robot.lua (в общем случае будет несколько скриптов-роботов, которые пишут сообщения в таблицу)

require('StaticVar')

-- функция выводит сообщение в таблицу - добавляет переменную в пространство имен RobotMessages
function robotMessage(key, str)
    stv.UseNameSpace('RobotMessages')
    if str == nil then stv.SetVar(key, nil); -- удаляем из таблицы сообщение
    else stv.SetVar(key, str);
    end
end

function main()
    while IS_RUN do
        stv.UseNameSpace('RobotMessages')
        if ... then robotMessage('YNDX', 'ошибка работа') end -- что-то произошло - выводим сообщение в таблицу
        sleep(1000)
    end;
end

А это отдельный скрипт, который перерисовывает таблицу через какой-то отрезок времени (здесь через секунду):
messages_table.lua

require('StaticVar')

function main()

    while IS_RUN do
        stv.UseNameSpace('RobotMessages')
        
        local id = getRobotMessagesTableId() -- эта функция русует таблицу и возвращает ее id, из-за громозкости не привожу ее
        local arr = stv.GetVarList()
        local keys = {}; for key,val in pairs(arr) do if val then table.insert(keys, key) end end; -- собираем ключи с непустыми значениями
        table.sort(keys);

        --
        local nRows, nColumns = GetTableSize(id)        
        --
        for i=1,#keys do
            if i > nRows then InsertRow(id, -1); end
            SetCell(id, i, 1, keys[i]) -- выводим ключ сообщения в 1-м столбце
            SetCell(id, i, 2, arr[keys[i]][1]) -- выводим текст сообщение во 2-м столбце
        end
        for i=#keys+1,nRows do DeleteRow(id, i) end -- удаляем лишние строки
        
        sleep(1000)
    end;
end

У меня сообщений мало оказалось, поэтому, в общем, доработки не требуются, но если будет большой объем данных, могут быть тормоза. По поводу уведомлений - логично оповещать скрипт о появлении сообщения (то есть о добавлении/изменении переменной в пространстве имен RobotMessages), а не заставлять его запрашивать данные каждую итерацию, как в примере выше.