Nikolay (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 14 След.
SetUpdateCallback - не срабатывает после первого запуска скрипта
 
Цитата
Kolossi написал:
Пардон, очепятка

while not ds or ds:Size()==0 do
sleep(50)
end

Ну еще счетчик циклов для повторной попытки загрузки
Не лучшее решение, оно блокирует исполнение кода. Запросы где время ответа неизвестно, лучше решать через очереди задач ожидания. Потоков в lua нет, но, как минимум, не блокировать весь код. Если, например, скрипт обрабатывает много инструментов и потоков данных, то ждать после каждого заказа - много времени пройдет пока до последнего дойдет. Или надо что-то другое постоянно контролировать, пока по другому инструменту заказ сделали. То что долго идет ответ - это не повод для уже работающих инструментов ждать.
как в луа брать данные из excel?
 
Вычисления лучше в скрипте и произвести. И быстрее будет. Ексель нужен только когда это надо визуализировать, больше ни для чего он не нужен.
Я не очень понимаю это странное "учеба на YouTube". В книге от автора языка все написано очень просто и понятно. Да и примеров очень много как прочитать файл, если просто поискать.
А вот чтение xls - это уже использование сторонней библиотеки luaCOM. С учетом древности технологии COM, не думаю что будет много информации.
как в луа брать данные из excel?
 
Библиотека luaCom поможет открыть COM объект и прочитать файл. Но я не очень понимаю  зачем использовать тяжелый формат xls, а не перейти на простой текст с расширением csv, который читается очень просто, да и Excel открывает его как простую таблицу.
Как заполняется размер таблицы исторических свечей ?
 
Я использую метод "догнать время последней сделки". Заказываем все сделки, далее ожидаем когда время из таблицы обезличенных сделок (или если угодно тика) равно времени последней сделки из ТТТ. Ждать надо, т.к. от заказа до прихода "последней" не одна минута может пройти. Также при восстановлении связи после обрыва тоже надо подождать. Ожидание точно не стоит делать блокирующим.
CreateDataSource("TQBR", "VTBR", 1), Получаю ошибку: TQBR - unknown class code.
 
1 и работает. В примере же, совсем не ясно а какой момент производился запрос, какой сервер. Может это демо и там класс QJSIM.
CreateDataSource("TQBR", "VTBR", 1), Получаю ошибку: TQBR - unknown class code.
 
Если выведете данные по переменной _G.INTERVAL_M1, то будет видно, что тип число, значение 1. В qlua много таких глобальных переменных ввели.

Можно даже просто вывести все, что есть в _G через pairs. Будут видны даже недокументированные.
Ошибка при выставлении заявки на валюту
 
Ошибки отправки транзакции нет, поэтому и res пустой. Вам необходимо прочитать ответ колбека OnTransReply. И по номеру транзакции получить текстовое представление ошибки.
QUIK 10, Ошибки, зависания и пр.
 
Цитата
nikolz написал:
Все просто, если ошибки на уровне локального кода функций, то это модификация,
а если ошибки на уровне метода, то это новая версия.
Очевидно, что 9-я с ошибками на уровне метода.
И ее на уровне кода функций уже не исправить.
Обычно, все же не так. Патчи - это третья цифра версии, методы - вторая, а первая цифра - это новые методы, модификации на грани совместимости с прошлыми релизами.
Впрочем - все это субъективно. Хотя и вызывает некое недоумение столь частые мажорные релизы.
QUIK 10, Ошибки, зависания и пр.
 
Больше вопросов взывает используемый SemVer.

Переход 7-8 логичен, внедрение x64 и lua 5.3.

А вот дальше уже как-то не очень. Что такого в 9-ой версии, что вызвало появление мажорного релиза. lua 5.4 просто дополнение, хотя, возможно, еще серверная часть сильно изменилась.

10-ая версия - еще менее логичная, как мажорная.

Конечно, "под капотом" может и много изменяется и никто никому не обязан объяснять. Но проблема в том, что брокеры не очень-то охотно переходят на новые мажорные релизы. Для примера, брокер Сбербанк (какой бы ни был этот брокер), очень долго был на 8-ом релизе. А потом перешел на проблемный 9.4, и уже не уверен, что перейдет на более стабильный 9.7, раз уже есть 10.
getParamEx
 
Динамичность типов языка - это особенность, а не обязательство. Никто не заставляет это использовать. И даже вполне естественно в сложных скриптах не использовать вовсе, если даже не контролировать и запрещать.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
 
Всегда надо помнить, что Вы работаете с терминалом, получающим данные с сервера. Т.е. после установки соединения начинается передача данных. Вполне естественно, что сразу после установки соединения (Handshaking) данные еще не начали передаваться.

К сожалению терминал не предоставляет методов контроля окончания передачи данных, о чем на этом форуме много раз вели дискуссию. Но можете воспользоваться одним способом: у каждого переданного пакета данных с сервера есть "его время". Поэтому процесс ожидания можно построить на том, чтобы время последнего переданного пакета "догнало" время сервера.
Волшебное исчезание меток
 
А метки да, исчезают. Как я понимаю из-за ошибки создания дампа состояния при падении. Приходится хранить параметры метки в файле состояния скрипта. Впрочем, я предпочитаю все хранить независимо, чтобы всегда иметь возможность при перезапуске проверить и выявить все различия.
Волшебное исчезание меток
 
string.gsub возвращает два параметра, поэтому tonumber воспримет второй как базу, что и приводит к nil. Скобки добавить надо, чтобы ограничить одним параметром возвращаемое значение gsub.
getParamEx
 
Цитата
Владимир написал:
Я не нашёл тип данных integer ВООБЩЕ! И как же мне работать с битовыми масками? Как на Lua реализуется конструкция вида:if (iData & 0x80) { blah-blah-blah }?
Прямо из коробки.
lua 5.3

3.4.2 – Bitwise Operators

Lua supports the following bitwise operators:  

  • &: bitwise AND
  • |: bitwise OR
  • ~: bitwise exclusive OR
  • >>: right shift
  • <<: left shift
  • ~: unary bitwise NOT

All bitwise operations convert its operands to integers (see §3.4.3), operate on all bits of those integers, and result in an integer.  

Both right and left shifts fill the vacant bits with zeros. Negative displacements shift to the other direction; displacements with absolute values equal to or higher than the number of bits in an integer result in zero (as all bits are shifted out).      

getParamEx
 
Возможно стоит добавить, что с версии 5.3, есть и целочисленное деление //
Получение стакана без открытия стакана, Получение стакана без открытия стакана
 
Зачем? После заказа данных и начала их поступления, Вы в любой момент времени можете получить данные через getQuoteLevel2. Это будут данные в момент запроса. Это же условно "непрерывный" поток данных.
Т.о. Вы можете "смотреть" на данные хоть каждые 10 млс. Если хватит производительности по их обработке. При этом "слепок" данных может не отличаться от того, что смотрели 10 млс. назад.
Поэтому и удобно и использовать колбек OnQuote для получения сигнала на повторное чтение. А если колбека нет, то данные те же, т.е. не требуется их заново читать.

Есть инструменты, где стакан изменяется раз в 10 минут. Какой смысл читать постоянно стакан. Пришел колбек OnQuote, установили некий флаг, что надо обновить данные, прочитали НОВЫЕ данные. Не пришел - данные те же самые.
Получение стакана без открытия стакана, Получение стакана без открытия стакана
 
Нет. Да и смысла нет, т.к. истории по стакану нет.

getQuoteLevel2 - просто получить текущий стакан на момент запроса. А OnQuote - признак, что стакан изменился. Только признак. Здесь нет такого понятие готовы данные или нет. Пришел колбек OnQuote - значит есть изменения в данных.
Получение стакана без открытия стакана, Получение стакана без открытия стакана
 
Код
local local_table_stock = getQuoteLevel2(class, sec) 
ну так что это за переменные class, sec
Где их инициализация?

Советую Вам использовать любой linter кода. Уйдут такого рода ошибки.
Получение стакана без открытия стакана, Получение стакана без открытия стакана
 
Вы как-то странно воспринимаете документацию.

Терминал - это клиент. Данные на сервере. Поэтому: заказ-получение-обработка. Все как при любом клиент-серверном взаимодействии. Сервер же может и не ответить, например.

Поэтому и сделаны функции заказа потока данных для получения и обработки той или иной информации.
Т.е. нужен стакан по инструменту:

Заказать поток на сервере - Subscribe_Level_II_Quotes
Получить данные о текущем состоянии, если данные заказаны успешно - getQuoteLevel2
Колбек о изменении OnQuote можно использовать как триггер о необходимости повторного считывания данных. Обрабатавать данные в самом колбеке - не очень хорошая затея.
Есть смысл делать так ? Это экономит ресурсы ?
 
Если надо обработать много (много) в цикле, то да. В обычной практике - это просто дело вкуса и привычки.
Код
local k = 10local s = 100

for i = 1, 10000000 do
    k, s = math.max(k, s), math.min(k, s)
    k, s = k*i, s*i
    k, s = math.min(k, s), math.max(k, s)
end
[Done] exited with code=0 in 2.068 seconds


Код
local math_max = math.max
local math_min = math.min

local k = 10
local s = 100

for i = 1, 10000000 do
    k, s = math_max(k, s), math_min(k, s)
    k, s = k*i, s*i
    k, s = math_min(k, s), math_max(k, s)
end

[Done] exited with code=0 in 1.597 seconds
Номер свечи из SetUpdateCallback всегда будет равен размеру таблицы ?, Номер свечи из SetUpdateCallback всегда будет равен размеру таблицы ?
 
Цитата

-1. Если в описании SetUpdateCallback: "Позволяет задать пользователю функцию обратного вызова для обработки изменившихся СВЕЧЕК", то почему, Callback - вызывается не только при изменении индекса всечи, но и цены в пределах этой свечи ? Разве тогда- это не нарушение принципа работы SetUpdateCallback - завленного в описании ?
Потому что изменение сечи - это не только смена индекса, а еще  изменение данных текущего бара, как то Close, High, Low, что как раз и происходит при совершении сделок.

Как уже говорилось решение зависит от задачи. Если задача - обработать все сделки без исключения, то это только таблица всех сделок.
Если узнать как менялась цена на произвольном отрезке времени, то с некой долей погрешности можно использовать и другие способы, OnParam, например. Самому читать цену последней сделки, и да, колбек на ds. Либо, если это очень важно, опять таблицу всех сделок.
Номер свечи из SetUpdateCallback всегда будет равен размеру таблицы ?, Номер свечи из SetUpdateCallback всегда будет равен размеру таблицы ?
 
Цитата
Quikos написал:
1)Ну так я тоже писал, что считаю подобный опрос в цикле - неправильным, некорректным, неэффективным. Опрашивая просто в цикле - во первых придется каждый раз заказывать ds:Size(). Во вторых - так вы 100% будете пропускать значения.
2)Насчет таблицы всех сделок - тоже писал, что не хочу запускать вручную в Квике что либо помимо скрипта.
Вопрос эффективности спорный. Если бы был колбек на событие "новый бар", то да. А т.к. его нет, то мы должны реагировать на каждый вызов колбека ds, только ради того чтобы узнать, что изменился Size. А если ТФ = 1 час, что, десятки тысяч вызовов обработать.

