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

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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 86 След.
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
Йцукен написал:

Теперь если ваш код модифицировать следующим образом:
Код
   local  x, y
 function   main ()
   while   true   do 
    y  =   99 
    x  =   199 
    x, y  =  y, x
     if  x ~ =   99   or  y ~ =   199   then 
      s  =  tostring(x) .. "," .. tostring(y) .. "\n"
     end 
   end  
 end   
и запустить, то QUIK повесится (версия Lua: 5.4.1).

Поправьте так и ничего не повесится:
Код
local  x, y
 function   main ()
   while   true   do 
    y=99
    x= 99 
    x, y  =  y, x
     if  x~= 99   or  y ~= 199   then 
      s  =  tostring(x) .. "," .. tostring(y) .. "\n"
     end 
       sleep(1);
   end  
 end  
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
 
Два других должны быть не нулевые , так как определяют клиента на сервере брокера.
Извечный вопрос: повторные вызовы OnTrade, Даже при заявке на одну акцию
 
Цитата
User12501 написал:
Создаю заявку из lua-скрипта на покупку ровно одной акции. Т.е. никаких финтов с частичным исполнением не может быть. При исполнении происходят два вызова функции OnTrade. Сделал полную распечатку всей таблицы от обоих вызовов. Отличие только в трёх полях: uid, on_behalf_of_uid, trans_id. При первом вызове все три нулевые, при втором все три - ненулевые.

Вопросы следующие:
1. Гарантируется ли, что вызов OnTrade, в котором эти поля нулевые, является не последним, т.е. я могу его игнорировать, т.к. после него будет следующий?
2. Гарантируется ли, что вызов, в котором эти поля ненулевые, является последним?
3. Являются ли эти три поля синхронными всегда? (Т.е. либо все три равны 0, либо все три не равны 0?) Т.е. можно ли проверять только одно из них, а не все три вместе?
Если заявка, по которой пройдет сделка выставлена не скриптом Lua, то trans_id будет нулевой .
-------------------------------------------
Должны быть не нулевые , так как определяют клиента на сервере брокера.
-----------------------------
Полагаю , что первый раз приходит с биржи, второй - с сервера брокера.
 
 
Cкорость обмена данными через файлы
 
Цитата
Йцукен написал:
Цитата
nikolz написал:
Но если это разные потоки или приложения, то надо синхронизировать
Как в QLua синхронизировать запись из разных скриптов в один файл?
А Вы писали из разных скриптов в один файл? Что получается?
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
Йцукен написал:
Цитата
nikolz написал:
x,y=y,x;
       if x~=99 or y~=199 then
           Log:write(tostring(x)..","..tostring(y).."\n")
Даже если вы поймаете тут ошибку, то подумайте вот о чём:
1) Может ли другой поток поменять значения переменных перед if ? Будет ли это означать отсутсвие атомарности в операторе присваивания?
2) Может ли другой поток поменять значения переменных перед выводом их в файл, т.е. гарантированно ли вы получите те значения, которые проверяли в if ?

    Скрытый текст       Ответ на 2-й вопрос - Нет.
Не знаю что Вы называете атомарностью операции.
Но В языке программирования Lua нет специальных атомарных операций.
-------------------------------------
Дело в том, что скрипт луа выполняется на виртуальной машине, а его операторы преобразуются в байт код.  Т е любой оператор -это набор функций на СИ. Поэтому официально в луа нет атомарных операций.
Можно говорить о синхронизации потоков при обращении к данным. Что делается известными методами, в том числе и в VMLua и в библиотеке  QLUA.
-----------------
Кроме того, VMLua изначально сделана не многопоточная( это всем известно).  Поэтому , если механизм синхронизации встроен, то ответ на ваш 2 вопрос будет нет, а если он не встроен , то ответ Да.
Рекомендую открыть в КВИКе еще поток ОС с VMLua как корутину (так открыт поток main) и обратится из него к общим переменным.  И Вы увидите ответ на Ваш вопрос. ( У Вас QUIK все просто вылетит аварийно)
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
тест поправил:
Код
minfo=debug.getinfo(1, "S").source:sub(2);  path=minfo:match("(.*[/\\])") or "."
Log=io.open(path.."/test.log","w"); 
fconnect=1; 
local x,y;
function main()
    while true do
        y=99 x=199      x,y=y,x;
        if x~=99 or y~=199 then
            Log:write(tostring(x)..","..tostring(y).."\n");Log:flush();
        end
            sleep(1);
       end 
end   
function OnParam(c, s) 
   y=100 x=200      x,y=y,x;
   if x~=100 or y~=200 then
        Log:write(tostring(x)..","..tostring(y).."\n");Log:flush();
    end
end

