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

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

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 19 След.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Glukator написал:
Да хрен его знает, этого прохвоссора, о чем он толкует. У вас какое-то конкретное практическое приложение намечено для этих структур?

Да уж куда еще конкретней. Попробую сформировать свою Задачу.

Как было показано в организации структуры данных, программа получает внешние данные из ds по нескольким тикерам на нескольких тайм фреймах. От начало торгов до закрытия торгов, эти массивы растут.
Для расчета самописных индикаторов, используемых торговой стратегией (в среднем ~<5), это массив ds передается в качестве входного параметра в алгоритм расчета индикатора.
Все они написаны с использованием замыкания, т.е. имеют внутренние таблицы для хранения данных, и все это дело с ходом торгов разрастается.

Изначально такой подход в организации стратегии, принят по тому что у меня много таких индикаторов, и простой заменой (присвоением) одного на другой меняется сама стратегия.
Этот подход проходит без проблем на одном инструменте, а при использовании портфеля возникают проблемы с памятью.

Решения вижу два:
1) Организовать расчет индикаторов по другому, но это не решает коренным образом проблему.
2) В организации и хранении структуры данных, ведь как правило не нужен весь массив значений хранящихся в ds, достаточно чтоб сохранялось 5 или 20 (Period=X задается пользователем) последних значений. Пример профессора, это на мой взгляд, ключ к пониманию и решению этой проблемы, правильной организации структуры данных использованию этих данных и хранению.

