что-же касается простаивания колбеков, при работе main, то это можно решить путем копирования очериди в локальный массив в main. и далее main работает с копией, а колбеки с очередью
Вячеслав написал: Николай Камынин , вопрос немного не об этом. Я уже выполняю синхронизацию на уровне мьютексов. Вопрос в том, прочитаются ли данные в потоке main сразу после вставки их в таблицу в обработчике callback'а или наоборот.
Перечисленных потокобезопасных функций мне не достаточно. В частности, мне нужно пройтись по таблице, в которой добавляются/удаляются элементы из callback'а и выполнить определённые действия для некоторых элементов по условию.
Я делаю иначе: если потоку main делать нечего, то я его усыпляю. в результате он не занимает никаких ресурсов процессора. когда я обновляю таблицу, то пинаю поток main, он просыпается и обрабатывает то, что ему пришло в очереди. после этого он снова засыпает до нового пинка.
Потокобезопасные функции для работы с таблицами Lua
Одновременная работа с таблицами из функций обратного вызова скрипта и функции main() может приводить к неопределенным ситуациям. Для решения этой проблемы qlua.dll предоставляет потокобезопасные аналоги стандартных функций Lua. Формат вызова потокобезопасной функции совпадает с форматом вызова аналогичной стандартной функции Lua. вместо concat ->sconcat remove ->sremove insert->sinsert sort->ssort
для начала можно почитать документацию QLUA где указано: ---------------------------------- Потокобезопасные функции для работы с таблицами Lua Одновременная работа с таблицами из функций обратного вызова скрипта и функции main() может приводить к неопределенным ситуациям. Для решения этой проблемы qlua.dll предоставляет потокобезопасные аналоги стандартных функций Lua. Формат вызова потокобезопасной функции совпадает с форматом вызова аналогичной стандартной функции Lua. В таблице представлены стандартные функции Lua и соответствующие им потокобезопасные аналоги:
теперь напишите , как Вы понимаете срабатывание стопа на каком-либо числовом примере, при этом укажите о чем Вы говорите - о стоп-лимите или тэйк-профите.
могу предположить, что индикаторы вычисляются на закрытие свечи. В этом случае они изменятся лишь на открытии новой и Вы получите то, что получаете. Надо считать индикаторы в скрипте.
не могу снять с графика цены параметры фрактала, значение всего одного параметра вытягиваемого с указываемого на графике идентификатором графика фрактала равно нулю на 30 последних свечах
не могу снять с графика цены параметры фрактала, значение всего одного параметра вытягиваемого с указываемого на графике идентификатором графика фрактала равно нулю на 30 последних свечах
Если память мне не врет, то индикатор фрактала в квик работает в зад. Т е записывает значения в прошедшие свечи. Поэтому в текущей свече будет всегда ноль. ----------------------------------------------- Это чтобы работа с КВИК не казалось не медом.
т е отвечать на поставленные вопросы Вы не хотите. Например, Вы можете показать результаты своих тестов задержки для любого брокера не называя его? или таких тестов вы не делали? Т е вам это по...? для информации привожу результаты мониторинга задержки ответов за вчера:
expected (to close '{' at line 39) near '[' в линии 39 отсутствует закрывающая скобка для '{} около '[' ------------------------------------------------------ это че Вы и жевать за меня будете? - АГА!!!
чтобы решить проблему надо: 1) синхронизировать часы компьютера с сервером времени 2) в момент задержки посмотреть диспетчером задач ( но лучше собрать за день в лог файл) параметры системы (загрузка процессора, объем пиковой памяти и т д) 3) записать в лог файл в течении дня информационные параметры квика. 4) на основе этой информацию скажу причину.
это наверно на учебном сервере? возможно не проходит По рынку и еще Вы как-то странно задаете, если по рынку то зачем цена если по цене то почему по рынку?
можно делать еще так. создаете файл или коллекцию используемых классов и бумаг после этого ищите лишь в этой коллекции вообще- настоятельно рекомендую переходить на луа. По многим причинам, В частности в вашей задаче поиск будет осуществляться существенно быстрее так как строки сравниваются как целые числа (по хешам)
Добрый день Вопрос к разработчикам QUIK. Наблюдаю следующую картину. 1) В информационном табло Задержка данных при обмене с сервером составляет при малой загрузке сервера брокера (нет торгов или вечерняя сессия) от 63 до 170 мс при большой загрузке (начало торгов активная сессия) 150 ... 250 мс (временами до 1 сек) 2) пинг на ip севера дает 16 мс ---------------------------- Получается, что запаздывание ответа от сервера терминалу в 10-20 раз больше, чем запаздывание за счет каналов связи. -------------------------- Вопрос: 1. Какая возможная причина такого запаздывания ответа сервера брокера? 2.Брокер умышленно создает дополнительное запаздывание? Верно? 3. Это делается средствами QUIK или доп оборудованием? 4. С какой целью это делается? Ваши варианты. Спасибо
Андрей Мурга написал: У меня слип(120000000000) делает 100 меседжей в секунду
А в документации написано так: NUMBER sleep(NUMBER time)
Параметры:
Параметр
Тип
Описание
time
NUMBER
Время, на которое приостанавливается выполнение, в миллисекундах
Пример: Sleep(1000) -- приостановка выполнения скрипта на одну секунду ------------------------------ Обращаю ваше внимание, что в документации ошибка: В первом случаем написано sleep, а в примере Sleep. А это две большие разницы. Может быть у вас не тот слип. Вот пример сообщение будет отображаться 1 раз в секунду 100 раз.
Скрытый текст
run=true; function main() count=0; while run do if res then message(res) else message("полет нормальный") end count=count+1; if count>100 then run=false end sleep(1000) end message("приземлился") end
проблема решается так: 1) создаем очередь сигналов пересечения 2) в колбеке ТВС каждое новое пересечение запихиваем в очередь 3) в функции main на каждый сигнал из очереди посылаем соответствующую транзакцию и сигнал убираем из очереди --------------------------------- Т е обработка колбеков должна осуществляться с помощью очередей. Я делаю в скриптах именно таким образом.
rozmin написал: Проблема: например, я открываю позицию покупка 5 контрактов по 10 руб, потом покупаю ещё 5 по цене 20 руб, потом продаю 5 контрактов по цене 30 руб. Не понятно, какая из позиций закрылась, первая покупка по 10 руб или вторая покупка по 20 руб?
Предлагаю решение - проводить соединяющие линии между сделками.
Попробую объяснить популярно, в чем ошибка спрашивающего. Так как на бирже совершаются обезличенные сделки по стандартизованным продуктам, то у любого игрока есть лишь одна позиция по каждому инструменту. Т е если мы совершаем сделку (биржа - это место совершения сделок) , то мы изменяем параметры позиции по инструменту ( т е не создаем еще одну, а изменяем существующую позицию по данному инструменту) Может быть много позиций, но по множеству инструментов. ---------------------------------- Теперь о позиции по инструменту. возможны следующие состояния ------------------------ рынок акций или облигаций: открыт лонг на свои деньги открыт лонг на заемные деньги закрыт лонг (продажа своих бумаг ) открыт шорт (продажа заемных бумаг) вне рынка - позиция нейтральная(нулевая) ------------------------------ рынок фьючерсов: открыт лонг открыт шорт вне рынка - позиция нейтральная ------------------ примерно так
local t = { ["CLASSCODE"]="SPBFUT", ["SECCODE"]="RIH6", ["ACTION"]="NEW_ORDER", ["ACCOUNT"]="SPBFUT00b52", ["CLIENT_CODE"]="99883", ["TYPE"]="L", ["OPERATION"]="S", ["QUANTITY"]="1", ["PRICE"]= "70500", ["TRANS_ID"]="1" } run=true; function main() count=0; while run do --res=sendTransaction(t) if res then message(res) else message("полет нормальный") end count=count+1; if count>100 then run=false end sleep(100) end message("приземлился") end
function OnStop(s) run = false end
Если Вы запустите ваш скрипт то Вы никогда не сможете его остановить. так как окно сообщения которое будет выводится будет блокировать ваши попытки что-нибудь сделать ( это прикол разрабочиков квика, чтобы жизнь седом не казалось) ------------------------------- Поэтому я написал вам пример который крутится 100 раз и завершается. отправку транзакции я закоментировал т е этот пример лишь покажет вам сообщение ------------------------ далее если захотите завалить сервер своими транзакциями то уберите -- перед res=sendTransaction(t) и завалите брокера своими заявками -------------------------------- Успехов
дополню ранее сказанное. пропуски срабатываний у Вас будут всегда происходить по следующей причине. --------------------------------- Данные в ТВС приходят пакетами. Т е сделки следующие с малым интервалом друг за другом придут к Вам одновременно. ----------------------------------- При этом колбек будет срабатывать на них последовательно и непрерывно. Т е например две сделки совершены с интервалом 100 мс но пришили в одном пакете. колбек на них отреагирует два раза но с интервалом полагаю менее мс. Т е у Вас произойдет анализ статуса на обе сделки одновременно. Если первая изменит статус а вторая вернет его обратно, то Вы этот сигнал не увидите и заявку не выставите. -------------------------------------- Эту ошибку никаким железом не исправишь - это методическая ошибка (ошибка метода). Ее можно устранить лишь изменив алгоритм работы робота. Теперь вроде все.
могу предположить следующее. Так как Вы пользуетесь колбеками , а они не синхронизируются то у Вас status успевает изменится туда и обратно до того момента, как Вы на него прореагируете
У БКС сервера работают медленно ( возможно так делают специально, чтобы на вип сервер подключались за денюшку, возможно старое железо, возможно клиентов много и сервер не справляется), короче реакция сервера медленная. Сейчас у нового брокера у Вас раз в 5 быстрее реакция сервера. В результате Вы сейчас просто не успеваете обрабатывать status и теряете сигнал. ----------------------------- Чем медленнее будет рынок, тем лучше у Вас будет срабатывание. -------------------------- Короче, проблема у Вас в потере сигналов status. Надо переделывать алгоритм обработки сигналов, либо работать со свечами. О чем уже писал ранее. --------------------------------- Чудес не бывает, но хочется в них верить.
и еще если я правильно понял, у Вас как-то странно проверяется пересечение. Вы используете сделку и заявку Вы именно так хотите? но тогда Ваш алгоритм вообще не соответствует картинке
На картинках у Вас пересечение свечи с линией болинджера а в программе используется тик. ----------------------- свеча - это четыре индикатора вычисляемых по куче тиков. ----------------------------- поэтому то, что у Вас написано это совершенно не то, что Вы хотите (если смотреть на картинки) ------------------------------- Нарисуйте картинку тиков внутри свечи и посмотрите . Если хотите как на картинке то используйте свечи а не ТВС
Хочу обратить Ваше внимание на тот факт, что в ТВС тики, а на графиках у Вас свечи. ------------------------------ Т е то, что вы реализовали это не то , что на графиках.