Денис написал: Погуглив немного нашел кое-что похожее для определения нового бара. Подправил, сейчас переменная first_candle_index обновляет свой индекс как только появляется новая свеча. Но как это прикрутить для дальнейших вычислений, пока не допер. Тут на форуме нашел вот что, цитирую : SetUpdateCallback при смене индекса даст вам как раз момент открытия новой свечи. Вот как ее прикрутить к функции поиска индекса ниже? Или может есть другие методы какие?
function newbar() ds, error_desc = CreateDataSource("SPBFUT", "SiM3", INTERVAL_M1) local try_count = 0 while ds:Size() == 0 and try_count < 1000 do sleep(100) try_count = try_count + 1 end if error_desc ~= nil and error_desc ~= "" then message("Ошибка получения таблицы свечей:" .. error_desc) return 0 end
local today_day = tonumber(os.date("%m")) local current_candle = ds:Size() local max_candles = math.min(20, ds:Size()) local first_candle_index = nil
while first_candle_index == nil and current_candle > ds:Size() - max_candles do if tonumber(ds:T(current_candle).day) ~= today_day then
first_candle_index = current_candle - 1 end end
return first_candle_index end
Рекомендую начать написание своего робота не в виде скрипта а в виде индикатора. Если будете торговать каким-то конкретным инструментом, то этого вполне достаточно, будет проще сделать работающий. ----------------- Кроме того, рекомендую писать не торговый робот, а торговый советник. Так будет меньше шансов слить свой счет. ----------------- Потом перепишите советник в робота, а затем если захотите большего -возьметесь за скрипты. -------------------- В итоге напишите все быстрее и качественнее.
Anzhelika Belokur написал: Данная ошибка связана с сетевыми проблемами на стороне клиента (т.е у Вас), рекомендуем попробовать сменить канал для связи или провайдера.
Проблема не с провайдером. Сегодня попробовал через ноутбук на этом же соединении. И проводное и вайфай работают.
На ноутбуке стоит вин 10. Возможно проблема в этом.
Через ноутбук работать не удобно.
Плюс я уже описал обращение к провайдеру. Они проверили и у себя еще у двух провайдеров. Какая-то проблема с сервером сбербанка.
Александр_1976 написал: Здравствуйте! Ожидаю что в течении пары месяцев цена на акцию упадет. Хучу выставить отложенную заявку на покупку по более низкой чем сейчас цене. Есть ли разница в выставлении заявки через "стоп цена по другой бумаге" или через "тейк профит"? Пробовал через стоп лимит, заявка через несколько секунд заявка отклоняется. Как правильно выставить отложенную заявку на покупку по цене ниже рынка?
Вы кандидат на нобелевскую премию. Так как ранее получатели ее доказали, что прогноз с таким горизонтом невозможен.
openbuys - Активные на покупку opense[[s - Активные на продажу
Эти переменные содержат число, а не логическую переменную В них либо ноль либо не ноль, а не TRUE и FALSE -------------------------- Но запускать заново скрипт или main нет надобности в вашем случае.
Тут сорян, я не все написал видимо, то что переменные сравниваются с цифрами это так, я просто потом новую ввожу если ~=0 то запоминаю как TRUE, что есть активная лимитка. По поводу возвращаемых данных есть смысл писать в функции Return? или в LUA в коде можно сразу писать например -- If Buy_Active_Limit == true и т.д.?
function check_active_position () for i = 0,getNumberOf("FUTURES_CLIENT_HOLDING") - 1 do if getItem("FUTURES_CLIENT_HOLDING",i).sec_code == instrument then if getItem("FUTURES_CLIENT_HOLDING",i).openbuys ~= 0 then Buy_Active_Limit = true;
end; end; end; return Buy_Active_Limit end
Ликбез: луа отличается например от СИ тем, что 0 - это не false, а true. Т е все числа - это true. ---------------------- return надо писать если что-то возвращаете из функции. ---------------- Ваш пример лучше написать так:
Код
function check_active_position ()
for i = 0,getNumberOf("FUTURES_CLIENT_HOLDING") - 1 do
local x=getItem("FUTURES_CLIENT_HOLDING",i);
if x.sec_code == instrument then
if x.openbuys ~= 0 then return x.openbuys; end;
end
rnd
end
В этом варианте два момента. 1) работает быстрее так как у Вас три раза ходите в архив, что существенно дольше чем работа с локальной переменной х 2) если x.oprnbus не равен нулю то функция вернет это значение иначе она вернет nil - а это false
Иван__ написал: Примерно с пару недель начала регулярно появляться ошибка при попытки установки связи с сервером:
connection was closed by peer cant get message size from net
Появляется преимущественно в утренние с 09-10 и вечерние после 23-х часы (по крайней мере что я заметил). При обращении в сбер поддержку пиняют на провайдера.
Обратился к провайдеру. Провайдер проверил у себя и у двух других провайдеров (РОСТЕЛЕКОМ, МГТС, БИЛАЙН). Проблема явно с сервером сбера.
Провел трасеровку айпи адреса через командную строку виндовс 2/3 пакетов теряется.
Подскажите как быть. Торговать не возможно. Не получается оставить заявку когда мне это нужно. В поддержке Сбера сообщили что разбираться с заявкой будут месяц.
Как-то можно в медийное поле это вытащить, чтобы они зашевелились??
PS операционка Windows 7
Эта проблема может возникать при использовании устаревших DNS серверов или отключении используемого. Попробуйте обновить кэш DNS.
Денис написал: Похоже не просто будет мне получить информацию о том, что текущая свеча закрылась. Из ответов выше кроме костылей с обработкой времени баров других вариантов нет? В питоне есть candle_close = true or false, в Амиброкере тоже есть свой костыль. Попробовал что-то изобразить, но сессия закончилась. У меня вроде стандартная задача - начинать расчет баров (обычное сравнение Bar-1 и Bar-2), но только когда текущая свеча закрылась. То что после закрытия текущей те бары сдвинуться на 1 - это понятно. Может есть какие варианты с меньшим количеством костылей? Спасибо.
закрытие свечи - это завершение интервала .Простейший алгоритм - синхронизируете ком от сервера точного времени и контролируете завершение текущего интервала времени. --------------------- Но относительно нового бара вы ошибаетесь. Новый бар возникнет не тогда, когда закроется предыдущая свеча, а тогда, когда появится сделка. Т е если сделки в новом интервале нет, то и бара нет.
openbuys - Активные на покупку opense[[s - Активные на продажу
Эти переменные содержат число, а не логическую переменную В них либо ноль либо не ноль, а не TRUE и FALSE -------------------------- Но запускать заново скрипт или main нет надобности в вашем случае.
Серёга187 написал: Опытные подскажите: правильно ли я выставляю заявку на отложенную покупку? А то еще ни разу не сработала. Брокер сбер.
Все правильно делал. Просто цена сильно быстро росла и стоп не сработал...
если правильно, то стоп должен сработать, и либо заявка исполнится, либо в стакане останется неисполненная заявка. ------------------------- Если этого нет, то неправильно что-то сделал.
Ликбез: Вообще-то, скрипт запускается не в QLUA, а в терминале QUIK. QLUA - это библиотека на CИ для обращения на языке луа к функциям и архиву данных терминала QUIK. Поэтому нет в библиотеках луа функции запуск скрипта терминала из подобного скрипта =============== Можно из скрипта терминал квик запускать еще скрипты в дополнительных потоках, но это не тоже самое и функции в чистом луа для этого нет. -------------------
Ликбез о том какие ресурсы скрыты от создателей роботов на чистом Lua. ---------------------- Cделал тест сравнения быстродействия чистого LUA и LUA совместно с функцией на СИ c использованием системы команд AVX2. --------------- в тесте вычисляется в цикле 32000 раз сумма элементов таблиц размером в 32000. вот этот тест:
Код
MAX_SIZE=32000;
local pX,hFM,hfl=nkarray.cr(32768,4,"nkQUIK1");
local pY,hFM,hfl=nkarray.cr(32768,4,"nkQUIK2");
-------------------------------------
local N=MAX_SIZE
startA();
for j=1,N do opVC(2,1,pY,1,N,pX,1); end
local t1=stopA();
------------------------------
local x1={} local x2={} for i=1,N do x1[i]=0; x2[i]=1; end
startA();
for j=1,N do for i=1,N do x1[i]=x1[i]+x2[i]; end end
local t=stopA();
print("t1="..(0.1*t1/1000)..",t="..(0.1*t/1000)..",t/t1="..t/t1)
а вот результат LUA+C+AVX2 в 153 раза быстрее "чистого LUA":
Дмитрий написал: nikolz, почему же стоп-лимит - это заявка на закрытие убыточной позиции? Вот у автора нет позиции, он хочет купить при пробитии вверх. Если цена выставляемой лимитной заявки не будет выше макс возможной, и рынок за время выставления не уйдет выше этой цены, это желание автора исполнится
Безусловно, можно и микроскопом забить гвоздь. и все названия - это лишь условности, которые упрощают понимание сущности вещей. -------------------------- Поэтому я пытаюсь объяснить, что название заявок было придумано не просто так, а с целью указать на их назначение. ----------------------- Любая заявка направлена на совершение сделки. -------------------------- Но некоторым конструкциям заявок авторы дают название. Стоп - означает "остановить" ---------------------------- В документации КВИК сказано: В системе QUIK существуют следующие типы условных заявок: (указано правильно типы условных заявок, а не типы стоп-заявок Иначе масло - масленое).
«Стоп-лимит» - стоп-заявка, порождающая при исполнении лимитированную заявку.
НАЗНАЧЕНИЕ: Ограничение величины убытков при изменении цен сделок в сторону, противоположную ожидаемой.
------------------------- Выше я показал, что согласно документации в QUIK вообще все отложенные заявки назвали стоп-заявками. ------------------------------- А кроме этого для каждой стоп заявки еще придумали тип стоп-заявки. ----------------------- Квиковское определение в глоссарии стоп-заявки не выдерживает критики и не соответствует введенным ими же типам. ====================== Поэтому квиковские стоп-заявки - это не стоп-заяки в классическом понимании, так как стоп-заявка существует лишь в одном исполнении, как указано в документации КВИК под типом Стоп-лимит. ========================== Поэтому выставить заявку против рынка с помощью отложенной заявки типа "стоп-лимит" можно. Это можно сделать и заявкой типа «Стоп-цена по другому инструменту» ===================== Если бы квиковцы не изобретали велосипед в терминологии рынка, то не возникало бы такой путаницы и многих вопросов, что можно, а что нельзя. ------------------------------ В действительности, названные ими стоп-заявки - это ОТЛОЖЕННЫЕ заявки. ------------------------- Т е в отличии от заявок, которые отправлены на биржу, эти заявки остаются на сервере брокера до момента возникновения условия отправки их на биржу. И слово "стоп" вообще не имеет смысла в их названии. ----------------------------- Это заявки можно назвать отложенными -условными или отложенными-алгоритмическими. Но самое бессмысленное название для них - это "Стоп заявки" ----------------------- Т е мы имеем наглядный пример, как дилетантское применение общепринятого в профессиональной области понятие стоп-заявки приводит к путанице, а не к упрощению понимания сущности.
и еще В некоторых стоп-заявках терминала квик указывается более 2 значений цен. Согласно определению это уже не стоп-заявки. ------------------ Тогда это что за заявки?
пардон, опечатка ----------------------- Исправляю согласно документации КВИК Разработчики QUIK дали свое собственное определение стоп-заявки: -------------------------------------- Стоп-заявка – поручение, исполняемое брокером в зависимости от достижения рыночной ценой инструмента определенного уровня. В такой заявке указывается два значения цены.
Прикольно, но первое предложение этого определения - это условие лимитной заявки. Второе предложение не верно, если заявка будет выполнена по рыночной цене. ------------------------- Таким образом, определение стоп-заявки придуманное разработчиками КВИК - не выдерживает никакой критики. Это масло масленое. ==================== Очевидно, понимая, что они написали бессмыслицу, далее они уточняют: «Стоп-лимит» – это стандартная стоп-заявка; ------------------------ Поэтому в приведенном выше ликбезе следует согласно документации читать стандартная стоп-заявка - «Стоп-лимит» – это заявка на закрытие убыточной позиции ========================= и далее Можно конечно использовать ее для открытия новой позиции, вне зависимости от наличия позиции, но для этого есть другие типы стоп-заявок. -------------------- Ув, разработчики может имеет смысл убрать это Ваше определение стоп-заявок? Просто ужас какой-то.
Ликбез: ------------------------ стоп-заявка - это заявка, которая хранится на сервере брокера. ----------------------- Название стоп-заявка означает, что ее назначение закрыть убыточную позицию. -------------------------------- Условия стоп-заявки проверяет сервер брокера. ------------------------------ При возникновения условий, стоп-заявка переписывается сервером в заявку и отправляется на биржу. ------------------------ Можно конечно использовать ее для открытия новой позиции, вне зависимости от наличия позиции, но для этого есть другие типы заявок.
Танечка написал: Подскажите, как создать в квике лимитную заявку например на покупку выше текущей цены? Устанавливаю цену, галочка по рынку не стоит, все-равно входит по рынку. Что за фигня.... В приложении скрин МТ5 - там называется BUY stop. Как это сделать в квике?
попробуйте почитать руководство пользователя QUIK , а не MT5 ------------------------------ Ввод заявки
кнопка Назначение
Формирование и передача на исполнение новой заявки на покупку/продажу инструментов.
Открытие окна «Ввод заявки» осуществляется:
Нажатием кнопки на панели инструментов;
Двойным нажатием левой кнопки мыши;
Нажатием клавиши «F2»;
Выбором в таблице пункта контекстного меню «Новая заявка»;
Выбором пункта меню Действия;
Использованием Общего способа выполнения транзакций с выбором операции «Ввод заявки»;
Из окна «Графики». Подробнее см. Ввод заявки из окна «Графики».
Если кнопка на панели инструментов неактивна (серая), значит, ввод заявки по выбранному инструменту невозможен.
Если при вводе заявки из таблицы неизвестен инструмент, по которому подается заявка (в таблице нет выделенных строк, или таблица пустая), то на экран выводится форма выбора инструмента для новой заявки:
Для выбора доступны только те классы, по которым у пользователя есть право активных операций и для которых получена соответствующая операции транзакция.
Признак «Только активные инструменты» позволяет исключить из списка инструменты или контракты, не имеющие заявок, сделок или открытых позиций.
При нажатии кнопки «Выбрать» открывается форма ввода заявки по выбранному инструменту.
См. также Управление заявками из Таблицы котировок
nikolz написал: колбек OnTransReply это реакция на транзакцию, а не на состояние заявки. Для заявки надо работать по OnOrder OnStopOrder либо по таблицам заявок и стоп-заявок
Я получила номер заявки через OnOrder, записала его в переменную и эту переменную записала в ключ ["BASE_ORDER_KEY"], но квик опять говорит что не указан номер базовой заявки. Что не так? Получить номер из таблицы заявок у меня тоже не получается - одни ошибки выдает. Помогите составить кусок кода на получение номера заявки из таблицы заявок пожалуйста
колбек OnTransReply это реакция на транзакцию, а не на состояние заявки. Для заявки надо работать по OnOrder OnStopOrder либо по таблицам заявок и стоп-заявок
Все очень просто и банально. ----------------------- Деньги разработчикам QUIK платят брокеры. -------------------------------------- Брокерам платят их клиенты. ---------------- Два вопроса знатокам ------------------------- 1) С какого бодуна Вы жалуетесь разработчикам на хреновые услуги брокеров 2) C какого бодуна разработчики квик обязаны делать что-то для Вас. ----------------------- Надо искать там, где потеряли, а не там, где светло.
У меня вин 10 все работает нормально у сбербанка. Возможно не установили сертификат. У меня никаких кнопок в квике не появилось. Попробуйте переустановить сертификат
serg написал: как загрузить квик сбербанковский? все время надпись выскакивает:"Цепочка сертификатов обработана, но обработка прервана на корневом сертификате, у которого отсутствует отношение доверия с поставщиком доверия."
c 1 апреля в КВИК сбербанка можно зайти если у вас установлен на компе сертификат минцифры
Про Pine Script. это разработка TradingView и скрипты исполняются на их сервере. т е все что вы напишите - это их собственность На их сайте для Вас дан ответ на вопрос: ---------------------------- Почему я не должен использовать скрипт Pine?
Основная причина, по которой вы не захотите использовать скрипт Pine, заключается в том, что вы ограничены вселенной TradingView.
Вот некоторые конкретные ограничения:
Данные. Если TradingView не предлагает нужные вам данные, вам не повезло. Конечно, TradingView имеет очень обширную базу данных. Но если ваша стратегия предполагает торговлю на малоизвестных рынках, данные о ценах могут быть недоступны.
Сервис выходит за рамки данных о ценах. Некоторые стратегии включают экономические или статистические данные. TradingView предлагает некоторые данные (в основном данные Quandl) в этой категории, но в настоящее время они ограничены.
Если вы используете альтернативные данные в своей стратегии, вероятно, будет проще использовать другой язык программирования, который обеспечивает большую гибкость.
Внешние библиотеки. Pine Script не подходит, если вы хотите использовать внешние библиотеки для выполнения таких задач, как машинное обучение. Есть лучшие альтернативы, если ваша стратегия основана на использовании науки о данных или других сторонних библиотек.
Станислав написал: А интерпретатор JavaScript в Node.js? По идее должна быть хорошая производительность.
Не видел торговых систем на их основе Подключать к КВИКУ не планирую. Вполне устраивает Lua, MQL5 и C.
PineScript, TradingView, терминал Тинькофф.
Да я и не прошу его подключать к квик. Сейчас молодежь со школы учат программировать на python, наверное, это был бы самый востребованный вариант в будущем. (сам не программирую на нем)
Давно торгую на MOCEX и давно использую QUIK. Как я писал ранее на форуме, QUIK позволяет работать с высокой скоростью. ---------------------------- Если возникнет необходимость в использовании TradingView, то напишу для него. Пока мне этого не надо. ----------------------------- Относительно питона. Тоже кое что использую для разработки встроенного софта IOT. ------------------------------ Проведенный тест показал что его интерпретатор почти в 100 раз медленне C и в 50 раз медленнее LuaJIT. Прикручивать его с КВИКУ смысла не вижу. ----------------------------------- В школе учился давно, тогда там программировать не учили, но это мне не мешает программировать сейчас на любом языке, если надо. Полагаю, что в будущем молодежь освоит все что ей понадобится самостоятельно.
nikolz написал: Один компьютер может обсчитывать очень сложный алгоритм по одному инструменту в реальном времени. Например нейронную сеть на 1 миллиард нейронных связей. ------------------------Делаем в интернет пул скажем 1000 компьютеров Получаем распределенный кластер прогнозирования 1000 инструментов в реальном времени.
:: . «Остапа понесло ….. Остап со вчерашнего дня еще ничего не ел. Поэтому красноречие его было необыкновенно» Ильф и Петров: «Двенадцать стульев»
nikolz написал: Один компьютер может обсчитывать очень сложный алгоритм по одному инструменту в реальном времени. Например нейронную сеть на 1 миллиард нейронных связей. ------------------------ Делаем в интернет пул скажем 1000 компьютеров Получаем распределенный кластер прогнозирования 1000 инструментов в реальном времени.
При таком размахе нужен не QUIK, а плаза, а там совсем другой подход.
Ликбез: плаза - это протокол , а не терминал. --------------------- Plaza II Шлюз FORTS — Программное обеспечение, обеспечивающее обмен данными между Серверной частью ПО – Торговой и клиринговой системы рынка фьючерсных контрактов и опционов (Торговой системой FORTS) и сертифицированной брокерской системой Интернет-трейдинга (читай сервер QUIK ) по протоколу Plaza II.
Один компьютер может обсчитывать очень сложный алгоритм по одному инструменту в реальном времени. Например нейронную сеть на 1 миллиард нейронных связей. ------------------------ Делаем в интернет пул скажем 1000 компьютеров Получаем распределенный кластер прогнозирования 1000 инструментов в реальном времени.
Александр М написал: Сами по себе цифры конечно красивые и проделана видимо огромная работа, но вот практическая целесообразность такой оптимизации под вопросом для реальных задач из под QUIK.
нет никакой оптимизации. ------------------------- Какую реальную задачу Вы сейчас решаете? Возможно она потому и не решается, что решается примитивно. --------------------------------- Представьте , что можно на КВИКЕ решать задачу в 100 раз сложнее за тоже время, что у Вас сейчас. ---------------------------------------- А учитывая возможность запуска много потоков, сложность решаемой задачи на квик может быть в 500...1000 чем решаемая Вами сейчас. ------------------------------------- И это на обычном компьютере без CUDA. ---------------------- Прикиньте сколько стоит компьютер, который в 100 раз быстрее вашего считает? А 2 1000? Вот эту задачу это и решает. -------------------- Если вы пришли на рынок за баблом то не ждите, что Вам его примитивный скрипт принесет. Скорее всего он его сольет. Чудес не бывает.
Sergey написал: Спасибо за ответ! Я вчера размышлял пока засыпал и пришел к такому выводу. Выражаясь вашими словами, разность движений направлений за день, определяет и направление по которому будет следовать индикатор. Проще говоря, если цена закрытия ниже половины ATR, то направление индикатора будет вниз, даже если свеча при этом будет зеленой.
Каждый индикатор предполагает некоторую модель рынка. В данном случае предполагается, что во первых рынок очень ликвидный. ----------------- Индикатор ATR Расчетная формула ATR: ATR = Moving Average(TRj, n), где TRj = максимальному из модулей трех значений |High — Low|, |High — Closej-1|, |Low — Closej-1|. ------------------- Понимать его можно так: Это сглаженное значение максимального диапазона движения либо последней свечи за день, либо свечи с учетом гэпа. Т е это индикатор движения (волатильности) рынка. ----------------------- ATR - это индикатор разности, поэтому некорректно сравнивать его с ценой.
Модель данного индикатора такая. Предполагается, что направление движения цены определяет направление денежного потока на рынке. ----------------------------- Так как все широко известные индикаторы были предложены до компьютеров, то они предполагают интервал от дня и выше. ------------------------ Для конкретики рассмотрим интервал день. -------------- Чтобы было наглядно, нарисуйте один период синусоиды -------------------------- (Close-Low) -диапазон движения цены вниз относительно закрытия за день, -------------------- (High-Close) -диапазон движения цены вверх день ------------------ Предполагаем , что это разное направление движения денег . ---------------- 2*Close-Low-High =(Close-Low)-(High-Close) - разность направлений движения денег за день ------------------- High-Low - это весь диапазон движения денег за день -------------------- ((2*Close-Low-High)/(High-Low)) - относительное изменение денежного потока ------------------- ((2*Close-Low-High)/(High-Low))*Volume - абсолютное изменение денежного потока за день
Добрый день, Ранее сообщал, что сделал возможность запуска скриптов QUIL в отдельных потоках в LUAJIT. ---------------- кратко это работает так. В колбек OnParam приходят сделки инструментов, которые передаются в функцию main() ----------------------- В main - это LUA 5.3 по каждому инструменту запускается скрипт алгоритма робота в отдельном потоке из пула потоков под LUAJIT. ====================== На просторах интернета нашел тесты по которым разработчики сравнивали MT5 сравнивали MQL5 и LUA в QUIK. --------------------- вот сами тесты:
Код
-- TestQuickSort
local array={}
local function QuickSort(arr,left,right)
local i=left
local j=right
local center=arr[math.floor((i+j)/2)]
while i<=j do
while(arr[i]<center and i<right) do i=i+1 end
while(arr[j]>center and j>left) do j=j-1 end
if i<=j then local x=arr[i] arr[i]=arr[j] arr[j]=x i=i+1 j=j-1 end
end
if left<j then QuickSort(arr,left,j) end
if right>i then QuickSort(arr,i,right) end
end
local function Start1()
for i=0,MAX_SIZE-1 do array[i]=i%100 end
start=os.clock()
QuickSort(array,0,MAX_SIZE-1)
res=(os.clock()-start)*1000
print("TestQuickSort SIZE="..MAX_SIZE..", time=" .. res .. " ms")
for i=1,MAX_SIZE-1 do
if array[i]<array[i-1] then print("Array not sorted"); break;
end
end
end
local str=""
local a={}
local function PiCalculate(digits)
local d = 0
local c = (math.floor(digits/4)+1)*14
local f = 10000
for i=0,c do a[i]=20000000 end
c=c-14
b=c
while b>0 do
e=d%f
d=e
while b-1>0 do
b=b-1
d = d * b + a[b]
g = (b * 2) - 1
a[b]=(d%g)*f
d=math.floor(d/g)
end
r=e+math.floor(d/f)
if r<1000 then
if(r>99) then
str=str .. "0"
else
if(r > 9) then
str=str .. "00"
else
str=str .. "000"
end
end
end
str=str .. string.format("%d",r)
c=c-14
b=c
end
end
function Start2()
start=os.clock()
PiCalculate(MAX_SIZE)
res=(os.clock()-start)*1000
print("TestPiCalculated SIZE="..MAX_SIZE..", time=" .. res .." ms Pi="..string.sub(str,1,16))
end
-- TestFibo
local fib={}
local function TestFibo(n)
if n<2 then return 1 else return TestFibo(n-2)+TestFibo(n-1) end
end
local function Start3()
start=os.clock()
for i=0,MAX_SIZE-1 do fib[i]=TestFibo(i) end
res=(os.clock()-start)*1000
print("TestFibo SIZE="..MAX_SIZE..", time="..res.." ms Fibo[39]="..fib[39])
end
-- TestArrays
local function Start4()
local x={} local y={}
local start=os.clock()
for i=1,MAX_SIZE,1 do x[i]=i y[i]=0 end
y[MAX_SIZE]=0
for k=1,MAX_SIZE,1 do
for i=MAX_SIZE, 1,-1 do y[i]=y[i]+x[i] end
end
local res=(os.clock()-start)*1000
local check=0
for k=1,MAX_SIZE,1 do check=check+y[k] end
print("Test Arrays SIZE="..MAX_SIZE..", Time = "..res.." ms check=".. check)
end
local function Ackermann(m,n)
if(m==0) then return(n+1) end
if(n==0) then return(Ackermann(m-1,1)) end
return(Ackermann(m-1,Ackermann(m,(n-1))))
end
-- TestAckermann
local function Start5()
local check=0
local start=os.clock()
for i=1,MAX_SIZE do check=check+Ackermann(1+i%3,1+i%5); end
local finish=os.clock()
local res=(finish-start)*1000
print("TestAckermann SIZE="..MAX_SIZE..",time=".. string.format("%.0f",res).." ms check="..check)
end
-- TestFloat
local f0=0.0
local f1=123.456789
local f2=98765.12345678998765432
local f3=12345678943.98
function TestFloat(MAX_SIZE)
MAX_SIZE=MAX_SIZE-1
for i=0, MAX_SIZE do
for j=0, MAX_SIZE do
f0=f0+(f1/(i+1))-f2+(f3*i);
end
end
end
function Start6()
local t=os.clock()
TestFloat(MAX_SIZE)
local res=(os.clock()-t)*1000
local check=f0
print("TestFloat SIZE="..MAX_SIZE..", time=" ..res.." ms check="..tostring(check));
end
MAX_SIZE=35000; Start6()
MAX_SIZE=120000; Start5()
MAX_SIZE=32000; Start4()
MAX_SIZE=40; Start3()
MAX_SIZE=22000; Start2()
MAX_SIZE=16000000; Start1()
=================== На этих тестах я провел тест LUA 5.3 и LUAJIT. ================== Результаты говорят сами за себя: Когда подключу MT5 к QUIK, то сделаю тест и для него. ----------------------- Следите за новостями.
Станислав написал: Очень интересно, поздравляю с успехом коллега!
Не понимаю, где была инициализирована переменная nk1?PS: К сожалению, не являюсь программистом на C/C++.
nk1 инициализирована в другом потоке и скрипте на Lua5.3. Применительно к скриту QUIK - в функции main() ------------------ Т е таким образом в этот поток в скрипт LuaJIT передаются любые параметры из потока со скриптом на Lua5.3
В качестве ликбеза. ---------------------- LUAJIT - это компилятор с оптимизацией в реальном времени. --------------------------- Так как любой робот это циклическое повторение расчета алгоритма прогноза по полученным данным, то LuaJIT выполняет компиляцию и оптимизацию скрипта совместно с виртуальной машиной. ---------------------------- В итоге с каждым новым циклом скрипт работает все быстрее и быстрее, приближаясь по скорости к чистому CИ.
сделал библиотеку , которая позволяет из скрипта на Lua5.3...5.4 вызвать в отдельных потоках скрипты на LuaJIT. Теперь можно запустить в скрипте КВИКА программный пакет TORCH ( ФАКЕЛ) . ---------------------------------- Вот пример бесконечного цикла скрипта в LuaJIT с синхронизацией потоков по событиям и вызов функций СИ через библиотеку FFI. --------------------------------. В этом примере из потока скрипта Lua5.3 передаются данные в поток скрипта LuaJIT через переменную nk1, которая выводится в файл.
Код
local ffi = require("ffi")
ffi.cdef[[
void Sleep(int ms);
long OpenEventA(uint64_t dwDesiredAccess, int bInheritHandle, const char* S);
long WaitForSingleObject( uint64_t hHandle, long dwMilliseconds);
long CreateEventA(int dwDesiredAccess, int M,int bInheritHandle, const char* S);
int SetEvent(uint64_t hEvent);
int ResetEvent(uint64_t hEvent);
]]
path = "D:/QUIK_SCRIPT/nk_bot/"
Log=io.open("D:/QUIK_SCRIPT/nk_bot/test_jit.log","w")
local event=ffi.C.OpenEventA(0x1f0003,0,"event");
while true do
local x=ffi.C.WaitForSingleObject(event,-1); --ждем события
local z=nk1;
Log:write(os.time()..","..tostring(z).."\n"); Log:flush();
ffi.C.ResetEvent(event)
-- print(x)
end
это не ложные шипики. Посмотрите формулу RSI RSI считается по разности закрытия свечей. Поэтому увеличение периода сглаживания не тоже самое что RSI на большем интервале. На интервале 1 день все свечи с интервалом 1 ча просто не существуют. Я конечно понимаю, что Вам все равно, так как Вы не понимаете смысла индикаторов.