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

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

Страницы: Пред. 1 ... 49 50 51 52 53 54 55 56 57 58 59 ... 72 След.
Торговля в двух и более терминалах на LUA
 
еще можно через DDE и подобные механизмы.
Так как DDE - это обмен через память, то работать будет быстро.
Но судя по уровню задающего вопросы, рекомендую просто запустить скрипт на каждом терминале.
Матлаб из Клуа
 
из собственного опыта.
Я использовал из матлаба любые методы следующим образом:
1) Пишем программу в матлаб.
2) Преобразуем ее средствами матлаб в прогамму на С либо С++ (по вкусу)
3)  создаем DLL.
4) Подключаем DLL к LUA.
5) работаем в реале без загрузки матлаба и с высокой скоростью.
 
Описания полей, Не хватает данных в справочнике
 
Цитата
Sergey Gorokhov написал:
Цитата
Николай  Камынин   написал:
информацию можно получить по любому полю из любой таблице,
используя экспорт DDE в excel,
включив "С заголовками столбцов" и "Формальные заголовки"
Это работает только для таблицы Params, для остальных совпадение не гарантируется.
На старых версиях проверял для все таблиц все совпадало.
Описания полей, Не хватает данных в справочнике
 
информацию можно получить по любому полю из любой таблице,
используя экспорт DDE в excel,
включив "С заголовками столбцов" и "Формальные заголовки"
неужели OnParam самый быстрый?
 
Цитата
Старатель написал:
Чтобы узнать, кто пришёл раньше, атомные часы не нужны. Есть такое понятие, как точка отсчёта.
    Скрытый текст          
По оси х отложено время получения колбэка (в мс) с момента начала отсчёта.
В OnParam - только параметр LAST, никаких стаканОв.
Данные с боевого сервера - незадолго до окончания торгов.
Вас не смущает задержка в 160 мс? Это на сервер в москве!!!
О какой скорости вы тогда говорите?
Это даже не велосипед, а скорее телега какая-то.
---------------------------------
Как Вы узнали что в OnParam нет лучшей цены?
Вы в ТТП отключили все параметры кроме LAST?
пинг брокеров
 
Цитата
Космонавт написал:
Николай, у Открытия этого параметра нет в Информационном окне. Это не только у меня, я у многих спрашивал, в том числе у менеджера когда счёт открывал. Там у всех пусто...
Эта странность у них на всех серверах
У меня этот параметр есть и он соответствует субъективному ощущению задержки сервера.
Вообще-то для оценки пинга до сервера я делал функцию пинга для луа и встраивал ее в скрипт.
пинг брокеров
 
Цитата
Космонавт написал:
Николай,
tracert Неттрейдера


tracert Открытия


Я правильно понял, что путь к Открытию - короче, чем к Неттрейдеру (меньше узлов). То есть Открытие с этой точки зрения предпочтительнее?
У неттрейдера вообще сервер в зоне Net  какой-то мутный. У Открытия безусловно лучше.
Вообще-то по моим наблюдением скорость у открытия лучше, чем у некоторых других брокеров.
неужели OnParam самый быстрый?
 
Цитата
Космонавт написал:
Мой скрипт выложен вверху. Кто первый пришел и записался в лог тот и победил.
А Вы внимательно посмотрите на время в ваших логах.
onparam приходит раньше не потому что в нем цена сделки, а потому что в нем цена из стакана.
Т е стакан меняется чаще и раньше чем совершается сделка.
Если время одинаковое то onparam  вызывается перед вызовом других колбеков.
Но оnparam  медленный колбек так как при работе в нем вы вынуждены ходить в хранилище за нужными параметрами.
Поэтому полагаю, что  onparam - это самый затратный колбек.
Проблема запуска скрипта на Lua, Квик не видит core.dll
 
