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

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

Страницы: Пред. 1 ... 15 16 17 18 19 20 21 22 23 24 25 ... 72 След.
Как получить любой SECCODE по BASE_CONTRACT ?, В какой таблице идёт привязка между текущим фьючерсным инструментом и базовым активом?
 
Цитата
awkozlov написал:
1.фьюченые инструменты постоянно меняются, но базовый актив - постоянный.
2.как я установил одному базовому активу может быть присвоено несколько фьючерсов по срокам истечения, например: BR = BRH3, BRG3, BRF3


Вопросы:
1.в какой таблице лежит список базовых активов?
2.какая таблица привязывает базовый актив к фьючерсам?

Хотелось бы получить Любой фьючерс по базовосу активу.
Делюсь опытом бесплатно.
-------------------------
Код фьючеса создается из кода базового актива, квартала и интервала.
Правила формирования кода фьючерса найдете на бирже.
Вот по этим правилам можете собрать имя любого фьючерса
Аналогично для опционов.
Разметка волн Эллиотта, дополнение
 
Цитата
Танечка написал:
Сделайте пожалуйста инструмент для разметки волн Эллиотта. Такие инструменты есть в TradingView, Investing, в терминале БКС, в метатрейдере.
Очень надо!

В кружочках - это шрифт EwaPro.  Quik его видит.


Заранее благодарю.
TradingView - это платное, терминал QUIK. -бесплатное
Кружочки будет проблема ,
---------------------
Но главное, что это не волны Эллиота, а пародия на них.
--------------------  
Там "кирпич", там обрыв-туда нельзя, но вам туда можно.
Мало кто об этом знает.
 
пардон, опечатка
Код
local N= getNumberOf("orders");
local j=1;  while N>=j do
   local mem=math.floor(collectgarbage ("count"))
   local z=getItem("orders",j-1)
        Log:write(tostring(j)..","..tostring(mem).."\n");
   j=j+1;
   end
Мало кто об этом знает.
 
Дело бы вечером, делать было нечего.
---------------
Предположим, что у Вас есть большая таблица в терминале QUIK.
------------------------
Например,  у меня получилась такая таблица "orders"  
В ней  227 тысяч строк.
-------------------------
И Вы хотите пробежать по строкам и найти строку с нужными вам параметрами
для этого Вы пишите такой цикл:
-----------------------
Код
local N= getNumberOf("orders");
local j=1;  while N>=j do
   local z=getItem("orders",jz-1)
   jz=jz+1;
   end
для контроля добавим два оператора
первый для замера расхода памяти
и второй для вывода результата в лог файл
получится так
Код
local N= getNumberOf("orders");
local j=1;  while N>=j do
   local mem=math.floor(collectgarbage ("count"))
   local z=getItem("orders",jz-1)
        Log:write(tostring(jz)..","..tostring(mem).."\n");
   jz=jz+1;
   end
А теперь вопрос знатокам, в ответ не подглядывать.
Сколько памяти займет данный цикл пробега по строкам таблицы заявок, в которой 227 строк.
-----------------------------
Уверен, что Вы даже не представляете себе это .
==================
Ответ на поставленный вопрос в лог файле
посмотрели 1-ю строку, заняли память 121 КБ
Код
1,121
посмотрели 100-ю строку, заняли память 654 КБ
Код
100,654
посмотрели  1000-ю строку, заняли память 5395 КБ т е округленно 5 МБ
Код
1000,5395
ну и когда посмотрели  последнюю 227851 строку, заняли память 1205 952 КБ т е округленно 1.2 ГБ
Код
227851,1205952
Вот так Lua в QUIK кушает память.
И  в этом случае мы просто нашли нужную нам заявку в таблице заявок.
-------------------------------------------------------
Угадайте, как с этим бороться?
Как работает OnCalculate(), Интерактивно указываю интервал расчета при помощи меток. Пересчитывается только текущая свеча
 
Цитата
Alexander написал:
Вообще эти свечи все "старые", как и вообще весь этот ТА как по мне, так это всё ерунда. Что бы там не рисовал нам ТА, рано или поздно он соврёт. Анализировать конечно можно, но нужен чисто свой ТА, котрый будет работать по набору чисто твоих данных, которые могут динамически менятся во времени от разных ситуаций, да и сам алгоритм ТА нужно постоянно менять под меняющийся рынок. Только так ТА будет работать. Но это такие сложности постоянно обновлять входящие данные и их количество и постоянно корректировать код(и то только после определённого слежения за рынком), а как поменяется код, то нет никаких гарантий, что рынок не изменится и код будет рабочим определённое время. Вобщем ТА не вариант в плане свечей и графиков прошлых цен, вернее вариант, но очень сложный, требующий постоянной корректировки скрипта. А вот анализ стакана может помочь при дневных сделках и общем анализе ситуации на рынке если мониторить несколько инструментов например основных фишек индекса.
Для такого ТА использую нейронные сети.
--------------------
Относительно пользы свечей и "старых" свечей Вы заблуждаетесь.
=================
Мое мнение следующее:
-------------------
Любая история полезна для прогноза будущего поведения ее участников.
-------------------
Любая тварь действует на основе накопленного опыта, т е прошлых ошибок и достижений.
--------------------
Поэтому без прошлого нельзя прогнозировать будущее.
----------------------
Чем больше интервал наблюдаемого прошлого , тем дальше горизонт прогнозируемого будущего.
Если торгуете на основе стакана, то горизонт такого прогноза измеряется в миллисекундах.
Так торгуют HFT роботы.
Но это очень дорогая технология и ее применяют лишь крупные игроки.
Как работает OnCalculate(), Интерактивно указываю интервал расчета при помощи меток. Пересчитывается только текущая свеча
 