Эта тема лежит в начале обсуждения (пост #1) на этой веточки. Но куда то подевались программисты? Все "понты" по отлетали. Лучше месяцами "толочь воду в ступе" про OnInit и тому подобное.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
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;
  --message('List.pushlast: ' ..'; '..tostring(last)..'; '.. 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 val ue
end

Если вы будете использовать эту структуру для обслуживания в порядке поступления, вызывая только pushlast и popfirst, то и first, и last будут постоянно расти. Однако, так как мы представляем массивы в Lua при помощи таблиц, вы можете индексировать их как с 1 до 20, так и с 16 777 216 до 16 777 236. Поскольку Lua использует для представления чисел двойную точность, ваша программа можем выполняться на протяжении двухсот лет, делая по миллиону вставок в секунду, прежде чем возникнет проблема с переполнением.
Кто то может сказать, как собрать ФИФО, как собрать ЛИФО, возможно есть еще варианты, и вообще о чем  толкует профессор? Кто понимает?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
В организации складского учета есть два разных подхода: ФИФО и ЛИФО.  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
VPM, Очередь, как и стек, понятия чисто алгоритмические. Но если со стеком всё просто с доступом - обрабатывается всегда  последний элемент, то с очередью всё хуже: обрабатывается первый, а потом первым становится уже второй, и вообще вся очередь сдвигается. Это затратно по времени. Если ничего не сдвигать, то первым элементом всегда будет "условно первый" - доступ мгновенный, как и в случае со стеком, но массив данных постоянно растёт. Это затратно по памяти. Наконец, если данные организовать в виде циклической очереди, как, например, организован буфер событий от клавиатуры, затрат почти нет ни по скорости, ни по памяти, но появляется риск переполнения буфера. Других вариантов, как я понимаю, в природе не существует. Вернее, можно очень эффективно реализовать очередь через список, но, строго говоря, это уже и будет список, т.е. другой тип организации данных. А про все эти insert и remove лучше сразу же забыть, как страшный сон.
Вы можете дать пояснения вот этому моменту
Цитата
Если ничего не сдвигать, то первым элементом всегда будет "условно первый" - доступ мгновенный, как и в случае со стеком, но массив данных постоянно растёт. Это затратно по памяти.
Но ведь в варианте со стеком массивы тоже растут?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Glukator,  Это было предположение, что одномоментно дадут сигнал 226 инструментов, но я упустил что Вы  алгоритмически ранжируете сделки. С памятью я примерно понимаю проблему, от куда "ноги растут", не очень понимаю как ее элегантно решить. Но всему свое время.
Цитата
Владимир написал:
VPM , Не вижу ни малейшего отношения к нашему разговору.
Ну как же не имеет это хороший пример, инвестиционного подхода крупного игрока!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Владимир,  Вот к нашему разговору про инвестирование, посмотрел фонды у управляющей компании. Это самый лучший результат

Паевый фонд, Сырьевой сектор, Акции сырьевых компаний из разных стран, Динамика стоимости пая▲86.49% за 3 года.

Прогноз доходности▲14% за год, Уровень риска Высокий, Рекомендуемый срок от 3 лет.

И не факт что управляющий сможет повторить? Пересчет в годовые 28,83% это хороший результат для инвестора с кругленькой суммой.
Но где тут управляющий, АУ, достаточно вспомнить что было с денежной массой и Сырьевыми рынками.

Есть и в минусе.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
nikolz,  Вы как всегда остроумны, а Ваши посты очень содержательны и полезны. И причём ту я? Это был всего лишь образ, фантазия, для простоты понимания. Сожалею что и такие вещи нужно разжёвывать. И уж точно они моего времени не стоят.

А говорю я в основном о возможностях, А каждый для себя решает чем ему пользоваться, а чем пользоваться. :smile:  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Вот такое сообщение получил сегодня от управляющей компании:

Стратегии доверительного
управления (ДУ) «Тактическая стратегия» и «Сбалансированная стратегия»
больше не активны, потому что БПИФы в их составе были закрыты
из-за инфраструктурных рисков. Инфраструктурный риск — это риск
на неопределенно долгий срок потерять доступ к операциям
с бумагами. Например, не иметь возможности продавать
их и получать дивиденды и купоны.

Красавцы, думаю еще за управление сдерут.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
VPM, И ценности никакой нет: есть согласие продавца и покупателя, то бишь абсолютно субъективная вещь.
Пример. Рыбак живет на Аральском море решил приобрести лодку чтоб рыбачить, спрос на лодки огромный все живут рыбалкой - Ценность1.
Аральском море высохло больше никто не рыбачит лодка ни кому не нужна нет спроса можно сдать на металлолом - Ценность2.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
nikolz,  Вот нашел, работа старая писал на луа 5.1, выкладываю как есть, перед использованием проверьте на соответствие 5.4.
Код
function Cached.SWISS_ARMY_KNIFE_INDICATOR()--SWISS ARMY KNIFE INDICATOR (John Ehlers)

--[[ выполняет все обычные функции обычных индикаторов, такие как сглаживание и генерация импульса.
 Также делает некоторые необычные вещи, такие как остановка полосы и фильтрация отклонения полосы. 
 
 Как только вы запрограммируете этот индикатор, вы сможете использовать практически любой метод технического анализа. 
 Этот уникальный общий индикатор является результатом общих концепций цифровой обработки сигналов (DSP) для дискретных сетей сигналов,
 которые появляются в различных формах в техническом анализе.

 Передаточная функция дискретной линейной системы - это отношение выхода системы, деленное на вход. 
 --]]
    --local rounding=rounding
    --local Value=Value;

    local pi=math.pi;
   local exp=math.exp;
   local cos=math.cos;
   local sin=math.sin;
   local sqrt=math.sqrt;
   local floor=math.floor;
        local Filt,Price={},{};
   --local fPeriodDC=Cached.PeriodDC();
   
   return function(I,FSettings,ds )
      local I = I or 1;
      local ds = ds or nil;
      local FSettings = FSettings or {};
      local v_t = FSettings.v_t or 'C';
      local P = FSettings.period or 48;
      local N = FSettings.N or 8;
      local n = FSettings.n or 0;
      local wid = FSettings.wid or "BP";
      local delta1 = FSettings.delta1 or 0.1;

      local avtoP = FSettings.avtoP or 0;
      local rev = FSettings.rev or 1;
      local wg = FSettings.bw_hp or 1; --полоса пропускания
      local bw_ss = FSettings.bw_ss or 1;
      local metod = FSettings.metod or 2; -- адаптации period данных
      --Settings.pole_hp = 0
      --Settings.pole_ss = 2
      local x = FSettings.x or nil;
      --------------------------------------
      local price = x or Value(I, v_t, ds) or 0;
      --------------------------------------
      if I == 1 then 
         Price,Filt={},{};
         Price[I],Filt[I]=p0,p0;
         --fPeriodDC=Cached.PeriodDC()
      end
      --------------------------------------
      local p1=Price[I-1] or price;
      local p2=Price[I-2] or p1;
      local pn=Price[I-n] or p2;
      Price[I] = price;

        --Vars:
        local c0=1;
        local c1=0;
        local b0=1;
        local b1=0;
        local b2=0;
        local a1=0;
        local a2=0;
        local alpha=0;
        local beta1=0;
        local gamma1=0;

      ---------------------------------
      if avtoP == 1  then 
         local DC = fPeriodDC(I, {['v_t']=v_t,['period']=P,['N']=N,['wg']=wg,['bw']=bw_ss,['metod']=metod}, ds)
         --if DC < 6 then DC=6 end
         --if DC > P then DC=P end
         P = round(floor(rev*DC),0)
      end
      ---------------------------------

      local filt=0;
      local filt1=Filt[I-1] or 0;
      local filt2=Filt[I-2] or filt1;
      local fi=2*pi/P;

  if wid == "EMA" then --INDICATOR
    if I <= n then filt,filt1 = price,price; end
      alpha = (cos(fi) + sin(fi) - 1) / cos(fi);
      b0 = alpha;
      a1 = 1 - alpha;
  
  elseif wid == "SMA" then --INDICATOR
     if I <= n then filt,filt1 = price,price; end
        c1 = 1 / n;
        b0 = 1 / n;
        a1 = 1;
      
  elseif wid == "Smooth" then --INDICATOR
        if I <= n then filt,filt1 = price,price; end
      c0 = 1 / 4;
        b1 = 2;
        b2 = 1; 
      
  elseif wid == "Gauss" then --INDICATOR 
        -- фильтр Гаусса является фильтром нижних частот, 
      -- позволяя проходить более низким частотам и ослаблять более высокие частоты.
      -- Использование гауссовых фильтров - это движение к двойной цели: 
      -- уменьшить отставание и уменьшить отставание высокочастотных компонентов относительно отставания низкочастотных компонентов. 
    if I <= n then filt,filt1 = price,price; end
        beta1 = 2.415*(1 - cos(fi));
        alpha = -beta1 + sqrt(beta1*beta1 + 2*beta1);
        c0 = alpha*alpha;
        a1 = 2*(1 - alpha);
        a2 = -(1 - alpha)*(1 - alpha);
  
  elseif wid == "Butter" then --INDICATOR 
        -- Сглаживание, реализованное с помощью этого фильтра, является чрезвычайно скромным, отклоняя только компонент цикла 2 бара.
      if I <= n then filt,filt1 = price,price; end
        beta1 = 2.415*(1 - cos(fi));
        alpha = -beta1 + sqrt(beta1*beta1 + 2*beta1);
        c0 = alpha*alpha / 4;
        b1 = 2;
        b2 = 1;
        a1 = 2*(1 - alpha);
        a2 = -(1 - alpha)*(1 - alpha);
  
  elseif wid == "HP" then 
     if I <= n then filt,filt1 = 0,0; end
       alpha = (cos(fi) + sin(fi) - 1) / cos(fi);
       c0 = 1 - alpha / 2;
       b1 = -1;
       a1 = 1 - alpha;
  
  elseif wid == "2PHP" then 
        --является фильтром высоких частот, позволяя проходить более высоким частотам и ослаблять более низкие частоты.
     if I <= n then filt,filt1 = 0,0; end
      beta1 = 2.415*(1 - cos(fi));
        alpha = -beta1 + sqrt(beta1*beta1 + 2*beta1);
        c0 = (1 - alpha / 2)*(1 - alpha / 2);
      b1 = -2;
        b2 = 1;
        a1 = 2*(1 - alpha);
        a2 = -(1 - alpha)*(1 - alpha);
  
  elseif wid == "BP" then 
     if I <= n then filt,filt1 = price,price; end
      beta1 = cos(fi);
      gamma1 = 1 / cos(4*pi*delta1 / P);
      alpha = gamma1 - sqrt(gamma1*gamma1 - 1);
      c0 = (1 - alpha) / 2;
      b2 = -1;
      a1 = beta1*(1 + alpha);
      a2 = -alpha;
  
  elseif wid == "BS" then --INDICATOR
     if I <= n then filt,filt1 = price,price; end
        beta1 = cos(fi);
        gamma1 = 1 / cos(4*pi*delta1 / P);
        alpha = gamma1 - sqrt(gamma1*gamma1 - 1);
      c0 = (1 + alpha) / 2;
        b1 = -2*beta1;
        b2 = 1;
        a1 = beta1*(1 + alpha);
        a2 = -alpha;
  end;

    if I > n then 
    filt = c0*(b0*price + b1*p1 + b2*p2) + a1*filt1 + a2*filt1 - c1*pn;
    end;
   Filt[I] = filt;

   return filt1,filt
   end
end

Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
И ещё раз: не бывает в природе никакой "справедливой цены"! Что бы там ни "считали на опционах".
Я ни слова не сказал про законы мировоздания (природы), здесь скорее нужно оперировать такими понятиями как ценность.
Есть цена, есть стоимость, и есть ценность.
Ценность в блокадном Ленинграде на золотые изделия, предметы искусства,  равнялась кусочку хлеба.  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Есть шутка "Хотел спекульнуть, а стал инвестором" :smile:

Владимир,  Как Вы не поймете, я рассказываю о подходе  очень простом.
Кто может двинуть цену - значительные средства.
На каком рынке проще провести крупные сделки - там где есть ликвидность,  за ней гоняется чтоб набрать свою крупную позицию.
Крупная Позиция набрана - защищать будет?
Крупная Позиция набрана -  будет движение в сторону наборной позиции или отдаст всю прибыль ретейлу?
Чтоб набрать Крупную Позицию обязательно будут следы.
Нашли следы встали в направлении крупной позиции позиции, нашу сделку защищает крупный игрок.
Какое его движение интересует ну точно не тайм фрейм 10 секунд . Так формируются тренды. И мы по тренду.
Теперь  задача сводится определить, когда Крупную Позицию начнут распределять ретейлу.
Если в двух словах, действует правило "перехода из рук в руки". Ретейл - мене организованная часть, Крупная позиция обладает значительными средствами и ведет свою игру.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
Кроме того, я лично никогда не пользуюсь конструкциями вида #sec - скрипт сам знает размеры всех своих массивов. Например, размеры стеков хранятся в их нулевых элементах. И все индексы у меня числовые - так, на всякий случай, чтобы не нарываться на потенциальные проблемы с ключами.
"размеры стеков хранятся в их нулевых элементах" - этот прием я перенял у Вас, активно его использую, но он не везде подходит. Проблема возникает при перезапуске, а что делать если скрипт запустил и оставил не выключая тут целая серия задач возникает.
Цитата
Владимир написал:
А "знать как надо" очень просто: надо так, как это представляется правильным в данный момент. Напишите ТЗ, и сами всё увидите.
ТЗ это хорошо в моем есть симулятор рынка, не могу сказать сколько раз я его уже переделываю и Вот опять надо.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Ну и еще одно
Цитата
Владимир написал:
А что такое "достаточно ликвидные инструменты" на срочном рынке? Я вот с недавнего времени стал торговать НА ВСЕХ фьючах одного тикера - в частности, на квартальных: H, M, U, Z. Закрылись вот недавно Z3, открываю Z4 - пусть даже его пока и в природе не существует. Появится - начнёт торговаться. И ликвидность у него месяц-другой будет почти никакая. А потом постепенно раскочегарится. Мой скрипт умеет торговать при ЛЮБОЙ ликвидности. Между прочим, средняя прибыль на сделку у малоликвидных обычно даже выше.
почему важна ликвидность, высокая ликвидность позволяет проводить в сделке более высокие объёмы, это одна из причин почему здесь сидит крупняк, а это в свою очередь заставляет работать алгоритмы о которых я пишу и реализую!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
И что, свободные деньги на срочном рынке заморожены? Нет, это резерв! Чтобы потом не было мучительно больно.
Согласен здесь если устраивает результат за период , то чем меньше под риском тем лучше!

Цитата
Владимир написал:
Наконец, не бывает в природе никакой "справедливой цены".
Даже считают на опционах.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
Планировать что-либо, считать какие-то риски просто глупо: "Хочешь рассмешить Господа - расскажи ему о своих планах". И ещё: даже при торговле на 10-секундном таймфрейме скрипт может держать позицию неделями, месяцами, годами. А может и секундами.
Всем чем можем управлять это риск! От него и строим сделку.
Цитата
Владимир написал:
А что такое "замораживание капитала"? Я бы предпочёл термин "вложение". Деньги должны работать. Причём на фондовом рынке можно вкладывать чуть ли не 100% имеющихся средств, но на срочном это, мягко говоря, чревато.
На срочном после дневного клиринга даже бывает > 100% вложение, но я такое не люблю и уменьшаю позиции.
Кстати Вы не считаете показатель из таблицы "состояние счета" "% Испол.ГО". Не могу понять как правильно?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
Я уже говорил, что мой личный рекорд 90.4% в день. И много раз говорил, что рынку насрать, что там МНЕ нужно: любой из тикеров может в любой момент и взлететь и упасть со страшной силой
Ну тут работает Ваше правило 300 * 9 = 2700 или 1/2700 капитала с работала на  90.4% в день. :what:  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
Потому в кубышке, что у Вас в коде указано ТРИ инструмента, а не 20. А если у Вас на 20 тикеров тупо денег нет? Или, наоборот, хватает на 200?
Цитата
VPM написал:
У меня их не 3 это для простоты изложения, но точно не 300, к примеру для фондового рынка я установил правило ~ 5% Капитала на инструмент,  100% / 20% <= 20 бумаг в портфеле.
На фондовом у меня инвестиционный подход. А рассказываю я про срочный (спекулятивный подход). Сейчас торгую руками отслеживаю в основном 4 тикера, которые котируются  в USD, для того чтоб оценить результаты одним взглядом т.е. посчитать пункты. А от 300 * 9 через пять минут можно в обморок упасть :lol:
Для сравнения на стадии отладки пишу в скрипт тоже 4 , позволяет сравнивать два подхода!  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
И для отладки куда выгоднее сразу делать как надо. И вообще работу нужно начинать с составления ТЗ.
Это так, вот только задача и заключается у знать как надо? Сейчас делаю подход от обратного.  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
Короче: профессионал воровать не умеет - ему проще самому написать то, что нужно. А чайники нехай ковыряются в кодах - не поможет!
Я не про воровство, я чтоб не портили задумку автора, а потом жаловались , что не так все работает, про не опытность!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
А что такое "достаточно ликвидные инструменты" на срочном рынке? Я вот с недавнего времени стал торговать НА ВСЕХ фьючах одного тикера - в частности, на квартальных: H, M, U, Z. Закрылись вот недавно Z3, открываю Z4 - пусть даже его пока и в природе не существует. Появится - начнёт торговаться. И ликвидность у него месяц-другой будет почти никакая. А потом постепенно раскочегарится. Мой скрипт умеет торговать при ЛЮБОЙ ликвидности. Между прочим, средняя прибыль на сделку у малоликвидных обычно даже выше.
Вы же сами говорите об эффективности использования капитала, а у Вас получается какую - то часть замораживаете на месяц, пусть даже небольшую, а зачем?

У фьючерса есть еще одна особенность, чем дальше срок исполнения, тем больше отклонение от справедливой цены! По мере приближения срока исполнения его цена будет смещаться в сторону цены актива!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
Ха-ха-ха! Комиссии НИКАК не зависят от количества тикеров. Если я сделаю 100 сделок на одном тикере или по одной на сотне тикерах, комиссия будет та же самая (если средняя цена лота у этой сотни такая же). И что делать с Вашим "правилом 5%", если у Вас те самые ТРИ тикера? Держать почти все деньги в кубышке? А ведь капитал и портфель меняются каждый день, если не каждую минуту!
1) Почему в кубышке? 20 инструментов * 5% капитала = 100% Капитала на 20 инструментов.
2) Как не зависит, у каждого инструмента своя комиссия.
Но я даже не об этом. Представим, дневной диапазон одного инструмента  в среднем ходит в день на 100 пунктов что составляет 2% изменения в цене.
Мой Вариант чтоб взять 100 пунктов мне нужен 1 контракт, (2%), если риск позволяет получить 500 пунктов мне нужно 5 контракт (5*2%) и т.д.
Ваш вариант так как тайм фреймы для принятия решений небольшие, а удержание позиции не значительное, то ценна на них делает несколько небольших колебаний, для простоты скажем 0.5%,
для того чтоб набрать 2% нужно сделать 4 сделки (4 комиссии).
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
Glukator , И у меня этот файл просто содержит строки вида "класс, код", только там ещё валюта, содержимое портфеля (если тикер там есть), настройки разные. Но тоже выдерживается правило "одна строка - один тикер". Кроме того, есть другие строки - данные по кошельку, номер счёта, можно переопределить режим работы скрипта (боевой, тестовый, по историческим данным), добавить или отнять денег или тикеров и т.д. Короче, структура внешнего файла тоже тщательно продумана и столь же подробно описана, как и структура данных в самом скрипте.
У меня это просто отдельный класс (таблица), то что пользователь задает , отвечает на вопросы , где торговать?, чем торговать? Какие средства использовать? и т.д.
Я до пересмотра этого еще не дошел (у маркетмейкера структура, а я один :smile: )  Возможно далее что то автоматизирую.

