Очереди и двойные очереди в луа

Страницы: Пред. 1 2 3 4 5 ... 26 След.
RSS
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Скрытый текст
 
Ну если кому то будет интересно то вот что получилось.

Следуя рекомендациям Владимира: Зачем жизнь усложнять когда она и так не проста.

1) отключил сортировку от Квик что не идет у меня.
2) применил старый добрый метод if;

Нужно разбираться с индексацией если с последним все понятно, то первого надо проверить.
От Роберта пока не отказался. Так дело пойдет и его задвинем  :wink:
Вот что получилось.
Скрытый текст
 
Что не так вставляю
Код
--[[ LOGGING ]]--
  local Log = {
    logfile = nil,
    loglevel = 0,
    loglevels = {
        [-1] = 'Debug',
        [ 0] = 'Trace',
        [ 1] = 'Info',
        [ 2] = 'Warning',
        [ 3] = 'Error',
    }
}
function Log:Log(log_text, log_level)
  if (log_level >= self.loglevel) then
    local msg = string.format("[%s] %s: %s\n", os.date(), self.loglevels[log_level], log_text)
    if (log_level > 0) then
      message(msg, log_level)
    end
    self.logfile:write(msg)
    self.logfile:flush()
  end
end
function Log:debug(t)
  self:Log(t, -1)
end
function Log:trace(t)
  self:Log(t, 0)
end
function Log:info(t)
  self:Log(t, 1)
end
function Log:warning(t)
  self:Log(t, 2)
end
function Log:error(t)
  self:Log(t, 3)
end
function Log:fatal(t)
  self:error(t)
  error(t)
end
--return Log
    
 local List = {};
function List.new()
    return {first = 0, last = -1}
end
--Теперь мы можем вставлять и удалять элементы с обоих концов за постоянное время:
function List.pushfirst (list, value)
   local first = list.first - 1
   list.first = first
   list[first] = value
end
function List.pushlast (list, value)
   local last = list.last + 1;
   list.last = last;
   list[last] = value;
   --Log:trace('List.pushlast: '..'; '..tostring(last)..'; '..tostring(value.sec_code)..'; '.. tostring(value.price)..'; '..tostring(value.qty))
end
function List.popfirst (list)
   local first = list.first;
   if first > list.last then 
   --error("list is empty") 
   return nil
   end
   local value = list[first]
   list[first] = nil -- чтобы разрешить сборку мусора
   list.first = first + 1
   return value
end
function List.poplast (list)
   local last = list.last
   if list.first > last then error("list is empty") end
   local value = list[last]
   list[last] = nil -- чтобы разрешить сборку мусора
   list.last = last - 1
   return value
end
--[[Если вы будете использовать эту структуру для обслуживания в порядке поступления, 
вызывая только pushlast и popfirst, то и first, и last будут постоянно расти. 
Однако, так как мы представляем массивы в Lua при помощи таблиц, 
вы можете индексировать их как с 1 до 20, так и с 16 777 216 до 16 777 236. 
Поскольку Lua использует для представления чисел двойную точность, ваша программа можем
выполняться на протяжении двухсот лет, делая по миллиону вставок в секунду,
прежде чем возникнет проблема с переполнением.--]]

   
   ------------------------ 
local function get_date(td)-- получаем -- формат QUIK
       if td==nil then return '0' end
        local d = td and td.year and td.month and td.day and string.format("%.4d%.2d%.2d",td.year,td.month,td.day) or '0';
      return d--(d or '0') 
end
local function get_time(td)-- получаем -- формат QUIK
   if td==nil then return '0' end
    local t = td.hour and td.min and td.sec and string.format("%.2d%.2d%.2d",td.hour,td.min,td.sec) or '0';
   --local t = string.format("%.2d%.2d",td.hour,td.min)..'00'
    return t--(t or '0')
end

 
----- AT local AT; 
   local allt={};
function allt:new() -- проинициализируем поля, процедуры и фунции нашего класса 
   ---- Создает экземпляр теперь уже объекта, описывает поля объекта и присваивает полям начальные значения.
   local obj={
           [0]=0,
         ['b']=0,
         [1] = { ['d']='0',['t']='0', ['o']=0,['q']=0,['p']=0,['b']=0, },
           ['n']=0,
         ['sm'] = { ['d']='0',['t']='0',['o']=0,['q']=0,['p']=0,['b']=0,},
         
         ['Z']=0,
            ['Seconds']={ [1]=1 },
         ['ty']=os.time(), 
         ['SP']={[1]=0},
         ['SQ']={[1]=0},
         ['Balance']=0,
         ['WP']={[1]=0},
          };
           
    ----далее превращаем таблицу в класс
   setmetatable(obj,self) 
   ---- объект получает доступ к методам класса
   self.__index = self
   ---- возвращаем наш объект (экземпляр класса)
   return obj 
