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

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

Страницы: Пред. 1 ... 55 56 57 58 59 60 61 62 63 64 65 ... 78 След.
два робота в одном квике
 
"Позвольте пару слов без протокола.."
Будем рассматривать работу на многоядерном компе.
---------------------------------
Колбеки.
Полагаю, что в 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") перемещает указатель текущей позиции в конец файла, и  возвращает его длину.
Как взять значение последней строки из файла?
 
Цитата
RC2 написал:
В целом мне необходимо реализовать трейлинг-стоп, но без выставления заявки, т.е расчет трейлинг-стопа должен быть в скрипте. На сколько я понимаю это не сделать без сохранения цен во внешний файл, т.к. между итерациями все переменные обнуляются.
не определяйте переменные как локальные и они не будут обнуляться.
Использовать запись в файл для реализации трейлинг-стопа нет необходимости.
Как быстрее войти в сделку, Как быстрее получить нужно значение цены или графика для выполнения условия
 
Если быть точным, то сложение двух свечей и вычитание из суммы одной.
На самом деле это азбука цифровой обработки сигналов в скользящем временном окне.
Как быстрее войти в сделку, Как быстрее получить нужно значение цены или графика для выполнения условия
 
Цитата
swerg написал:
Цитата
Николай  Камынин   написал:
Цитата
swerg   пишет:
Если же надо просуммировать 1000 свечей, да еще дифур решить для вычисления значения индикатора - лучше взять готовое значение из квика, если там есть такой индикатор, это и проще и надёжнее, ибо в своём алгоритме мы еще и наошибаться можем, а квиковый индикатор - хотя бы глазами видишь что он на самом деле считает.
Вот тут у Вас ошибочка
Чтобы сложить 1000 свечей надо столько же время сколько для сложения двух.
---------------------------------------
Вопрос же поставленный в начале вообще то не имеет однозначного решения
Он из разряда "Как стать счастливым"
У меня ошибки нет, а вот вы - обманываете.
Чтобы сложить 1000 свечей - требуется по крайней мере 1000 операций сложения.
Я понимаю, что вы говорите про количество сложений на каждую свечу и итеративный подход, однако если уж взялись указывать на ошибки другим - будьте любезны и сами быть в этой ситуации непогрешимым в формулировках.
Иначе, сами понимаете, лужа за углом может поджидать.
нет, я говорю о работе в реальном времени.
В реальном времени циклы - это зло и их в правильных алгоритмах не применяют.
Поэтому складывать надо текущую сумму с новым значением  т е сложение двух свечей.
Как включить файл в луа?, Есть ли в Луа аналог директивы include из С
 
dofile
Что с оператором "if"?, Он не умеет сравнивать дробные числа?
 
function ff1(dp)
for i=-8.8,-0.8 do
print(i.."/"..dp)
if tostring(dp)==tostring(i) then print(dp) end
end
end
Что с оператором "if"?, Он не умеет сравнивать дробные числа?
 
Цитата
Старатель написал:
Цитата
Николай  Камынин   написал:
ff1(-8.8)
Все работает правильно.
Вопрос был в другом  
Код
   function   ff1 (dp)
   for  i  =   -  8.8 ,  -  0.8   do 
     if  dp  =  =  i  then   print (dp)  end 
   end 
 end 

 for  param, value  in  pairs({ -  8.8 ,  -  7.8 ,  -  6.8 ,  -  5.8 ,  -  4.8 ,  -  3.8 ,  -  2.8 ,  -  1.8 ,  -  0.8 })  do 
  ff1(value)
 end   
Я Вам про это и ответил.
В данном варианте Вам надо написать функцию так:
unction ff1(dp)
for i=-8.8,-0.8 do
print(i.."/"..dp)
if string(dp)==string(i) then print(dp) end
end
end
Что с оператором "if"?, Он не умеет сравнивать дробные числа?
 
а если передать строку:
ff1(tostring(-8.8))
То получим:
------------------
-8.8/-8.8
-7.8/-8.8
-6.8/-8.8
-5.8/-8.8
-4.8/-8.8
-3.8/-8.8
-2.8/-8.8
-1.8/-8.8
-0.8/-8.8
>Exit code: 0
Т е строка -8.8 не равна числу -8.8. Это тоже правильная работа if .
Что с оператором "if"?, Он не умеет сравнивать дробные числа?
 
function ff1(dp)
for i=-8.8,-0.8 do
print(i.."/"..dp)
if dp==i then
print(dp)
end
end
end

ff1(-8.8)
-----------------------------
результат
-8.8/-8.8
-8.8
-7.8/-8.8
-6.8/-8.8
-5.8/-8.8
-4.8/-8.8
-3.8/-8.8
-2.8/-8.8
-1.8/-8.8
-0.8/-8.8
>Exit code: 0
Все работает правильно.
Что с оператором "if"?, Он не умеет сравнивать дробные числа?
 
сравнивать можно, но важно, чтобы тип у сравниваемых переменных был одинаковый.
Так как тип указан неявно, то может возникать ситуация сравнения числа с текстом.
поэтому при сравнении указывайте тип явно.
Что быстрее - DataStore или GetCandlesByIndex?
 