Но сейчас актуально проблема как правильно организовать работу с получением хранением и обработкой РЫНОЧНЫХ данных! Что делать с памятью которая растет значительно к концу торгового дня (сессии)?
Именно этот пример и привожу!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
VPM , Ну неужели не очевидно? НЕ НАДО КОД ПРАВИТЬ! Скину я, скажем, Борьке, последнюю версию скрипта, и он тут же будет работать, не меняя в нём ни единой запятой!
Согласен, но я так делаю пока для себя и для отладки , просто так удобней пока, и от этого принципиально не что не меняется. Но а если передавать код другому лицу, еще и пароль поставлю, чтоб не лазили! :smile:  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
DS[1][4][n].cc=n>1 and round(DS[i][j]:C(n) - DS[i][j]:C(n-1), feed[i].sec_scale) or 0;

feed[i].sec_scale -- это параметр тиккера sec_scale
feed[i]. -- это таблица необходимых параметров? получаю при инициализации и обновляю при каждом обращении к инструменту (feed[i].bid)

Здесь нужно сказать, что у меня не одна глобальная таблица, а несколько и по возможности локальных + классы.
Может этим ввел в заблуждение? Пока не вижу смысла собирать все в одну (придерживаюсь своего взгляда, принципиальную схему я показывал Выше)
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
И как вы будете искать нужный инструмент в этом индексированном массиве? Каждый раз будете в цикле перебирать?
Именно так при получении данных и их подготовке.