Цитата
Alexander написал:
Цитата
nikolz написал:
1) про замыкания.индикаторы здесь не причем.  Это способ программирования  функций,  при котором значения переменных сохраняются  после выхода из функции.Он используется в различных языках программирования.Не знает, не используйте. тоже самое делают глобальные переменные.--------------2)если надо не обрабатывать старые, то сравнивать i с size()
1) Про замыкания возник вопрос из-за того, что у кваика есть справочный .pdf файл "Использование Lua в Рабочем месте QUIK.pdf" в C:\Open_Broker_QUIK\Doc\Lua, в нём есть п. 3.7 "Расчёт EMA" и там написано: "Нет возможности обратиться напрямую к предыдущим рассчитанным значениям индикатора.
Это значит, что для вычислений текущего значения необходимо хранить и предыдущие
значения. Для таких целей в Lua используется механизм замыканий. Определение такой
функции нужно вынести в отдельный файл и в отдельный каталог, который не сканируется
при создании индикатора."
И далее идут примеры, функции, возвращающие функции(короче замыкания как я понял). Они используются именно для индикаторов. В чём там прикол, я так и не понял. Можно тоже самое написать и не использовать возврат функции в функции(замыкания). Что они хотели этим показать я не понял. И зачем это всё в отдельный каталог, который не сканирует квик при создании индикатора? Зачем весь этот изврат с каталогами, dofile и замыканиями в придачу???
2) Это да согласен, что i c Size() надо тогда сравнивать, это так. Просто у меня сначала скрипт начинался с того, что в init сначала запоминал Size(), а в OnCalculate() отбрасывал всё, что меньше Size(), повторные свечи >= Size() тоже обрабытывал, для меня это не важно было. Вобщем такой скрипт при загрузке на индикатор нормально загружался и работал без проблем, рисовал кривые мои 2 шт в отдельной области. Проблема возникла только тогда, когда я выходил из квика, повторно запускал квик и вот тут то квик у меня вообще начал зависать, вернее в цикле без конца то подключится к серверу, то отключится, при этом куча окон всяких на экран выдаёт, в сам квик войти невозможно стало. А чтобы зайти нужно было как то отключить индикаторы. Я даже по началу вообще не понял, что в этом виноваты мои индикаторы, так как проблема то явно выглядела как подключения-отключения к серверу. Потом дошло, что могут влиять на это индикаторы. А как их отключить то если квик не запускается. Вот пришлось переименовывать папку с индикаторами, чтобы квик при загрузке их не находил. Папку переименовал, в квик стал заходить, ну иначал искать причину чё к чему. Выяснил, что квик этот почему-то еще до коннекта с сервером по паролю 2 раза(зачем 2 не знаю, только разрабам видно известно) пробегает по свечам по всем начиная с первой, потом после второго прогона останавливается и пока не залогинишься более никакие свечи не прогоняет. Потом как залогинишься квик опять таки ещё 2 раза опять заного пробегает по всем свечам(точно так же как и до залогинивания) но потом уже начинает и дальше свечи обрабатывать, что новые грузит. Так вот в самый первый раз до залогинивания Size() выдаёт почему-то 0(ноль) Ха - ха - ха Ноль, а не то что надо - максимальный индекс свечи. Отсюда получалось то, что даже при закрузке квика(после переименования папки с индикаторами)  и при работающем квике если название папки с индикаторами вернуть обратно, то индикаторы то всё равно не заработают на открытых графиках, а чтобы заработали надо зайти в график, удалить их и заного загрузить на график, только тогда квик их загрузит из папки. Ну а потом я эту проблему решил как описал выше через isConnected() и подкорректировал всю логику индикатора, убрав Size() из Init. Просто вычислений на свечу видимо много было и квик так долго всё обсчитывал и обсчитывал, что не догонял чё так долго то и разрывал соединение установленое с сервером, потом опять по кругу - подключался, считал, отключался и т.д. и т.п. Потом, когда сделал так, что Size() начал мне выдавать нормальное значение вместо ноля, квик стал подключаться, так как все свечи до логина мой индикатор считал в nil, а потом отсчитыал только свечи новые, видимо так как новые то идут не так часто, квику хватает времени и на свою работу и на просчёт свечей. Всё стало работать. А так то это их косяк - почему Size() выдаёт ноль если он в Init и квик загружается с существующим ранее индикатором? Ведь всечи то есть и он их прогоняет до какого-то значения аж 2 раза. Почему же тогда Size() не возвращает это значение? Вот в этом и косяк. Не будь его всё бы работало и в процессе загрузки на индикатор и после перзагрузки, ан нет, пришлось извращаться и корректировать код.
проблему с отключением индикатора я решаю так :
Перед запуском квика в индикаторе пишем аброкадабру  т е делаете явно ошибки.
При запуске КВИК грузит индикаторы,  а при их загрузке работает компилятор байткода.
Он находит  ошибку и квик такой индикатор не загружает.
---------------------
Про два раза, да я тоже когда-то возмущался этим.
Первый раз Size меняется до максимального. А второй раз он уже не меняется пока не придет новая свеча.
Я делал так, чтобы считалось лишь один раз, но есть хитрость двух разового расчета . Поэтому просто забил на это.
---------------------
Бесплатный совет.
Так как Вы начинающий писатель, то рекомендую Вам писать скрипты без циклов.
Так пишут профи софт  для систем обработки данных в реальном времени.
Если научитесь, то индикаторы будут в десятки раз считаться быстрее.
----------------------
Уровни Фибоначчи, Длина лучей от уровней
 
Они положили сырой порох, Карл!
Уровни Фибоначчи, Длина лучей от уровней
 
Поздравляю от всей души!
―Но с чем?!
―С успешным возвращением с Луны!
―Неправда! В этот раз я не был на Луне!
―Как это не был, когда уже есть решение, что был!
Кривые шибки в QLua
 
Цитата
Старатель написал:
Цитата
nikolz написал:
В итоге тест работал 4 часа
4 часа - это не срок. У меня скрипты годами (!) работают, но иногда вылазят ошибки, описанные в данном треде. Многие ошибки даже за неделю непрерывных нагрузочных тестов нереально воспроизвести.
если не учитывать, что за 4 часа колбеки вызывались 4 миллиона раз и было выставлено и снято 500 тысяч заявок.
 