"Во вторых - так вы 100% будете пропускать значения." - что будет пропускаться? Новый индекс - однозначно нет. Промежуточные значения цен сделок - да, но т.к. колбек ds самый медленный, то используя его Вы однозначно будете пропускать цены сделок, если это конечная цель.OnParam быстрее, а таблица всех сделок хоть и медленно заказывается, но зато гарантирует все сделки.

Здесь же важна цель - обработать все сделки без исключения, то это только таблица всех сделок. Получит новый индекс - построить свой метод опроса, не прибегая к колбеку. В конечном итоге у Вас скрипт большую часть времени ничего не делает. Спросить какой сейчас Size - не сильно повлияет на работу. А вот заниматься обработкой колбека в основном потоке терминала - это уже вопрос целесообразности.

...Таблицы всех сделок заказывается прямо из скрипта - это ТФ = Tick
Номер свечи из SetUpdateCallback всегда будет равен размеру таблицы ?, Номер свечи из SetUpdateCallback всегда будет равен размеру таблицы ?
 
Вам уже уже писали, что чтобы понять, что пришел новый бар, надо всего лишь сравнить запомненное при прошлом опросе значение ds:Size() с новым. При этом можно опрашивать не постоянно, а с периодичностью заказанного интервала.
А чтобы узнать изменения цены можно использовать колбек OnParam, можете сами периодически читать через getParamEx, или таблицу всех сделок, если нельзя пропускать ни одной сделки. А можете и сами просто читать ds:Close() - это и будет текущая цена на момент запроса.
Номер свечи из SetUpdateCallback всегда будет равен размеру таблицы ?, Номер свечи из SetUpdateCallback всегда будет равен размеру таблицы ?
 