DS[1][4][n].cc=n>1 and round(DS[i][j]:C(n) - DS[i][j]:C(n-1), feed[i].sec_scale) or 0;
1 -- первый тикер, 4 тайм фрейм, n- последний бар , n-1 предпоследний бар.
Я не понимаю что Вас смущает здесь?

А далее просто

if rule[i].open_buy and OrderSmart[i].position<=0 then --Открыть позицию
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Glukator написал:
Пока у вас 3 инструмента, эта хренота даже будет работать. Как только у вас их станет 300, или даже 30, вас не спасут ни терабайт оперативки, ни дох**ядерный процессор, потому что все это будет жрать память как голодный слон, тормозить и глючить. Задолбаетесь глюки обходить.
У меня их не 3 это для простоты изложения, но точно не 300, к примеру для фондового рынка я установил правило ~ 5% Капитала на инструмент,  100% / 20% <= 20 бумаг в портфеле.
В Вашем варианте  Капитал =100% / 300 бумаг <= 0.33% капитала  на 1 бумагу? Но мне помнится у Вас еще нужно 300 * 9 тайм фреймов, считайте сами на кого работаете (комиссии).

ДА и на срочном 300 инструментов не нужны достаточно ликвидных. А стоимость позиции регулируется количеством контрактов, и зависит от риска принимаемого в данной позиции!
Согласен есть некоторые сложности CreateDataSource, но к моему удивлению оказались не такими тяжелыми как предполагал ранее, видимо потому что лежат на сервере.
Получаю так ds:SetEmptyCallback(); С памятью надо подчищать пока пробую варианты.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Цитата
Glukator написал:
Цитата VPM  написал: Цитата Владимир  написал: Во-вторых, закладыывать список тикеров в код и, следоватеьльно, править код на любой чих есть просто безумие
А как нужно?
Создайте текстовый файл со списком тикеров, которыми собираетесь торговать, и считывайте его при старте скрипта.
У меня, к примеру, этот файл просто содержит строки вида
КодTQBR:ABIO
TQBR:ABRD
TQBR:ZVEZ
В чем разница считывать из файла, или читать таблицу прямо из скрипта, кроме как удобства?
local sec   = { 'BRG4','NGF4', 'GDH4',  }; for i=1,#sec do  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
Как минимум, это i и j должны быть local, а не sec и tf.
Согласен i,j пропустил, (но они вроде и так локальные для цикла),
sec и tf видимость ведь позволяет держать локальными?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
В-третьих, использовать CreateDataSource значит обрекать себя на бесконечные глюки даже если тикеров в портфеле будет столь жалкое количество. Ну и т.д.
Ну если считать то к примеру Н4 то не одной сделки не сделаешь, нужно тогда историю записывать и сохранять!
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Владимир написал:
Во-вторых, закладыывать список тикеров в код и, следоватеьльно, править код на любой чих есть просто безумие
А как нужно?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Владимир,  Не "покладая рук" а Вы?  :smile:
А что не так?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
DS[i][j][n]
На мой взгляд все логично, у каждого инструмента есть несколько тайм фреймов, в каждом тайм фрейме есть несколько баров (индексов), такая вложенность (матрешка), а дальше идут переменные  или еще таблицы! Что не так?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Glukator написал:
А не так что "хочу упихать все в таблицы" и все тут. Правильно организовать данные - это большая работа, и делается она не из желания упихать все куда-нибудь, а из соображений удобства и быстроты доступа к этим данным в дальнейшем.
"Таблицы в Lua — это не одна из структур данных, — это единственная структура данных".
"Таблицы - это всё.
Хотя, на самом деле, таблицы это просто способ хранить множество пар "ключ-значение", а все остальное - это то, какие вы выбираете ключи и какие значения."
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Glukator,  Я не пишу новый код, оптимизирую старый, переосмысливаю, какие - то моменты.
У меня сейчас организовано так  

