26 (2015-11-19 21:54:04 отредактировано GREEN_X5)

Re: Исследование порядка вызовов Callback-функций в QLua

swerg пишет:

Позвольте я отвечу.
Да, это всё, что добавлено для стабильности.

Спасибо за ответ!

А что, в самом деле так много стабильнее?

Ну т.е. вообще нет проблем. Абсолютно! Если не косячить с кодом. )
Сегодня вот вновь пришлось выбирать между перевернутыми треугольниками и нормальной выгрузкой. )) Не могли бы Вы добавить это в свои исходники? Сам боюсь накосячить, с Делфи пока не знаком вообще. Как и с товарищем Паскалем. )

27

Re: Исследование порядка вызовов Callback-функций в QLua

Ну вот, не пошло у меня что-то... Не в тот файл строчку дописал?

http://i.imgur.com/i7HXnXG.png

28 (2016-09-29 11:40:11 отредактировано sam063rus)

Re: Исследование порядка вызовов Callback-функций в QLua

-

29

Re: Исследование порядка вызовов Callback-функций в QLua

Всё, разобрался, был невнимателен, не включил

uses
  Windows,

Собрал библиотечку, доволен как слон )

30 (2016-09-29 11:40:02 отредактировано sam063rus)

Re: Исследование порядка вызовов Callback-функций в QLua

-

31

Re: Исследование порядка вызовов Callback-функций в QLua

GREEN_X5 пишет:

Если не косячить с кодом. )

Вы имеете ввиду работу с контролами исключительно из колбэков?

32 (2015-11-23 15:09:18 отредактировано GREEN_X5)

Re: Исследование порядка вызовов Callback-функций в QLua

CyberTrader пишет:
GREEN_X5 пишет:

Если не косячить с кодом. )

Вы имеете ввиду работу с контролами исключительно из колбэков?

Да ну, нет. Обращаться к библиотеке можно откуда угодно с этого потока. С main нельзя.
vcl очень нежная по обращению, валится вместе с терминалом, но только если допустить явную (но к сожалению нигде не документированную) ошибку. Например контролу Name послать имя с пробелом, отсылать к необъявленному обработчику и т.д.
Нет ошибок - библиотека суперстабильна. Уже много кодов на ней трудится больше года без проблем.

33 (2015-11-23 15:00:07 отредактировано GREEN_X5)

Re: Исследование порядка вызовов Callback-функций в QLua

Если некоторые значения для контролов задаются в main, то лучше везде перестраховаться, например так

function ()
Edit.Text = x or ""
if Edit.Text=="" return false else return true end
end

Ну и понятное дело из main к этой функции всё равно обращаться нельзя.
Периодичные несобытийные расчеты вместо main можно перенести в таймер из библиотеки.

34 (2015-11-23 15:55:55 отредактировано CyberTrader)

Re: Исследование порядка вызовов Callback-функций в QLua

GREEN_X5 пишет:

vcl очень нежная по обращению, валится вместо с терминалом, но только если допустить явную (но к сожалению нигде не документированную) ошибку.

C ошибками-то понятно. Вопрос именно по правильному с точки зрения Lua коду. Т.е., когда скрипт рабочий, но ведёт себя нестабильно время от времени.

GREEN_X5 пишет:

Да ну, нет. Обращаться к библиотеке можно откуда угодно с этого потока. С main нельзя.

У нас в основном потоке работа идёт только в колбэках (если не считать первичной инициализации).

Вот сейчас ломаю голову над следующим алгоритмом.
В QUIK v7 изменилась работа со сделками: теперь на одну сделку приходят три колбэка. А задачка: при старте скрипта считываем текущую позицию и после каждой сделки рассчитываем самостоятельно размер позиции и выводим на контрол:

function OnTrade(trade)
  if trades[trade.trade_num] then return end  -- Уже обрабатывали
  table.sinsert(ontrades, trade)  -- Добавим в очередь
end

function OnTradeDo(trade)
  local trade_num = trade.trade_num
  if trades[trade_num] then return true end  -- Уже обрабатывали
  if <условие> then
    return false  -- Если нужных данных в терминале ещё нет, то идём на штрафной круг
  end
  trades[trade_num] = true  -- Добавляем сделку в таблицу обработанных сделок
  -- ...
  TotalNet = TotalNet + qty
  -- Чё-то делаем в зависимости от текущей позиции

  P.Caption = TotalNet  -- Выводим на контрол
  -- Здесь скрипт часто падает

  return true