Кривые шибки в QLua
 
Цитата
Nikolay написал:
Это строка приводит к падению терминала (10.1.2.2):
Код
   local  sec_list  =   getClassSecurities ( 'TQOD|TQOB|TQTD|TQTF|EQEO|EQOB|EQDB|SPBBND|SPBXM|QJSIM|TQBR|FQBR|SPBFUT|CETS' )  

Да, есть ошибка в передаваемом параметре, но, кажется, это не должно приводить к падению. Есть ощущение, что просто нет unit тестов методов qlua...
А не чо, что вместо  разделителя ","  Вы используете  "|" ?
и в конце нет ","
Как работает OnCalculate(), Интерактивно указываю интервал расчета при помощи меток. Пересчитывается только текущая свеча
 
Цитата
Alexander написал:
Цитата
nikolz написал:
Бесплатные советы.
1) Посмотрю. Вникну подробнее. Мельком глянул - ничего с наскоку не понял. Для чего эти замыкания в квике в индикаторах? Если можно на пальцах, хоть кратко, просто для того, чтобы уловить суть необходимости.
2) Не, мне так не пойдёт. Это отсекёт повторы если будут, а так то всё-равно все свечи пробегать будет. А мне надо, чтобы "старые"(до момента коннекта) все отбрасывались. Я в принципе уже нашёл решение как это сделать, хотя и Size()
в Init возвращает 0 при запуске квика с индикаторами. Вызыываю Size() только после коннекта с сервером и только 1 раз, чтобы зафиксировать значение и обрабатываю свечи > этого значения только. Несколько вызовов на 1 свечу мне не страшно, пусть будут, график рисует как надо. А так то да, можно использовать, чтобы одну свечу 1 раз только вызывать, может и заиспользую.
1) про замыкания.
индикаторы здесь не причем.
Это способ программирования  функций,  при котором значения переменных сохраняются  после выхода из функции.
Он используется в различных языках программирования.
Не знает, не используйте.
тоже самое делают глобальные переменные.
--------------
2)если надо не обрабатывать старые, то сравнивать i с size()
Как работает OnCalculate(), Интерактивно указываю интервал расчета при помощи меток. Пересчитывается только текущая свеча
 
Цитата
Alexander написал:
Не нужные мне свечки ранее отсекал сохранение значения через вызов функции Size(), обрабатывал только вновь пришедшие свечи. При загрузке индикатора такое работало. После перзагрузки Size() внутри Init возвращает 0, буду пробовать выкручиваться, может отсекать свечи до подключения и после подключения? Попробую, а то виснет же - видимо много считает и считает при загрузке.
Бесплатные советы.
1) Если вы про замыкание в луа, то рекомендую читать это:
https://eligovision.ru/media/upload/lua.pdf
2) Чтобы индикатор рассчитывался лишь по закрытым свечам используйте условие появления новой свечи.
т е поставьте if по смене параметра  OnCalculate(i)
Например так
Код
local  _i=0
function OnCalculate(i)
if i~=_i then
---что-то делаете
_i=i
end
return  ... -вывод индикаторов
end
Ищу программиста для написания индикатора, Согласно тех. задания скрипт должен рисовать уровни поддержек и сопротивлений.
 
Цитата
PAK написал:
Цитата
nikolz написал:
Выкладывайте тех задание, стоимость и сроки.  
Тех. задание объёмное, стоимость и по срокам подлежит совместному обсуждению.
На каком ресурсе Вам удобнее?  
на любом файлообменнике . ссылку в личку.
Ищу программиста для написания индикатора, Согласно тех. задания скрипт должен рисовать уровни поддержек и сопротивлений.
 
Цитата
PAK написал:
Нужны авторские уровни, согласно тех. задания.
Выкладывайте тех задание, стоимость и сроки.  
Ищу программиста для написания индикатора, Согласно тех. задания скрипт должен рисовать уровни поддержек и сопротивлений.
 
Цитата
PAK написал:
Согласно тех. задания скрипт должен рисовать уровни поддержек и сопротивлений.
вот это рисует скрипт:

 
Это еще блин че такое на графике Яндекса (YNDX) ???
 
Цитата
Quikos_1 написал:
Цитата
Constantin написал:
 
Цитата
Quikos_1  написал:
Зачем ?
 Может в вашем Quick данные сборные, скачаются от брокера по новой. Удалить только по этому инструменту.
Мне важно понять почему это произошло, потому что, если произошло один раз, то произойдет и два...
Предположу, что это  сбой на сервере.
-------------------------
В следующий раз просто отключитесь от сервера, удалите  файл с именем этого инструмента и этим периодом из каталога archive и снова подключитесь.
------------------------
Если данные не восстановятся, то это ошибка сервера.
Тогда стучите к брокеру и говорите ему об этой проблеме.
Фильтрация транзакций "своего" робота
 
Прикольно, Но  выдать id=last_seen_trans_id + 1  квику очень сложно.
--------------------------------
Попробуйте угадать, почему.
Фильтрация транзакций "своего" робота
 
Цитата
Максим написал:
Откуда вы знаете, что не выдаст? Завтра они начнут для ручных транзакций выдавать last_seen_trans_id + 1 и привет. Ваша система тоже рухнет. Моя тоже какое-то время держалась, пока они ноль возвращали.
Будет завтра -будет завтрак.
Можете и дальше гадать.
Фильтрация транзакций "своего" робота
 
Цитата
Максим написал:
Цитата
nikolz написал:
 
Цитата
Максим  написал:
Картинка
 Я делаю так:
------------------------------
назначаем роботам номера
например
 num_bot=134548