local sec   = { 'BRG4','NGF4', 'GDH4',  };
local tf = { INTERVAL_M1, ---- 1 минута  
INTERVAL_M4, ---- 4 минуты
INTERVAL_H1, ---- 1 час
INTERVAL_D1, ---- 1 день
--INTERVAL_W1, ---- 1 неделя
--INTERVAL_MN1, ---- 1 месяц
};

local DS = {};

for i=1,#sec do --Заказываю Данные
    DS[i]={};
    for j=0,#tf do
           DS[i][j] = Source(cl[1],sec[i],tf[j]); --CreateDataSource


--получаю
for i=1,#sec do    
     for j=#tf,1,-1 do

          I[i][j] = DS[i][j]:Size();
           local n;
           n = I[i][j];

            DS[i][j][n] = {}
            DS[i][j][n].d = get_date(DS[i][j]:T(n))
            DS[i][j][n].t = get_time(DS[i][j]:T(n))
            DS[i][j][n].p=round((DS[i][j]:H(n) + DS[i][j]:L(n))*0.5, feed[i].sec_scale);
            DS[i][j][n].hl=round(DS[i][j]:H(n) - DS[i][j]:L(n), feed[i].sec_scale);
            DS[i][j][n].co=round(DS[i][j]:C(n) - DS[i][j]:O(n), feed[i].sec_scale);
            DS[i][j][n].cc=n>1 and round(DS[i][j]:C(n) - DS[i][j]:C(n-1), feed[i].sec_scale) or 0;
         
            --сюда же ответы от алгоритмов присваиваю
           local Pdf = f[i][j].pdf( n, {period=4,v_t='M',up=1.5, dw=-1.5}, DS[i][j] )
            DS[i][j][n].pdf=Pdf;