end 
function allt:printf()
      print = message or print --Log:trace  
      --print('------------ параметры: ' )
       local a,v; for a,v in pairs(self) do
          --if type(v)==table then type(v)
            print( 'allt['..tostring(a)..'] = '..tostring(v) )
         --end
      end
end
   
 --local Q={};
function AllTrade()
        
      local at = nil; at = List.popfirst(list);
      
       if not at then return end;
      
      local sec=at.sec_code;
      local cl=at.class_code;
      
      --if sec~=symbol then return end
      
      local dir=0;
      if bit.test(at.flags, 0) then ---- Если сделка на продажу, вычитает объем из текущего 
            dir=-1; --local balance=AT.Balance; balance = balance+at.qty*dir; AT.Balance=balance;
      else -- Если сделка на покупку, прибавляет объем к текущему
            dir=1; --local balance=AT.Balance; balance = balance+at.qty*dir; AT.Balance=balance;
      end
      
      local b = AT['b']; b=b+at.qty*dir; AT['b']=b;
      --Log:info('at: '..tostring(AT[0])..'; '..tostring(stec)..'; '..tostring(AT['b']) );--
      
      local dt=at.datetime; -- datetime  TABLE  Дата и время  
      local stec=AT[0]; stec=stec+1; AT[0]=stec;
      AT[stec]={};
      AT[stec]['t']=get_time( dt )
      AT[stec]['d']=get_date( dt )
      AT[stec]['o']=dir;
      AT[stec]['q']=dir*at.qty;--fd0(at.qty);
      AT[stec]['p']=at.price;--round(at.price,scale);
      AT[stec]['b']=b;
      --AT[stec]['s']=at.sec_code;
      --AT[stec]['c']=at.class_code;
      
      --Log:info('at: '..AT[stec]['d']..'; '..AT[stec]['t']..'; '..tostring(AT[stec]['o'])..'; '..tostring(AT[stec]['b']));
      
      --[[---- smart money
      if at.qty>=1000 then
          local stec=AT[0]; stec=stec+1; AT[0]=stec;
          AT[stec]={};
            AT[stec]['d']=AT['d'];
          AT[stec]['t']=AT['t'];
          AT[stec]['o']=AT['o'];
          AT[stec]['q']=AT['q'];
          AT[stec]['p']=AT['p'];
          Log:trace('at-SM: '.."("..stec..") "..AT[stec]['d']..'; '..AT[stec]['t']..'; '..( sec )..'; '..( cl )..'; '..round( AT[stec]['p'],scale)..'; '..fd0(AT[stec]['q'])..'; '..fd0(AT.Balance).."\n");
      end
      ---]]
      
      --Q[at.price]=at.qty;
      --Log:trace( 'at-Q: '..at.price..'; '..Q[at.price] );
      
      -----*
      local x=os.time()-AT.ty; --F:write('x=',x.."\n")
      if x~=AT.Z then 
             local i;
            for i=1,#AT.Seconds do 
                AT.SQ[i]=AT.SQ[i]+dir*at.qty;
                  AT.SP[i]=AT.SP[i]+dir*at.qty*at.price;
               AT.WP[i] = 0;
               if x%AT.Seconds[i]==0 then 
                   
                   --loadstring("F"..AT.Seconds[i].."("..i..")")(); 
                   AT.WP[i] = AT.SQ[i]~=0 and round(AT.SP[i]/AT.SQ[i],scale) or 0;
                   
                   AT.Z=0;
                  AT.Balance=fd0( AT.SQ[i] );
                   AT.WP[i]=round(AT.WP[i],scale);
                  --Log:trace('at: '..AT.Seconds[i].."("..i..")"..'; '..round(AT.WP[i],scale)..' '..fd0(AT.Balance).."\n");
                  
                  --AT.SQ[i]=0;--AT.SP[i]=0;
               end; 
            end; 
      end;
      AT.Z=x; 
      --Log:trace('AT.Z= '..AT.Z..' '..AT.WP[i]..' '..Balance.."\n")
      
      --collectgarbage()
      --List.pushfirst(list, at)
      --List.poplast(list)
end
    local is_run;
function OnStop(flag)--вызывается при остановке скрипта из диалога управления
-- 2.2.24 Функция вызывается терминалом QUIK при остановке скрипта из диалога управления.

   is_run = false
   return 1000