а текущее значение   id=125657   -номер транзакции
-----------
формирует для отправки серверу
trans_id=id+(num_bot<<31)
---------------
из принятого c сервера trans_id
й транзакции с сервера вычисляем
num_bot  =trans_id>>31
id=trans_id&0xffffffff
-----------------
По такой схеме, Вы можете иметь более миллиарда  роботов, которые могут послать более миллиарда уникальных транзакций
У меня похожая схема, но сгенерированные номера транзакции могут быть от 111. В десятичной системе: transid + botid + botidlen. В итоге номера перекрываются.
Но даже если я просто взведу старший бит как признак моей транзакции, нет никаких гарантий, что Квик не выдаст и такой большой trans id. Хотелось бы надёжного решения, а выходит только какая-то магия. В этом-то и проблема.
В моем варианте ничего не перекрывается Более того квик не выдаст такие trans_id, так как для номера робота 1 и id=1  ,  trans_id =2147483649
Диапазон номеров роботов и id от 1 до двух миллиардов
Фильтрация транзакций "своего" робота
 
Цитата
Максим написал:
Картинка
Я делаю так:
------------------------------
назначаем роботам номера
например
num_bot=134548
а текущее значение  id=125657 -номер транзакции
-----------
формирует для отправки серверу
trans_id=id+(num_bot<<31)
---------------
из принятого c сервера trans_id
й транзакции с сервера вычисляем
num_bot=trans_id>>31
id=trans_id&0xffffffff
-----------------
По такой схеме, Вы можете иметь более миллиарда  роботов, которые могут послать более миллиарда уникальных транзакций
Это еще блин че такое на графике Яндекса (YNDX) ???
 
 
Кривые шибки в QLua
 
Цитата
TGB написал:
nikolz
  Ожидаемо, что вам не захотелось продолжения нашего «банкета», но чтобы у вас, и мысли продолжения его не возникли далее (вы мне надоели), то я сам его и завершу.
  Мне, совершенно, не интересно с вами общаться. Что-то вам объяснить, это неразрешимая задача (на уровне, попытки объяснения обезьяне тензорного исчисления).  Но, я в мягкой форме и неоднократно  пытался вам объяснить, предельно простую мысль, что вам не надо много писать на форуме, пока вы не сможете читать  :: .  А если это и произойдет (вы сможете читать) то, похоже, очень не скоро  :: .
  Вам вредно изображать из себя «гуру программирования». Вам это не идет. Вы что, не понимаете, что вы смешны со своими сотнями потоками?  Вы несчастный человек. Вам не надо заниматься сложными вещами. Вам, наверное, надо как то осознать ваше реальное место в этой жизни. Вы не торгуете на  фондовом рынке,  хоть и заявляете о каких то «бешенных» процентах. У вас нет приличной работы. Ну кто, в здравом уме, примет вас на приличную работу? Вы безработный или полубезработный и работаете на данном форуме «прокладкой» между комментариями пользователей.
Ну и нахрена Вы словесным поносом растеклись по интернету?
--------------------------------
Форум не церковь, а я вам не поп, чтобы слушать Вашу исповедь.  
Потоки
 
Цитата
Constantin написал:
И ещё вопрос: доступ к полям таблицы из разных потоков возможен?

Заранее спасибо за ответ.
В документации по QLUA указаны потокобезопасные функции для работы с таблицами:
-----------------------
Одновременная работа с таблицами из функций обратного вызова скрипта и  функции main() может приводить к неопределенным ситуациям.
Для решения этой  проблемы qlua.dll предоставляет потокобезопасные аналоги стандартных функций  Lua.
Выполнение потокобезопасной функции блокирует выполнение кода в другом потоке до окончания работы функции.

Формат вызова потокобезопасной функции совпадает с форматом вызова  аналогичной стандартной функции Lua.

В таблице представлены стандартные функции Lua и соответствующие им  потокобезопасные аналоги:

Стандартная функция LuaПотокобезопасная функция
concat sconcat
remove sremove
insert sinsert
sort ssort

-------------------
Все остальное не безопасно, так как VMLua не разработана для многопоточной работы.  
---------------------
Спасение утопающих -дело рук самих утопающих.
Потоки
 
относительно работы с файлами в потоках.
--------------------
Работа с файлами в Windows реализована на основе механизма memory-mapped files.
---------------------------
Если один экземпляр приложения модифицирует какие-либо глобальные переменные,
размещенные на странице данных, содержимое памяти изменяется для всех  экземпляров этого приложения.
Такое изменение могло бы привести к  катастрофическим последствиям и поэтому недопустимо.
Поэтому ОС предотвращает подобные ситуации, применяя механизм копирования при  записи.
Всякий раз, когда программа пытается записывать что-то в файл,  спроецированный в память,
система перехватывает эту попытку, выделяет новый блок  памяти, копирует в него нужную программе страницу и после этого разрешает запись  в новый блок памяти.
Благодаря этому работа остальных экземпляров программы не  нарушается
Кривые шибки в QLua
 
Цитата
TGB написал:
Цитата
nikolz написал:
Разработчики КВИКА  к разработке VMLua  имеют ровно такое же отношение как мы с вами - т е НИКАКОГО.
   Я нигде не писал, что разработчики КВИКА разрабатывали VMLua. Но за все ошибки, которые возникают в КВИКе, независимо от того, что разработчик использовал при его создании, отвечают он.
   Вы какой-то сильно непонятливый. Но попробую объяснить вам это на простом примере. Возможно, вы ездите на своей машине. В ней наверняка используется электроника, которую производитель закупал на стороне. Например, эта электроника сломалась. Вы что, побежите со своими претензиями к производителю электроники?