Отсюда и структура
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Glukator, Согласен, Ну конечно все так и делают!  Именно этим и занимаюсь,  собираю отдельные переменные в таблицы. Цель максимально локализовать переменные.
От этого тоже отказался лишнее bar={};  bar[ticer][tf][inde[]={};  Все уже и так есть.  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
nikolz написал:
На верхнем графики автоматически строятся уровни поддержки и сопротивления и линии регрессии.
Если Вы используете в качестве входного параметра регрессию, то можно попробовать фильтровать цену за интересующий Вас период. Это позволит значительно уменьшить отставание, по сравнению с регрессией, а второе изменяя период можно пробовать на разных частотах, или сразу спектр частот. Если будете пробовать поделитесь результатом.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Склоняюсь к варианту А (подход  Владимир,), подход опробован,  как утверждает Владимир, показывает отличный результат, такое дерево всегда можно в последующим более аккуратно наследовать в глобальную таблицу. Подход Б требует дополнительного ознакомления, что можно чего нельзя. И так решено подход А, соберу в четырех этажную таблицу переменные.
bar={};  bar[ticer][tf][inde[]={};  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Пересмотрел главу Окружение.
"Поскольку окружение — это обычная таблица, то вы можете просто индексировать ее нужным ключом (именем переменной).
Похожим образом можно присвоить значение глобальной переменной, чье имя вычисляется динамически, если написать
_G[varname] = value."

Есть еще одна интересная "штука":
"Поскольку _ENV — это обычная переменная, мы можем обращаться к ней и присваивать значения как и любой другой переменной.
Присваивание _ENV=nil сведет на нет любой прямой доступ к глобальным переменным в оставшейся части куска. Это может пригодиться для контроля над тем, какие переменные использует ваш код"
"Конечно, главной областью применения _ENV является изменение окружения, используемого фрагментом кода."
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
Более эффективная:_G[varname] = value; local value = _G[varname]; print(value)
Явно кокая - то ошибка, или это простое присвоение или профессор что то напутал?
Возможно это имелось ввиду? Не понятно.

_G[varname] = varname;
local value = _G[varname] ;
print(value)
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
nikolz,  Ну это просто аппроксимация в черном ящике? Если конечно в учителях не паттерны.
Цитата
nikolz написал:
Графики использую для обучения. Этот робот реализует NN -"обучение с учителем"
Цитата
nikolz написал:
белая линия - это суммарный профит зеленая линия - это лонгсиняя - это шортштриховые линии - это текущий расчет.
Не понятно в чем мерите и относительно чего?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
for n in pairs(_G) do print(n) end;   А так можно узнать какие глобальные переменные используются.
Понимание организационной структуры приводит к пониманию, установлению компромисса между быстродействием и производительностью, ну и не забываем про простоту кода.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
 "Едем дальше, видим больше!"   1)  Структура:
Итак, вплотную подошли к вопросу организации структуры данных в скрипте.
Цитата
Владимир написал:
Для меня давно очевидно, что чуть ли не единственная важная тема - это определение структур данных. Даже код скрипта базируется на этом! И это СЛОЖНАЯ тема.
Из того что выше обсуждалось можно сделать вывод, есть два подхода:

А) Создать внутреннею переменную (таблицу) и уже внутри нее строить дерево.
Цитата
Владимир написал:
В частности, "таблица Lua" у меня представляет собой большое разветвлённое дерево уровней на пять, если не больше. А переменные туда целесообразно относить, где их удобнее всего использовать.