end
function OnClose()--Функция вызывается перед закрытием терминала QUIK и при выгрузке файла qlua.dll. 
is_run = false
end
--function OnInit() -- вызывается терминалом QUIK перед вызовом функции main (2.2.25 OnInit)
--end
local class,symbol;
function main()-- Функция, реализет основной поток выполнения в скрипте.(2.2.26 main) 
    
   local myLog='AllTrade1'
    Log.logfile = io.open(myLog ..'.log', 'w')
   Log:trace(myLog)
   Log:trace('Создал Лог ');

   is_run = true;
   
   --local list=List.new();
    -- message('0 '..'first='..tostring(list.first)..'; '..'last='..tostring(list.last) )
   --local AT=allt:new();
      class= "SPBFUT";
       symbol='RMU3'--NGN3';
      Log:trace( "----------------InitParameter: ".. tostring(class)..'; ' .. tostring(symbol)..'; ');
      
       -----------all_trades
      --Если перечисленные параметры отсутствуют в списке полей элемента, то в качестве параметра передается nil. 
        
      function fn(par1,par2)
          if par1 == class and par2 == symbol then
                 return true
          else
              return false
          end
      end
      local t1 = nil;
      --[[---- возвращает таблицу с индексами элементов, удовлетворяющих условию поиска
      t1 = SearchItems("all_trades", 0, getNumberOf("all_trades")-1, fn, "class_code, sec_code")

       local at=nil;
      --local number_of_rows = getNumberOf('all_trades')   
      local first,last=1,#t1;
        for i = 1, #t1 do
             at = getItem('all_trades', i)
          if at --and at.sec_code==symbol 
          then
             List.pushlast(list, at);
             --AllTrade();
             List.popfirst(list);
          end
      end   
      --]]
      local first=0;
      local at = nil;
      --Log:trace('1 '..'first='..tostring(list.first)..'; '..'last='..tostring(list.last) )
       ----
       local j=1;
   while is_run do ----- основной поток выполнения скриптa:
   
      local last=getNumberOf("all_trades"); 
      Log:trace(j..' '..'first='..tostring(first)..'; '..'last='..tostring(last) )
      if last>first then
      
        ---- возвращает таблицу с индексами элементов, удовлетворяющих условию поиска При возникновении ошибки в функции fn функция SearchItems прерывает свою работу и возвращает «nil». 
        --t1 = SearchItems("all_trades", first, getNumberOf("all_trades")-1, fn, "class_code, sec_code")
        --if t1 then
        
         Log:trace(j..'): '..'first='..tostring(first)..'; last='..tostring(last)--..'; #t1='..tostring(#t1) ..'; t1[1]='..tostring(t1[1])..'; t1[#t1]='..tostring(t1[#t1])
         );
            at = {};
         --for i = t1[1], t1[#t1] do
         for i = first, getNumberOf("all_trades")-1 do
         
             if not is_run then break end
          
          at = getItem('all_trades', i)
          --if at and at.sec_code==symbol then
          --List.pushlast(list, at);
          --AllTrade();
          --List.popfirst(list);
          --end
         --if symbol==at.sec_code then
          local d = at and at.sec_code and at.sec_code==symbol and get_date(at.datetime) or 0;
          local t = at and at.sec_code and at.sec_code==symbol and get_time(at.datetime) or 0;
          local sec = at and at.sec_code and at.sec_code==symbol and at.sec_code or 'x';
          local p = at and at.sec_code and at.sec_code==symbol and at.price or 0;
          local q = at and at.sec_code and at.sec_code==symbol and at.qty or 0;
          
          local dir = (at and at.sec_code and at.sec_code==symbol and bit.test(at.flags,0) and -1 or 1) or 0; 
          
          --if bit.test(at.flags, 0) then ---- Если сделка на продажу, вычитает объем из текущего 
             --   dir=-1;
           --else -- Если сделка на покупку, прибавляет объем к текущему
             --   dir=1; 
           --end
          
          Log:trace(j..'): ['..i..']; '..tostring(d)..'; '..tostring(t)..'; '..tostring(sec)..'; '.. tostring(p)..'; '..tostring(q*dir)..'; '..tostring(dir) );
          
          end
         ---- Последний стал первым
          first=getNumberOf("all_trades");--last;--t1[#t1];
        end
      --end
      j=j+1;
        --Log:trace(j..' '..'first='..tostring(first)..' list.first='..tostring(list.first)..'; '..'list.last='..tostring(list.last) )
      sleep(1000);
      
   end
   if Log and Log.logfile~=nil then io.close(Log.logfile) end;
   Log:trace('Закрыл Лог '.. tostring(Log.logfile));
end
 
VPM, Круть невероятная. В код, естественно, даже не заглядывал, но объём последнего коммента 12542 байта, объём ВСЕГО моего рабочего скрипта - 36596 байт. :smile:  
 
Владимир, Согласен что то не то, Код вам и не нужен, пока не надумаете таблицу всех сделок в свой скрипт прикрутить.

Эталон перед глазами :wink:

Если серьезно то танцы с бубнами вокруг таблицы всех сделок.

Задача отфильтровать по нужным инструментам, на каждом посчитать баланс ну и выделить Оператора.
Чтоб в последствии прикрутить к рабочему.


У Николая там полный спектор пока не сильно не разбирался, позже запущу и посмотрю, больно уж закручен.

Этот скрипт сейчас работает в терминале после первого цикла 50 kB, за сессию  накопит на верно надо чистить.
Это поставил фильтр на одну бумагу, гоняю RTS не самая ликвидная.

Рабочий скрипт скачет от 4000 до 7000 за сессию накопит. При этом  первым моим способ обрабатывает все сделки.
 
[Thu Jul  6 14:52:47 2023] Trace: AllTrade1
[Thu Jul  6 14:52:47 2023] Trace: Создал Лог
[Thu Jul  6 14:52:47 2023] Trace: ----------------InitParameter: SPBFUT; RMU3;
[Thu Jul  6 14:52:47 2023] Trace: 1 first=0; last=395007
[Thu Jul  6 14:52:47 2023] Trace: 1): first=0; last=395007
[Thu Jul  6 14:52:47 2023] Trace: 1): [255]; 20230705; 190505; RMU3; 997.5; -20.0; -1
[Thu Jul  6 14:52:47 2023] Trace: 1): [500]; 20230705; 190522; RMU3; 998.0; 1.0; 1
[Thu Jul  6 14:52:47 2023] Trace: 1): [917]; 20230705; 190603; RMU3; 998.0; 2.0; 1
[Thu Jul  6 14:52:47 2023] Trace: 1): [918]; 20230705; 190603; RMU3; 998.0; 48.0; 1
[Thu Jul  6 14:52:47 2023] Trace: 1): [1039]; 20230705; 190612; RMU3; 998.0; 2.0; 1
[Thu Jul  6 14:52:47 2023] Trace: 1): [1122]; 20230705; 190624; RMU3; 997.5; -1.0; -1
[Thu Jul  6 14:52:47 2023] Trace: 1): [1318]; 20230705; 190656; RMU3; 998.0; 1.0; 1
[Thu Jul  6 14:52:47 2023] Trace: 1): [1833]; 20230705; 190816; RMU3; 998.0; 3.0; 1
[Thu Jul  6 14:52:47 2023] Trace: 1): [1926]; 20230705; 190827; RMU3; 998.0; 2.0; 1

