sam063rus пишет: квик не предназначен для стабильной роботорговли по определению. бо как любое его обновление может в одночасье угробить весь депозит, за что разработчики только в очередной раз мило извиняться и пообещают исправить прискорбную ситуацию в новых своих версиях, а брокер тем временем скажет, что, цитирую дословно: "... надо учитывать риски". Ну, а биржа, весело назовёт техническим сбоем и забудет об этом, в отличии от всяких SEC - так и не анулировав сделки.
формально Вы правы, но по-существу нет. ------------------------------------------ Правы в том, что "квик не предназначен для стабильной роботорговли по определению" Потому что QUIK - это программа для подачи поручений брокеру (по определению) Хочу обратить внимание на то, что НЕ для подачи заявок на биржу, а лишь поручений брокеру. Это две большие разницы. ----------------------------- Неправы потому что, разработчики никогда (поправьте если я ошибаюсь) не говорили, что делают бесплатный инструмент для создания торговых роботов. Наоборот, периодически подчеркивалось, что VM LUA встроена без изменений, что библиотека QLUA сделана как копия купала. а КУПАЙЛ сделан не для торговли я для отображения бесплатной информации клиентам. т е это некоторе подобие кубиков в детском саду, чтобы было чем заниматься детям. Ну а если из этих кубиков начинают делать что-то большое, то проблема тех, кто это делает, а не тех , кто сделал кубики. ----------------------------------------------------------------------------------------------------------- Ну не умеет трактор летать. Но если очень хочется, то надо осваивать ЧПУ и проектирование самолетов и из трактора делать самолет.
А я верю челу и рад за него. --------------------------------------- sam063rus У меня к Вам вопросик: Зачем делать открытый проект библиотеки ? -------------------------------- Вполне серьезно спрашиваю. Можете сформулировать, что конкретно невозможно реализовать на QLUA с использованием API С? (Оставим в стороне ошибки и зависания). Почему спрашиваю? объясню. --------------------- По-моему мнению, есть недоразвитость графических и диалоговых средств. Но это решается сторонними модулями. В остальном реализуемо любые мечты буратины. ---------------------- Спасибо
Николай Камынин пишет: если выставление стопов соответствует их названию, то можно определить по расположению цены сделки предшествующей срабатыванию стопа по отношению к расположению позиции относительно рынка.
В общем случае это неверно. В большинстве случаев так прикинуть можно, но далеко не всегда.
Поэтому утвердительно ответить на первоначальный вопрос нельзя.
Это голословное утверждение. приведите пример, но соблюдайте указанные мною условия.
1) читаем документацию: OnInit Функция вызывается терминалом QUIK перед вызовом функции main(). 2) Чтобы ничего цикл можно поставить в колбеке будет нечто такое: -------------------------- local ind_old=1 function cd() local size=ds:Size() for i = ind_old, size do Candles[i] = ds:C(i) end ind_old=size end
если выставление стопов соответствует их названию, то можно определить по расположению цены сделки предшествующей срабатыванию стопа по отношению к расположению позиции относительно рынка.
про вечерние сделки могу сказать следующее ( наблюдал это уже давно возможно что-то изменилось) Они приходят потому, что на следующий день у них меняется класс т е они становятся как бы новыми сделками и сервер их обязательно передает в терминал. Когда сортировал все сделки на лету тоже поначалу в этом застрял. Потом поставил фильтр и все стало ОК
позволю предложить следующий алгоритм (так cделал бы сам): ------------------- 1) По спискам формируем таблицу играющих инструментов (критерий на ваш вкус) 2) если я ожидаю, что будут запаздывающие данные, то задаю таблицу неопределенности (т е таблицу памяти N секунд, которые могут корректироваться опоздавшими данными. 3) В колбеке считаем распределение числа сделок по N последним секундам. ------------------------------------ Ну а далее думаю - и зачем я это все посчитал???
1) колбек не может ничего сканировать. по определению -это функция,которая вызывается при наступлении события. в данном случае - это событие - получение новых исторических данных с сервера, которые дописываются к существующим данным. ------------------ 2) Таким образом, колбек позволяет обнаружить приход новых данных, а не ждать их. Осуществлять обработку при поступлении новых данных.
Вот примерно Ваш алгоритм: ------------------------- 1) в корутине должен быть бесконечный цикл,в котором вы посылаете и останавливаете корутину. 2) когда ответ пришел вы активируете корутину и она снова посылает и останавливается. 3) кроме этого должна быть очередь к корутине 4) корутина пускает из этой очереди если очередь пустая то останавливается 5) кроме того должна быть запись в очередь 6) при записи в очередь,если корутина стоит то запускается.
Хочу подлить масло в огонь. Возможно это уже обсудили, но не увидел. ------------------------------------- Относительно линий трендов.Гипотеза следующая ( не проверял, лень) ----------------------------------------- Линии тренда должны смещаться по крайней мере если занимают интервал нескольких торговых дней. ---------------------- Проблема в том, что как всем известно день - это 24 часа и не все из них торговые, и есть еще выходные и праздники, а следовательно такие дни(часы не отображаются на оси времени в квике. ----------------------------------------------------- Прямая наклонная линия будет непрерывной и монотонной лишь при равномерном шаге оси времени. -------------------------------------- В нашем же случае мы имеем разрывы оси времени, следовательно линия тренда тоже должна иметь разрывы, либо это линия с меняющимся углом наклона. Т е положение линии тренда при смене тайма будет изменятся, иначе она должна быть ломаной линией.
Серж пишет: ds = CreateDataSource (ClassCode, SecCode, Interval) repeat sleep(1) until ds:Size() ~= 0 -- тут надо поиграть с задержкой for i = 1, ds:Size() do Candles = ds:C(i) end
Нет, предположим, что нет этого достоинства (передача по указателю) Что тогда? тогда остается лишь копирование по циклу. Т е то что есть без достоинства. Если язык допускает присвоение таблиц (например MATLAB) то цикл будет неявным, а если такого оператора нет (например паскаль) то цикл будет явным либо в виде функции. Т е достоинства лишь предполагают внимательное изучение языка и приобретения навыков мышления на нем.
хэш - это число. В луа используется для хранения строковых данных. В луа таким образом обеспечивается быстрое сравнение строк, так как сравниваются фактически числа. Кроме того, хранятся лишь уникальные строки, что исключает избыточное хранение копий строк.
Одно из существенных достоинств луа это то, что таблицы не копируются а передаются указателем. Это существенно ускоряет вычисления и экономит память, особенно в микроконтроллерах. Если нужна копия таблицы, то надо делать явно через цикл.
ED921 пишет: Здравствуйте. Тоже пытаюсь разобраться ..) И все-таки подскажите пожалуйста, как лучше на примере простых стратегий (по параболикам, пересечением скользящим) формировать сигнал для заявок? В простых примерах на просторах инета, часто берутся данные индикаторов прямо с графика, можно же наверно расчеты тех же скользяшек делать в скрипте используя (что-то, что лучше?, может про это спрашивалось в топике) и так будет быстрее, чем ждать когда Квик посчитает... Потом, что лучше брать для дальнейших действий в алгоритме, к примеру купили и хотим сразу выставить заявку на продажу, что лучше ждать?, отклика от сервера, что заявка исполнена или можно использовать данные ТЧП или это может быть гораздо дольше.... Простите пожалуйста за то, что неуч еще тот.. не программист я, просто времени свободного навалом, вот и читаю все подряд про QLua )
На примере простых стратегий подсказать очень просто: НЕЛЬЗЯ на простых стратегиях выиграть на бирже. ------------------------------------------------- Простые примеры на просторах инета для того, чтобы показать буратинам, что на поле чудес они могут быстро стать карабасами. Буратинам обычно этого достаточно. ---------------------------------------------------------- "Мы люди не местные, детство тяжелое, учиться некогда, хотим много денег Надеемся на халяву и чудо. Простите нас пожалуйста." - молитва начинающих игроков. .
Вот интересно, что реально хочет сказать автор этой фразы: " Мы постараемся рассмотреть его (пожелание)..." и "постараемся ... сообщить Вам результаты анализа" -------------------------- Варианты ответа: ----------------------- a) Ваш вопрос такой маленький, что без специального старания его никак не рассмотреть. ---------------------- b) Мы очень заняты, но все же постараемся понять , что же Вы написали. Для этого проведем анализ. ---------------------------- c) Мы создадим специальную комиссию , которая тщательно проанализирует Ваше высказывание. и "постараемся ... сообщить Вам результаты анализа" ----------------------------------------------------------------------------------------------------------
"Над кем посмеялся, тому уже простил, того даже полюбить готов" -И.С.Тургенев
Могу предположить, что при запуске в автомате Ваши скрипты обращаются к еще не полученным данным. В результате получаете nil и аварийное завершение. когда пускаете кнопкой все данные уже подгружены и такого не происходит.
Viktor MMM Попробуйте рассмотреть работу Вашей программы, когда приходят onorder, а корутина еще занята обработкой предыдущего. ----------------------------------------- Для использования корутины с колбеками надо делать очередь.
Объясняю. против Вас играет маркет-мейкер. У него алгоритм такой: Если стоит против, то ему биржа платит. ---------------------------------------- Когда Вы якобы обыгрывали - Вы просто стояли по рынку. А когда рынок пошел против Вас - Вы просто этого не заметили. ---------------------------------------- Когда по рынку - то все гуру, а когда против - то ищут кукловода, а он - в зеркале.
1) на любой взгляд этот цикл "for i=1, 30 do" лишний.
2) Если надо делать такое лишь один раз в сессию то можно и так, но если это делается всю сессию, то надо ставить колбек OnQuote(STRING class_code, STRING sec_code).
такой вариант устроит: ----------------------------- for i=1,#b do a[#a+1]=b[i] end; table.sort(a); for i=2,#a do if a[i-1]==a[i] then a[i-1]=nil end end; table.sort(a);
Alexey K пишет: почему у меня в этой части скрипта выдает ноль? А вот если бы указал trade=getItem("trades", getNumberOf("trades")-1) то получил бы номер заявки предыдущей сделки
Потому что в хранилище Квика сделка попадает после отработки колбека. Поэтому внутри колбека getNumberOf возвращает количество сделок без учёта последней. И взять её значение из таблицы функцией getItem невозможно. Но вот почему у вас ноль, а не nil - вот это вопрос.
Момент записи сделки в хранилище не имеет никакого значения в данном случае. -------------------------------- В данном колбеке: ------------------------------------ function OnTrade(trade_data) trade=getItem("trades", getNumberOf("trades")) message(tostring(trade["order_num"]),1) end ------------------------ обрабатывается не последняя совершенная сделка, а сделка, которая находится после в таблице в ячейке getNumberOf("trades")
т е trade_data никакого отношения не имеет к следующим операторам:
trade=getItem("trades", getNumberOf("trades")) message(tostring(trade["order_num"]),1) -------------------------------- Т е message выводит в сообщение номер сделки в пустой ячейке таблицы. (см. мой комент выше)
--------------------------------------- А эта запись: ------------------------------ function OnTrade(trade_data) message(tostring(trade_data["order_num"]),1) end -------------------------------- обращается не к хранилищу, а к полученной таблице с параметрами сделки. Хранилище здесь тоже не имеет никакого значения. --------------------------------------------------- ноль очевидно потому, что trade_data.order_num=0.
Если окно не закрывается, попробуйте выключить монитор. Если и после этого не закрывается, то выключайте свет и ложитесь спать под теплое одеяло. -------------------------------------------------- Мужайтесь! Запад нам поможет!
первый элемент таблицы имеет индекс 0, всего элементов в таблице: getNumberOf("trades") последний элемент имеет индекс getNumberOf("trades")-1 первый свободный( несуществующий ) элемент имеет индекс: getNumberOf("trades") ---------------------- Поэтому и ноль.
Николай Бехтерев пишет: Зачем было вводить эти биты, какая-то экономия на памяти?)))
Все еще смешнее на самом деле это не экономия, а лишние затраты, так как битовая операция bit.band(order["flags"],4) занимает места больше, чем экономия памяти на упаковке флагов. -------------------------------------- Возможно, что так сделано для того, чтобы неподготовленным пользователям (а таких большинство) "жизнь медом не казалась".
Добрый день, Добавлю свой стакан бензина в костер дискуссии. -------------------------- Есть как минимум два варианта 1) несколько скриптов с обменом информацией между скриптами 2) несколько потоков и один из них main с дополнительной синхронизацией потоков ---------------------------- Хотя поток входных данных с сервера один, но это не мешает сделать параллельную обработку, так как обработка данных умным роботом требует значительных ресурсов. А обработку по разным инструментам можно делать параллельно без проблем. ------------------------------- Из собственного опыта замечу, что в QUIKe на существующем уровне реализуются оба способа( реализовал год назад оба)
Дмитрий, 1) Вот здесь: "ещё несколько потоков будут подписываться на ТВС и перебирать все сделки через CreateDataSource (а их может быть миллионы). " У Вас огромные резервы в повышении производительности. Рекомендую полностью пересмотреть Вашу концепцию обработки информации. ----------------------------------------------- 2) Следует учитывать что сораунды не позволяют задействовать множество ядер в процессоре или множество процессоров в кластере. Они позволяют переключаться лишь между фрагментами алгоритма в рамках одного ядра.
Добрый день, утомился я читать эту перепалку что-то. ----------------------------------- попробую ответить, чтобы ускорить обсуждение. ------------------------------------------ колбеки - это обычная функция в глобальной таблице скрипта. ------------------------------------- если у вас есть бесконечный цикл в скрипте, то колбек никогда не вызовется и квик повиснет. --------------------------- собственно майн для того и сделан, чтобы обеспечить работу скрипта вне основного потока колбеков т е тела скрипта вне майн. ------------------------------ Надеюсь , что объяснил понятно.
Michael Bulychev, Теперь все понятно. Спасибо. -------------------------------------------------- Замечу, что риторические вопросы не требуют ответов. Поэтому они не могут затягивать обсуждение по определению. Просто надо внимательно читать вопросы и учитывать, что не все могут угадать, что именно Вы спрятали по капот Вашего творения. ------------------------------------------ Каждый понимает вопросы по-своему. Кому-то кажется сарказм, кто-то вникает в суть, не обращая на форму, а кто-то подглядывает со-стороны и тупо вставляет свои оценки - "флуд". ---------------------------------------------- Не бывает глупых вопросов , бывают глупые ответы. Глупее глупее ответов бывают лишь глупые оценки подсматривающих за обсуждением.
Добрый день, Михаил Вы надеюсь поняли, что не ответили челу на его вопрос? Если нет то повторю: Вопрос: Как получить результат транзакции, без использования OnTransReply ? Естественно ожидать два варианта: 1) Невозможно. 2) или какой-то вариант "без использования OnTransReply " Вот Ваш ответ: "Только эмуляцией, с использованием sendTransaction и OnTransReply." Вы придумали третий вариант очень напоминает ответ "сам дурак", Просто замечательный ответ. Главное доходчиво и сразу все понятно.
это значит, что на вершине стека лежит эта константа. попробуйте поставить проверку типа после вызова функции обращения к стакану. lua_pcall(st, 2, 1, 0); весьма возможно что функция ничего не вернула или вернула nil, а вы пытаетесь что-то извлекать из стека.
"Мои коды просты как дрова, сложные я писать не умею" Значит Вы профессионал, потому что сложные( вернее сказать мудреные) пишут начинающие. -------------------------------------- В структурном программировании есть такое образное сравнение. программа не должна напоминать тарелку вареных спагетти, в которой трудно понять где что начинается и кончается. Программа должна быть подобно жемчужному ожерелью. Каждая функция подобно ниточке жемчуга. Можно удалить, но ожерелье не рассыпется. -------------------------- Ну а, у Вас тоже хорошо - стопка дров. Успехов
Евгений, ------------------------------ Я указал как возможную ошибку ограничение памяти на основании того, что Вы указали о ранее работавшей программе. Т е данная конструкция у Вас работала. Т е она интерпретировалась правильно. Теперь не работает. как вариант, интерпретатрор обрезал строку и получил ошибку. ---------------------------------------- Давным дано я решил большинство проблем программирована на QPILE таким образом: ---------------------------------------------- Написал препроцессор , но так как компилятора нет в QPILE, то назвал его компилятор, который сам создает внутренние переменные для функций. --------------------------------------------------- Вместо функций сделал макросы. ---------------------------------------------------- Компилятор выдает список всех переменных и функций. ---------------------------------------------- Все функции и макросы разместил в библиотеках. -------------------------------------------------- В результате программа на QPILE стала простой и понятной. -------------------------------------------------------- Кроме того, таким образом снимается ограничение на максимальное число переменных и функций. ------------------------------------------------------- Если владеете языками рекомендую сделать так.
if (top == 0) return 0; поставьте здесь проверку значения на вершине стека на тип кода или вывод в лог файл string sec_code = lua_tostring(st, -1);// qlua.ToString(-1); // код бумаги
Добрый день, выражение if((Server_Time_var-Registration_Time)>Time_Criterium_for_Bad_Deal) перепишите так: x=Server_Time_var-Registration_Time-Time_Criterium_for_Bad_Deal if x>0 -------------------------------------- Можно предположить, что не хватает памяти для данной строки и в результате облом. ------------------------------------ Могу рекомендовать следующее правило: Не пишите сложных и длинных выражений в условиях и такой проблемы никогда не будет. И еще в QPILE не рекомендую использовать длинные имена переменных. Все переменные и функции на одном уровне видимости. Длинные имена лишь замедляют интерпретацию