Б) Создать в глобальном окружении, служебные поля для переменных данного скрипта;
Про такой подход подсказал Игорь М,  описан автором языка в его книге, и применяется разработчиками QUIK при создании модуля qlua.
Вот такие две записи идентичны:

local varname = 20
local value = load or loadstring("return " .. varname)()
print(value)

Более эффективная:
_G[varname] = value
local value = _G[varname]
print(value)
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
nikolz написал:
Могу посоветовать следующее. Написали что-то. Поставьте в начале блока N=os.clock()и в конце time=os.clock()  -N  и выведите time в сообщение.   Вы узнаете сколько реально в секундах у вас выполняется этот блок. Если это разовый блок в начале запуска, то время вообще не колышет. Если время вас устраивает, то забудьте про этот блок и пишите дальше.
Да я так делаю, еще получаю используемую память, а в главное окно скрипта вывожу прямо в заголовок окна, удобно всегда перед глазами информация как работает скрипт.

"Повторение мать ученья"! Благодарю за обсуждение и ликбез, не которые мои сомнения развеялись, понятно стало в какую сторону копать. Надеюсь что обсуждение было полезно не только мне.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Владимир, Ну тогда получается, что и голову "ломать" не стоит, пихай все в оперативную и все дела? Ну да еще можно подчищать так?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
nikolz, Наоборот прозрел, за скоростью не гоняюсь , тогда чем можно руководствоваться и как наилучшим (оптимальным) образом организовать память?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
И так если провести промежуточную черту о выше сказанном:

1)  Структура;
2) Хранение данных:
3) Парсер:
4) Дамп текущего состояния.

И все же остался не раскрыт вопрос как эффективно, распоряжаться памятью, хотя не которые моменты прорезались?  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Владимир,  Ну мой пример маленько о другом, о тех переменных которыми редко пользуемся, те которые можно отправить на небольшое хранение и потом достать.
Допустим торговая система  открыла позицию, создали таблицу с параметрами этой позиции, писать в файл  эту таблицу не эффективно, так как будем часто обращаться к ней ,
другое дело позицию закрыли записали свою сделку в файл, и достаем когда уже когда обрабатываем сделки.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Игорь М, написал  value = _G[varname]

Такой подход встречал в работах Nikolay, Не очень понятно зачем лезть в поле глобальной переменной, предполагал что ради видимости.
Но не как не могу себе предположить, что это более эффективно, тогда возможно нужно дерево сделать как  Владимир,  ("Волки сыты и овцы целы")?
Цитата
Владимир написал:
Для меня давно очевидно, что чуть ли не единственная важная тема - это определение структур данных. Даже код скрипта базируется на этом! И это СЛОЖНАЯ тема. В частности, "таблица Lua" у меня представляет собой большое разветвлённое дерево уровней на пять, если не больше. А переменные туда целесообразно относить, где их удобнее всего использовать.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
nikolz написал:
load - загрузка из переменной string
loadfile - загрузка из файла на диске
Вроде уловил смысл.
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 19 След.
Наверх