Вот пример из лога
1) - номер цикла:
[255] - индекс в т. всех сделок:

С нова люблю луа! А Главное Р,Е прав индексирует.
 
VPM, Да и Вам таблица всех сделок нафиг не нужна. А если бы и была нужна, код для работы с нею наверняка копеечный. Это УЖЕ СОВЕРШЁННЫЕ сделки, это ПРОЙДЕННЫЙ этап, дела давно минувших дней. За каким хреном кому-то нужен этот мусор?

У меня скрипт ОДИН на все случаи жизни, выполняет ВСЕ операции до единой: считает свечи, ведёт логи, выводит состояние текущих торгов (или НЕ выводит в спящем режиме - эта операция довольно затратная), поддерживает какой-никакой диалог - в частности, три вида контекстных меню по тикерам, принимает решения о подаче заявок, обрабатывает данные о сделках, отслеживает состояние портфеля и кошелька, умеет работать как на фондовом, так и на срочном рынке (фьючерсы, акции, депозитарные расписки) в любом из трёх режимов: боевой, тестовый и по историческим данным, количество тикеров и их ликвидность почти по барабану. Наконец, как я уже говорил, весьма заметная часть кода предназначена для компенсации глюков системного софта Квика. А всё потому, что он делает только то, что ДЕЙСТВИТЕЛЬНО нужно делать, а не занимается разной хернёй вроде коллбеков, двойных очередей или ТОС.
 
Владимир, Не нужно все в кучу.

1)
Цитата
Владимир написал:
скрипт ОДИН на все случаи жизни
Это стала понятно. Вы об этом постоянно говорите.
Мой не так крут.
Работает всего в 3 режимах; Тестер, Expert, AVTO;
выставляет сминает заявки Buy, Sell, TP, SL , trail Stop, Stop от % Деро.
отслеживает Поз. расчет ММ ведет аналитику 5-7 индикаторов и многое чего.

Это собственно у всех так, только реализация разная.

Есть смысл обсуждать у кого какие приемы!

2)
Цитата
Владимир написал:
Да и Вам таблица всех сделок нафиг не нужна. А если бы и была нужна, код для работы с нею наверняка копеечный.
Мне нужна. Если Вам интересно расскажу не секрет да на форуме круче меня понаписано.
Насчет копейки у меня вызывает затруднение. Сами посмотрите на отзывы 0. Зато ломаного гроша нестоит OnInit широкими массами.


3)
Цитата
Владимир написал:
Это УЖЕ СОВЕРШЁННЫЕ сделки, это ПРОЙДЕННЫЙ этап, дела давно минувших дней. За каким хреном кому-то нужен этот мусор?
Ну конечно! На этом строится тех. анализ Выделить статистически значимое событие и сесть ему на хвост.
Так не Вы не я Рынок двинуть не можем  это бизнес Фонда банка Крупных денег.