Цитата
dmitry dorjiev написал:
Цитата
Николай  Камынин   написал:
Цитата
dmitry dorjiev   написал:
Да, про ssl это я не то написал, потом с новой библиотекой пробовал только сокет, ошибка была Unknown error. Possible unhandled exception. Про ssl пожалуйста игнорируйте :).
В первом случае не находилась не вызываемая библиотека,
а одна из тех, которая используется внутри этой библиотеки.
Чтобы найти , что надо еще используйте прогу depends,
чтобы найти зависимости.
Про ssl и про core.dll уже не надо, сейчас ошибка Unknown error. Possible unhandled exception. при попытке подгрузить socket (это после того как я поменял бинарники на скачанные из github'a).
Это сообщение означает, что встретился глюк в коде, который никто из разработчиков не знает , либо не захотел делать на него ловушку.
пинг брокеров
 
Цитата
Космонавт написал:
сравниваю двух брокеров - Неттрейдер и Открытие.
Когда открывал счёт в Открытии, опасался что через них данные будут приходить медленно и заявки отсылаться тоже медленно. У них много клиентов, канал забит, и мои заявки будут долго улетать на биржу. Я когда-то был сотрудником брокера с единственным сервером. Хорошо помню, как мои многочисленные заявок вешали сервер и у других клиентов, по разным городам и весям из за моего робота медленно уходили заявки. Моя активность приводила к задержкам у клиентов до 5 секунд. То есть я могу столкнуться с таким же дефектом у любого крупного брокера с гигантским количеством клиентов. Открытие - топ брокер, поэтому как раз в группе риска.

Но к моему удивлению, серьёзных претензий к Открытию нет. Скорость улёта-прилёта заявки сегодня была 30-75 миллисекунд на обычный сервер, не выделенный. Заявки уходили с московской виртуалки, измерял через OnTransReply.
Теперь перехожу к вопросу.
Я научился пинговать. Хе-хе. Пингую, сравниваю. Вот пинг Неттрейдера.


Вот пинг Открытия



Открытие существенно обгоняет.
 Вопрос 1.   О чём говорит это превосходство в скорости? О железе блокера или об интернете брокера или о том и другом сразу?
 Вопрос 2.   У Открытия несколько серверов, но пропинговать получается только первый. На остальных - превышен интервал ожидания. Как их пропинговать? Или это невозможно?

Вот ай пи серверов Открытия. Пингуется только первый.

Спасибо за помощь.
Посмотрите tracert  маршрут и Вам будет все ясно.
Еще рекомендую посмотреть В квике в информационном окне в расширенном варианте параметр "Задержка данных при обмене с сервером"
и сравнить для двух брокеров.
----------------------------
Задержка в 30-75 мс при пинге в 2 мс - это много.
неужели OnParam самый быстрый?
 
Цитата
Космонавт написал:
тестирую эти же колбеки на другом брокере - Открытие.
Всё то же самое, но чуть чуть отличается.
ОнПарам по прежнему самый быстрый.
OnAllTrade приходит вторым , но цифра в миллисекундах почти всегда загадочно совпадает с приходом ОнПарам
Вот так:
Цитата
01/10/17 13:10:18,792 APTK пишет OnParam OB 10.31 time_diff=56687
01/10/17 13:10:18,792 APTK пишет OB OnAllTrade 10.31 time=13:10:18 675 675329 time_diff=0
01/10/17 13:10:18,885 APTK пишет OB DataSource 10.31 time_diff=95
редко-редко OnAllTrade приходит с другой цифрой в миллисекундах - на квант позже:
Цитата
01/10/17 12:49:45,674 APTK пишет OnParam OB 10.31 time_diff=288303
01/10/17 12:49:45,690 APTK пишет OB OnAllTrade 10.31 time=12:49:45 485 485692 time_diff=15
01/10/17 12:49:45,690 APTK пишет OB DataSource 10.31 time_diff=0
Ну и колбек ДатаСорс всегда третий. Он самый тормозной у Открытия, но успешно конкурирует (не уступает) с OnAllTrade у предыдущего брокера (НетТрейдер)

Бывает, что всё втроём приходят одновременно (Открытие), но не было случая, чтобы ОнПарам пришёл НЕ первым.
Цитата

01/10/17 13:19:17,807 APTK пишет OnParam OB 10.31 time_diff=8750
01/10/17 13:19:17,807 APTK пишет OB DataSource 10.31 time_diff=0
01/10/17 13:19:17,807 APTK пишет OB OnAllTrade 10.31 time=13:19:17 737 737640 time_diff=0
Не знаю как Вы тестируете, но надо делать так:
1) синхронизируете свой комп от атомных часов При этом надо настроить параметры синхронизации и дождаться когда рассинхронизация станет меньше 10 мс.
После этого делаете замеры относительно локального времени компа.
В результате Вы получите задержку времени относительно биржевого, а не относительно сервера брокера.
-----------------------------
2) можно дополнительно использовать rdtsc, чтобы измерить скорость исполнения отдельных функций.
-----------------------
вот тогда Вы увидите много интересного.
например можете увидеть,
что информация с различным временем приходит одновременно.
---------------------------
Повторю еще раз - информация приходит пакетами и в пакете может быть все и onparam и alltrade, а разбор их зависит в том числе и от порядка вызова функций, возможно onparam вызывается перед alltrade.
--------------------------
Но это все мало соответствует реальной задержки данных относительно биржевого времени.
измерить скорость выставления заявки
 
Цитата
swerg написал:
Цитата
Николай  Камынин   написал:
Цитата
Про МБ, но никто не заприщает делать так.
Полагаю Вы знаете, что на бирже торгует брокер, а не его клиенты.
запрещает.
у вас есть номер биржевой сделки, если на бирже такой нет - смело в суд
Это вы размечтались.
Почитайте регламент, закон о рынке ЦБ, методические указания надзорных органов, ГК РФ и найдите там основания для Вашего смелого похода в суд.
кратко поясню - вы подали заявку и указали цену по которой надо купить/продать - брокер исполнил ваше поручение по указанным Вами параметрам.
Какие претензии? Никаких. Так как основные параметры - это наименование товара и его цена а не место где этот товар купить.
Да и какая вам разница, в каком месте вам купили то, что вы хотели и за сколько Вы хотели? Хоть в китае. Верно?
Ядра процессора
 