Вы ломитесь в открытые ворота.
-------------------------------
То, что VMLua потоко не безопасная известно с момента ее создания.
-----------------------------
Это не ошибка, а ограничения реализации VMLua, которую изначально создавали для измерительных мобильных устройств .
------------------------------
Для реализации многопоточности в каждой ОС есть свои механизмы.  
----------------------------------
На основе этих механизмов разработчики и реализуют синхронизацию своих приложений.  
-----------------------
В QLUA есть синхронизация в функциях.
-------------------------
Вы пишите cвой скрипт - это Ваше приложение.  Вы его разработчик
Вот и решайте свои проблемы сами, а не перекладывайте их на других.
----------------------------
Я не использую sleep и синхронизирую все потоки Их у меня до 100 штук создается в тестах. Делаю Специально тесты, где потоки долго заняты до 10 секунд на каждой сделке.
В итоге если в одном потоке то сделки последовательно будут обрабатываться через 10 секунд. У меня потоки запускаются через 5-15 мс от прихода сделки.
--------------------------
Судя по Вашим постам Вы не умеете использовать механизмы синхронизации потоков.  
------------------------------------------
Покажите пример как tonumber Вам создает проблему в скрипте или дайте ссылку на такой пример, если Вы его выкладывали с результатами.
Отвечу Вам конкретно, как решить Вашу проблему.
Кривые шибки в QLua
 
Цитата
TGB написал:
const char *s =  lua_tolstring (L, 1, &l);  if (s != NULL &&  lua_stringtonumber (L, s) == l + 1)return 1; /* successful conversion to number *//* else not a number */
Разработчики КВИКА  к разработке VMLua  имеют ровно такое же отношение как мы с вами - т е НИКАКОГО.
------------------------------
поясните, зачем окружать указатель на стек, если он никогда не изменяется потоками
В скриптах QUIK, указатель на глобальный стек у основного потока и потока main  один и тот же,
а локальные стеки у каждого потока свой и их вообще нет смысла синхронизировать.
----------------------------
Синхронизировать надо не код программы, а обращение к одним и тем же областям данных.
===============
В данном случае - это область данных в глобальном стеке.
Но ее как раз и синхронизировали разработчики КВИК в функциях библиотеки QLUA
и сделали 3 функции потокобезопасные для обращения к таблицам.
Все что они сделали работает.
-----------------------
Все сверх этого пишите сами , если это надо Вам.
Вы хотите чтобы они занялись разработкой VMLua?
В чем проблема?
Кривые шибки в QLua
 
Ну давайте посмотрим tonumber
{"tonumber", luaB_tonumber},
---------------------------------------
static int luaB_tonumber (lua_State *L) {
if (lua_isnoneornil(L, 2)) { /* standard conversion? */
luaL_checkany(L, 1);
if (lua_type(L, 1) == LUA_TNUMBER) { /* already a number? */
lua_settop(L, 1); /* yes; return it */
return 1;
}
в этой части  ничего не преобразуется так как это и есть число
===================================-
else {
size_t l;
const char *s = lua_tolstring(L, 1, &l);
if (s != NULL && lua_stringtonumber(L, s) == l + 1)
return 1; /* successful conversion to number */
/* else not a number */
}
}
в этой части преобразуется строка в число и используется функция lua_tolstring  ранее уже показывал, повторю:

LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {  StkId o = index2addr(L, idx);
 if (!ttisstring(o)) {
   if (!cvt2str(o)) {  /* not convertible? */
     if (len != NULL) *len = 0;
     return NULL;
   }
   lua_lock(L);  /* 'luaO_tostring' may create a new string */
   luaO_tostring(L, o);
   luaC_checkGC(L);
   o = index2addr(L, idx);  /* previous call may reallocate the stack */
   lua_unlock(L);
 }
 if (len != NULL)
   *len = vslen(o);
 return svalue(o);
}
=================================
else {
size_t l;
const char *s;
lua_Integer n = 0; /* to avoid warnings */
lua_Integer base = luaL_checkinteger(L, 2);
luaL_checktype(L, 1, LUA_TSTRING); /* no numbers as strings */
s = lua_tolstring(L, 1, &l);
luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range");
if (b_str2int(s, (int)base, &n) == s + l) {
lua_pushinteger(L, n);
return 1;
} /* else not a number */
} /* else not a number */
lua_pushnil(L); /* not a number */
return 1;
}
в этой части выясняется что строка не является числом при этом для строки тоже используется lua_tolstring  ранее уже показывал
-------------------------------------
if (lua_isnoneornil(L, 2)) { /* standard conversion? */
luaL_checkany(L, 1);
if (lua_type(L, 1) == LUA_TNUMBER) { /* already a number? */
lua_settop(L, 1); /* yes; return it */
return 1;
}
------------------------------
Резюме, в преобразовании tonumber  блокировка делается при получении копии строки.
Все правильно?  Проблемы нет?
Потоки
 
Цитата
Constantin написал:
Цитата
nikolz написал:
зачем? поясните  
Си библиотека буферезует запис в файл, по умолчанию.
Нет желание заниматься ликбезом.
--------------------
Могу сообщить , что делаю запись в лог
из колбеков,
из main,
и еще из 90 (краш-тест терминала)  потоков
которые выбираются из  пула потоков (максимум 512 потоков)
 и проблем нет  
Кривые шибки в QLua
 
Цитата
TGB написал:
tolstring
В скрипте нельзя вызвать эту функцию, там мы пишем tostring, а не tolstring
Цитата
TGB написал:
lbaselib.c
в таком случае, смотрим приведенную Вами функцию.
В ней выполняются различные преобразования в зависимости от типа исходного значения.
Но во всех случаях сначала преобразуемые данные извлекаются  с помощью функции
  lua_pushfstring
смотрим эту функцию:
LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) {  const char *ret;
 va_list argp;
 lua_lock(L);
 va_start(argp, fmt);
 ret = luaO_pushvfstring(L, fmt, argp);
 va_end(argp);
 luaC_checkGC(L);
 lua_unlock(L);
 return ret;
}
----------------
Ой, что не так?
Потоки
 