И это другой подход, сесть на хвост Оператору (SmartMoney, Специалисты) и тд.

Написано много всего но стоящие вещи помещаются на пальцах одной руки.
Сегодня Валютный рынок хороший пример Закончился квартал рынок отдан на откуп Экспортерам попробуйте встать им против шерсти.
У меня позиция CNY Рано перевернулся.  
 
У меня позиция CNY Рано перевернулся. Кажется дождался нарисовали "Голову"  
 
VPM, Нет, ТОС мне вообще не интересна - она годится лишь для того, чтобы засрать память и процессор.

А что есть "статистически значимое событие"? Свечи для того и придуманы, что "большое видится на расстоянии". Ну так это свечи, а не дурацкая ТОС.

Сегодня Валютный рынок резко рванул вверх, потом вниз, потом опять вверх, сейчас опять вниз - зарабатывай, не хочу. А у меня сейчас фьючерс на юань именно "против шерсти". И ничего, чуток заработал...
 
Да нужно подставить стране плечо, иначе торговать нес кем будет, И так все убежали за криптой или в отпусках.
 
VPM, Вот я и балуюсь на фьючерсах. А мой любимый долларовый рынок арестовали - и деньги, и бумаги.
 
Владимир, Я не понял что такое ТОС. А свечи чем не угодили по своей природе отфильтрованные сделки. Есть H есть L есть C  на акциях есть Объем (Кол. сделок).
По сути квантованные данные за разный промежуток времени с указание момента фиксации. Ну просто сказка.

Я Себя практикую 4 таймфрема 1м, 15М, 60М, конечно D.

При определении целей заглядываю на W но это уже руками.

На акциях нынче Все руками В длинную не включаю Месячный. Все свалилось купил и держи.
Зайти два раза в день подкорректировать не сложно, В режиме Эксперт скрипт работает.
На рынке нет ликвидности.
 
Владимир,
Цитата
Владимир написал:
VPM , Вот я и балуюсь на фьючерсах. А мой любимый долларовый рынок арестовали - и деньги, и бумаги.
Ну я капиталистам ни когда не доверял, у меня сын так попал.
А Вы должны были сдавать Капитал и знать про 300% Маркса   :smile:  
 
Владимир,
Цитата
Владимир написал:
А что есть "статистически значимое событие"?
Я не понял вы это серьезно или подшучиваете?

Ну тогда нужно обозначить базовые вещи, чтоб говорить на одном языке. Вот я ваше ТОС не могу понять.
 
VPM,  ТОС - это Таблица Обезличенных Сделок. То самое говно, в котором Вы ковыряетесь. А свечи - МОИ свечи, а не это японское говно - просто среднее арифметическое значений курса за период. Их я считаю сам по... ща скажу... по восьми таймфремам, от 10-секундных до часовых. Ни за чем не слежу, включаю скрипт в 9-10 утра и выключаю ближе к полуночи. А на рынке не просто нет ликвидности - самого рынка нет. А вот у капиталистов - есть.
 
Владимир,
Цитата
Владимир написал:
ТОС - это Таблица Обезличенных Сделок. То самое говно, в котором Вы ковыряетесь.
Ну тут все просто отследить крупные сделки для определения куда "Умные деньги" толкают рынок.

Я не знаю читали что-то на эту тему. Это классика жанра торговали так еще в начале 20 века.
и ныне стратегия рабочая для Крупных денег с некоторыми изменнениями.

Идея следующая "Умные деньги" двигают рынок в нужно им направлении.
В  накапливая огромный объем удерживая рынок в границах скидывают лишних и толкают вверх так как не осталось предложения.
Затем распределяют.

ТОС  здесь и используют для разных целей основная когда Маркет Мейкер вступает в дело обменивая 100 млн$ не двину рынок не пункт, не попадая в стакан.
Собственно это основная цель Рынка сделать Возможно обмена крупной сделки.
Зачем нам буте уверены отследили такую сделку вставайте за ней.
 
Владимир,
Цитата
Владимир написал:
А на рынке не просто нет ликвидности - самого рынка нет. А вот у капиталистов - есть.
Мне последнее время NG нравится торгуется хорошо в американскую сессию, или BRENT, гоняю RTS Маленький.
Да полно Все конечно зависит от депозита если млн.$ то тесно.
 
VPM, Ха-ха-ха! Я когда-то рассказывал здесь набросок алгоритма, по которому ни одна собака в жисть не догадается, что это крупная сделка. А можно и наоборот: ПОКАЗАТЬ, что это крупная сделка и развернуть рынок в обратную сторону. И мне плевать, что там считалось классикой жанра торговали в начале 20 века. И плевать, что там хорошо торгуется, а что нет - это проблемы моего скрипта, а не мои.
 