Цитата
Космонавт написал:
Станислав, вопрос не про скорость процессора, а про количество ядер. Если при 4 ядрах загрузка ниже 50%, какой смысл держать 4 ядра, может можно понизить до 3?
Теоретически:
одно ядро - ввод-вывод с внешних накопителей
одно ядро - работа с каналами связи
одно ядро - обслуживание основного потока КВИК
по ядру на каждый торгуемый инструмент
итого примерно 4000 ядер для торгов на ММВБ
еще несколько десятков тысяч ядер для торговли на западных площадках
правда программу надо писать на CUDA и ставить  NVIDIA
и это уже будет не КВИК.
А для КВИК хватит и двух и даже одного.
как говориться, от числа колес скорость велосипеда не зависит.
Amibroker из Клуа
 
Цитата
валерий написал:
Пытался подключиться к Ами
Код
  require  "luacom" 
ami  =   luacom.CreateObject ( "Broker.Application" )
ami.Visible  =   true 
aa  =  ami:LoadDatabase( "D:\\PF\\AmiBroker\\DB\\trade" )
  
Работает. Но дальше облом...
Код
  qq  =  ami:Import( 0 ,  "c:\\valg\\rt.txt" )  
Ошибки не выдает, но и ничего не делает (в логах импорта Ами просто пусто).
Код
  st  =  ami.Stocks:Add( "RTSI" )  
Ошибка - attempt to index field 'Stocks' (a function value)

Может кто что подскажет?
Я для работы с амиброкером  делал свои плагины на СИ и для  ами и для квика.
У амиброкера есть хороший api и хорошее описание.
Ядра процессора
 
Рекомендую сделать хронометраж а потом принимать решение.
Но если нужна действительно скорость то надо уходить на прямое подключение к бирже либо выделенный серевер у брокера (есть предложения у некоторых брокеров)
измерить скорость выставления заявки
 
Цитата
swerg написал:
Цитата
Николай  К  
Все зависит от алгоритма реализации сервера брокера.
Например, никто не запрещает брокеру самому гасить встречные заявки клиентов .
мы же про МБ, да?!
тогда странно слышать такое.
Про МБ, но никто не заприщает делать так.
Полагаю Вы знаете, что на бирже торгует брокер, а не его клиенты.
Проблема запуска скрипта на Lua, Квик не видит core.dll
 
Цитата
dmitry dorjiev написал:
Да, про ssl это я не то написал, потом с новой библиотекой пробовал только сокет, ошибка была Unknown error. Possible unhandled exception. Про ssl пожалуйста игнорируйте :).
В первом случае не находилась не вызываемая библиотека,
а одна из тех, которая используется внутри этой библиотеки.
Чтобы найти , что надо еще используйте прогу depends,
чтобы найти зависимости.
измерить скорость выставления заявки
 
Цитата
Космонавт написал:
Добрый день.
Как быстро моя заявка попала в стакан?
Если я засекаю время и пользуюсь OnTrnsReply, то информация о времени придёт увеличенная: заявка улетит на биржу (тратится время), а обратно придёт ответ (тратится время). Мне нет дела знать, сколько шёл ответ, мне надо знать когда заявка появилась в боевой очереди в стакане на бирже.
Как это сделать?

Сейчас я считаю так:
Код
   function   OnTransReply (reply)
        orders[reply.trans_id].tr_receive_time =  os.clock ()    
         local  latency = (orders[reply.trans_id].tr_receive_time - orders[reply.trans_id].tr_send_time) *  1000 
 end   

ну и перед отправкой засекаю через  os.clock()    
В итоге полученное время дольше, чем есть на самом деле из за того, что ответу нужно идти ко мне в терминал, хотя заявка на бирже уже стоит.
Не факт, что заявка в стакане - это заявка на бирже.
Поэтому в стакане заявка может быть моментально, как только ее принял брокер.
Все зависит от алгоритма реализации сервера брокера.
Например, никто не запрещает брокеру самому гасить встречные заявки клиентов .  
неужели OnParam самый быстрый?
 
Полагаю, что все общие данные такие как ТВС и ТТП передаются блоками по таймеру.  Но в ТВС помещаются все данные за интервал передачи, а в ТТП лишь данные на момент передачи.
Интервал передачи ТТП меньше чем интервал ТВС, так как ТТП содержит более быстро меняющиеся данные такие как лучшая цена.
Поэтому onParam будет срабатывать чаще.
два робота в одном квике
 