Как-то Вы "вцепились" в этот колбек. Он один из самых "бесполезных". Чтобы узнать изменения цены он не нужен. Чтобы понять, что пришел новый бар - тоже не нужен. Узнать значения на текущем баре - тоже. Узнать, что пришли данные с момента заказа - тоже. И это не учитывая, что он достаточно медленный и пропускает данные.
QUIK (версия 7.0.1.5), function OnTrade(trade), трехкратный вызов на одно событие.
 
Цитата
Alexander написал:
Вот ещё хочу тут спросить старожилов по такому поводу. Скрипт на Lua сначала делает продажу акций Лукойл по рынку в шорт 10 шт через sendTransaction() при этом естественно ставлю TYPE="M", PRICE="0".
Транзакция проходит, заявка исполнилась нормально. Следующая транзакция на покупку фьючерса "LKZ2", т.е. LKOH-12.22 в количестве 1шт так же по рынку, где в sendTransaction() установлено так же TYPE="M", PRICE="0". Но при этом транзакция с ошибкой: Ошибка создания заявки. [GW][332] "Нехватка средств по лимитам клиента." Пытаюсь купить данный фьючерс вручную в квике, установив галочку в окне ввода заявки "Рыночная" - результат опять та же самая ошибка!
В результате фьючерс купил таки вручную, указав цену на покупку из стакана равную лучшей цене продажи. Транзакция прошла без ошибок и заявка тут же исполнилась. Да мог бы поставить цену покупки и выше чем лучшая цена продажи на несколько пунктов, это я знаю, и заявка ушла бы так по лучшей рыночной цене.
Но вопрос: почему sendTransaction() работает на покупку/продажу акций по рынку с значениями TYPE="M", PRICE="0", а на  покупку/продажу фьючерса с значениями TYPE="M", PRICE="0" выдаёт ошибку: "Нехватка средств по лимитам клиента." и я вынужден ставить цену хуже рынка, чтобы заявка ушла по рынку? Заявка то в конечном итоге прошла, значит средств достаточно!
Рыночных заявок на срочном рынке нет, на самом деле. Брокер Они отправит их по верхней|нижней границе допустимого ценового диапазона. Так происходит, потому что размер ГО, блокируемого под сделку, зависит от цены сделки. И чем дальше цена от цены последнего клиринга, там ГО будет выше. Хотя реальная сделка и будет не так далеко, но расчет ГО у брокера будет по цене ордера. Так что на сделку в 200 пунктах от цены клиринга может и хватает, а вот уже на сделку в 2000 пунктах - нет. Но такое происходит, если торговать на границе доступных средств. Когда средств достаточно, то и "по рынку" пройдет сделка.
CreateDataSource SetUpdateCallbackcallback более чем для одного заказа, SetUpdateCallbackcallback более чем для одного заказа
 