end

function main()
  while run do
      if #ontrades > 0 then
        if OnTradeDo(ontrades[1]) ~= false then
          -- Если сделка обработана, удаляем её из очереди
          table.sremove(ontrades, 1)
        end
      else sleep(2) end
  end
end

Как бы изменить так алгоритм, чтобы скрипт не падал? В какой колбэк можно запихать вывод на контрол?

35

Re: Исследование порядка вызовов Callback-функций в QLua

GREEN_X5 пишет:

Периодичные несобытийные расчеты вместо main можно перенести в таймер из библиотеки.

Чё за таймер? Как использовать?

36 (2015-11-23 16:26:42 отредактировано GREEN_X5)

Re: Исследование порядка вызовов Callback-функций в QLua

CyberTrader пишет:

C ошибками-то понятно. Вопрос именно по правильному с точки зрения Lua коду. Т.е., когда скрипт рабочий, но ведёт себя нестабильно время от времени.
У нас в основном потоке, работа идёт только в колбэках (если не считать первичной инициализации).

Ну библиотеке то до лампы что там в остальном lua коде, ей важно чтобы с её контролами нежно обращались. ) Если переменная с корректным значением приготовлена, и во время отправки на контрол не дергается из соседнего потока (main), особенно при отправке таблиц, то всё всегда гладко. Если код валится не в этих случаях, наверное стоит проверить lua код в отрыве от vcl, например закрыть все выводы в библиотеку, открыть взамен в message или дебагер и там ловить...

Насчет трех колбеков, тоже столкнулся с этой хренью, делаю так:
1. отправляю транзакцию, сразу получаю ответ в переменную

res = sendTransaction(transact)

res парсю на наличие серверного номера заявки
2. тут же добавляю серверный номер заявки в массив (таблицу) ордеров
3. В  onTrade() из каждого колбэка достаю номер ордера и проверяю его наличие в своём массиве ордеров, если есть, и пришел флаг "исполнено", исключаю эту запись из массива. Таким образом остальные повторы фильтруются.

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

37 (2015-11-23 16:11:05 отредактировано GREEN_X5)

Re: Исследование порядка вызовов Callback-функций в QLua

В Вашем коде вижу дообработку результатов транзакций в main,

CyberTrader пишет:
function main()
  while run do
      if #ontrades > 0 then
        if OnTradeDo(ontrades[1]) ~= false then
          -- Если сделка обработана, удаляем её из очереди
          table.sremove(ontrades, 1)
        end
      else sleep(2) end
  end
end

я бы убрал это всё в колбэк OnTrade, не так уж это всё ресурсоёмко, чтобы вешать на параллельный поток. А межпоточные риски появляются.
Советую всё это делать в OnTrade.

38 (2015-11-23 16:30:52 отредактировано CyberTrader)

Re: Исследование порядка вызовов Callback-функций в QLua

В main идёт анализ

if OnTradeDo(ontrades[1]) ~= false then

была ли обработана сделка функцией OnTradeDo

if <условие> then
    return false  -- Если нужных данных в терминале ещё нет, то идём на штрафной круг
end

Если не была, то идём на следующий круг с этой сделкой, пока не обработаем её.
Т.к. информация в терминал поступает не синхронно, то возможна ситуация, когда не получена вся необходимая информация из других колбэков для анализа сделки.

39

Re: Исследование порядка вызовов Callback-функций в QLua

CyberTrader пишет:
GREEN_X5 пишет:

Периодичные несобытийные расчеты вместо main можно перенести в таймер из библиотеки.

Чё за таймер? Как использовать?

function Timer()
-- периодическая работа
end

tmr    = vcl.Timer(Form,{Interval=1000, Enabled="True", OnTimer=Timer})  --Interval в милисекундах

40

Re: Исследование порядка вызовов Callback-функций в QLua

GREEN_X5,
спасибо, уже добавил. Погоняю, посмотрю.

41 (2015-11-23 16:42:20 отредактировано GREEN_X5)

Re: Исследование порядка вызовов Callback-функций в QLua

CyberTrader пишет:

В main идёт анализ

if OnTradeDo(ontrades[1]) ~= false then

была ли обработана сделка функцией OnTradeDo

if <условие> then
    return false  -- Если нужных данных в терминале ещё нет, то идём на штрафной круг