еще замечу следующее.
про быстродействие.
Винда не является системой реального времени.
А именно к задачам реального времени относятся торговые роботы.
Что это означает?
Это означает тот факт, что если у вас работает на компе еще несколько приложений, например стоит обозреватель и вы еще на форуме трындите, то квик будет работать тогда, когда ему система даст квант времени. А это может быть и через 100 мс и через секунду.
--------------------------
Кроме того, в винде есть механизм уменьшение нагрузки на выход в интернет при коротких пакетах. А заявка - это и есть короткий пакет.
Как правило, при действии этого механизма  (Алгоритм Нейгла) короткий пакет может отправлять с задержкой 200 мс.
------------------------
Кроме того, при работе через КВИК, все ваши заявки попадают сначала на сервер брокера для проверки лимитов, потом идут на биржу.
Как известно, скорость работы ядра сервера КВИК не более 1000 транзакций в секунду.
Это означает, что если на сервер пришло в секунду 1000 заявок от клиентов брокера, то последняя попадет на биржу через 1000 мс.
------------------------
Можно долго обсуждать данную тему.
Но хочу заметить, что QUIK - это инструмент для подаче поручений брокеру любителями, а не средство профессиональных биржевых игроков , поэтому смотрите на его возможности адекватно его назначению.
два робота в одном квике
 
"Позвольте пару слов без протокола.."
Будем рассматривать работу на многоядерном компе.
---------------------------------
Колбеки.
Полагаю, что в QLUA сделано так, что одноименные колбеки - это таблица указателей на соответствующие функции в скриптах.
Т е например колбек  OnOrder.
Если запускаем две скрипта в которых стоит этот колбек, то в основном потоке будет стоять последовательно два вызова функций этой функции из каждого скрипта.
Как это можно ускорить?
Есть несколько способов.
Вот для примера два из них, которые я делал сам.
------------------------------
Вариант1.
В скриптах создаем пулы потоков для каждого типа колбеков.
Внутри колбека  запускаем соответствующий поток.
При этом потоки можно выделять на каждый инструмент.
Сколько инструментов - столько потоков.
-----------------
Сложность этого варианта в создании и управлении пулами потоков.
---------------------------------
Вариант 2.
На каждый колбек пишем свой скрипт. Его так и называем OnOreder, onParam и т д
Внутри скрипта функция колбека сразу передает управление в Main.
в результате скриптов будет по числу колбеков.
Кроме того , для каждого робота пишем свой скрипт.
т е к колбекам добавляются скрипты роботов
При этом в роботах нет колбеков.
----------
Сложность этого варианта в синхронизации потоков.
Создавать потоки не надо, так как они создаются средствами QLUA.
---------------------------
два робота в одном квике
 
Цитата
Космонавт написал:
Цитата
Сергей Дворцов   написал:
Раундтрип самой быстрой заявки в Квике будет 150 мс
вот мои свежие логи

01/06/17 10:13:06,864 sec_code=MSNG;price=2.4205;client_code=000;balance=0;time=101308;status=3;qty=3;class_code=TQBR;trans_id=532782944;account=Y01+00000B00;exchange_code=;quantity=3;firm_id=MC0020800000;flags=262145;result_msg=(160) Заявка на покупку N 15836586314 зарегистрирована.;brokerref=/1.5774;order_num=15836586314;R=532782944;server_trans_id=329;uid=6695;ordernum=15836586314;
01/06/17 10:13:06,864 532782944   zaderzhka 30.999999988126  

01/06/17 10:13:06,973 sec_code=MSNG;price=2.4205;client_code=000;balance=0;time=101308;status=3;qty=3;class_code=TQBR;trans_id=1623615465;account=Y01+00000B00;exchange_code=;quantity=3;firm_id=MC0020800000;flags=262145;result_msg=(160) Заявка на покупку N 15836586321 зарегистрирована.;brokerref=/1.5774;order_num=15836586321;R=1623615465;server_trans_id=329;uid=6695;ordernum=15836586321;
01/06/17 10:13:06,973 1623615465         zaderzhka       31.000000017229  

Задержка 30 миллисекунд. Это время между отправкой и получением ответа. Виртуалка в москве, обычный КВИК.
это скорее всего квант винды для процесса. он кратен 10 мс.
либо задержка сервера брокера
Замечу, что если два скрипта в одном квике, то колбеки будут выполняться последовательно а не параллельно.
потому что колбеки исполняются в основном потоке квика и не зависят от числа скриптов.
просто для каждого скрипта будет дублироваться вызов колбека. т е колбеков будет в два раза больше.
Чтобы колбеки исполнялись параллельно надо внутри колбеков открывать потоки.
А луче (я делал именно так) колбеки выносить в отдельные скрипты. В резлутате будет вообще-то, для каждого колбека будет свой поток.
Тэйк-профит: старые песни о защитном спрэде, Возможные сюрпризы при совершении сделки по тэйк-профиту
 