Ну, видимо, потому, что пытаетесь произвести конкатенацию числа и строки
my_table_data_history_candle_:Size() .. "\n"

Обратно работает, а вот число..строка уже нет

> print(5..'a')
stdin:1: malformed number near '5..'
> print('a'..5)
a5

Лучше не злоупотреблять динамичностью языка. Либо просто ошиблись с расстановкой скобки для tostring. Также не понятно что это за переменные my_int_1 и my_int_2. Не вижу инициализации. А раз они nil, то соединяете строку с nil.
CreateDataSource SetUpdateCallbackcallback более чем для одного заказа, SetUpdateCallbackcallback более чем для одного заказа
 
Если Владимир сделал вывод, то, конечно, это приговор. Правда странно, почему же оно работает у остальных.

Вот, специально проверил, версия Квика 8.7.3
Код
local is_run = true

local function is_date(val)
    local status = pcall(function() return type(val) == "table" and os.time(val); end)
    return status
end

local function call_back_processor(action, context)
    if not action then return end
    return function(index)
        action(index, context)
    end
end

local function on_ds_action(index, context)
    local time = is_date(context.ds:T(index)) and os.time(context.ds:T(index)) or nil
    _G.message(string.format('new ds index %d %s %s|%s last close %.5f', index, time and os.date('%d.%m.%Y %H:%M:%S', time), context.sec_code, context.class_code, context.ds:C(index)))
