Проверка выставления заявки по отправленной транзакции QLua(Lua)

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 3, среднее: 5,00 из 5)
Загрузка...

Блоки кода

Блок кода QLua

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

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

Проверка выставления заявки по отправленной транзакции QLua(Lua): 32 комментария

  1. Доброго времени суток.
    Не могли бы вы подсказать, где можно найти перечисление возможных значений, таких параметров транзакции как ACTION и TYPE?

    1. Здравствуйте! Файл справки (находится в папке с терминалом квик) info.chm: "Раздел 6. Совместная работа с другими приложениями" - "Импорт транзакций" - "Формат .tri-файла с параметрами транзакций" и "Примеры строк, которые могут содержаться в файле"

  2. Приветствую Вас!
    А так ли необходима функция OnTransReply()? Не достаточно ли того что написано тут :

    local Res = sendTransaction(Transaction)
      if Res ~= '' then message('TransOpenPos(): Ошибка отправки транзакции: '..Res) else message('TransOpenPos(): Транзакция отправлена') end
    end
    Отправлена транзакция и хорошо. Дальше проверяем наличие чистой позиции по бумагам если сделка была совершена. Там и номер и время и кол-во бумаг смотрим.
    Может я чего-то не понимаю, разъясните! 🙂 
    ps: просто измучился я уже с этой функцией )))
    1. Здравствуйте!
      Смысл в том, что в Res появится ошибка только если сам терминал ее обнаружит, еще до отправки на сервер брокера. И если биржа отклонит данную транзакцию по какой-то причине, то мы об этом сможем только догадываться, ожидая результата. OnTransReply() решает эту проблему.

  3. Вот так ловчее, по моему:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    local OldTransReply = {}
    function OnTransReply(trans_reply)
    	local t_id = trans_reply.trans_id
    	if not OldTransReply[t_id] then -- транзакция не обработана
    		-- Если пришла информация по нашей транзакции
    		if t_id == trans_id then
    			local status = trans_reply.status
    			--Выводит в сообщении статусы выполнения транзакции
    			if status == 3 then -- транзакция выполнена
    				message('OnTransReply(): По транзакции №'..t_id..'\nУСПЕШНО ВЫСТАВЛЕНА заявка №'..trans_reply.order_num..'\nпо цене: '..trans_reply.price..' объемом '..trans_reply.quantity)
    				OldTransReply[t_id] = true -- больше по этой заявке не будут обрабатываться колбеки, даже после дисконекта
    			elseif status > 3 then -- произошла ошибка
    				message('OnTransReply(): ОШИБКА выставления заявки по транзакции №'..t_id..', текст ошибки: '..trans_reply.result_msg)
    				OldTransReply[t_id] = true -- больше по этой заявке не будут обрабатываться колбеки, даже после дисконекта
    			end
    		end
    	end
    end

    а вообще, на мой взгляд, OnTransReply нужна только для получения ошибки, обработки этой ошибки и коррекции заявки для повторного выставления, если ошибки нет, то и нечего в ней (функции) делать.

      1. Все переменные хранятся в таблицах lua, таблица с локальными переменными меньше, чем с глобальными (ровно такого размера, сколько вы объявили локальных переменных у себя в коде) и доступ к ним быстрее. Главное с областью видимости не перепутать.
        Т.е.:

        1
        
        local а = math.floor(10/3)

        При частом использовании будет работать медленнее, чем:

        1
        2
        
        local math_floor = math.floor--в начале кода взяли все функции из глобальных таблиц
        local a = math_floor(10/3)
        1. Спасибо.
          Т.е. раз интерпретатор, то и доступ к переменным не прямой, а последовательный, следовательно чем переменных больше, тем медленней выборка адреса для операции (производится поиск адреса по имени переменной в таблице переменных)?
          Скажем компилятор "С" вместо "math.floor(10/3)" влепит сразу адрес функции и загонит параметры с стек, а "перевалка" адреса функции в переменную может и удлинить бег кода.
          Но кажется где-то читал, что lua таки делает какую-то предкомпиляцию перед выполнением...

      1. Локальная переменная по своей сути локальна и храниться в таблице локальных переменных, вопрос где она объявлена, если в начале кода, то доступ к ней есть у всего кода, если внутри кода, то блоки написанные выше переменной ее не будут видеть, если внутри блока - то забывается сразу после выхода из блока (удаляется из таблицы локальных переменных).
        Глобальная переменная видна везде, т.к. заноситься в таблицу глобальных переменных на этапе компиляции.

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        
        --глобальная переменная  "a":
        do a=10 end
        print (a)-->10
        --локальная переменная "a":
        do local a=10 end
        print (a)-->nil - не видна
        local a --объявляем до блока
        do 
        local x=10
        a=x
        end
        print (x)-->nil
        print(a)-->10

        Разница понятна между локальной и глобальной переменной?

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

          1. Да, с локальными переменными, а тем более локальными функциями надо быть оч. внимательным.
            Если функция объявлена локально и должна быть видна во всем коде, то пишем ее в начале кода.
            Если эта локальная функция хочет использовать внешние локальные переменные, то эти переменные надо поместить выше этой функции.
            Все просто.

      1. Веселый вы человек, Дмитрий))
        OnTransReply(trans_reply) - не гарантирует, что можно уже выставлять заявку обратного направления, например - купил, и после получения ответа от биржи, что заявка исполнена - нельзя сразу выставить заявку на продажу. Соответственно, сама по себе функция OnTransReply() является чисто информативной и не белее

              1. Да дело не в этом, я посмотрел практически все ваши примеры, и многие рады и этому, но - это не правильно - значит вы намеренно вгоняете не опытных программистов в блуд, что само по себе - не хорошо)).

                1. Намеренно я точно никого никуда не вгоняю 🙂 Давайте конструктивную критику, с удовольствием внесу правки в статьи, я нигде не заявлял, что я отец-основатель терминала QUIK и что знаю все его потайные комнаты 🙂
                  На почту пишите сами, когда Вам будет удобно, с удовольствием пообщаюсь с Вами, если по делу.

                  1. Я так думаю каждый решает сам. Я пытаюсь проверять без OnTransReply(). Если здесь ошибки нет, то есть терминал не ругнулся

                    1
                    2
                    
                     local Res = sendTransaction(Transaction)
                      if Res ~= '' then message('TransOpenPos(): Ошибка отправки транзакции: '..Res) else message('TransOpenPos(): Транзакция отправлена') end

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

                  2. Я тоже считаю сделку совершённой только тогда, когда она появилась в OnTrade(), но все предыдущие шаги тоже отслеживаю (OnTransReply(), OnStopOrder(), OnOrder()), чтобы отлавливать возможные ошибки. Но как и написано в данной статье, для того, чтобы понять выставлена ли заявка (не сделка) по транзакции, достаточно OnTransReply().

                  1. Здравствуйте я новичек не подскажите где копать , взял простой скрипт на QLua попытался запустить на демку в квик выдает ошибку в окне (Ошибка TransOpt: Не найдено поле ,, Проверять лимиты ,, для транзакции ,, Ввод заявки ,, по классу ,,Опционы FORTS ,,
                    ) смотреть в коде скрипта или в квике ? хотя бы подсказку .
                    С ув.Андрей

                    1. Здравствуйте! В скрипте создается структура (массив) транзакции для отправки на сервер брокера, в ней должно быть поле проверки лимитов, а его там у Вас нет, потому квик и ругается перед отправкой. О том, какие поля и значения должны быть в транзакции читайте в файле справки info.chm (находится в папке с терминалом) в разделе "Совместная работа с другими приложениями" , подразделы: "Формат .tri-файла с параметрами транзакций", "Примеры строк, которые могут содержаться в файле"