Цитата
Алибек Хакиев написал:
Цитата
Zoya Skvorcova   написал:
Алибек Хакиев  , добрый день.
Если цена с отступом у Вас 98, то и отнимать спред надо от этой цены.
Спасибо. Означает ли это, что моя лимитированная заявка на продажу в этом случае попадет на биржу по цене не хуже "98 - защитный спред"?
Не забывайте тот факт, что на сервере с такими стопами сотня а то и тысяча клиентов (как правило стопы стоят в одном месте, так как все смотрят графики по одним и тем же книжкам )
Т е Ваш стоп может быть надцатый. И при обвальном рынке ваша заявка на бирже может быть где угодно и когда угодно.
100% Гарантий, что цена будет 98 -защитный спред нет.
Робот на Луа +API брокера
 
можно вызвать функции питона из луа:
http://stackoverflow.com/questions/20400390/how-to-call-a-python-function-from-lua
Робот на Луа +API брокера
 
Вы также можете установить модуль websocket на луа и писать на луа то, что написано в пример на сайте для websocket
https://luarocks.org/modules/lipp/lua-websockets
https://github.com/lipp/lua-websockets
Робот на Луа +API брокера
 
здесь https://github.com/socketio/socket.io-client-cpp
socketio на C++.
Можете вставить его в LUA и будете работать из LUA (QUIK)  с вашим брокером.
Робот на Луа +API брокера
 
https://habrahabr.ru/post/126105/
Робот на Луа +API брокера
 
https://copist.ru/blog/2014/08/29/best-tools-for-testing-php-code-online/
Робот на Луа +API брокера
 
Цитата
Космонавт написал:
Долго об яснять. Так у них устроена ЕДП. Это часть настроек админки. Программа BO Client кажется. Пониженное ГО делалось бы через маржинальность фьюча. Но речь не об этом.
Тут беседа уплыла в сторону от вопроса который меня интересует
Там есть примеры обращения. Это обычные обращения к серверу через сокет.
Надо использовать указанные языки, либо поставить обертку для API на LUA .
Но с этим надо разбираться Вам самому.
Робот на Луа +API брокера
 
Цитата
Космонавт написал:
У моего брокера есть необычная странность. Если я сегодня поторговал акциями с плечом, внутри дня вошёл и вышел, ночевал в кэше, на следующий день я всё равно не смогу торговать через КВИК фьючерсами. Будет ошибка Превышен лимит. В брокере мне объяснили, что это из за Т+2. На следующий день по Т+2 у меня нет денег, - они "в пути".
В то же время, торговать через брокерскую платформу (веб-терминал) можно и через API можно. Поэтому вопрос.
Как мне отправлять транзакции через АПИ брокера.
Вот исходные данные.
1. У меня робот на луа. Он делает анализ.
2. При наличии сигнала нужно отправить транзакцию через АПИ

Вот коды, которые предлагает брокер:
Там есть примеры для Browser / PHP / PHYTON

https://tradernet.ru/tradernet-api/orders-send

Отлично что есть примеры, но я не могу понять что мне с ними делать. Нужен какой то дополнительный софт? Нужно ли ставить платформу для питона или пхп? Прошу подсказать для чайника что делать чтобы отсылать эти приказы.
Спасибо
По содержимому сайта, tradernet - это не брокер, это "кухня",поэтому у вас такие заморочки.
Для начала выясните у них наличие лицензии.
совет - торгуйте через реального брокера.
Обезличенные сделки за прошлые торговые сессии
 
Цитата
Виктор Столетов написал:
Цитата
Сергей Николаев   написал:
Насчет МаркетМейкера напишу пару слов.
МаркетМейкер устанавливает цену открытия торговой сессии.
МаркетМейкер может "придержать" движение цены в определённую сторону.
"Придержать" это значит, что он может размещать очень крупные ордера на покупку и/или на продажу с целью остановить мелких трейдеров и/или скальперов. Позиционщиков это не сильно остановит или испугает, если они увидят очень крупные объёмы против их позиции.
А что, такое  объяснение выглядит  правдоподобно. Если ММ выставил такой большой фиктивный ордер например на покупку, то это психологически может не только остановить внутридневных трейдеров от продажи, а наоборот подтолкнет их к покупке. Парни смотрят на стакан и думают: раз толстосумы покупают, значит время покупать, а не продавать.
 Спасибо вам Сергей за подробные разъяснения.
 