end

local function create_ds(context, action)

    if not context then return end

    local ds, err = _G.CreateDataSource(context.class_code, context.sec_code, context.interval)

    if not ds then
        _G.message(err, 3)
        return
    end

    if ds and action then
        ds:SetUpdateCallback(call_back_processor(action, context))
    end
    context.ds = ds

    return ds
end

function _G.main()

    create_ds({sec_code = 'SBER', class_code = 'TQBR', interval = _G.INTERVAL_W1}, on_ds_action)
    create_ds({sec_code = 'GAZP', class_code = 'TQBR', interval = _G.INTERVAL_MN1}, on_ds_action)

    while is_run do
        _G.sleep(100)
    end
end

function _G.OnStop()
    is_run = false
end
Описание базовых активов Si, SiZ2 ?
 
Уже спрашивали
https://forum.quik.ru/messages/forum10/message46592/topic5558/#message46592
Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы, Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы
 
Цитата
Quikos написал:
Цитата
Владимир написал:
Quikos , А зачем? Мне на это событие совершенно наплевать, как и на время сделки. Зачем вообще нужны свечи?
Одна из необходимостей - это расчет индикаторов. Я индикаторы рассчитываю сам без привязке к терминалу, но для этого нужны свечи.
Уже написали, что для этих целей нет необходимости подписываться на колбек. Свечи у Вас будут и без него.
Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы, Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы
 
Колбек вызывается по событию и это не значит, что уже загружены все бары. Как минимум мы не знаем как организован вызов колбека в терминале. Может при получении очередного пакета данных, он разбирается и вызывается колбек на данные в нем. Т.е. вызвали для первого пакета, а когда придет условно последний - неизвестно. Понятие "последние данные" очень условно в ситуации непрерывного потока информации. На этом форуме уже много раз спорили, обсуждали эту тему. С тем же успехом можете просто смотреть на n = Size(), и если он отличен от 0, то проверит время бара с этим n. Если время "устраивает" - данные есть.
Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы, Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы
 
Цитата
Владимир написал:
Колбек МНОГОКРАТНО вызывается когда наступило событие связанное с данным колбеком
Это не так. Если бы это был колбек по получению нового бара, то да. Но этот колбек по событию: изменение текущего бара. А изменится он может при изменении любого из значений, в том числе и закрытия бара, что происходит при новой сделке. Также и время, что происходит при приходе нового бара. Можно сказать, что нехватает колбека именно на новый бар, да. Но текущий колбек о другом. И по хорошему, я лучше сам проверю Size() чем буду доверять колбеку.
Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы, Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы
 