Владимир,
Цитата
Владимир написал:
ПОКАЗАТЬ, что это крупная сделка и развернуть рынок в обратную сторону.
Хотелось бы Посмотреть.
Цитата
Владимир написал:
это проблемы моего скрипта
Такое Впечатление что он у Вас сам себя пишет.

Да видел ИИ но мое в впечатление что дальше аппроксимации не на что не годятся!

Удачной торговли!
 
VPM, Ну, покопайтесь в моих комментах, если интересно - мне лень. Было это давно. Может, год назад или больше. Навскидку: если у меня бабла до мамы, а я хочу обрушить рынок, то ставлю в стакан две-три лонговые плиты и держу цену на какой-то из них, время от времени меняя, чтобы не скучно было. А когда рынок поверит, что курс вниз не пустят и отодвинет его вверх от моих плит, вываливаю накопленные бумаги.

Скрипт пишу я, а работает он сам. И можете посмотреть в архиве, что я говорил про ИИ и Маршака.
 
Владимир,
Цитата
Владимир написал:
Навскидку: если у меня бабла до мамы, а я хочу обрушить рынок, то ставлю в стакан две-три лонговые плиты и держу цену на какой-то из них, время от времени меняя, чтобы не скучно было. А когда рынок поверит, что курс вниз не пустят и отодвинет его вверх от моих плит, вываливаю накопленные бумаги.
Ни какое "бабла до мамы" не поможет если не читаете рынок.
Рынки ходят за ликвидностью,
Только Вы ее покажите, как она очутится в других руках.
Ни чего личного это бизнес - больших дяденек.
 
VPM, Поможет, поможет - не нужно читать рынок, нужно его писать. Не знаю, как там и за каким хреном "рынки ходят за ликвидностью" - моему алгоритму на неё плевать. А если у меня бабла до мамы, я и сам большой дяденька.
 
Владимир, Ну что здесь скажешь Удачи в торговле!

Торговать средние лучше чем ничего.
 
Владимир,
Цитата
Владимир написал:
Ну, покопайтесь в моих комментах, если интересно - мне лень.
Покопался, более того Ваши сообщения выделил по пользователю отдельно.
Ну если оставить в покое Ваши рассуждения
Цитата
"бабла до мамы"
Кстати когда реализуете поделитесь.

Ну а если серьёзно у Вас оригинальный подход к программированию.
Раньше попадались такие библиотеки на луа.

Не понял
1) преимущества ф. стандартной библиотеки  loadstring.
Если не сложно можно простой пример.
2) Файл txt пишите сложно это привычка , метод  или что то еще.
Ведь можно сохранить в формате луа а потом прочитать?  
 
По теме ветки.

Первый мой подход работает от Роберта Е. работает. считает правильно есть с чем сравнить.
С памятью остаются "непонятки"?
Зато можно модулем организовать!

Но вроде с кланяюсь к простате.

К стати есть реализация FIFO от разработчиков в колбеках.
Фильтрует по классу память кушает на глазах, Но это все к вопросу задачи.
Выкладывать нет смысла все есть в документации.

Все удачной торговли.
 
VPM, Что реализую? Чем поделиться? Баблом, штоле?

У меня КЛАССИЧЕСКИЙ подход к программированию, я стоял чуть ли не у истоков.

И я не понял: что за "преимущества ф. стандартной библиотеки  loadstring"? Что за "простой пример"? Что за "файл txt"? Что за "формат луа"?  
 
Владимир,
Цитата
Владимир написал:
Баблом, штоле?
Не, это оставьте себе, тем более у Вас есть куда его применить.

Не я про расширение функционала за  ф. стандартной библиотеки  (loadstring or load).
Я у себя попробовал по образу и подобию не понял смысла в каких случаях она полезна?

Цитата
Владимир написал:
простой пример
Простой пример значить понятный ре только Вам.
Цитата
Владимир написал:
Что за "формат луа
Вот Вы отказываетесь от пояснений автора.
{[1] =a, [3] =b, [a]=1, [a][1]=1....}
Так и в пишем в файл потом читаем без всяких доп. манипуляций.
Цитата
Владимир написал:
Что за "файл txt"
".txt" - формат расширения от истоков.

Прошу прощение за косность моего язык мои познания в программировании малы.  
 
VPM, loadstring or load - это возможность программирования данными. То, что лежит во внешних файлах, благодаря этой утилите будет выполнено так, как если бы оно было набито непосредственно в теле скрипта. Например, номер счёта, код клиента, количество денег, которыми скрипту разрешено пользоваться и т.п. А что там понятно не только мне, я не знаю - информация ПОЛНОСТЬЮ определяется ПРИЁМНИКОМ.

А ЗАЧЕМ "так и в писать в файл потом читать без всяких доп. манипуляций"? Эта информация НЕ ТОЛЬКО для скрипта, но и для трейдера, и её лучше представлять в виде, наиболее удобном ДЛЯ ЧЕЛОВЕКА. А "файл txt" как раз для того, чтобы с его можно было открыть обычным блокнотом, хотя я пользуюсь редактором Far Manager - там прекрасно видны и нетекстовые символы и ему пофиг, что там за расширение.
 