Насчет стакана интересно узнать мнение бывалых:  кого больше -  тех, кто открывается по рынку или тех, кто выставляет лимитные ордера?  
У меня опыта по акциям нет, а есть некоторый опыт на  форексе. Там  имеется 4 типа отложенных ордеров  - buy stop, sell stop, buy limit и sell limit.  Аналогов первых двух в Quik нет. Смысл например  buy stop в том, чтобы установить цену покупки выше текущей, и когда цена  развернется  вверх, ордер сработает.  Это разумно и даже в help по Metatrader4 написано, что чаще всего выставляют именно ордера buy stop и sell stop.  Однако если в Quik выставить заявку  типа buy stop на покупку по цене выше рыночной, то она сработает сразу же по текущей цене!  
На мой взгляд выставлять ордера типа buy limit и sell limit или лимитные ордера по акциям – не очень умная стратегия. Потому что например при лимитном ордере на покупку цена боле вероятно опустится  еще ниже установленной в ордере цены, чем пойдет  вверх. Еще как то может быть оправдано  установить цену на покупку ниже рыночной цены у уровня поддержки, но все равно рискованно.   Так что стакан похоже не лучший показатель общей картины по акции.  
В качестве лекбеза.
Рынок двигают рыночные цены.
Задача ММ  - сужение спреда. Ему собственно за это и платят. Т е по-определению ММ играет против рынка. Т е он получает свои копейки если цена бьет в его ордер, иначе биржа ему не платит.
Но есть еще инсайд. Его прекрасно знаю те, кто в яме.
Когда крупный игрок заходит в рынок ММ не будет играть против, а просто станет с ним в тренд и получит свои на игре как дилер.
Остальному планктону как повезет.
Кажется ошибка в OnCalculate в версии 7.6
 
Цитата
Борис Гудылин написал:
Цитата
Тут что-то попроще. Вот только один график. Ни свечи, ни объема. Версия 7.6. Индикаторы ломаются. Геометрия поломается.
[img]file:///F:/!!ScreenCaptures/PFE/gold.png[/img]
Возможно у Вас в параметрах диаграммы стоит галочка в "Показывать пустые интервал" Попробуйте ее убрать.
Кажется ошибка в OnCalculate в версии 7.6
 
Цитата
Sergey Denegin написал:
Цитата
Sergey Gorokhov   написал:
И это правильно, так как отсутствие свечи это отсутствие данных.
Что же тут правильного? Если свечи нет, то не должно быть и вызова OnCalculate на эту свечу. Если же свеча вызывается, то логично, чтобы для этой свечи существовали те параметры, которые про нее известны. Логично, что цена отсутствует, тогда и пусть будет nil. Но у этих пропущенных свечей есть время. ТАк почему тогда время должно равняться для них nil? В чем логика?
Вызов OnCalculate происходит потому, что на одном графике свечи есть, поэтому он вызывается и для другого, где свечей нет, но оба графика в одном окне. Попросите разработчиков разделить вызов для графиков.
Скорость обработки
 
Цитата
Космонавт написал:
Хм. Тогда ещё вопрос.
Вот мой колбек.
Код
   function   mycallbackforallstocks (class,sec,index)         

расчёт логики, трудоёмкий процесс анализа
   
 end 

 function   DataSource (class,sec,interval)
   ds[sec]  =   CreateDataSource (class,sec,interval)
   ds[sec]: SetUpdateCallback ( function ( .. .) mycallbackforallstocks(class,sec, .. .)  end )
    return  ds[sec]
 end   
пока считается логика, успевает прийти ещё одна сделка по другому инструменту. Или по этому же инструменту.
Обработается ли она? Или будет пропущена и забыта?
Все Колбеки работают в одном потоке.
Программировать на Луа для Плазы
 
Цитата
Космонавт написал:
Уж простите за странный вопрос. Можно ли писать на Луа роботов для Плазы?
Увы, я кроме Луа ничего не знаю... А то корявое что я умею писать на Луа  - далось с огромным трудом.
Учить Си++, Джаву и Си# для меня долго...
Спасибо за ответ.
Если найдете модуль  луа для работы с плазой.
Фактически это библиотека аналогично QLUA.
Т е кто-то напишет на СИ вызов функций плазы из VMLua.
Склейка данных для Амиброкера
 
при экспорте надо закачивать данные последовательно с нарастанием даты иначе амиброкер начинает перебирать и замещать данные и все делается очень долго.
Склейка данных для Амиброкера
 
Цитата
Orange2000 написал:
Добрый день. Являюсь клиентом Альфы. Перешел на квик. Возникла проблема.

Скачиваю с финама минутки (примерно за 1 год) фьючерса РТС. И в формате txt и как тут ниже советовали в формате csv. экспортирую в ами. Все хорошо отображается, но экспорт не идет. На чистую идет, но там (у Альфы) история с 1 декабря почему-то.

менял всячески настройки экспорта в квике. Ничего не получается.
В свое время с Альфа Директом таких траблов не было.

Подскажите где копать?
рекомендую делать так.
Скачивайте с сайта финам  в формате txt порядок значений настраиваете при экспорте в амиброкер аналогично скаченному.
Все склеивается без проблем. Склеивал историю за 10 лет на минутке по любым инструментам.
Что срабатывает быстрее?
 
самый тормозной колбек это OnParam
В этом случае Вы получаете любое изменение ТТП,
а за последней ценой приходится лазить в хранилище.
Почему медленно работает код
 
вообще-то Вы опять не правильно делаете.
Расчет надо делать в колбеках. либо в майн по флагу из колбека.
Ваш вариант функции main очень плохой.
Почему медленно работает код
 
Цитата
Космонавт написал:
Добрый день.
Два дня мучился, осваивал работу через DataSourse. Заработало. Но код работает в 5 раз медленнее, чем когда я получал данные индикатора через идентификатор.