Цитата
Constantin написал:
Цитата
nikolz написал:
3) ошибаетесь, запись в файлы синхронизирована на уровне ОС.  Но с этим к Майкрософт.
Но там же должен быть буфер на уровне си библиотеки, ещё до ОС.
зачем? поясните  
Потоки
 
1) да
2) да
3) ошибаетесь, запись в файлы синхронизирована на уровне ОС.  Но с этим к Майкрософт.  
Кривые шибки в QLua
 
Цитата
TGB написал:
Цитата
Anton Belonogov написал:
По обращению 1 мы производим анализ проблемы, к сожалению, он еще не завершен.
   Описав в своем комментарии, в чем, по моему мнению, заключается ошибка использования существующей функции tostring в QLua, я не привел решения по ее ее устранения.
   Приведу в данном комментарии один из вариантов решения:
     1)  В начале функции tostring  вставить lua_lock(L);
     2)  В конце всех завершений функции вставить  lua_unlock(L).
так вроде все есть
смотрим sorce 5.3:

LUA_API const char *lua_tolstring (lua_State *L, int idx, size_t *len) {
 StkId o = index2addr(L, idx);
 if (!ttisstring(o)) {
   if (!cvt2str(o)) {  /* not convertible? */
     if (len != NULL) *len = 0;
     return NULL;
   }
   lua_lock(L); /* 'luaO_tostring' may create a new string */
   luaO_tostring(L, o);
   luaC_checkGC(L);
   o = index2addr(L, idx);  /* previous call may reallocate the stack */
   lua_unlock(L);
 }
 if (len != NULL)
   *len = vslen(o);
 return svalue(o);
}
-------------------
что не так?
OnParam, для класса SPBFUT
 
Цитата
Алексей13 написал:
Здравствуйте, у брокера скрипт на ЛУА выполняется хорошо и в OnParam приходят котировки фьючей как и положено. Но если к основному терминалу сделать дополнительные (можно до 5 шт бесплатно, все на одном счете) - то в этих дополнительных терминалах котировки именно фьючей не приходят. Скрипт один и тот же. Я даже брал каталог с основным терминалом (QUIK) и просто менял логины и пароли (чтобы настройки точно такие же оставить) - результата нет - колтировки не приходят. не подскажете в чем дело?
А оно Вам надо?
Пять терминалов к одному счету - это как пять телевизоров с одним кинофильмом в одной комнате.
Просто палата номер 6
Кривые шибки в QLua
 
Цитата
TGB написал:
Цитата
nikolz написал:
Локальные стеки у луа машин майн и основного потока разные и следовательно синхронизация потоков при обращении к ним не требуется и нет блокировки.
  Это было бы верно, если бы в Qlua не было общего ресурса потоков:  сборки мусора (GC).  При своем запуске, GC "ползает" по всем стекам и не является потокобезопасным. Поэтому для всех потоков QLua все фрагменты скрипта, за исключением, вызываемых С- функций, являются разделяемым ресурсом (потоки синхронизируются).  Нет синхронизации потоков только при выполнении C-функций, вызванных в скрипте.
Вы почему-то опускаете тот момент, что синхронизация нужна лишь при изменении потоками общих данных . т е если данные лишь читаются, то синхронизация обращения к ним потков не требуется.
Во всех приведенных Вами обсуждаемых фрагментах, Вы этот факт не учитываете.  
Проблема с функцией getBuySellInfo
 
Пишем вот такой фрагмент:
Код
qtyB,comission=CalcBuySell(clas,sec,client,acc,price,true,false); --расчитать доступное количество к покупке
qtyS,comission=CalcBuySell(clas,sec,client,acc,price,false,false); --расчитать доступное количество к продаже
local tp=getBuySellInfo (firm,client,clas,sec,price);
Qcur=tp.balance --STRING Текущая позиция по инструменту, в лотах
NQb=tp.can_buy --STRING Оценка количества лотов, доступных на покупку по указанной цене *
NQs=tp.can_sell-- STRING Оценка количества лотов, доступных на продажу по указанной цене *
Dp=tp.share  --STRING   Процентное отношение стоимости позиции по данному инструменту к стоимости всех активов клиента, рассчитанное по текущим ценам
QmaxBuy=tp.can_buy_own  --STRING   Максимально возможное количество инструментов в заявке на покупку этого инструмента на этом классе на собственные средства клиента, исходя из цены лучшего предложения
QmaxSel=tp.can_sell_own  --STRING   Максимально возможное количество инструментов в заявке на продажу этого инструмента на этом классе из собственных активов клиента, исходя из цены лучшего спроса
и затем выводим на печать исходные данные
Код
firm=SPBFUT000000, acc=SPBFUT00049, client=SPBFUT00049, clas=SPBFUT, sec=GDH3
и результаты работы
функции  CalcBuySell  (для сравнения)
Код
price=1161.5,qtyB=12,qtyS=10
и функции getBuySellInfo (проверяем)
Код
tp={}
Qbuy=nil,Qsel=nilNQb=nil,NQs=nil
CalcBuySell  выдает какие-то значения,
getBuySellInfo выдает пустую таблицу tp  
================
Что не так c getBuySellInfo?
Попытка создать сервис на Lua
 
Цитата
SK172 написал:
в этом случае Quik не зависает, но и сервис тут же прекращает работу, не войдя в цикл
у меня работает. Добавил вывод значения счетчика.
просто скопируйте скрипт
Код
function main()
  count = 0;
  while is_run do
   sleep(1000);
      count = count + 1;
     message(tostring(count),1)
  end;
end;

function OnInit(pfile)
is_run = true;
end;

function onStop()
  is_run = false;
end;
Попытка создать сервис на Lua
 
попробуйте так:
Код
function main()
  counttick = 0;
  while is_run do
      sleep(100);
      counttick = counttick + 1;
  end;
end;

function OnInit(pfile)
is_run = true;
end;

function onStop()
  is_run = false;
end;
OnTransReply
 
Цитата
Михаил написал:
Цитата
nikolz написал:
 