end

Если не была, то идём на следующий круг с этой сделкой, пока не обработаем её.
Т.к. информация в терминал поступает не синхронно, то возможна ситуация, когда не получена вся необходимая информация из других колбэков для анализа сделки.

Про несинхронность в курсе, поэтому, как уже писал выше, я использую после транзакции только один колбэк - OnTrade. Там всё и обрабатываю. Только событийность, никаких "кругов".
Для встречи сделок уже упакованы данные о транзакции ещё на этапе её отправки из

res = sendTransaction(transact)

Пока упаковка не завершится, никакой колбэк в код не придет, это ж все в одном потоке.

42

Re: Исследование порядка вызовов Callback-функций в QLua

GREEN_X5 пишет:

1. отправляю транзакцию, сразу получаю ответ в переменную

res = sendTransaction(transact)

res парсю на наличие серверного номера заявки

sendTransaction ведь не даёт номер заявки. При успешной отправке транзакции в sendTransaction будет пустая строка.

43

Re: Исследование порядка вызовов Callback-функций в QLua

CyberTrader пишет:
GREEN_X5 пишет:

1. отправляю транзакцию, сразу получаю ответ в переменную

res = sendTransaction(transact)

res парсю на наличие серверного номера заявки

sendTransaction ведь не даёт номер заявки. При успешной отправке транзакции в sendTransaction будет пустая строка.

Посмотрел, да, действительно, номер ловлю в OnTransReply()

44

Re: Исследование порядка вызовов Callback-функций в QLua

GREEN_X5 пишет:

Посмотрел, да, действительно, номер ловлю в OnTransReply()

smile  А вы не думали, как поведёт себя ваш робот, если OnTrade получит раньше, чем OnTransReply? Или в OnTransReply не будет номера заявки (на форуме QUIK, вроде, такая информация проскакивала)?

45

Re: Исследование порядка вызовов Callback-функций в QLua

CyberTrader пишет:
GREEN_X5 пишет:

Посмотрел, да, действительно, номер ловлю в OnTransReply()

smile  А вы не думали, как поведёт себя ваш робот, если OnTrade получит раньше, чем OnTransReply? Или в OnTransReply не будет номера заявки (на форуме QUIK, вроде, такая информация проскакивала)?

После всех подобных ситуаций боты останавливаются и переходят в emergensy секцию, звучит сигнал, привлекающий внимание.

46

Re: Исследование порядка вызовов Callback-функций в QLua

Может ли скрипт падать из-за того, что для контролов не указывается параметр Name?

47

Re: Исследование порядка вызовов Callback-функций в QLua

CyberTrader пишет:

Может ли скрипт падать из-за того, что для контролов не указывается параметр Name?

Нет, в этом случае самогенерируются уникальные имена. Запустите несколько раз:

vcl = require "qvcl"
Form=vcl.Form({})
message(Form.Name)
Form:Release()

48

Re: Исследование порядка вызовов Callback-функций в QLua

GREEN_X5 пишет:

Нет, в этом случае самогенерируются уникальные имена.

Уточню, это "ноу-хау" 5-й версии vcl
В 3.х версии имена обязательно требовалось задавать.

49

Re: Исследование порядка вызовов Callback-функций в QLua

Как я не пытался "оптимизировать" код под vcl результаты такие:

1) Оригинальная vclua v.0.3.5 ведёт себя крайне нестабильно: падает в любое время и в любом месте.
Смотрел скрипты других авторов: хоть QUIK и не крашит, но бывают зависания.

2) qvcl v.0.5.0 rev.2 при многократных запусках часто падает. Решение не сильно помогает: падения происходят на mainForm:Show(), особенно если выдержать паузу между запусками скрипта.

mbul пишет:

Можно предусмотреть в VCLua какой-нибудь финализатор?

Может, действительно предусмотреть какую-то финализирующую функцию vcl:Close(), которая передавала бы управление другому оператору, только когда все действия с окнами vcl завершены?

3) "Хакнутая" qvcl от Михаила работает более-менее стабильно. Падает иногда при работе с DateEdit.

50

Re: Исследование порядка вызовов Callback-функций в QLua

CyberTrader пишет:

2) qvcl v.0.5.0 rev.2 при многократных запусках часто падает.

Неправильное обращение с библиотекой. У меня всё стабильно на куче скриптов. Win7 64