function OnInit(p) 
 fconnect=1;
end
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Йцукен,
Вы, очевидно, ждете системные ошибки, типа ошибок обращения к памяти. Верно?
Но их может и не быть.
Атомарность обнаруживается например тем, что записав в ячейку 1 и прибавив к ней 1 Вы ожидаете прочитать из нее 2, а читаете 0, так как с момента прибавления 1 до момента чтения результата другое ядро успело записать в эту ячейку ноль.
 
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
Йцукен написал:
Цитата
nikolz написал:
как вы проверили, что выполняется атомарно?  Где доказательство?
Вот:  #11
Цитата
Йцукен написал:
такой код работает без ошибок

Можете опровергнуть?
Как Вы это установили?  какие ошибки?
---------------------
Вот вам тест:
Код
minfo=debug.getinfo(1, "S").source:sub(2);  path=minfo:match("(.*[/\\])") or "."
Log=io.open(path.."/test.log","w"); 
fconnect=1; 
local x,y;
function main()
  while  fconnect do 
        fconnect=2
        while fconnect==2 do
            y=99 x=199      x,y=y,x;
            if x~=99 or y~=199 then
                Log:write(tostring(x)..","..tostring(y).."\n");Log:flush();
            end
        end 
        sleep(10);
    end
    sleep(1000) 
end   
function OnParam(c, s) 
   y=100 x=200      x,y=y,x;
   if x~=100 or y~=200 then
        Log:write(tostring(x)..","..tostring(y).."\n");Log:flush();
    end
end

function OnInit(p) 
 fconnect=1;
end
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Атомарная (греч. άτομος — неделимое) операция — операция, которая либо выполняется целиком, либо не выполняется вовсе; операция, которая не может быть частично выполнена и частично не выполнена.
https://ru.wikipedia.org/wiki/Атомарная_операция
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
Йцукен написал:
Похоже, операция множественного присвоения выполняется атомарно.
Вот такой код работает без ошибок:
    Скрытый текст        
Код
   local  run  =   true 
 local  a1, a2, a3, a4, a5, a6, a7, a8, a9  =   0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 
 local  n  =   100 

 function   OnAllTrade ()
   for  i  =   1 , n  do 
    a1, a2, a3, a4, a5, a6, a7, a8, a9  =  i, i, i, i, i, i, i, i, i
   end 
 end 

 function   OnParam ()
   for  i  =   1 , n  do 
    a1, a2, a3, a4, a5, a6, a7, a8, a9  =  i, i, i, i, i, i, i, i, i
   end 
 end 

 function   main ()
   while  run  do 
     sleep ( 1 )
     local  t  =  prec_time()
     for  i  =   1 , n  do 
       if  a1 ~ =  a2  or  a1 ~ =  a3  or  a1 ~ =  a4  or  a1 ~ =  a5  or  a1 ~ =  a6  or  a1 ~ =  a7  or  a1 ~ =  a8  or  a1 ~ =  a9  or  a1  =  =   nil   then 
        error( "error" )
       end 
     end 
   end 
 end 

 function   OnStop ()
  run  =   nil 
 end   
и как вы проверили, что выполняется атомарно?  Где доказательство?
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Йцукен,
Интересно, как Вы реализуете обращение к этим переменным в разных потоках?
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
Йцукен написал:
a, b = 1, 2
это выполнится на этапе компиляции.
а это
x, y = y, x
как указано ранее
Вопрос о целостности данных при работе с таблицей из разных вычислительных потоков
 
Цитата
Йцукен написал:
атомарной операция присвоения одновременно нескольким переменным
нет.
При множественном присваивании Lua сначала вычисляет все значения, а затем выполняет присваивание.
Данные с индикатора. Просто и быстро.
 
Продолжение здесь:
https://forum.quik.ru/messages/forum17/message80774/topic9418/?result=new#message80774
Торговый советник - это просто.
 