Цитата
Михаил  написал:
OnTransReply()
 попробую пояснить.
--------------------------
этот колбек реагирует не на заявку, а на транзакцию.
Ему пофиг снял вы что-то или надели или одели.
Ему важно лишь транзакция исполнена или нет.
-----------------------
Попробуйте это понять.
Т е не надо ловить в нем вашу или не вашу заявку.
Это конечно можно делать и я ловлю, чтобы быстрее реагировать, но это сложно и в действительности не нужно.
------------------------------
Ловите свою заявку в колбеках заявок, а в этом колбеке надо ловить успешно или нет прошла вша транзакция.
Так в OnTransReply() я и ловлю успешность выполнения заявки отправленной с помощью sendTransaction(). sendTransaction() исполняется, а ответа в OnTransReply() нет.
поставьте вывод в лог или на экран самым первым оператором в функции OnTransReply
КРАШ -ТЕСТ терминала
 
к текущему моменту  в тесте  колбеки вызывались 3 млн 700 тысяч раз,
выставлено и снято  380 тысяч заявок по 922  инструментам
Внимание! Тормоза в версиях 9 и 10.
 
Вы изменения настроек на серверах брокерам сообщили?
А то похоже Сбербанк не знает.
Я у них 3 раза обновлял 8.7 на 9.7 и потом возвращал все в зад из-за тормозов.
Внимание! Тормоза в версиях 9 и 10.
 
вот вернул настройки портфеля как было по умолчанию и тормоза вернулись, но не полностью.
 
Внимание! Тормоза в версиях 9 и 10.
 
Цитата
Anzhelika Belokur написал:
nikolz, добрый день.

Цитата
nikolz написал:
Но данная проблема выявлена с вашем демо сервером. Полагаю, что он у Вас не устаревший.
Все верно, проблема была на нашем демо сервере из-за устаревших настроек, которые мы изменили на актуальные.
Цитата
nikolz написал:
Да , работает, но тормоза не только раздражают, но и существенно замедляют реакцию терминала на рыночные события.
Как/при каких обстоятельствах сейчас проявляются "тормоза"?
тормоза остались.
Если случайно выставил заявку ниже рынка
 
всегда продается и покупается по лучшей  встречной цене на рынке.
если лучшая цена  покупки 600 руб  а вы поставите продать по 20,то продадите по 600
-----------------------------------
но если рынок неликвидный и цена покупки 600 на 1 лот
и далее цена 100 1 лот
и цена 20 1 лот
и вы продаете по 20 три лота,
то догадайтесь сами по какой цене вы их продадите.  
OnTransReply
 
Цитата
Михаил написал:
OnTransReply()
попробую пояснить.
--------------------------
этот колбек реагирует не на заявку, а на транзакцию.
Ему пофиг снял вы что-то или надели или одели.
Ему важно лишь транзакция исполнена или нет.
-----------------------
Попробуйте это понять.
Т е не надо ловить в нем вашу или не вашу заявку.
Это конечно можно делать и я ловлю, чтобы быстрее реагировать, но это сложно и в действительности не нужно.
------------------------------
Ловите свою заявку в колбеках заявок, а в этом колбеке надо ловить успешно или нет прошла вша транзакция.
нет в документации
 
Цитата
Anzhelika Belokur написал:
nikolz, добрый день.

Постараемся пояснить по поводу отсутствия описания упомянутых Вами ошибок в нашей документации:
Вариант добавления диагностики "Превышена позиция по инструменту" в Руководство пользователя QUIK целесообразным не считаем, по скольку она возникает при различных настройках на стороне серверного ПО, данная ошибка может меняться в формулировке от версии к версии, но причина ее появления будет одна и та же - настройки на стороне сервера, с которыми необходимо разобраться, разбор каждого конкретного случая происходит индивидуально силами специалистов брокеров, которые при необходимости также консультируются у нас.
Повторимся - данная диагностика является специфичной, и каким-либо содержательным образом описать её для конечного пользователя, к сожалению, возможным не представляется.
При возникновении подобной ошибки - рекомендуется обращаться к Вашему действующему брокеру. В данном случае, если необходим разбор появления ошибки на сервере QUIK Junior - просьба сообщить ранее запрошенные детали.
Касательно ошибки "Превышен лимит отправки транзакций для данного логина" - это ошибка возвращается из торговой системы (на это должен указывать номер ошибки), и характерна, как правило, для срочного рынка.
Терминал может ретранслировать ошибки, посылаемые из ТС, но мы их не документируем, потому что это также подразумевает необходимость поддерживать список биржевых ошибок и их описание в актуальном состоянии, а это уже не является нашей прямой задачей, как разработчика. Описание ошибок может и должна предоставлять биржа.
При этом биржевые ошибки достаточно легко идентифицировать - по наличию номера ошибки в круглых или квадратных скобках.
В случае срочного рынка ещё есть подстрока "[GW]", и Вы, скорее всего видели такую диагностику: "[GW] Превышен лимит отправки транзакций для данного логина".
Т.о., за информацией о смысловом содержании той или иной биржевой ошибки следует обращаться либо напрямую на биржу, либо уточнять её причины через Вашего действующего брокера.
та вот это и напишите кратко в инструкции.
----------------------------
Если ваша прога что-то прокукарекала, то Вы должны сказать что-то про это,
а не заставлять пользующих гадать на кофейной гуще и отвлекать Вас от важных дел.  
КРАШ -ТЕСТ терминала
 