Владимир,
Цитата
Владимир написал:
То, что лежит во внешних файлах, благодаря этой утилите будет выполнено так, как если бы оно было набито непосредственно в теле скрипта.
Не совсем понимаю, под "То, что лежит во внешних файлах" т.е. нужно создать внешний файл для обмена какой то информацией и с помощью этой ф. вставлять в код,
правильно?

Ну я про смыл.
Спасибо обдумаю.
Цитата
Владимир написал:
Эта информация НЕ ТОЛЬКО для скрипта, но и для трейдера
К примеру я вывожу в окно скрипта инфо для трейдера и в log пишу, вроде хватает?

Но в любом случае спасибо за ответ на до обдумать.

Где мне попадалось Вы говорили о подготовке переменных на лету с помощью этой функции, можете показать?
 
VPM, У меня во внешних файлах лежит мой портфель, кошелёк, перечень тикеров, за которыми скрипт следит, данные для брокера, чтобы можно было совершать сделки, настройки разные. Не править же из-за этого код. При запуске скрипта всё это считывается, при остановке - записывается. Точнее, записывается каждую пару минут, на всякий пожарный.

Нет, в окно скрипта я тоже вывожу, если не спящий режим, и лог веду - это совсем другое, обязательное действие, в отличие от лога или вывода на экран.

Где я говорил о подготовке переменных на лету с помощью этой функции?
 
Владимир,
Цитата
Владимир написал:
Где я говорил о подготовке переменных на лету с помощью этой функции?
Так вот смотрю ваши сообщения не могу найти.
 
Владимир, Может напутал.

Кому то показывали в цикле их делали, просто понравилось.
 
getCandlesByIndex чудо из чудес.

Суть такая убрал расчеты алгоритмов анализирующих Рынок назад в терминал.
Индикаторы написаны через "замыкание", кушали в мега байтах  - назад в килобайты.
Проще синхронизация в разных таймфревов (подход 4 окон).
А главное все можно рассмотреть на графике.

"Такого не было ни когда и вот опять" мое произведение уронило терминал.

Уж и не знаю кто здесь главнее мой скрипт, данная функция, или терминал.

В любом случае все силы брошены на выявление :smile:  
 
VPM, Я когда-то хотел использовать "готовые" свечи на "тяжёлых" таймфреймах (начиная с 15-минутных или хотя бы с часовы), но реализация работы со свечами в Квике настолько безобразна, что я давно уже все свечи считаю сам, от 10-секундных до часовых.
 
Нашел.
Кажется не дополученные данные на графике при загрузке терминала. Видимо чудесное nil в ценообразовании.
Подберу костыли.
Вернул CreateDataSource  пусть будет ведь есть оператор or.
Честно удивила скромной нагрузкой.
Цитата
Владимир написал:
все свечи считаю сам, от 10-секундных до часовых
Нет мне столько не нужно да и расчеты только вернул в терминал.
Меня еще интересует синхронизация данных с разных интервалов.
Гоняю тесты он написан у меня своеобразно младшим индексирую данные со старших, пытаюсь более точно отследить событие.
Слепил из того что было. Ну и наглядность вывожу метки.
 
Всем добрый день!
Цитата
Владимир написал:
давно уже все свечи считаю сам, от 10-секундных до часовых
Нашел в Ваших сообщениях пример, считаете средневзвешенную взял на заметку и реализовал у себя 30 сек.
Пока не знаю зачем, Понравился подход в реализации.
 
Столкнулся со следующей проблемой:

Цикл main крутится  250 mc.
Сигнал допустим Buy  сформировался на tf 15 минут или выше, т.е. сигнал на покупку существует 15 минут.
Есть меньший tf 1 мин. отслеживаю появление новой свечи newbar=I>I1 or false; I1=I;
Отсекаю сигнал появлением newbar.
Позицию пишу из OnTrade, т.е. появление в массиве pos={} сделки считаю заявку исполненной еще раз блокирую исполнение приказа.

Но появляются случаи когда на сигнал пролетают еще приказы видимо связано с ответом от OnTrade().
Явно чего то не хватает в отслеживании конкретного приказа? Не хочется зависеть от капризов OnTrade!

Кому не сложно может поделится на работкой.
 
robot quik от души шлет мне email письма это можно отключить?
 
Цитата
VPM написал:
Нужно разбираться с индексацией если с последним все понятно, то первого надо проверить.
Добрый день.

Управление подписками находится в верхнем левом углу страницы.
 
Alexey Ivannikov, Спасибо
 
VPM, Так у меня и считается по всем таймфреймам в цикле: 10, 30, 60, 120, 300, 600, 1800 и 3600 секунд.