Чтобы получить исторические данные, да и текущие, не обязательно подписываться на колбек. Просто заказали данные, установив пустой колбек через SetEmptyCallback, дождались получения баров с сервера и можете делать с ними все что хотите. Пройтись итератором по ним, совершив действия хоть на каждом баре. А новый бар можно получить просто проверив, что размер Size() стал больше.

Колбек же нужен если надо обрабатывать каждую сделку (точнее каждый вызов, сделок больше может быть) и попутно еще получать данные бара. Но в большинстве случаев это не надо. Да и сделки лучше отслеживать по обезличенным сделкам, а не по колбеку источника баров.
Приведение строки к числу
 
А зачем указана база 10 в tonumber? Она только для целых чисел.

Для такого вида строки не надо указыывать базу.


А вот для такой вполне можно:

> print(tonumber('101', 2))
5
Получение цены инструмента
 
Цитата
Kolossi написал:
В принципе с подпиской получилось нормально. Всем спасибо.

Задумался вот, а почему статус торговой сессии нужно получать по определенному инструменту а не в общим параметром?
Ну так по одному могут быть стоп торги, а по другим с этим же классом будет идти сессия.
Разработка торговых роботов на LUA, Разработка торговых роботов на LUA
 
Описание к скрипту есть, там же есть и контакты.
Не работает простейший скрипт вывода сообщения
 
Зря Вы такой логин выбрали. И администрация - опять дубль пользователя.
Передать в SetUpdateCallback дополнительные параметры
 
Есть один проект - https://github.com/elelel/qluacpp
Найдете много ответов.
Передать в SetUpdateCallback дополнительные параметры
 
Вы привели пример лямбда функции.
SetUpdateCallback в качестве первого аргумента просит ссылку на функцию. Функцию можно объявить в переменную, можно без объявления как лямбду. Кажется в С++ 14 появилось и лямбы и замыкания.


Но Вам необходимо "захватить" переменные, чтобы они были видимы в итоговой исполняемой функции. Делать это можно и так как написали, но лучше использовать более явный подход. Вот на чистом lua:
Код
local function call_back_processor(var1, var2)
    return function(index)
        print(index, var1, var2)
    end
end

local my_call_back = call_back_processor('a', 'b')

my_call_back(1)
my_call_back(2)
my_call_back(3)
my_call_back(4)

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

Для вашего случая можно сделать и через неявную функцию (лямбду):

my_table:SetUpdateCallback(call_back_processor('a', 'b'))

А можно и через явное объявление функции и передачи ее как параметра в SetUpdateCallback
Разработка торговых роботов на LUA, Разработка торговых роботов на LUA
 
А скрипт выложен публично, как я и говорил выше. В ничего особого нет. Он написан давно, не поддерживается, т.к. сам я TW не использую. https://github.com/nick-nh/qlua/tree/master/signalOrders
Получение цены инструмента
 
Если  настроено получение потока данных для необходимых инструментов и заданы получаемые параметры, то да. Такая настройка будет не умной, как ее называют в интерфейсе. Тогда можно не открывать ни одной таблица, ни один график.
Если параметры не заданы, то можно заказать его через ParamRequest https://luaq.ru/ParamRequest.html
Шаг сетчика в операторе for, Некорректная работа оператора for при нецелочисленном шаге
 
Арифметика арифметика чисел с плавающей запятой работает с некоторой точностью. Поэтому при сложении выходит, например не 2, а 2.0000000001.
Необходимо, либо делать свой итератор, либо добавляйте дельту погрешности меньше шага для гарантированного включения числа в перебор.
Разработка торговых роботов на LUA, Разработка торговых роботов на LUA
 