Тема для начинающих писателей роботов.
Продолжение темы:
https://forum.quik.ru/messages/forum17/message80773/topic9417/#message80773
-------------------------
Чтобы сразу не сливать депозит,  лучше написать робот-советник, который на истории покажет , что он сможет.
---------------------------
Напишем такой советник.
Для этого в приведенный по ссылке выше скрипт добавим расчет прибыли/убытков при совершении сделок по приведенному ранее(см ссылку) алгоритму
------------------------
Примем что брокер и биржа забирают com=0.006 (0.6%)
Расчет будет проводить в %, количество лотов примем равным 1. Сделки совершаются в long и short.
В результате получился вот такой скрипт:
Код
function OnCalculate(i)
  local buy,sel;
  if i==1 then OnChangeSettings() 
    i1=0; t={}; Prof=0; Los=0; Q=Settings.Q; com=Settings.com; ProfAll=0;  BS=0;
  elseif i1~=i  then 
     ind(i1,Settings.tag,t); 
     if #t>0 then
          local Oi,Hi,Li=O(i1),H(i1),L(i1)  local prib=0;  local z=T(i1);   x=t[#t]; 
          params.DATE=100*(100*z.year+z.month)+z.day; 
          params.TIME=100*(100*z.hour+z.min)+z.sec;
          if Li>x and 0>=BS then buy=Li-0.05;  if BS==0 then prib=-com; else prib=(1-com)*(price/Oi-1); end  BS=1; price=Oi; params.YVALUE=buy-0.1; end
          if x>Hi and BS>=0  then  sel=Hi+0.05 if BS==0 then prib=-com; else prib=(1-com)*(Oi/price-1); end price=Oi;  BS=-1; params.YVALUE=sel+0.1; end
          if buy or sel then
            ProfAll=ProfAll+prib;    params.TEXT=(0.1*(1000*ProfAll//1)).."%" 
            if ProfAll>=0 then params.B=255 params.R=0 else params.B=0 params.R=255 end
            Label=AddLabel(Settings.tag,params);
          end
      end
  end
  i1=i;  
 return buy,sel;
 end

function Init() 
local t={} Settings.line =t;
   t[#t+1]={Name = "Bu",Color = RGB(0,255,0),Type = 10,Width = 4};
    t[#t+1]={Name = "Se",Color = RGB(255,0,0),Type = 11,Width = 4};
   return #t; end
    
function OnDestroy ()  DelAllLabels(Settings.tag) end
function OnChangeSettings() 
   DelAllLabels(Settings.tag); 
end


а это результат его тестирования на демо-сервере:
Данные с индикатора. Просто и быстро.
 
Теперь добавляю надписи в скрипт.
Код
Settings={ tag="moving", Name = '*nk_test'}
params={R=0,G=0,B=255,TRANSPARENCY=0,FONT_HEIGHT=10,TRANSPARENT_BACKGROUND= 1,FONT_FACE_NAME= 'Verdana'}

function ind(i,tag,t)
  local M=getNumCandles (tag);  
  if M>=i then x=getCandlesByIndex(tag,0,i,1); if x then t[#t+1]=x[0].close end   end
  end

function OnCalculate(i)
local buy,sel;
  if i==1 then  i1=0; t={}; BS=0;
  elseif i1~=i  then  ind(i1,Settings.tag,t);  
      if #t>0 then  local x=t[#t];  if L(i)>x and 0>=BS then  buy=L(i)-0.05; BS=1; params.TEXT="buy" 
      end  if x>H(i) and BS>=0 then   sel=H(i)+0.05 BS=-1; params.TEXT="sel" end end
      -----------------------------------
      if sel or buy then  
        local x=T(i); params.DATE=100*(100*x.year+x.month)+x.day; params.TIME=100*(100*x.hour+x.min)+x.sec;
       if buy then  params.YVALUE=buy-0.1 else  params.YVALUE=sel+0.1 end;
       Label=AddLabel(Settings.tag,params); 
      end
      -------------------------------
   end
  i1=i;  
 return buy,sel;
 end

function Init() 
local t={} Settings.line =t;
   t[#t+1]={Name = "Bu",Color = RGB(0,255,0),Type = 10,Width = 4};
    t[#t+1]={Name = "Se",Color = RGB(255,0,0),Type = 11,Width = 4};
   return #t; end
    
function OnDestroy ()  DelAllLabels(Settings.tag) end
получаем вот такой результат торгового советника:
Данные с индикатора. Просто и быстро.
 
Теперь покажу простой скрипт-индикатор  торгового советника.  
Он реализует следующий алгоритм:  
-----------------------
Покупаем, если минимум свечи выше мувинга.
продаем, если максимум свечи  ниже мувинга.
---------------------
Чтение данных мувинга вынес в отдельную функцию.
Вот этот скрипт:  
Код
Settings={ tag="moving", Name = '*nk_test'}

function ind(i,tag,t)
  local M=getNumCandles (tag);  
  if M>=i then x=getCandlesByIndex(tag,0,i,1); if x then t[#t+1]=x[0].close end   end
  end

function OnCalculate(i)
local buy,sel;
  if i==1 then  i1=0; t={}; BS=0;
  elseif i1~=i  then  ind(i1,Settings.tag,t);  
      if #t>0 then  local x=t[#t];  if L(i)>x and 0>=BS then buy=L(i)-0.05; BS=1;  end  if x>H(i) and BS>=0 then sel=H(i)+0.05 BS=-1; end end
   end
  i1=i;  
 return buy,sel;
 end

function Init() 
local t={} Settings.line =t;
   t[#t+1]={Name = "Bu",Color = RGB(0,255,0),Type = 10,Width = 4};
    t[#t+1]={Name = "Se",Color = RGB(255,0,0),Type = 11,Width = 4};
   return #t; end

а это результат работы советника:
Данные с индикатора. Просто и быстро.
 
и еще...
Все существующие на графике свечи будут считаны в момент открытия графика.
Поэтому  в последующие моменты будет считываться лишь последняя закрытая свеча и только один раз.  
Данные с индикатора. Просто и быстро.
 
Тема для начинающих писателей роботов.
----------------------------
Ранее на форуме я рассказывал как построить робота-эксперта  на основе двух любых индикаторов отображаемых на графике.
https://forum.quik.ru/forum17/topic7630/
---------------------------
В этой теме поясню как читать данные с индикатора быстро и просто.
------------------------
Напишем пример скрипта индикатора, который считывает значения индикатора moving в массив t и выводит на график значения индикатора смещенные на 0.1 в виде зеленых треугольников .
---------------------------
При этом  сделаем так, чтобы индикатор не тратил время на считывание тиков, а читал значение индикатора один раз в момент появления новой свечи цены.

В моих роботах именно в этот момент и принимается решение о выставлении заявки.

Т е решение принимается в момент открытия новой свечи .
------------------------------  
Если робот будет торговать на интервала 30 минут, то чтение индикатора будет происходить всего 1 раз в 30 минут именно на открытии новой свечи.
Код
Settings={ tag="moving", Name = '*nk_test'}

function OnCalculate(i)
 if i==1 then  i1=0; t={};
 elseif i1~=i  then local M=getNumCandles (Settings.tag);  
    if M>=i then x=getCandlesByIndex(Settings.tag,0,i1,1); if x then t[#t+1]=x[0].close end  i1=i;  end
 end
 i1=i;  if #t>0 and t[#t]~=0 then  return t[#t]+0.1; end
end

function Init() 
local t={} Settings.line =t;
t[#t+1]={Name = "Bu",Color = RGB(0,255,0),Type = 10,Width = 3};
return #t;
end



это результат:
Торговые роботы без программирования
 
Тема создана с целью  обсудить мой подход к созданию торговых роботов без написания сложных скриптов на Lua.
--------------------------
Приведу примеры, потом объясню что и как.
----------------------
Пример 1: Скрипт скользящего стопа на основе индикатора fractals записывается таким образом:



Пример 2: Скрипт торгового робота на основе индикаторов moving и RSI



Робот строится как скрипт индикатора и состоит из обязательной таблицы Settings, встроенных в QUIK индикаторов  и библиотеки nklibi, начальным объемом  11 КБ.
-------------------
Все необходимые параметры робота определяются в Settings.
Изначально указывается, если надо, создание лог файла, набор индикаторов, на основе которых будет работать робот.  Для каждого индикатора указывается линия, параметр свечи и смещение относительно текущего значения.
-------------------  
Для применения робота необходимо открыть график инструмента, поместить на него указанные в Settings индикаторы и записать им в качестве идентификаторов указанные имена.
-------------------
Алгоритмы новых роботов можно добавить либо в библиотеку, либо в конец скрипта.
===================
Библиотека nklibi реализует конечный автомат  управления заявками и стоп-заявками, а также определяет по графику инструмента все необходимые для торговли параметры.
====================
Если график с индикатором робота связать якорем с таблицей текущих параметров(ТТП) торгов, то, перебирая инструменты в ТТП,  можно переключать робота  на различные торгуемые инструменты.
----------------------------------
Конструктивные предложения по расширению возможностей данного подхода приветствуются.
----------------------------
В настоящее время библиотека nklibi находится в стадии тестирования.


 
Нули в индикаторе там, где должны быть пустые интервалы
 
попробуйте так:
Код
function OnCalculate(index)
  ...
if v and v==0 then v=nil end
return v
end
или так:
Код
function OnCalculate(index)
  ...
if v and v~=0 then return v end
end
Cкорость обмена данными через файлы
 
Цитата
AndyWise написал:
Цитата
Самое смешное то ,
что задержка измеряется в мкс
и составляет в среднем не более  10 . т.е. 0.000001 сек.
-------------------------
Это медленно?  
Спасибо, очень интересно.  Получается, для человека 0,1 сек в общем то за глаза. Меня в свое время смутило в Квике в "Импорте динамических транзакций из файла" рекомендуемый интервал аж 5 секунд! Почему? Пожалуй все на 0,1 надо переделать. А функции типа getParamEx, getNumCandles, getFuturesHolding, getNumberOf не измеряли часом?
Импорте динамических транзакций из файла - это другое.
Полагаю, что 5 секунд связано с интервалом опроса терминалом файла транзакций, а не с минимальным временем чтения данных из файлов.
Терминал QUIK создан для подачи заявок брокеру как альтернатива звонка по телефону. Терминал не предназначен для высокоскоростной торговли роботами (HFT).
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
nikolz,  Да я умею читать справку. Речь идет о передаче из графика в луа? Есть график где исполняются в QUIK разные индикаторы и формируются свечи, но чтобы привести цену к необходимому формату нужны class_code и sec_code, а с графика получаем легенду графика, если б приходил sec_code, то все остальные торговые параметры можно было бы восстанавливать (получать)  по нему. А по факту задал tag графику получил все остальные метрики в том числе и торговые.
Не сомневаюсь что Вы умеете читать справку.  
Я лишь показал как сам получаю эти данные с графика.
Если это не то, то расскажите на примере, что Вы хотите.
 
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Определенное не удобство в этом подходе, вызывает от факт что нельзя вернуть с class_code и sec_code? То факт что возвращается легенда графика, мало чем помогает в автоматизации подхода.  
Вы ошибаетесь.
Вот так получаете  class_code и sec_code и интервал:
Код
   local t=getDataSourceInfo(); 
   int=t.interval; clas=t.class_code; sec=t.sec_code;
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Цитата
Nikolay написал:
Все же мне сложно понять зачем выбирать чтение с медленного графика, когда есть инструмент для получения данных без каких либо ручных манипуляций.
Все дело в компетенции.
Подход с запахом "нафталина", напомнил времена, когда информация передавалась на дискетах, а вместо монитора зачастую использовали телевизор.  А под DOS за несколько минут можно было собрать не большое приложение, да еще работающее.

Вот и это подход позволяет за не большой промежуток времени собрать целые стратегии. Да он отправляет к истокам самого QUIK, но мне представилось, что его не забросили разработчики и что то подкрутили. По крайней мере у меня такое чувство сложилось от применения. Если отбросить мой контур управления из луа кода в виде модулей, то подход с правилами описанными выше стоит 100 - 300 кБ. Но главное это время от идеи до воплощения в терминале!
Индикатор, который управляет стопом, например по fractals,  скрипт всего 4КБ.  
Получить номер свечи-фрактала
 
Пардон, ранее это уже написано, просто пояснил на примере
Получить номер свечи-фрактала
 
Если я правильно понял, то функция function FRACTALS  написана универсально для индикаторов и скриптов.
Код
 Out = (O and O(I)) or (ds and ds:O(I))
В данном случае она используется в индикаторе, поэтому будет работать левая  часть  относительно  or
Код
(O and O(I)) 
Если использовать ее в скрипте, то будет работать правая часть or т е ds
Код
(ds and ds:O(I))
 
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Оказывается, QUIK гарантирует,  если время последней свечи изменилось — свеча закрыта ! Тогда определяется ключевой элемент "детектор НОВОЙ СВЕЧИ".
Важно, торговые решения применяем, только после закрытия свечи, торговля внутри незакрытой свечи Запрещена!
Следящее правило, работать с 2–3 последними свечами, отсчет ведется от текущей не закрытой свечи.
getCandlesByIndex   имеет смысл использовать лишь в индикаторах.  
Ваш вариант не имеет практического смысла.
--------------------------
Например, скрипт скользящего стопа при реализации в индикаторе составляет примерно 100 строк.
если торгуем руками, то используем всегда график.
Тогда скрипт скользящего стопа просто бросается на график любого инструмента и автоматом управляет стопом.
---------------------
При этом закон изменения стопа задается любым желаемым индикатором на графике.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
for i = 0, 50000 do
           local _, n = getCandlesByIndex(o.tag, o.line, i, 1)
Правильно Вас понял, Вы здесь
Код
 for i = 0, 50000 do
            local _, n = getCandlesByIndex(o.tag, o.line, i, 1)

читаете 5000 раз по одной свечи?  и определяете конец по нулю свечей
и так делаете в цикле?
В таком случае можно сделать просто бесконечный цикл и выход по break
---------------------------
Но лучше читать лишь новые свечи и лишь тогда, когда они есть.  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Почему портфель причем. Этим же подходом, проходим по портфелю, переключаемся в терминале на режим связанных окон от таблицы "Состояния Портфеля", и проверяем идеи на портфеле.
Когда-то давно делал это в автомате на AutoIT.
Относительно не сложно написать скрипт на AutoIT (язык для автоматизации выполнения задач в Microsoft Windows) , который переключает инструменты в таблице ТТП -инструмент меняет график в связанном окне и скрипт на луа считает портфель .
И получаем любое число инструментов с одним графиком.   При этом QUIK сам делает подписку на нужные свечи инструментов.
-------------------------
Почему AutoIT.?
Потому что это язык специально созданный, чтобы лазить по окнам и автоматизировать ручное нажатие клавиш.  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Функцию getCandlesByIndex удобно использовать для построения робота на основе встроенных в QUIK индикаторов для торговли одним инструментом.
-------------------------------------
Скрипт такого робота самый простой в написании и самый быстрый в исполнении по сравнению со скриптами на самописных индикаторах.
-----------------------------
При этом не надо заморачиваться алгоритмами индикаторов.
------------------------------
Очень просто тестировать различные стратегии  на основе RSI,мувинг, и т д
----------------------------------
Начинающим писателям роботов  и не только можно рекомендовать такой подход.  
OnTrade отображает неверное количество акций, Изменения в состоянии счёта отображаются не мгновенно
 
Цитата
User12501 написал:
Предположим была заявка на покупку акции. В момент исполнения заявки вызывается OnTrade. Если из этой функции OnTrade напечатать текущий размер позиции с помощью getDepoEx, только что исполненная заявка там не будет учтена, т.е. напечатается неверное количество (которое было до исполнения заявки). Почему так происходит и как это исправить? Спустя несколько миллисекунд количество становится правильным, уже в следующих функциях. Но мне нужно в функции OnTrade использовать текущее количество акций. Как я могу его надёжно получить?
Все верно.
Сначала приходит информация с биржи о сделке. На бирже торгует брокер, а не клиенты.
Потом брокер записывает изменения позиции клиента в своем внутреннем  учете и сообщает об этом клиенту.
И эта инфа приходит клиенту после информации о совершении сделки.
Т е сначала инфа о сделке потом инфа об изменении портфеля.
Стоимость позиции на начало дня, Почему-то везде нулевая в T0
 
Цитата
Kilor написал:
Да, там на скрине как раз и был пример отображения (как-то криво вставился по Ctrl+V) - все позиции имеют равные значения в T1/Tx и нулевые - в T0 в окне позиций по инструментам.
А у Вас есть обязательства сроком расчётов по которым истекает «сегодня» (T0)?
Прошу разъяснить термины: объем в обращении, объем обращения и оборот
 
Средневзвешенная цена:
Отношение оборота текущей сессии в деньгах к бумагам во всех сделках, рублей
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Все на этом форуме - это бесплатные тестировщики QUIK.
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Сергей,
Вы ошибаетесь.
Вы и я и все на этом форуме не клиенты разработчиков, а клиенты брокеров.
Брокеры - клиенты разработчиков.
----------------
Нужна помощь по работе со вчерашней (не сохраняющейся) историей тиков
 
Цитата
Сергей Гусаков написал:
Цитата
nikolz написал:
==================  
Ну а дальше все совсем просто.
Все что вчера и раньше считаете по базе данных, а текущие торги по данным QUIK  
Спасибо. Я довольно далек от этого, профан тасскать, "Создаем базу данных" - имеется в виду файл с котировками (*.CSV?), которые может понять и обработать... Эксель?
А можно сделать так: в конце дня, когда торги закончились и все накопленные тики еще на графике Квика, кликнуть правой на легенде инструмента - сохранить данные в файл txt, будет так
Код
   < TICKER > , < PER > , < DATE > , < TIME > , < OPEN > , < HIGH > , < LOW > , < CLOSE > , < VOL > 
RMH6 [SPBFUT], 30 , 20250807 , 190000 , 1140.000000 , 1140.000000 , 1139.000000 , 1139.000000 , 3.000000   

затем открыть в Экселе как csv, у меня будет история тиков за предыдущий день, я смогу из них нарисовать индикатор, а потом настроить трансляцию из Квика в Эксель, чтобы история подхватывалась уже текущими котировками.
Это единственное, что приходит мне в голову, прошу прощения, если я совсем не в ту степь...
Набор файлов - это и есть один из вариантов базы данных
Сам делаю так как написал ранее.
--------------------
Если не собирать из интернета, то придется накапливать , чтобы получить историю.
На которой можно было бы проверять стратегии торговли и разрабатывать алгоритмы.
----------------------------
Чтобы не нажимать каждый день кнопку, которую можно забыть нажать, пишется скрипт,
который автоматом каждый день пишет тики в файл в желаемом формате.
-------------------------
Не по теме вопроса, но замечу, что QUIK не для торговли по тикам.  
Нужна помощь по работе со вчерашней (не сохраняющейся) историей тиков
 
Цитата
Сергей Гусаков написал:
Работаю на тиковых графиках, с началом нового торгового дня история предыдущего дня обнуляется и начинают генерироваться новые тики. Никакие индикаторы использовать невозможно, пока количество тиков не достигнет расчетного периода индикатора, в моем случае он довольно большой. Остаешься как без рук в начале нового торгового дня. Подскажите, пожалуйста, варианты решения этой проблемы средствами Квика или какой-нибудь другой программы/скрипта.
Проблема решается так и не только по тикам.
Создаем базу данных по предыдущим дням.
---------------------------
Историю с таймом  1 мин  можно взять с биржи бесплатно.
-------------------------------
Историю по тикам можно взять с биржи платно.
------------------
Про бесплатно можно прочитать здесь:
https://www.finam.ru/publications/item/kak-vybrat-servis-eksporta-kotirovok-20240416-1631/
==================  
Ну а дальше все совсем просто.
Все что вчера и раньше считаете по базе данных, а текущие торги по данным QUIK  
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Цитата
Сергей написал:
Ваше время :) не свое...  А Вам благодарен Буду искать обходные варианты
Если что-то придумаю, то напишу.
Если Вы сделаете иначе, то напишите.
Успехов
Полагаю что тема про OnDestroy()  закрыта  
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
А потом еще 30 минут объяснял Вам что и как.
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
В первом моем скрипте я удалял метку.
Но наложение происходит.
Поэтому я поставил стирание всех меток.
-------------------
Возможно есть иное решение, но я его не искал.
Я решал Вашу задачу 5 минут.  
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Цитата
Сергей написал:
Цитата
nikolz написал:
Поэтому, полагаю, что как Вы хотите не получится
Не совсем понимаю что вообще дает стирание метки и создание ее заново если можно менять ее параметры? Это сэкономит ресурсы или еще что то?
Когда сменится инструмент то все предыдущее должно быть удалено в принципе и инициализировано заново как с чистого листа чего как раз и не происходит, как это должно быть реализовано это не вопрос пользователя

Конечно если это решит сейчас проблему я так и сделаю, но это как мне кажется неправильно и просто как способ обойти проблемы функционирования самого терминала
В любом случае спасибо вам за подсказки и что потратили на меня время
Попробую объяснить.
Когда мы выводим метку то на экране рисуется текст метки по координатам метки в пикселях.
функцией Set можно менять текст метки и параметры этого текста или картинки. Все будет нормально, пока не произойдет движение экрана.
После сдвига экрана функция set установит новые координаты метки. А старая метка останется на экране.
Т е Вы увидите наложение меток .
-----------------
Решить эту проблему можно, если мы знаем новые координаты старой метки на изменившемся экране.  Но мы их незнаем.
Поэтому чтобы ее удалить я удаляю все старое и рисую новое.
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
поясняю:
SetLabelParams()  создаст новую метку, но если ее координаты изменятся,
то старая метка не затрется новой.
Вы это и получаете.
---------------
Т е если Вы изменяете положение метки на экране, то надо удалять старую.
---------------------
Выскажу свое субъективное мнение . Если ошибаюсь, пусть разработчики поправят и объяснят.
----------------------------------
Если экран динамически изменяется,
то удалить старую можно лишь удалив все метки,
так как координаты метки ( мое мнение являются статическими).
------------------------------
Это недоработка разработчиков.
Об этом надо указывать в документации или доработать функцию удаления метки.
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Цитата
Сергей написал:
Цитата
nikolz написал:
Я лишь показал Вам что проблема не QLua
Я имел ввиду что если не удалять метку в теле расчетов а корректировать ее положение то так и будет несколько меток после смены инструмента
А lua действительно не причем, это уже проблема самого рабочего места Quik
У вас в скрипте ( я повторил Ваш алгоритм)  метка выводится на новое место, когда график двигается.
Поэтому, полагаю, что как Вы хотите не получится.
Будет именно так, как у Вас и получалось.  
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Цитата
Сергей написал:
Но вообще говоря у меня как раз нет задачи на тиках удалять и создавать новую метку.  Удалять и создавать новую только нужно  только если сменился актив графика. Мептка будет нести информацию о позиции - цена входа, объем позиции и тд и обновляться раз в несколько секунд через SetLabelParams()
Я лишь показал Вам что проблема не QLua, а в написании скрипта.
---------------
А уж OnDestroy()  вообще ни при чем.
Не работает исправление отступов
 
Цитата
komka написал:
Sublime
Рекомендую взять редактор SciTe(Ru)  Там все на русском и настраивается. Кроме того, можете тестить ошибки.
Индикатор с метками
 
Код
Settings={ Name = "*nk_test", tag ="Metka"  }

params={R = 255, G = 255, B = 255, TRANSPARENCY = 0,FONT_HEIGHT = 10,TRANSPARENT_BACKGROUND = 1, FONT_FACE_NAME = 'Verdana' }

function OnCalculate(i)
   if i==1 then
   OnChangeSettings()
   elseif i== Size() then    -- последняя свеча
      if os.time() > LastSecond  then          -- раз в секунду (или больше)
           LastSecond = os.time();    -- потиковое обновление (с задержкой)
          DelAllLabels(Settings.tag);
            params.TEXT =tostring(C(i))
            params.HINT = tostring(i)
         local h=0   local  m=i;
         while 14>i-m  do if H(m) > h then h=H(m) end;m=m-1;   end
         local Ti=T(i-3)
         params.DATE=100*(100*Ti.year+Ti.month)+Ti.day;
         params.TIME=100*(100*Ti.hour+Ti.min)+Ti.sec;
         params.YVALUE =h;
         Label= AddLabel(Settings.tag, params)
        end -- every second
    end
end

function OnChangeSettings()
sec = getDataSourceInfo().sec_code; 
DelAllLabels(Settings.tag);
LastSecond=0  end
function OnDestroy() OnChangeSettings() end
function Init()  return 1 end
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Сергей ,

попробуйте этот:
Код
Settings={ Name = "*nk_test", tag ="Metka"  }

params={R = 255, G = 255, B = 255, TRANSPARENCY = 0,FONT_HEIGHT = 10,TRANSPARENT_BACKGROUND = 1, FONT_FACE_NAME = 'Verdana' }

function OnCalculate(i)
   if i==1 then
   OnChangeSettings()
   elseif i== Size() then    -- последняя свеча
      if os.time() > LastSecond  then          -- раз в секунду (или больше)
           LastSecond = os.time();    -- потиковое обновление (с задержкой)
          DelAllLabels(Settings.tag);
            params.TEXT =tostring(C(i))
            params.HINT = tostring(i)
         local h=0   local  m=i;
         while 14>i-m  do if H(m) > h then h=H(m) end;m=m-1;   end
         local Ti=T(i-3)
         params.DATE=100*(100*Ti.year+Ti.month)+Ti.day;
         params.TIME=100*(100*Ti.hour+Ti.min)+Ti.sec;
         params.YVALUE =h;
         Label= AddLabel(Settings.tag, params)
        end -- every second
    end
end

function OnChangeSettings()
sec = getDataSourceInfo().sec_code; 
DelAllLabels(Settings.tag);
LastSecond=0  end
function OnDestroy() OnChangeSettings() end
function Init()  return 1 end
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Цитата
Сергей написал:
Цитата
nikolz написал:
Мне не удалось получить наложение меток.
Попробовал Ваш скрипт в том виде как есть без каких либо изменений К сожалению метки дублируются
Чтобы увидеть это переключайтесь между двумя активами туда и обратно
Как только первый раз вернетесь на изначальный сместите метку и увидите что их две, потом еще раз на другой и обратно на исходный и будет уже три и тд
У меня не дублируются.
сделайте картинки с указанием инструмента и интервала
Я повторю у себя такое же переключение.
Индикатор с метками
 
По просьбе трудящихся, написал Пример ПРАВИЛЬНОГО индикатора, который  через секунду удаляет ранее выставленную метку и выводит новую.
--------------------------------
Пользуйтесь на здоровье.
----------------------------

Код
Settings={ Name = "*nk_test", tag ="Metka"  }

params={R = 255, G = 255, B = 255, TRANSPARENCY = 0,FONT_HEIGHT = 10,TRANSPARENT_BACKGROUND = 1, FONT_FACE_NAME = 'Verdana' }

function OnCalculate(i)
  if i==1 then
  OnChangeSettings()  
  elseif i== Size() then    -- последняя свеча
     if os.time() > LastSecond  then          -- раз в секунду (или больше)  
          LastSecond = os.time();    -- потиковое обновление (с задержкой)  
        if Label then DelLabel(Settings.tag,Label) end
           params.TEXT =tostring(C(i))
           params.HINT = tostring(i)
        local h=0   local  m=i;  
        while 14>i-m  do if H(m) > h then h=H(m) end;m=m-1;   end
        local Ti=T(i-3)
        params.DATE=100*(100*Ti.year+Ti.month)+Ti.day;
        params.TIME=100*(100*Ti.hour+Ti.min)+Ti.sec;  
        params.YVALUE =h;
        Label= AddLabel(Settings.tag, params)
       end -- every second
   end
end

function OnChangeSettings()
sec = getDataSourceInfo().sec_code; DelAllLabels(Settings.tag);
LastSecond=0  end
function OnDestroy() OnChangeSettings() end
function Init()  return 1 end




Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 86 След.
Наверх