По поводу подачи заявок - у меня сделано так:
Каждый таймфрейм управляет своими ставками самостоятельно, но реальные сделки разрешены только для нулевого (10-секундного) таймфрейма, который находится ближе всего к текущему положению рынка. Остальные уровни могут лишь переносить к себе уже совершённые ставки с нижестоящих уровней. Закрытие сделок старшими таймфреймами осуществляется сбросом закрываемой сделки на нулевой уровень. Есть и более скоростная подача заявок, в секундном и двухсекундном обработчиках.

И далее:
В полусекундном обработчике обслуживается стек заявок: выбирается кандидат на подачу заявки в QUIK (приоритетом пользуются продажи, освобождение средств, а среди покупок выкуп шортов). Все заявки уже при попадании в стек блокируют тикер до их исполнения или отмены, поэтому при отклонении заявки блокировка снимается, а скрипт переходит к следующему элементу стека. Таймер устанавливается на три минуты, по истечении которых заявку можно снимать. Если рынок находится рядом с заявкой, таймер переустанавливается ещё на три минуты. При подаче заявки в QUIK заводится новый элемент стека активных заявок для контроля за их исполнением.

А вот robot quik ни одного письма мне ни разу не прислал. Да он и мыла моего не знает. :smile:  
 
Владимир, Спасибо,

Пока не сообразил Ваш алгоритм - закручено!
Ушел разбираться.

Может попроще что то можно? Ведь - «Краткость - сестра таланта»!

Цитата
Владимир написал:
А вот robot quik ни одного письма мне ни разу не прислал.
А тут секрет простой письма - душевные.
 
Цитата

В полусекундном обработчике обслуживается стек заявок:
А цикл main тоже 500 mc. или меньше нужно? Их нужно синхронизировать?
Цитата
Владимир написал:
Таймер устанавливается на три минуты, по истечении которых заявку можно снимать. Если рынок находится рядом с заявкой, таймер переустанавливается ещё на три минуты.
Заявки у Вас все таки лимитные, т.е. раскидываете по уровням?
Цитата
Владимир написал:
При подаче заявки в QUIK заводится новый элемент стека активных заявок для контроля за их исполнением.
Исполнение понятно получаем в OnTrade, а Контроль Активных заявок по времени. Правильно я понял?
 
У тончил у себя цикл main  чуть меньше 1 сек. крутит.
 
VPM, В алгоритме - да, закручено местами очень серьёзно. А это всего лишь техника. Можно и попроще, но мне хотелось, чтобы мой алгоритм ещё и зарабатывал. :smile:

Нет, конечно. В цикле мейна крутится только sleep(250). Вот ещё фрагмент из моего ТЗ:
Для балансировки нагрузки на процессор обработчики вызываются со сдвигом: 4 раза в секунду – обработчик стека сделок. Каждое нечётное срабатывание (2 раза в секунду) – обработчик стека заявок, каждое второе и шестое – секундный (не пересекаясь с 0.5-секундным), каждое восьмое – 2-секундный (не пересекаясь ни с секундным ни с 0.5-секундным). Свечной и более тяжёлые обработчики в случае необходимости вызываются из двухсекундного при помощи счётчиков.

Да, все заявки у меня лимитные и раскиданы по уровням. Да, "исполнение получаем в OnTrade, а Контроль Активных заявок по времени". Каждые 10 секунд проверяется стек активных заявок, и те из них, кто исчерпал свой лимит времени, проверяются на возможность снятия.
 
В периоды активности Quik выдавал задержки до трех минут по крайней мере я наблюдал такие.
 
VPM, А я не наблюдал. Только когда тестировал работу с 20 000 бумаг на Финаме были заметны задержки, да и то скорее из-за прорисовки в двухсекундном обработчике этой ЗДОРОВЕЕЕНОЙ таблицы. Тогда я и ввёл "спящий режим", в котором скрипт только торгует, но таблицу не рисует, только тики в заголовке небольшого окошка тикают, чтобы показать, что скрипт работает, а не висит.
 
Нет, это мне не по "зубам"! Что нужно попроще.

Сделаю период Вашим метом 1сек, цикл 1сек, запрос  обновления информации 1сек,   т.е. попробую синхронизовать.
Добавлю флаг по направлениям. может поможет.

Ведь моя сетка как то работала.
 
Цитата
Владимир написал:
были заметны задержки
Но ведь задержки не от скрипта, если убрать sleep он повесит терминал.
Задержки от брокера возможно с биржи когда исполняются огромное количество ордеров и явно наши не в приоритете.
Да и отложенные не использую по этой причине, не знаешь какое проскальзывание получишь.

Но Ваш подход мне более менее понятен похож на сетку, но мне думается более правильно по смыслу назвать подстричь рынок.

Спасибо за помощь!  
Страницы: Пред. 1 2 3 4 5 ... 26 След.
Читают тему
Наверх