Задержки. Пока сигнал дойдет до терминала, то уже может быть точка входа неактуальной. Вот если время доставки сократить до 1-5 сек., то возможно, наверно. Но это надо свой web-server и обработку webhook с передачей в терминал.
Функция CreateDataSource - не вызывает callback при изменении свечи, Функция CreateDataSource - не вызывает callback при изменении свечи
 
А где бесконечный цикл в функции main. Иначе она просто выполнится и скрипт остановится.
Size()
 
Size = Size()

Вот этим и вызываете ошибку.

Читаем: инициализировать переменную Size числом. Функция Size тем самым становится недоступной, точнее переопределенной на число. При повторном выполнении кода, при попытке вызова функции Size(), получите ошибку.

Язык Lua динамической типизации. Поэтому надо быть очень аккуратным с желаниями.
Добавление вкладки и графика, Добавление вкладки и графика
 
Добавили в пожелание. Ничего не обещали. Здесь бы исправили существующие ошибки, не то чтобы что-то новое сделали.
Узнать цену покупки актива.
 
Цитата
Сергей написал:
Скрипт( https://github.com/ser-source/ser-qlua ) исправно работал полгода. А сегодня отказался.
Брокер Сбербанк вчера перестал выдавать информацию при подаче запроса через метод CalcBuySell.
Уже было. Приходится временно отключать контроль и переходить на самостоятельный расчет объема сделки или ГО и проверку достаточности средств.

Уже привыкли...
Изменение стоп-заявки
 
Цитата
Айдар написал:
номер транзакции я сравнивал с пользовательским номером стоп заявки, значит это неправильно?
Нет. Номер стоп-ордера - это его номер. После его активации устанавливается лимитный ордер, номер которого будет записан в таблице стоп-ордеров, в поле linkedorder.
Соответственно сделки будут приходить по ордеру с этим номером.

В идеальном мире:
При активации стоп-ордера придет колбек OnStopOrder. Для своего стоп-ордера увидите заполненное поле linkedorder.
При совершении сделок по этому ордеру придут колбеки OnTrade, где в поле order_num будет тот же номер, что и в linkedorder.

В реальном мире, в теории, колбек OnStopOrder с заполненным linkedorder может прийти после колбека OnTrade. Правда, с учетом того что OnTrade приходит не один раз, то синхронизация возможна.

В любом случае схема такая
стоп ордер - linkedorder - ордер с этим номером - сделки по этому ордеру.

Правда при работе с стоп ордерами всегда важно помнить, что стоп ордера - это просто триггер. Он всего лишь отправляет транзакцию при активации. А исполнится ли лимитный ордер или останется висеть неисполненным, или он будет отвергнут ядром биржи - это уже "проблема индейцев". Т.е. это Вы должны контролировать что случилось после активации стоп-ордера. Иначе позиция может так и остаться не закрытой.
Изменение стоп-заявки
 
А почему номер транзакции связанного лимитного ордера сравнивается с номером стоп-ордера?

TABLE_trade.trans_id==Param_sdelki["NUM_USER_STOP"]
Изменение стоп-заявки
 
Любое клиент-серверное взаимодействие в той или иной мере будет транзакционным. Условно: отправили запрос - ждете ответ - проверка. Только потом следующее действие.
При этом таких "транзакций" может быть много параллельно. Например, отправили 100 транзакций, далее ждете по ним ответы. Кто-то ответит первым, кто-то последним.

Поэтому и алгоритм должен быть построен так, чтобы поддерживать такой механизм. Например, создаете сущность "Задача". В вашем случае она будет состоять из двух этапов: снять ордер, поставить ордер.
Далее просто выполняете задачу, поэтапно. Если на каком-то этапе ошибка - кидаете исключение и алгоритм принимает решение о том, что делать в этом случае.
Как конвертировать в юникод
 
https://github.com/nick-nh/qlua/blob/master/telegramQuik/ansi2utf8.lua
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 14 След.
Наверх