Прошу подсказать почему.
Вот код. Боллинджер считается внутри файла BB.lua, который выложили разработчики вот здесь:
ftp://ftp.quik.ru/public/INDICATORS.zip
Код
   

А теперь - самое интересное. Места с задержками. Где скорость как у ласточки я не трогал, подсветил только места задержек:
Цитата
То есть задержка то есть, то нету. Она равна 15 миллисекунд. И она бывает не только между 3 и 4, но и на разных участках кода. Вот например между 1 и 2 шагом.
Цитата
Вопросы.
1. Почему происходят эти задержки?
2. Почему на разных участках кода?
3. Рационально ли составлен код?

Спасибо.
задержка в 15 ms смахивает на квант для процесса
Попробуйте оставить из запущенных задач лишь квик и посмотрите задержку.
Вычисление индикатора внутри кода
 
Цитата
Космонавт написал:
Николай, спасибо за ответ.
Приведите пожалуйста формулу мувинга, которую Вы рекомендуете, там где  1 деление +1 вычитание+1 сложение.
вот код мувинга без циклов:
Код
Settings = {
Name = "*nkSMA",
Period = 9,
line = {{Name = "nkSMA",Type = 1, Color = RGB(255, 0, 0)}}
}

function Init()
   return #Settings.line
end

local P,i1,NP;
function OnCalculate(i)
   local Out=C(i);
   if i==1 then
      S={}; P=Settings.Period; NP=1/P;
   else
      if i<=P then  Out=(Out+i1*S[i1])/i;
      else  Out=S[i1]+ NP*(Out-C(i-P));  end
   end
   i1=i;  S[i]=Out;
   return Out
end

Вычисление индикатора внутри кода
 
Цитата
Космонавт написал:
Сейчас формула такая.
На примере 5-периодной Moving Average:
Код
   ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  ..  .. 
ds =  CreateDataSource (p_classcode, p_seccode, INTERVAL_M1)    
ds: SetUpdateCallback (cb)

    
     while  is_run  do 
    length = ds: Size ()
    sum =  0 
         for  i =  0 , 4 , 1   do 
            sum = sum + ds:C(length - i)    
         end 
    moving5 = sum/ 5 
     sleep ( 100 )
     end 
 end 

  
Есть два момента, которые необходимо учитывать:
----------------------------------------------
1) Расчет надо делать для двух состояний: а) свеча закрыта б) свеча открыта.
Либо лишь состояние а), которое надо обнаружить. состояние б) существует лишь на последней свече и лишь в режиме торгов.
Поэтому у Вас расчет последней свечи содержит ошибку.
--------------------------------------------------------------------
2) Не надо использовать циклы.
Циклы -это зло в системах реального времени.
Можно вычислить мувинг затратив лишь 1 деление +1 вычитание+1 сложение для любого значения параметра N.
У Вас N всего 4, а некоторые (обращались ко мне с такой проблемой) используют 1000000 (сто тысяч) Вот и посчитайте мколько времени у Вас будет считаться мувинг встроенным индикатором или вашим ( у обращавшихся квик виснул )
-----------------------------
 
Порядок создания callback-обработчиков
 
Цитата
El El написал:
Цитата
swerg   написал:
Цитата
El El   написал:
Цитата
swerg   написал:
Любопытно, кстати: зачем генерировать обработчики в run-time?
Один из случаев, который был бы удобен многим, чтобы упрощать слежение корректности стейта. Сейчас, например, если есть поведение, зависящее от стейта, то нужно в каждом коллбеке делать проверки на то, от чего он зависит. Если бы можно было переназначать обработчики, то вся вариативность бы укладывалась бы в одом if-е в каком-нибудь OnInit, где инициализируются и переменные, и функции обратного вызова. Таким образом, можно было бы добиться инкапсуляции данных и поведения "для бедных" в Lua.
можно как-то на примере?
Было бы:
Код
  Инициализация_скрипта:
  x  =  внешние_данные
   if  (x  =  =  A)
    дополнительная манипуляция над данными
     if  (x.z  =  =   1 )
       манипуляция_состоянием 1  .. .
       OnAllTr ade  =  My_OnAllTrade1
       OnQu ote  =  My_OnQuote1
        .. .
     if  (x.z  =  =   2 )
       манипуляция_состоянием 2  .. .
       OnAllTr ade  =  My_OnAllTrade1
       OnQu ote  =  My_OnQuote2
        .. .
     if  (x.z  =  =   3 )
       манипуляция_состоянием 3 
       OnAllTr ade  =  My_OnAllTrade1
       OnQu ote  =  My_OnQuote2
        .. .
   else   .. .  
  
Это эквивалентно динамическому полиморфизму в ООП языках.

Сейчас пришлось бы делать так:
Код
  Инициализация_скрипта:
  x  =  внешние_данные

