Вопрос-ответ

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 5, среднее: 5,00 из 5)
Загрузка...
LogoNew
Если Ваш вопрос не имеет отношения к какой-то определенной статье на данном сайте, то, пожалуйста, задавайте его в комментариях здесь.

Добавить комментарий

Вопрос-ответ: 1 896 комментариев

  1. Здравствуйте.
    Как правильно обрабатывать Таблицу Обезличенных Сделок?
    Пишу индикатор. Задача стоит такая. Прочитать Таблицу Обезличенных Сделок, собрать сделки на покупку и на продажу и вывести на график. Все реализовал, но имеется одна проблема.
    Когда индикатор выводит сумму объема на покупку и на продажу, то это число отстает от объема бара.
    В индикаторе используется функция OnCalculate(index) то есть, как только изменяется бар на грфике вызывается функция. Читает строки Таблицы Обезличенных Сделок, считает объем на покупку и на продажу, суммирует и выводит на график.
    Как я понял Таблица Обезличенных Сделок не успевает обновиться. То есть сначала изменяется бар, потом вызывается функция OnCalculate(index), а потом в Таблицу Обезличенных Сделок записывается новая сделка. В итоге последняя строка не попадает в вычисления индикатора
    Когда приходит новая сделка, бар изменяется, вызывается OnCalculate(index) индикатор теперь вычисляет ту не попавшую строку, потом в Таблицу Обезличенных Сделок записывается сделка которая привела к изменению бара, но эта сделка снова не попадает в индикатор.
    В итоге последняя сделка не участвует в расчетах.
    Может как то по другому нужно обрабатывать Таблицу Обезличенных Сделок?

      1. Такой вариант конечно я посмотрю. Хотя и не хочется отдельный скрипт держать запущенным.
        Как я понял функции обратного вызова в скриптах выполняются в потоке в котором работает Квик, а не в отдельном. Значит последовательность так же будет иметь значение. Может быть придет сделка, потом запишется в Таблицу Обезличенных Сделок, потом будет вызвана функция в скрипте, далее изменится бар на графике и будет вызвана OnCalculate. тогда все хорошо. А возможно последовательность будет и такой: придет сделка, изменится бар, будет вызвана OnCalculate а потом вызвана функция в скрипте и далее записывается сделка в Таблицу Обезличенных Сделок. В этом случае и читать из файла нет смысла. Но это надо будет на практике проверить и уже убедиться в какой последовательности работает.
        Ну и конечно по времени может возникнуть задержка. Время записи на HDD и время чтения с HDD каждой сделки может подтормаживать, но можно писать в файл на SSD в принципе.
        Но это ладно, я все протестирую.
        Спасибо за ответ. Я больше думал что может я как то не правильно мыслю и обрабатываю Обезличенные Сделки и есть иной способ, а я его не знаю.

      2. Проверил последовательность выполнение функций в индикаторе и скрипте. Получается что отдельным скриптом писать сделки в файл так же не решает проблему.
        Написал индикатор который пишет сделки в файл из Таблицы Обезличенных Сделок.
        Написал скрипт который пишет сделки в файл в функции обратного вызова OnAllTrade.
        Добавил время и задержку, что бы определить последовательность записи.
        Результаты получились такие.
        Сначала изменяется Бар, вызывается функция OnCalculate в индикаторе, из Таблицы Обезличенных сделок не удается получить сделку которая изменила бар, ее там нет. Потом вызывается функция OnAllTrade в скрипте со сделкой которая и изменила бар.
        Получается что даже если написать скрипт который будет писать сделки в файл используя функцию OnAllTrade, то когда изменится бар, сделки еще нет ни в Таблице Обезличенных Сделок ни в файле. Так что задержка останется.
        Днем конечно отставания практически не заметно, потому что сделки идут часто, а вот вечером хорошо видно. Объем бара один, а на индикаторе меньше, как раз на количество в последней сделке

        1. можно просто запоминать в индикаторе предыдущий объем и сравнивать с новым, можно будет понять таким образом по какой цене была сделка и какого объема, только направление будет неизвестно.

    1. Здравствуйте! Потому что у него вся работа идет в функциях обратного вызова (коллбеках), которые начинаются на On..., а в main цикл while просто поддерживает работу робота, т.к. робот работает, пока работает функция main.

        1. Можно в каждой функции обратного вызова записывать имя функции в которой в данный момент идет выполнение и значение os.clock() в файл. Потом посмотреть файл, там будет что то типа
          Имя функции - 1.005
          Имя функции - 1.014
          Имя функции - 1.051
          Имя функции - 1.083
          ...
          Так и определить последовательность

  2. Добрый день! Несколько дней как изучаю материалы сайта и все время не могу понять одного не особо заметного, но очень важного момента, а именно - почему вы пишите робота на C# а конектор на C++ если можно обойтись C++ без посредников ? Работа со скриптом Lua, а следовательно и всем терминалом через Классическое приложение Windows на C++ гораздо удобнее чем на C#, но с промежуточным звеном. Не говоря уже о том что DLL посредник увеличивает задержку и нагружает память. Конечно если требуется сложный интерфейс на WPF то это оправдано но в остальных случаях использование DLL конектора представляется сомнительным решением. Буду признателен если мне пояснят в чем я прав, в чем ошибаюсь. Спасибо!

      1. За Qlua не скажу точно, но в C++ приложении можно спокойно отправлять параметры, принимать ответ, вызывать функции прописанные в Lua скрипте. Например по этому мануалу : http://www.troubleshooters.com/codecorn/lua/lua_c_calls_lua.htm ... Arguments and Return Value. Конечно возможно я чего то не знаю или что то упустил.

          1. Видимо вы правы, никто бы не стал все усложнять а я просто недопонимаю какого то важного момента. Например из статьи :
            https://quikluacsharp.ru/qlua-c-cpp-csharp/obmen-dannymi-mezhdu-dll-c-c-i-prilozheniem-c/
            совсем непонятно - а как Lua передаст данные в DLL, что бы потом DLL передал их С# ?
            Ведь сами методы `forLua_StartSendHi` и `forLua_StopSendHi` в качестве параметров принимают указатели на lua_State. Или Lua должен не только вызвать команду в DLL но и отправить данные в стек, из которого Dll их и отправит в # ?

            1. В Lua все хранится в стеке, т.е. все переменные и функции. При вызове из Lua любой функции подключенной dll этот стек передается в нее автоматически, по этому, имея к нему доступ внутри dll функции, мы можем обратиться к любой переменной, или функции Lua.

              1. - '''При вызове из Lua любой функции подключенной dll этот стек передается в нее автоматически'''
                ок, стек передался автоматически - как DLL узнает какой именно элемент стека нужно найти и передать в # ?
                На сайте есть пример работы с Lua стеком из подключенной DLL?