1

Тема: Структура робота.

Доброго времени суток всем. В QLua пару недель только. Есть небольшой опыт в программировании на другом ЯП.
И отсюда вылазят некоторые проблемы.

А именно структура самого файла и соответственно работа самого скрипта.

Не получается понять что и где должно быть.
Как я вижу сейчас.
Поправьте меня если я не прав.

--========>  Н А Ч А Л О
is_Run = true

--========> П Е Р Е М Е Н Н Ы Е 



-- *****************************************************************
        ---------->> Т Е Л О   С К Р И П Т А  <<---------
function main()
    while is_Run == true do
        buy()
        sell()
        calculate()
    end
end
-- * * * * * * * * * * С A L L B A C K'и * * * * * * * * * * * 



 
function OnStop()    --
is_Run = false        --
end                    --
----------------------

---------->> Ф У Н К Ц И И <<========
function buy()
end 

function sell()
end

function calculate()
end

2

Re: Структура робота.

musin,
Приветствую вас на форуме!

Я бы рекомендовал начать понимание как оно все устроено вот с этой темы на форуме: [url=https://quik2dde.ru/viewtopic.php?id=16]Основы программирования на QLua[/url].

Что до общей структуры вашего скрипта - то да, вполне подходяще. Если вы не собираетесь супер-оперативно реагировать на события (сделки, движения стакана). (Хотя, конечно, в рамках QLua термин "супер быстро" относительно условный).
Желательно еще добавить например после calculate() вызов

sleep(1)

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

3 (2022-04-19 13:36:15 отредактировано musin)

Re: Структура робота.

swerg
Это все я понимаю. Я просто удалил лишние строки , чтоб поменьше текста было.
Я накидал общий шаблон.
Я не могу понять в каком потоке и как работают callbak'и.
Тот же пример , что я писал выше , если я ставлю sleep , то почему то сначала отрабатывает sleep и только потом идет скрипт дальше.


main()
    while is_Run == true do
        buy()
        sell()
        calculate()
        sleep(10000)   --<<<<
    end
end

Даже почти разобрался с флагами. Допустим мне нужен флаг что сделка исполнена. (0x2)
Почему не запускается такое условие

main()
    flag ==55
    sell() --- Функция продажи. Проверенно.
    while flag ~= 0x2 do 
      sleep(50)
    end
end 

--- здесь calback OnOrder(order) работы с флагом
OnOrder(order)

вот в чем вопрос. В организации порядка функций. Может я что то неправильно понял из всех инструкций.

4

Re: Структура робота.

musin пишет:

Я не могу понять в каком потоке и как работают callbak'и.

В основном потоке терминала.
main() - в другом потоке.
Т.е. код callbak'ов выполняется строго последовательно, в смысле только когда один заканчивается - начинает работать какой-то другой, а вот код из main() работает одновременно и параллельно со всем этим, это следует учитывать.

musin пишет:

если я ставлю sleep, то почему то сначала отрабатывает sleep и только потом идет скрипт дальше.

Так sleep() это и есть "приостановить работу программы на указанное время в миллисекундах".
Другое дело, что если вы его применяете внутри main(), то сам терминал работает как и раньше (т.к. он рабтает в своём основном потоке), а main() на время выполнения sleep останавливается. Для этого sleep и нужен.

musin пишет:

Даже почти разобрался с флагами. Допустим мне нужен флаг что сделка исполнена. (0x2)
Почему не запускается такое условие

main()
    flag ==55
    sell() --- Функция продажи. Проверенно.
    while flag ~= 0x2 do 
      sleep(50)
    end
end 

Потому что 0x2 это не значение flag на заявке, это "битовая маска". Тут стоит почитать про двоичную систему счисления, биты, битовые операции.

Т.е. ваше условие, если я его верно понял, следует написать так:

    while (flag & 0x2) == 0  do 
      sleep(50)
    end

5

Re: Структура робота.

musin пишет:

Это все я понимаю. Я просто удалил лишние строки , чтоб поменьше текста было.
...

вот в чем вопрос. В организации порядка функций. Может я что то неправильно понял из всех инструкций.

Привет! На сколько мне известно, лишних строк в примерах не работающих скриптов не бывает, чаще их не хватает.
После оправки транзакции, флага не существует, его можно получить:
1. в потоке квика в OnTransReply, OnOrder и т.д.;
2. просматривать таблицу заявок в потока main на предмет появления новой записи (и в последующем ее изменении, если заявка исполнилась при выставлении, то изменений больше не будет).
Оба варианта требуют ожидания ответа от биржи на транзакцию.

6

Re: Структура робота.

musin,
получилось разобраться?