OnQuote:
   if  (x  =  =  A)
     манипуляция над частью данных
      if  (x.z  =  =   1 )        
       OnAllTr ade  =  My_OnAllTrade1
       OnQu ote  =  My_OnQuote1
        .. .
      if  (x.z  =  =   2 )
        .. .
      if  (x.z  =  =   3 )

OnAllTrade:
  разбор для всех тех же случаев
  
В итоге получается, что вся вариативность поведения разбросана внутри каждого коллбека и нужно раздублировать все проверки на состояние внутри.
Чуть более сложный сценарий, в зависимости от состояния переназначать коллбеки, например, чтоб не вызывался один OnAllTrade, пока не сработал другой колбек (сейчас альтернатива, опять же, засунуть все в один OnAllTrade и делать там разбор случаев).
Вобщем-то даже в Lua при всей ее примитивности заложена философия first-class функций, и такая работа с функциями, как динамическое переназначение на имя другой лямбды, вполне в ее духе.
Как варианты:
1)Можно вынести разбор состояний в функцию
2) Можно ввести глобальный флаг и не разбирать снова если это тоже самое.
Блок Settings
 
Settings.cl="TQBR,TQTF,RTSIDX,INDX"
Программа qTuner, БЕСПЛАТНОЕ приложение для контроля качества соединения серверов брокера + другие полезные плюшки
 
если кто-то посадил дерево,
то обязательно найдется тот,
кто нагадит под ним.
Имитация SetUpdateCallback(.....)
 
Цитата
Владимир Б****ов написал:
Добрый вечер.

Есть желание поэкспериментировать в выходной день, но в выходной день DS:SetUpdateCallback(....) не приходят, но мы можем тиковый график сохранить в файл. Для имитации SetUpdateCallback(....) я хочу с помощью луа читать файл с тиковыми значениями (построчно) и заносить в DS.
Ввиду отсутствия опыта, прошу помочь, как это реализовать - чтение из файла и введение новых значений в DS.

Спасибо
Так как DS:SetUpdateCallback(....)  это просто функция в таблице DS, напишите новую под этим именем и она заменит старую.
dofile()
 
Цитата
Sergey Denegin написал:
Здравствуйте. Подниму эту тему, потому что озадачился этой же проблемой.
Можно ли как-то из одного скрипта, запустить другой, но так, чтобы его работа выполнялась аналогично тому, как если бы мы его запустили из панели ЛуаСкриптов?
Т.е. полностью независимо от запускающего его скрипта и полностью со своими переменными.
Технически можно, но не просто.
Для этого надо изучить потоки и владеть СИ.
Сделать можно так:
Запускаем все скрипты, которые будем в дальнейшем использовать.
Скрипты, которые не нужны останавливают себя  сами (останавливаем поток main)
После этого из управляющего скрипта, при необходимости, пускаем поток нужного скрипта,
который закончив работу снова останавливает себя.
Вопрос к разработчикам: Вам не стыдно?
 
Чел, просто неудачно пошутил. Зачем же сразу б..ить.
Протокол FIX
 
Цитата
Иван Иванов написал:
В плане разработки ПО под FIX затраты как раз меньше - есть куча готовых библиотек.

По-моему была бы логичная линейка API, условно:
а) нужен алгодоступ, но не нужна скорость :   FIX >> QUIK сервер.    200 руб в мес.
б) стала нужна скорость - легко мигрируем:  FIX >> биржа.         10 тыс в мес.

Просто разработчиков приучили к пляскам с бубном с DDE/LUA для QUIK, но это не от хорошей жизни.
Полагаю, что Вы путаете кислое с зеленым.
FIX - это протокол получения информации с биржи по распределенной и разнородной сети.
DDE - это протокол обмена данным между приложениями на компе через оперативную память память.
а LUA  - это вообще просто язык описания задач.
И тем более все это не связано с качеством жизни.
Как взять значение последней строки из файла?
 
если хотите читать в конце файла не перебирая все содержимое, то используйте функцию:
file:seek ([whence] [, offset])
Получает и выставляет текущую позицию в файле,  отсчитываемую от начала файла, в позицию, заданную параметром offset  плюс значение (исходная позиция), заданное строкой whence, следующим  образом:  
  • "set": исходная позиция равна 0 (начало файла);
  • "cur":исходная позиция – текущая;
  • "end": исходная позиция – конец файла.
В случае успешного выполнения, функция seek  возвращает выставленную позицию в файле, отсчитываемую от начала файла.  Если функция завершается неудачно, она возвращает nil и строку – описание ошибки.
Значение по умолчанию для параметра whence равно  "cur", а offset – 0. Т.о. вызов file:seek() возвращает текущую позицию в  файле, не изменяя ее; вызов file:seek("set") перемещает указатель  текущей позиции в начало файла (и возвращает 0); а вызов  file:seek("end") перемещает указатель текущей позиции в конец файла, и  возвращает его длину.
Страницы: Пред. 1 ... 49 50 51 52 53 54 55 56 57 58 59 ... 72 След.
Наверх