Добрый день,
----------------------
Написал скрипт краш-теста.
В целом результатами доволен.
Рассказываю подробности.
----------------------------,
Условия теста:
демо-сервер
версия терминала 9.7 ( тормозная)
--------------------
Робот на каждую принятую сделку по колбеку OnParam рассчитывает  цену на 20 шагов ниже цены последней сделки
определяет максимальное число контрактов для текущего инструмента функцией CalcBuySell
и выставляет заявку на покупку одного контракта по расчетной цене.
При очередном вызове колбека , робот  снимает все выставленные ранее заявки ,
проверяет отсутствие неисполненной транзакции и открытой заявки по текущему инструменту
и  при положительном решении, выставляет новую заявку.
--------------------
Результаты теста(фрагмент):
Код
31381.046s,240us, 28, 117, 30, 46.us, SFH3,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673016,#tparam=1,NNsec=908
31381.172s,613us, 55, 417, 47, 75.us, SiH3,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673018,#tparam=3,NNsec=908
31381.173s,284us, 30, 139, 24, 60.us, MXH3,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673019,#tparam=2,NNsec=908
31381.173s,214us, 19, 119, 24, 34.us, MMH3,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673020,#tparam=1,NNsec=908
31381.177s,361us, 37, 206, 33, 54.us, RMH3,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673022,#tparam=2,NNsec=908
31381.177s,210us, 22, 105, 28, 38.us, RIH3,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673023,#tparam=1,NNsec=908
31381.244s,385us, 53, 155, 83, 81.us, CRH3,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673026,#tparam=2,NNsec=908
31381.244s,195us, 21, 81, 28, 39.us, MXH3,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673027,#tparam=1,NNsec=908
31381.247s,312us, 36, 156, 38, 55.us, SVH3,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673029,#tparam=1,NNsec=908
31381.249s,231us, 25, 106, 32, 43.us, SiH3,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673031,#tparam=1,NNsec=908
31381.254s,3448us, 3115, 216, 41, 3131.us, USD000UTSTOM,ns_CETS=15,sumT=8188,Norder=277953,jc=2673033,#tparam=4,NNsec=908
31381.257s,2656us, 2414, 159, 24, 2429.us, CNYRUB_TOM,ns_CETS=15,sumT=8188,Norder=277953,jc=2673034,#tparam=3,NNsec=908
31381.26s,3379us, 3135, 159, 24, 3150.us, EUR_RUB__TOM,ns_CETS=15,sumT=8188,Norder=277953,jc=2673035,#tparam=2,NNsec=908
31381.263s,2509us, 2292, 137, 23, 2307.us, USDCNY_TOM,ns_CETS=15,sumT=8188,Norder=277953,jc=2673036,#tparam=1,NNsec=908
31381.37s,465us, 60, 223, 90, 83.us, USDRUBF,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673037,#tparam=3,NNsec=908
31381.37s,181us, 22, 75, 27, 39.us, TTH3,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673038,#tparam=2,NNsec=908
31381.37s,184us, 22, 85, 24, 38.us, SiH3,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673039,#tparam=1,NNsec=908
31381.373s,496us, 37, 140, 34, 54.us, GKH3,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673041,#tparam=1,NNsec=908
31381.374s,389us, 34, 192, 70, 64.us, GKH3,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673043,#tparam=2,NNsec=908
31381.375s,186us, 25, 77, 25, 42.us, SPH3,ns_SPBFUT=35,sumT=8188,Norder=277953,jc=2673044,#tparam=1,NNsec=908
Время работы теста составило примерно 12000 секунд( примерно 1.5 часа)
За это время колбеки вызывались 2 млн 670 тысяч раз,
выставлено и снято заявок 278 тысяч
инструментов  908 (акции валюта фьючерсы)
среднее время на одну заявку составляет примерно 2.5 ms, максимальное 8 ms, минимальное 0.25 ms.
из 2.5 ms одного цикла выставления заявки, 2.2 ms уходит на  функцию CalcBuySell.
уж не знаю, что туда напичкали, если на все остальное у робота уходит в 10 раз меньше,чем на эту функцию.
На обработку колбеков заявок и транзакций уходит 0.05 до 0.1 ms.
-------------------------------------------
Размер скрипта 600 строк LUA+ DLL для обработки событий и расчета времени с квантом 0.1 мкс.
 
OnParam и ТТТ
 
Цитата
AndyWise написал:
Вопрос по ТТТ, как говорили выше, она формируется срезами и пакетами.  Допустим пакет с ценой LAST отправляется каждые 100 мс. А в нем 10 срезов, каждый 10мс.Так вот, эти 10 мс формируются по простому, просто как есть на «сейчас».  Либо второй вариант, в эти 10 мс  (за 10мс) можно запихнуть Hi, Low, Now. По сути, по мотиву свечей, пропуск данных нивелирует Мин/Макс за период обновления.
Срез - это значения параметров на момент среза
Last - это цена последней сделки на момент среза.
Если в пакете несколько срезов то и цен несколько. Актуальная всегда последняя.
Hi, Low - это понятия относятся к интервалу наблюдения  Например торговый день или свеча с интервалом 1 минута.
TTT к этому не имеет никакого отношения.
OnParam и ТТТ
 
Цитата
Александр написал:
Цитата
nikolz написал:
если Вы используете sleep
А есть пример без использования sleep?)
можно sleep не использовать если комп многоядерный, но тогда  одно ядро будет занято и при отсутствии  сделок.
Например,  В тесте у меня Загрузка без слипа примерно 30% со sleep(1) 3-10%
------------------
если делать совсем правильно, то надо использовать события ядра OC или атомарные операции совместно с Shared memory
------------------
Я использую внутри скрипта события ядра, а между скриптами и приложениями  Shared memory . Загрузка процессора не более 3%.
OnTransReply
 
Цитата
Михаил написал:
Добрый вечер!
У меня в скрипте Lua не срабатывает OnTransReply.
В начале при выставлении заявки он отрабатывает, а при удалении этой заявки нет.
Посоветуйте, пж, что делать?
поставьте вывод в лог файл,
покажите скрипт .
нет в документации
 
Цитата
Дмитрий написал:
По п. 2, возможно, это поможет  https://forum.quik.ru/forum10/topic5970/
Спасибо, понятно.
Страницы: Пред. 1 ... 15 16 17 18 19 20 21 22 23 24 25 ... 72 След.
Наверх