Michael Bulychev написал: Основные затраты при поиске перебором используя getItem это передача структур данных из хост-программы через стек в скрипт. SearchItems дает возможность уменьшить эти расходы. Используя Ваш пример я написал похожую реализацию с помощью функции SearchItems. Исходный код я немного модифицировал для подсчета статистики. Исходный пример Пример реализации с SearchItems Результаты тестов на моей машине:
Добрый день, Михаил Просьба протестите еще SearchItems без всех этих приблуд. Просто для конкретного варианта. Сколько будет по сравнению с этими выкрутасами. Спасибо ------------------------------------------------ Универсальная система (программа) - это такая система(программа) , разработчики которой не имеют ни малейшего представления о том, как реально ее будут применять.
Подскажите, можно ли получать данные индикатора RSI, примерно так же, как получаются данные из стакана при его изменении с помощью OnQuote, а можно ли как то получить данные с графика индикатора ?
В стакане - это очередь заявок на торгуемый инструмент. индикатор RSI (если Вы говорите об индикаторе а не о фьючерсе на него) - это интегральный показатель, т е не инструмент. поэтому на него нет никаких заявок и очередей. попробуйте сформулировать свой вопрос более четко. --------------------------------- Четкость в словах - есть ясность в мыслях и точность в действиях.
пардон, опечатка в результате они последовательно как из автомата будут записаны в gTrade и следующие затрут предыдущие. В майне будет обработана лишь последняя
или вот еще прикол. как известно если сделки были совершены часто, то они придут пакетом в результате они последовательно как из автомата gTrade и затрут друг друга.
Michael Bulychev написал: Добрый день. Николай немного сгустил краски. достаточно сохранить ссылку на полученную в колбеке таблицу. Примерно так:
Код
gTrade = {}
function OnTrade (t)
gTrade = t
end
function main ()
--в gTrade будет последняя сделка из OnTrade
end
Если я не правильно Вас понял, то опишите задачу подробнее.
Ну да... А вот такая ситуация сделку приняли по инструменту сбербанк сохранили передали в майн управление а в это время исполнилась сделка по газпрому сделку по сбербанку мы затерли и в майне вместо сбербанка получили газпром. что делать дилетанту?
Добрый день, Предлагаю сделать возможным для колбека OnParam указание списка параметров активации. ---------------------- Поясняю. Так как OnParam реагирует на изменение любых текущих параметров всех инструментов, то его применение очень сильно грузит процессор, так как активация этого колбека происходит по каждому чиху каждому тику каждому изменению в очереди каждом ... ------------------------ В реальности же нет такой задачи, где требуется реагировать на все изменения текущих параметров. ----------------------- Как правило обычно требуется реагировать на изменение одного параметра. ------------------- В 99% это либо изменение очереди заявок, либо совершение сделки по инструменту. И ВСЕ --------------------- Поэтому было бы замечательно указать для OnParam например параметр "bid" и не париться с обработкой всех изменений и не лазить в хранилище для выяснения что же изменилось и кому оно надо. ------------------- Спасибо
универсальное медленнее специального. ------------------ Вам что надо? Быстро или универсально (т е лень писать код) ? -----------------------------------
действительно, создается впечатление, что разработчики сайта имеют не востребованное техническое образование в области проектирования механических систем типа реактивных велосипедов, но суровая реальность заставляет их делать сайт по софту для финансовых рынков . Вот и получается сайт с абстрактными картинками.
Максим Миненко написал: При нажатии F6 с графика цены и объема сейчас программа предлагает создать "Тэйк профит и стоп лимит". Я хочу, чтобы это был обычный "Стоп лос". Как изменить тип заявки по умолчанию?
Варианты решений: 1) Если есть уже снятый стоп, то можно выбрать из таблицы стопов 2) Поместить в караман транзакций и выбирать 3) поместить на график подальше от цены и двигать 4) пойти покурить и желание пройдет.
если работаете с колбеками, то эта функция нужна лишь при запуске скрипта для выборки того, что уже принято, если оно Вам надо. ---------------------------- А при запуске скорости особо и не надо. ------------------------ Поэтому нет особой разницы каким образом выбрать уже принятые данные .
DeSan DeSan написал: привет у биржи есть плата за транзакции как я понял текущая формула - если транзакций больше 2000
Именно так.
Эти сборы касаются брокера (т е участников торгов) Клиенты брокера - не являются участниками торгов на бирже. ------------------------------------------- Сбор за ошибочные транзакции Ошибочными будут признаваться транзакции, которые приводят к возникновению некоторых ошибок, например: "Возникла кросс-сделка", "Недостаточно средств клиента", "Заявка не найдена" (при использовании DelOrder и MoveOrder) и т.д. Расчет сбора будет производиться по логинам участника торгов. Сбор за ошибочные транзакции будет рассчитываться, в том числе в период приостановки торгов во время проведения клиринга и в выходные — в этом случае он будет отражаться в отчетах в понедельник, и списываться во вторник. Методикой расчета сбора за ошибочные транзакции предусмотрено ограничение на минимальную величину сбора за день — 1 000 рублей. Максимальная величина сбора за день составляет 30 000 рублей и вводится с целью ограничения убытков участника торгов из-за неполадок в алгоритмических системах. Кроме того, методикой расчета сбора предусмотрена возможность блокировки Биржей логина с предварительным уведомлением о возможной блокировке (в случае, если это технически возможно).
Если я не ошибаюсь, то плата за транзакции возникает при более 30 транзакций в секунду. Эту плату берут с брокера, а он берет с Вас, если об этом есть в регламенте. например у БКС введено ограничение на не более 30 в секунду если больше то имеют право вообще отключить. узнайте у своего брокера, что он с Вами сделает.
еще хуже в параметрах транзакций. Отсылаем один формат данных и имена параметров, а принимаем другие и даже бинарные. Полагаю, что как у классика - "пуговицы пришивал один, а рукава - другой." ----------------------------------- "К пуговицам претензии есть? - К пуговицам претензий нет!"
ninjatrader написал: да я и сам могу в пятницу программу запустить, только вот неужели нельзя избежать утомительной процедуры открывания графиков на всех тайм-фреймах? куча ведь настроек в квике, неужели нет такой их комбинации, чтобы быстро скачивались необходимые данные при подключении к серверу? в других программах которыми пользуюсь достаточно скачать данные по меньшему тайм-фрейму, а большие уже строятся исходя из этих данных - здесь почему-то такая логика не работает...
В квике свечи строит сервер, а не терминал. Поэтому надо заказывать все таймы Но в скрипте открывать графики не надо. В скрипте надо просто в цикле открыть источник на каждый инструмент и каждый тайм, после прихода закрыть. ----------------------------------- Т е делаете скрипт, запускаете его на квике навсегда. Он например в вечернюю сессию активируется сам и принимает Вам все данные. Вы даже и не заметите как он это все сделает.
Кирилл Мазеин написал: Я пробовал по вашему совету поменять кодировку текста робота - то же самое. Да и на моем скриншоте искажается только русский текст, который в комментариях.
Хотите помощи? Выложите текст. Или Вы полагаете, что будут с экрана набивать Ваш текст для тестирования?
Николай Бехтерев написал: Да, у меня явно нет ясного понимания КоллБек функций. И к сожалению пока не попалось ни одной подробно разъясняющей статьи.
Попробую объяснить. Про колбек. Колбеком называется функция, которая вызывается из вне Вашей программы(скрипта) Такую функцию обычно определяют для обработки каких-либо асинхронных событий, время прихода которых нам заранее неизвестно. В QLUA колбеки - это функции с зарезервированными именами, которые будут вызваны при возникновения определенного в документации события. -------------------------------------- про main Эта функция, которая вызывается при запуске скрипта и используется для его(скрипта) зависания в режиме активности. Такой способ активации скрипта - это изобретение автора QLUA. Решение вполне работающее, но не очевидное для пользователей и не самое лучшее. но как говорят, дареному коню в ... не смотрят. Поэтому что состряпали, то и кушаем. ------------------------- Так вот, колбеки и функция main никаким образом не связаны между собой. Если Вам надо, чтобы в main обрабатывалось то, что будет получено в колбеке, то Вы должны это передать в майн и осуществить синхронизацию работы колбеков и майн. При этом, надо еще и синхронизировать обращение к общей памяти в колбеках и майн, так как это разные потоки. Т е Вы должны решать 1) синхронизацию потоков 2) синхронизацию обновления информации -------------------------- Т е декларация разработчиков о том, что QLUA сделано для дилетантов в программировании - это такой шутка --------------------- Примерно так
green_X5 написал: Еще чуть проще ) - windows условно многозадачен, и у него по-умолчанию стоит ограничение - переключаться между задачами не чаще чем раз в 15 мск. Этот параметр можно изменить командой для WinAPI, взяв на себя риск возможной потери устойчивости / стабильности системы.
Немного не так. 15 мс - это квант таймера. Поэтому минимальный sleep получается в 1 квант. квант таймера можно изменить сделав его 1 мс. Квант времени для задачи(потока) тоже можно настроить в количествах квантов таймера. примерно так.
Michael Bulychev написал: И как Вы определяете задержки, если на стакане нет метки времени?
для стакана я определяю не задержки а интервал поступления. вопрос: У меня получилось, что на вашем тестовом сервере часы отстают на 0.9 сек. Можете подтвердить либо сообщить на сколько точно отличается время на сервере от атомных. Спасибо ----------------------------------------- Кроме того, сейчас по пингу в терминале QUIK для Вашего тестового сервера получаю вполне объяснимые данные . А именно. получаем значения 32,47,63,78 (в основном) мс - между ними разница 15 мс - это квант таймера OC. Т е встроенный пинг вполне нормально работает и соответсвует 2,3,4 и 5 квантам. а пинг на IP соответствует одному кванту. ------------------------
тот самый написал: вобщем, доля правды - во всём этом есть... у меня было такое - когда у меня:
не хватало оперативки когда была сильная фрагментация в файловой системе - например, когда скачал/удалил игру на 10ГБ когда было зависшее интернет соединение (интернет может быть - но не стабильно [провайдеры знают о чём я])
длительные исследования на реальном сервере показали, что задержки на 4-10 секунд - это обычное дело. Средняя величина запаздывания данных ТВС составляет примерно 0.4-0.6 сек. Что вполне нормально для торгующих руками и моему роботу.
Добрый день, Написал тест для исследования очередей заявок (стаканов). Пустил его на вашем демо-сервере. Понятно, что это тестовый сервер. Но уж больно интересная картинка. Если не военная тайна, может кто объяснит эти периодические зависания обмена на 40 секунд Вот картинка: спасибо
чтобы меньше было ошибок и легче было читать рекомендую написать так: ------------------------ local x=nextWeather == 1; local x1=previosWeather == 1; local x2=previosWeather == 3;
пардон опечатка Попробую пояснить далее Вот примерный алгоритм Вашего робота: ---------------------------- СОСТОЯНИЯ ( S) 1) свободно 2) торгуем 3) ждем ------------------------- OnQuote S==1 - если нет позы, то покупаем, иначе продаем. Выставляем заявку по лучшей цене , S=3 S==2 - цена в заявке хуже лучшей, снимаем заявку, S=3 ------------------------- OnOrder если заявка активна, то S=2, иначе S=1 ---------------------
Попробую пояснить далее Вот примерный алгоритм Вашего робота: ---------------------------- СОСТОЯНИЯ ( S) 1) свободно 2) торгуем 3) ждем ------------------------- Onorder S==1 - если нет позы, то покупаем, иначе продаем. Выставляем заявку по лучшей цене , S=3 S==2 - цена в заявке хуже лучшей, снимаем заявку, S=3 ------------------------- OnOrder если заявка активна, то S=2, иначе S=1 ---------------------
Николай Бехтерев написал: И такой вопрос, допустим выставление лучшей заявки мы засовываем в коллбек OnOrder, в OnTrade мы получаем информацию о том взята заявка или нет, как исключить момент исполнения двух заявок? Без sleep() и ожидания ответа о том, что заявка снята - тут никак не обойтись, я правильно понимаю?
можно и без speep Например запоминать номер выставленной заявки и перед выставлением новой, проверять исполнилась старая или нет через функцию getOrderByNumber
но ведь всё равно будет какая-то разница во времени между sendTransaction для снятия заявки и коллбеком OnOrder?
Вот вы говорите номер... Ну запомили мы номер первой выставленной нашей заявки, далее, когда в стакане появляется цена лучше нашей, мы проверяем по номеру не снята ли заявка (а может быть и взята рынком), если снята, выставляем новую, а если нет? Если заявка стоит и её надо снять, мы тут же в OnQuote кидаем sendTransaction и? Время же тикает пока заявка будет снята и мы увидим это по флагам. Что в это длящееся время будет происходить в OnQuote?
Небольшая лекбес 1) робот - это конечный автомат. т е устройство, которое имеет набор состояний и по событиям переходит из одного в другое. ------------------------------ 2) первоначально надо определить перечень этих состояний Например , хотим играть по очереди заявок состояния: 1.свободно - нет заявок 2. есть заявка - купить.продать 4. есть лучшая цена 5. есть сделка ... 3) потом определяем, в какие состояния переходит робот из каждого состояния
4) потом определяем какие события создают эти переходы
5) и после того, как нам стало понятна логика работы нашего робота, мы переводим эту логику на язык программирования, например луа. ------------------------------------ Это подобно написанию художественного произведения например на японском языке. ---------------------- Придумываем сюжет, героев, пишем на том языке, на котором умеем думать (т е на русском) . Когда все написали и получился хороший рассказ(роман, повесть, сказка), после этого берете словарь японского и переводите на японский (луа) ------------------------------------------------------------ Не в обиду будет сказано, но Ваш пост свидетельствует о том, что Вы пытаетесь, еще не придуманный свой роман писать сразу на японском, без словаря, спрашивая на форуме, как написать на японском ...то или иное слово и зачем это слово надо писать. ------------------ Примерно так.
в main проверяете, если она меньше предыдущей то снимаете старую заявку и ставите новую. Однако, лучше убрать проверку из main и перенести ее целиком в OnQuote, только без sleep
Не понимаю почему проверку в OnQuote если всё равно происходит выставление заявки в main? Т.е. допустим мы в OnQuote будем иметь два ценовых уровня OFFER и LAST_OFFER допустим мы сравнили и выяснили, что наша заявка не лучшая, тогда нам всё равно эту перемену как-то нужно передать в main и получится уже два if-then, а значит большая вычислительная мощность, разве нет?
1) колбек исполняется в основном потоке квик . Поэтому его завершение ждут другие колбеки и основной поток. Если действий мало, то можно все делать в колбеке. Когда алгоритм большой и у Вас есть несколько ядер , то исполнение основных вычислений в майн теоретически даст ускорение вычислений процентов на 10-20. почему теоретически ? потому что переключение потоков имеет накладные расходы и для оптимального переключения надо управлять ос. 2) При играх в лучшую заявку надо учитывать следующее. На ликвидных бумагах спреда может не буть и ваша заявка будет бить в противоположную лучшую, т е Вы будете двигать рынок. Это обычный прием маркет-майкеров заставить двигать рынок чужими деньгами. Забиваю спред , а подобные Вашему алгоритмы начинают съедать встречные заявки.
Как нанести на младший таймфрейм цены закрытия (хая, лоя) предыдущего бара в виде горизонтальных уровней., Например нанести на M15 цены закрытия предыдущего дня, недели, месяца? Это возможно реализовать?
Michael Bulychev написал: Просто есть два подхода в использовании Lua: 1. Вы пишете на Lua и тогда корутины это то что Вам надо 2. Lua используете как язык для связки своих библиотек и QUIK. В этом случае реализация полностью на ваших плечах. Но я все еще не понимаю полностью как Вы хотите вызывать функции одного работающего скрипта из другого. Проблем и ограничений в таком подходе явно больше чем преимуществ.
Добрый день, Хоть и не верю в то, что из этого будет толк, но все же отвечу: -------------------------------------- 1) Я пишу на луа и СИ. Либо любом другом языке, который лучше подходит для решения конкретной задачи. ----------------------------- 2) Полагаю, что Вы не внимательно прочитали то, что я написал ранее. ----------------------------------- Увы без лекции не обойдемся. ------------------------ Корутины - это виртуальный поток. Его задача уменьшить простои процессора при ожидании асинхронных позиций, без которых дальнейшие вычисления невозможны. Это тоже самое, что потоки в одноядерной винде. Такие потоки решают лишь две задачи - уменьшение простоя ядра при ожидании задачей асинхронных событий и исключение зависания задач. Т е в таких системах задачи решаются последовательно. Так как параллельно нет на чем решать. Эти потоки не могут ускорить вычислительные задачи, т е те, в которых используется лишь память и вычислитель(процессор) и нет ожидаемых событий. ------------------------------- Ранее я уже написал , что поток - это фактически вычислитель ( т е процессор и код программы) Так вот, возвращаясь ранее определенным задачам, я решаю задачу параллельных вычислений в роботах на основе Вашей QLUA библиотеки. Поэтому речь идет о реальных потоках в многоядерной (многопроцессорной) системе. ---------------------------------- Вообще-то я эту задачу решил. Поэтому сделаете ли Вы это для других или нет, мне все равно. --------------------------- Корутины я тоже использую, например в системе мониторинга умных вещей на основе чипа ESP. Но это уже другая история. --------------------------------------- Примерно так..
тут уже приводилась ссылка на статью, где товарищ пытался ускорить выполнение расчетной программы разбивкой на потоки на одноядерной машине. и удивился, не получив никакого ускорения.