Цитата
тот самый написал:
Цитата
Николай  Камынин   написал:
Так как обработка делается в реале, то затраты ресурсов минимальные.
Цитата
Николай  Камынин   написал:
в реале (налету)  сортирую по инструментам
Цитата
Николай  Камынин   написал:
а ещё - люблю сочинять сказки. Очень люблю..правд ::
Ну вот как тут не вспомнить замечательную басню Крылова "Слон и моська"
Что быстрее - DataStore или GetCandlesByIndex?
 
Цитата
Космонавт написал:
Добрый день. У меня робот мониторит больше сотни акций, по всем открыты графики. Это не праздный вопрос, а злободневный. Что продуктивнее - получать данные индикатора с графика через getCandlesByIndex или НЕ открывать графики и всё делать через заказ данных с помощью DataStore, а индикаторы считать внутри робота?
1. Что быстрее?
2. Что экономнее для ресурсов компьютера?

Спасибо.

Для большого числа акций делаю так:
Получаю ТВС по подписке ,
в реале (налету)  сортирую по инструментам
и формирую необходимые индикаторы.
Так как обработка делается в реале, то затраты ресурсов минимальные.
Утечка памяти
 
Цитата
тот самый написал:
Цитата
Vladimir   написал:
А если оперативки 8 ГБ, есть ли разница? Quik же бывает только 32битный, т.е. не может использовать всю память? Т.е. вопрос: можно ли на нем развертывать большие проекты на клуа с сотней ботов?
Размер оперативки - в QUIK-е - влияет лишь на количество одновременно открытых окон и то, до определённого предела.
Как уже говорил - QUIK  - относится к системам с обязательной сериализацией данных. То есть, любой "чих" пользователя, а также ЛЮБОЕ изменение в принимаемых и отправляемых транзакциях - он сериализует на ДИСК. Потому что биржевые данные - это реальные деньги. Отсюда и то, что он даже не сжимает данные при хранении на диске - потому что так быстрей.
Про сериализацию это конечно хорошо, но когда КВИК зачинали, это слово не применялось.
В квике использованы проецируемые в память файлы - это основной метод винды для работы с большими массивами.
 
Стоп лимит тейк профит по исполнению стоп заявки
 
вроде бы на фьючерсах нельзя по рынку выставлять
CreateDataSource: ограничить число полученных свечек
 
Цитата
Imersio Arrigo написал:
Цитата
Николай  Камынин   написал:
надо знать лишь две свечи в MA и одну в EMA.
Это если есть результаты предыдущих вычислений.
А если они ==0, то не получится.
Это лишь в начале т е при запуске. но в это время данные поступают с сервера и они рассчитываются в реальном времени. И условия остаются теже  - не более двух свечей.
CreateDataSource: ограничить число полученных свечек
 
действительно, какая-то каша.
На самом деле,
скорость вычисление скользящих не зависит от числа свечей ,
фактически для этого надо знать лишь две свечи в MA и одну в EMA.
Просто надо изучить цифровую обработку сигналов.
Отметки на графике QUIK средствами QLUA
 
Цитата
Ivanco написал:
Подскажите пожалуйста, возможно ли средствами языка QLUA делать какие-либо графические отметки на графике инструмента в QUIK? Например, если алгоритм находит удачный момент для сделки - ставить графическую отметку на графике и т.п.

Заранее благодарен.
Функции для работы с метками

Предназначены для построения меток и установки их на графике.  

  • AddLabel - добавляет метку с заданными параметрами
  • DelLabel - удаляет метку с заданными параметрами
  • DelAllLabels - удаляет все метки на диаграмме с  указанным графиком
  • GetLabelParams - позволяет получить параметры метки
  • SetLabelParams - задает параметры для метки с  указанным идентификатором
Руководство пользователя QUIK © ARQA Technologies / www.arqatech.com/ru/products/quik/
Теоретическая разница получения данных CreateDataSource+SetUpdateCallback или getNumCandles()+getCandlesByIndex(), В чем разница получения данных 1 способом и 2 способом
 
Цитата
Владимир Б****ов написал:
Теоретически, по времени, есть разница между колбэком и таймером (sleep()), а практически разница заметна? может кто проводил измерения/исследования?
колбек и sleep() - это две большие разницы.
колбек - это функция LUA , которую вызывает терминал QUIK для обработки события.
sleep() - это остановка исполнения потока(процесса) и досрочное освобождение процессора.
Как сделать цикл по всем меткам на графике в LUA
 
Цитата
Sergey Denegin написал:
может у них есть какой нибудь массив данных? Типа глобальной переменной _G
Создавайте  метки в индикаторе и сохраняйте их в массиве. При новом запуске метки построятся заново и сохранятся в массиве.
OnCalculate. Двойной проход при изменении свойств индикатора
 
У вас счетчик не обнуляется.
функция INIT()  выполняется лишь один раз при загрузке индикатора на график.
Теоретическая разница получения данных CreateDataSource+SetUpdateCallback или getNumCandles()+getCandlesByIndex(), В чем разница получения данных 1 способом и 2 способом
 
но так как время свечи не меняется, то новое значение запишется на место close открытой свечи по данному тайму.
Страницы: Пред. 1 ... 55 56 57 58 59 60 61 62 63 64 65 ... 78 След.
Наверх