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

Страницы: Пред. 1 ... 18 19 20 21 22 ... 26 След.
RSS
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
nikolz,  Написаны они у меня практически все , отдельно оценить нельзя так как работают в составе какой то стратегии, активно пользуюсь Decycler только индикатором в основном однополосным.
Но интересны не его примеры индикаторов, а его фильтры, посмотрите "швейцарский складешок", если не найдете я более точно на пишу. А Вам зачем?
 
Цитата
VPM написал:
Glukator,  я просто пошутил, да и результаты нужны статистически значимые (ведь задача стоит сделать стабильный доход!)
Цитата
Владимир написал:
Glukator, А как быть с экспирациями? С банкротством? С долгими годами ожидания, когда позиция выйдет в плюс?
Мой ответ был как в анекдоте про математиков. Совершенно точный и совершенно бесполезный :)
Я ж нигде не сказал, что сам так делаю? =)

Вот два примера из моего, так сказать, недавнего опыта:
1. В ноябре я накосячил в скрипте в самых базовых вещах, где и накосячить, казалось бы, нельзя. В результате он нахватал в портфель всякого говна, часть из которого к декабрю закрылось в плюс, а остальное ушло в глубокую жопу. После чего я совершенно спокойно закрыл эти убыточные позиции, чтобы высвободить средства и отлаживать скрипт дальше в "боевом" режиме, пусть и с меньшим депозитом - пусть выкручивается сам, сволочь такая )
2. Эта сволочь купила UCSS, который решил слинять с биржи, за 3 дня до этого события. После предупреждения брокера о том, что фирма планирует сделать ручкой, также вручную закрылся в убыток (правда, совсем смешной - что-то около 150 рублей), после чего у скрипта появился "блеклист" для тикеров, с которыми вообще никогда не надо связываться.

Зато вот с начала декабря, когда косяки были выпилены, скрипт-таки начал реализовывать изначальную задумку. И практически все, что было куплено - продано с профитом, только пара тикеров болтается в портфеле со смешной просадкой от -1,5 до -4%, да периодически что-то покупается и продается.
 
Glukator,  А вы сделки каким либо образом оцениваете, я имею ввиду результат?  
 
Ну к примеру сделка прошла (не обязательно закрытие но и уменьшение позиции) я сохраняю в таблицу такие показатели (Выиграла +1 Проиграла -1,), то есть количество выиграны и проигранных сделок, плюс сам результат, это позволяет делать оценку торговой системы, как я уже приводил?
 
Цитата
VPM написал:
Glukator,  А вы сделки каким либо образом оцениваете, я имею ввиду результат?  
Элементарно - по доходности в процентах годовых. У меня задана целевая доходность 25% годовых, которая в большинстве случаев перекрывается с огромным запасом. Вот к примеру выдержка из лога:

Сделка открыта:
Код
2024-01-08 18:29:05 [TNSE] ENTER: tf=6 delta=-2.27 mean2=3740 mean1=3655 offer=3670 price=3665
2024-01-08 18:29:05 [TNSE] ORDER TID=10000009 op=B price=3665 qty=1
2024-01-08 18:29:41 [TNSE] TRADE TID=10000009 разовая покупка qty=1 price=3665 role=maker
Сделка закрыта:
Код
2024-01-09 10:02:34 [TNSE] stop=3115 (initial)
2024-01-09 10:02:34 [TNSE] закрытие по достижению целевой доходности:
- yield=1308.55
- bid=3755, qty=1, lot=1
- sigma0=3666.832500
- tau=55973
2024-01-09 10:02:34 [TNSE] ORDER TID=10000002 op=S price=3755 qty=1
2024-01-09 10:02:34 [TNSE] TRADE TID=10000002 разовая продажа qty=1 price=3755 role=taker
2024-01-09 10:02:34 [TNSE] сделка закрыта (role=taker), результат: 85.16
 
Есть какие то первые результаты за период которые можно оценить? Ральфа Винца не читали?
 
Glukator, А я делаю именно так. За исключением случаев, когда так нельзя делать.

Я немного делаю явных косяков: всё-таки программист почти полвека. У меня был более тяжёлый случай: в биржевых делах я не разбираюсь, и говно от хороших тикеров отличаю только по ликвидности: если народ там ковыряется, значит, и нам можно. Да и кто заранее может сказать, что говно, а что нет. И потом я заметил, что нормальные тикеры хорошо торгуются иногда вылетают из портфеля, снова заходят, а вот говно тоже торгуется, но постепенно оседает в портфеле, связывая всё больше денег. Процесс настолько медленный, что я заметил это где-то через полгода. И тогда я ввёл рейтинги тикеров, которыми управлял через контекстное меню тикера: "говно", "мусор" и так далее до "отличного". И немного перенастроил алгоритм, чтобы "говно" из портфеля скрипт старался выводить, а хорошие тикеры, наоборот, старался придержать а портфеле. А уж разрешение тикеру покупать или продавать изначально было заложено в меню - это два бита, 4 состояния. Очень удобно. Например, где-то за неделю до экспирации я перевожу тикер в "говно", и он спокойно выводится в 0.
 
Цитата
VPM написал:
Есть какие то первые результаты за период которые можно оценить? Ральфа Винца не читали?
Не читал, и даже не знаю, кто это, и зачем он мне надо.
Результаты мои скромные на скромном депозите :) С 12.12.2023 (сейчас уточнил по логам, когда я выпилил убыточные позиции), результат следующий:
- всего сделок: 50 (сделкой считается удержание позиции от открытия до закрытия);
- прибыльных: 50, убыточных: 0;
- лучший результат: 113.81;
- худший результат: 0.21;
- суммарный результат: 622.83.
- оценка портфеля на 12.12.2023: 13167.70.
Итоговая доходность схемы: 622.83 / 13167.70 / 28 * 365 = 61.6% гг.
 
РАЛЬФ ВИНС - "Математика управления капиталом"  
Результат приличный!  Только годовые считать узкая оценка! Но об в следующий раз.
 
Цитата
Владимир написал:
Glukator, А я делаю именно так. За исключением случаев, когда так нельзя делать.
В принципе при хорошем входе в позицию и достаточном количестве свободных средств это не такая уж проблема - поболтается да и продастся рано или поздно.
Цитата
Владимир написал:
я ввёл рейтинги тикеров, которыми управлял через контекстное меню тикера: "говно", "мусор" и так далее до "отличного". И немного перенастроил алгоритм, чтобы "говно" из портфеля скрипт старался выводить, а хорошие тикеры, наоборот, старался придержать а портфеле. А уж разрешение тикеру покупать или продавать изначально было заложено в меню - это два бита, 4 состояния. Очень удобно. Например, где-то за неделю до экспирации я перевожу тикер в "говно", и он спокойно выводится в 0.
Красивое решение. У меня пока попроще, простое бинарное разложение: можно/нельзя торговать в принципе. Тупо через два файла - в одном общий список тикеров, в другом - запрещенные. Присмотрюсь, может, тоже придется рейтинги вводить. В биржевых делах разбираться мне тоже лень. Другое дело скрипт написать - упражнение для ума, а если с пользой для кошелька выйдет, так и вовсе хорошо.

Цитата
VPM написал:
только годовые считать узкая оценка!
Да с чего бы? Самый правильный показатель. И любую доходность я буду сравнивать с ключевой ставкой, потому что не вижу смысла в схеме с доходностью меньше ее (нахрена все эти сложности с торговлей, когда тупо с накопительного счета можно больше получить?).
 
Glukator, В принципе, даже при нехорошем входе можно работать - вот резерв по деньгам необходим всегда, особенно на фьючерсах. И у меня один общий список по всем тикерам, а уж можно/нельзя - это в его паспорте указывается и в диалоге редактируется.
 
У меня робот с начала года показал это:

стратегия "купил и держи " показала бы в этом случае  (275.28-273.5)/273.28 -ком=0.72%
У робота получилось переиграть эту стратегию =1.3%
--------------------
А это картинка за декабрь 2023



стратегия "купил и держи" показала бы   (273-276)/273= -1.5%
робот показал =32%
----------------------------  
Особо интересно то, что рынок при этом сменил тренд с падающего на растущий.
Сначала провалился на (276-255)/276=7.6%
Потом вырос на (273-255)/255=7%
Если сначала войти в шорт а потом в лонг, то получим всего 14.6%
----------------
Робот собрал на логах 15% и на шортах 17%.
 
----- Чтение таблицы из файла в массив или таблицу
  --message(filename)
  local f,err = io.open(filename,"r")--"r": режим чтения (используется по умолчанию);
  if not f then
     return nil,err
  end
  local tbl = assert(load("return "..f:read("a")))--"a": режим дозаписи в конец файла
  f:close()

Никак не могу понять, что изменилось в lua 5.4 и перестала работать строка, подскажите что тут не так?

local tbl = assert(load("return "..f:read("a")))
 
file:read (···)

Считывает файл fileв соответствии с заданными форматами, которые определяют, что читать. Для каждого формата функция возвращает строку или число с прочитанными символами или завершается ошибкой , если она не может прочитать данные в указанном формате. (В последнем случае функция не считывает последующие форматы.) При вызове без аргументов она использует формат по умолчанию, который считывает следующую строку (см. ниже).

Доступные форматы

  • « a»: читает весь файл, начиная с текущей позиции. В конце файла возвращается пустая строка; этот формат никогда не подводит.
 
Цитата
VPM написал:
local tbl = assert(load("return "..f:read("a")))
Ой, жопа какая... Я в упор не понял, что вы хотели сделать.  
 
Glukator,  Я этим пользовался в lua 5.1 при переходе на 5.4 перестало работать, вот смысл:
Цитата

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

-- Сохранение таблицы или массива в файл
function table.save(tbl,filename)
  local f,err = io.open(filename,"w")
  if not f then
     return nil,err
  end
  f:write(table.tostring(tbl))
  f:close()
  return true
end

В результате на диске мы получим файл, в котором в терминах синтаксика языка Lua описана наша таблица. Зачем сохранять в синтаксисе Lua? Причин две:

  • универсальность
  • элегантный способ чтения таблицы из файла

Вот функция, читающая файл и возвращающая сохранённую в нем таблицу:

-- Чтение таблицы из файла в массива или таблицу
function table.read(filename)
  local f,err = io.open(filename,"r")
  if not f then
     return nil,err
  end
  local tbl = assert(loadstring("return " .. f:read("*a")))
  f:close()
  return tbl()
end

Все просто - читаем файл и запускаем его на выполнение

Вот как это выглядит:

table.save({11,22,33,{"gh",'jk'},44},"e:\\1.dat")    -- пишем
t = table.read("e:\\1.dat")                                 -- читаем
https://bot4sale.ru/blog-menu/qlua/301-save-lua-table.html
 
Вроде как заработало , кому нужно вот

для 5.1
local tbl = assert(loadstring("return "..f:read("*a")))
для 5.4
local tbl = assert(load("return "..f:read("a")))
 
Glukator, Я тоже ничего не понял, да такой ужас и не хочется понимать. assert, да ещё и load, и это на файловых операциях, проще которых и не бывает в природе. АХХХРЕНИТЕЛЬНО "элегантный способ"!
 
Цитата
VPM написал:
Glukator,  Я этим пользовался в lua 5.1 при переходе на 5.4 перестало работать, вот смысл:
Цитата
Используем преобразование таблицы в  текстовое представление  и сохраняем на диске результаты. -- Сохранение таблицы или массива в файл
function table.save(tbl,filename)
  local f,err = io.open(filename,"w")
  if not f then
     return nil,err
  end
  f:write( table.tostring (tbl))
  f:close()
  return true
end
В результате на диске мы получим файл, в котором в терминах синтаксика языка Lua описана наша таблица. Зачем сохранять в синтаксисе Lua? Причин две:   универсальность
 элегантный способ чтения таблицы из файла
  Вот функция, читающая файл и возвращающая сохранённую в нем таблицу: -- Чтение таблицы из файла в массива или таблицу
function table.read(filename)
  local f,err = io.open(filename,"r")
  if not f then
     return nil,err
  end
  local tbl = assert(loadstring("return " .. f:read("*a")))
  f:close()
  return tbl()
end
Все просто - читаем файл и запускаем его на выполнение    Вот как это выглядит: table.save({11,22,33,{"gh",'jk'},44},"e:\\1.dat")    -- пишем
t = table.read("e:\\1.dat")                                 -- читаем
 https://bot4sale.ru/blog-menu/qlua/301-save-lua-table.html
если Вы записали в файл fT таблицу T так, как она записана в скрипте Lua, то просто загрузите этот файл в скрипт
так:
loadfile(fT)
 
Ну здесь все просто, если читать из файла f:read("a") получим строковой формат, перевод в функцию и чтение из функции позволяет работать в формате таблицы.
Не знаю насчет элегантности, но очень удобно при дальнейшей обработке.  
 
Цитата
nikolz написал:
если Вы записали в файл fT таблицу T так, как она записана в скрипте Lua, то просто загрузите этот файл в скрипттак:loadfile(fT)
Я вообще не понимаю в чем различие loadfile от load в каком случае чем пользоваться (может есть какие то критерии) ???
 
VPM, АХХХРЕНИТЕЛЬНО удобно! Во-первых, формат данных в ОЗУ совершенно другой - там важна скорость, прямой доступ к данным. Во-вторых, не нужно сохранять всё - у меня объём таблицы в ОЗУ раз в пять больше, чем сохраняемых данных. В-третьих, данные в файле предназначены не только для компа, но и для человека - я, например, прекрасно вижу и свой портфель, и свой кошелёк, открыв этот файл в любом текстовом редакторе. И поправить там могу всё, что душе угодно. Небольшой парсер в main, заглатыающий исходные данные при запуске скрипта и небольшая функция, сбрасывающая в файл дамп текущего состояния каждые 3 минуты - всё, что требуется. Работает как часы, в любых версиях Квика и языка.
 
Цитата
VPM написал:
Цитата
nikolz написал:
если Вы записали в файл fT таблицу T так, как она записана в скрипте Lua, то просто загрузите этот файл в скрипттак:loadfile(fT)
Я вообще не понимаю в чем различие loadfile от load в каком случае чем пользоваться (может есть какие то критерии) ???
load - загрузка из переменной string
loadfile - загрузка из файла на диске
=======================
Выкладываю для вас решение для вывода таблицы в файл и загрузки таблицы из  файла в скрипт
Код
function value2text(t,s)  --преобразование таблицы в скрипт
   local s1=""; --новое значение
   local n=string.len(s); local z=string.sub(s,n);
   local m= type(t);
   if m=="string" then
      s1='"'..tostring(t)..'"';  elseif m=="number" then s1=tonumber(t);  elseif t==nil then s1="nil";
   elseif m=="table" then local f;
      for j,v in pairs(t) do
         local x=v;
         if f then s1=s1.."," end  f=1;
         if  type(j)~="number" then    s1=s1..'\n["'..tostring(j)..'"]='; end
         s1=value2text(x,s1);
      end
      if z=='}' then s1='\n{'..s1..'}'; else s1='{'..s1..'}' end
   end
 return s..s1;
end

--------------------  это пример вывода и загрузки с распечаткой значений из таблиц
local t2={6,7,8,9}
local t={1,2,3,4,5,"asd",t2}  -- это таблица которую выводим в файл
----------вывод в файл
local fn=p3.."test999.lua"
fLog=io.open(fn,"w"); fLog:write("t1="..value2text(t,"").."\n");fLog:flush()
fLog:close();
-----------ввод из файла
dofile(fn);
----------------прочитали таблицу из файла в таблицу t1
--теперь печатаем из введенной таблицы значения и сравниваем их со значениями в t2 и t
local t3=t1[7]
local s1=t1[6];
print(t1[1],s1,t3[3])

результат:
это содержимое файла test999.lua:
Код
t1={1,2,3,4,5,"asd",{6,7,8,9}}
это печать значений
Код
1   asd   8
 
Владимир,  Вы подняли сейчас, очень нужную техническую тему и даже не одну, там где для Вас вещи очевидные, для меня и таких как я полная "тьма".
Цитата
Владимир написал:
Во-первых, формат данных в ОЗУ совершенно другой - там важна скорость, прямой доступ к данным.
Во-вторых, не нужно сохранять всё - у меня объём таблицы в ОЗУ раз в пять больше, чем сохраняемых данных.
Вопрос такой, не вдаваясь сильно в детали, есть какие - то критерии оценки какие переменные куда целесообразно относить,  
 
nikolz,  Спасибо попробую!
 
При организации структуры программы в виде классов, проявилась еще одна особенность lua!
В случае обнаружения при выполнении ошибки, скрипт останавливается, там где раньше перепрыгивал через эту ошибку и продолжал выполнение.
Нашел этому объяснение, хочу поделиться:

"Errare humanum est. Поэтому мы должны обрабатывать ошибки как можно лучше.
Поскольку Lua — это язык расширения, часто встраиваемый в приложение, он не может просто аварийно завершить работу или завершить работу в случае возникновения ошибки.
Вместо этого при возникновении ошибки Lua завершает текущий фрагмент и возвращается в приложение."

"Любое неожиданное условие, с которым сталкивается Lua, вызывает ошибку.
Ошибки возникают, когда вы (то есть ваша программа) пытаетесь добавить значения, не являющиеся числами, вызвать значения, не являющиеся функциями, индексировать значения, не являющиеся таблицами, и т. д. (Вы можете изменить это поведение с помощью метатаблиц , как мы увидим позже.)
"
Стало чуть сложней искать, но появилась уверенность, что программа с ошибками не будет исполняться!
 
Цитата
Владимир написал:
Небольшой парсер в main, заглатыающий исходные данные при запуске скрипта и небольшая функция, сбрасывающая в файл дамп текущего состояния каждые 3 минуты - всё, что требуется. Работает как часы, в любых версиях Квика и языка.
Если Вы про парсер который освещали в начале своих публикаций, то я  на нем "зуб потерял"?
Дамп текущего состояния, вообще не понятно что туда писать, почему через 3 минуты сохранять, нужен какой - то подход?
 
VPM, Для меня давно очевидно, что чуть ли не единственная важная тема - это определение структур данных. Даже код скрипта базируется на этом! И это СЛОЖНАЯ тема. В частности, "таблица Lua" у меня представляет собой большое разветвлённое дерево уровней на пять, если не больше. А переменные туда целесообразно относить, где их удобнее всего использовать. А уж парсер склепать вообще не проблема. Дамп текущего состояния - на случай отвисания Квика, отключения электричества и просто на всякий случай. 3 минуты - как кому нравится. Сейчас код посмотрел - у меня дамп сбрасывается каждые сто секунд. А писать туда нужно то, чтобы после перезапуска скрипта иметь возможность продолжить работу с того места, где остановился.
 
Цитата
VPM написал:
"Errare humanum est. Поэтому мы должны обрабатывать ошибки как можно лучше...
По вашему предыдущему вопросу в этой же книге есть пояснение: "Многие программисты пытаются писать нечто подобное: value = loadstring("return " .. varname)(). Если, скажем, varname равно x, то результатом конкатенации будет "return х", что при выполнении даст нам желаемый результат. Однако, этот код включает в себя создание и компиляцию нового куска кода, что является довольно затратным. Вы можете добиться того же эффекта при помощи следующего кода, который в десятки раз эффективнее предыдущего: value = _G[varname]".
 
Цитата
VPM написал: Я вообще не понимаю в чем различие loadfile от load в каком случае чем пользоваться (может есть какие то критерии) ???
Всё из той же книги: "Функция load похожа на loadfile, за исключением того, что она берет кусок кода не из файла, а из строки (Примечание: В Lua 5.1 функция loadstring выполняет роль load)".
 
Игорь М,  Да нет в книге то, не понятно как в жизни этим пользоваться, чем руководствоваться можно какой - то не большой пример?
Цитата
Игорь М написал:
Вы можете добиться того же эффекта при помощи следующего кода, который в десятки раз эффективнее предыдущего: value = _G[varname]".
Это что писать в глобальную переменную?
Ну к примеру вот:
Код
local Order={}
function Order:new() -- проинициализируем поля, процедуры и фунции нашего класса 
   ---- Создает экземпляр теперь уже объекта, описывает поля объекта и присваивает полям начальные значения.
      local obj = {
               [0]=0,
               ['id']=0,--['symbol']='X',
               [1]={
                   ['d']='0',
                   ['t']='0',
                   ['dir']='X',
                   ['qty']=0,
                   ['op']=0,
                   ['id']=0
                   },
            };
   ----далее превращаем таблицу в класс
   setmetatable(obj,self) 
   ---- объект получает доступ к методам класса
   self.__index = self
   ---- возвращаем наш объект (экземпляр класса)
   return obj 
end 
function Order:save(path)   -- пишем
    table.save(self,path) 
end
Сделал класс, написал под него метод , вот использую
Код
local order=Order:new()
order:save(path..'\\1.dat')
order:printf()
local ord = table.read(path..'\\1.dat')
Log:info( 'table.read '..type(ord)..' '..tostring(ord[0])..' '..tostring(ord.id) )
Ну ведь удобно же.
 
Цитата
nikolz написал:
load - загрузка из переменной string
loadfile - загрузка из файла на диске
Вроде уловил смысл.
 
Игорь М, написал  value = _G[varname]

Такой подход встречал в работах Nikolay, Не очень понятно зачем лезть в поле глобальной переменной, предполагал что ради видимости.
Но не как не могу себе предположить, что это более эффективно, тогда возможно нужно дерево сделать как  Владимир,  ("Волки сыты и овцы целы")?
Цитата
Владимир написал:
Для меня давно очевидно, что чуть ли не единственная важная тема - это определение структур данных. Даже код скрипта базируется на этом! И это СЛОЖНАЯ тема. В частности, "таблица Lua" у меня представляет собой большое разветвлённое дерево уровней на пять, если не больше. А переменные туда целесообразно относить, где их удобнее всего использовать.
 
VPM, Да никуда не деться от дерева, если этих самых varname будут десятки, а то и сотни тысяч.
 
Владимир,  Ну мой пример маленько о другом, о тех переменных которыми редко пользуемся, те которые можно отправить на небольшое хранение и потом достать.
Допустим торговая система  открыла позицию, создали таблицу с параметрами этой позиции, писать в файл  эту таблицу не эффективно, так как будем часто обращаться к ней ,
другое дело позицию закрыли записали свою сделку в файл, и достаем когда уже когда обрабатываем сделки.
 
И так если провести промежуточную черту о выше сказанном:

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

И все же остался не раскрыт вопрос как эффективно, распоряжаться памятью, хотя не которые моменты прорезались?  
 
VPM,
Без обид, но Вы очевидно не представляете как реализована запись в файл в Винде. Если Вы часто читаете файл, то Вы читаете его из памяти, а не с диска. Поэтому разницы никакой нет. Да и вы же за скоростью не гонитесь.
Или что я упустил в Ваших рассуждениях?
 
nikolz, Наоборот прозрел, за скоростью не гоняюсь , тогда чем можно руководствоваться и как наилучшим (оптимальным) образом организовать память?
 
VPM, И что же это за "те переменные, которыми редко пользуемся"? Я вот тестировал свой скрипт на 20К тикерах. Если у каждого из них только по 10 параметров - вот уже и 200 тысяч переменных. А ведь их НАМНОГО больше! И общие данные (имя, класс, на какую валюту торгуется, можно ли им вообще торговать, сколько лотов закуплено, размер лота и т.д.), и данные по его таймфреймам (а у каждого таймфрейма есть свечи, а на каждом могут быть свои сделки), текущий курс, цена спроса и предложения, шаг цены, данные по ликвидности и прочая, и прочая, и прочая. Подумаешь, "торговая система  открыла позицию"! Да у меня два раза в секунду такое может происходить! А сделки обрабатывать и вообще 4 раза в секунду. АБСОЛЮТНО ВСЁ должно быть под рукой! А вот сохранять на диск из "этого всего" нужно только жалкую часть. Памяти это, кстати, жрёт совсем немного - несколько мегов. А на диске объёмы и вообще смехотворные.
 
Владимир, Ну тогда получается, что и голову "ломать" не стоит, пихай все в оперативную и все дела? Ну да еще можно подчищать так?
 
VPM, Естественно, всё в ОЗУ. Файл нужен только при запуске и для лога по заявкам и сделкам.
 
Цитата
VPM написал:
nikolz, Наоборот прозрел, за скоростью не гоняюсь , тогда чем можно руководствоваться и как наилучшим (оптимальным) образом организовать память?
С памятью все просто.
-------------------
На диск надо писать лишь то, что хотите сохранить для истории и что не хранится в архивах КВИК.
Как правило - это результаты реальной торговли.  
Но и это можно не сохранять так как они есть в отчете брокера.
И только в отчете брокера Вы увидите что было реально.  
--------------------  
Кроме того, в отдельный файл можно записать исходные данные для торговли.  
Это позволяет не изменять их в скрипте.
-----------------  
Могу посоветовать следующее.
Написали что-то. Поставьте в начале блока N=os.clock()
и в конце time=os.clock()  -N  и выведите time в сообщение.   Вы узнаете сколько реально в секундах у вас выполняется этот блок. Если это разовый блок в начале запуска, то время вообще не колышет.
Если время вас устраивает, то забудьте про этот блок и пишите дальше.
 
Цитата
nikolz написал:
Могу посоветовать следующее. Написали что-то. Поставьте в начале блока N=os.clock()и в конце time=os.clock()  -N  и выведите time в сообщение.   Вы узнаете сколько реально в секундах у вас выполняется этот блок. Если это разовый блок в начале запуска, то время вообще не колышет. Если время вас устраивает, то забудьте про этот блок и пишите дальше.
Да я так делаю, еще получаю используемую память, а в главное окно скрипта вывожу прямо в заголовок окна, удобно всегда перед глазами информация как работает скрипт.

"Повторение мать ученья"! Благодарю за обсуждение и ликбез, не которые мои сомнения развеялись, понятно стало в какую сторону копать. Надеюсь что обсуждение было полезно не только мне.
 
Хвалюсь.
------------------------------
Сегодня мой робот на сбере показал такую картинку с начала года.


Т е c 3.01.2024 профит   2.44%, из них 1.72 - лонг и 0.72 -шорт.
Стратегия "купил и держи" дала бы  1%.  
 
Цитата
nikolz написал:
Хвалюсь.
------------------------------
Сегодня мой робот на сбере показал такую картинку с начала года.
 

Т е c 3.01.2024 профит   2.44%, из них 1.72 - лонг и 0.72 -шорт.
Стратегия "купил и держи" дала бы  1%.  
Чем тут хвалиться? Этой уродливой картинкой, по которой единственное, что можно понять, - что она опасна для глаз смотрящего?
У меня цыгане на соседней улице живут, так вот от их шмоток в глазах меньше рябит.
 
Цитата
Glukator написал:
Цитата
nikolz написал:
Хвалюсь.
------------------------------
Сегодня мой робот на сбере показал такую картинку с начала года.
 

Т е c 3.01.2024 профит   2.44%, из них 1.72 - лонг и 0.72 -шорт.
Стратегия "купил и держи" дала бы  1%.  
Чем тут хвалиться? Этой уродливой картинкой, по которой единственное, что можно понять, - что она опасна для глаз смотрящего?
У меня цыгане на соседней улице живут, так вот от их шмоток в глазах меньше рябит.
Это Ваша проблема. Сочувствую.
 
А это результат на сегодня.
 
Цитата
nikolz написал:
Цитата
Glukator написал:
 
Цитата
nikolz  написал:
Хвалюсь.
------------------------------
Сегодня мой робот на сбере показал такую картинку с начала года.
 

Т е c 3.01.2024 профит   2.44%, из них 1.72 - лонг и 0.72 -шорт.
Стратегия "купил и держи" дала бы  1%.  
 Чем тут хвалиться? Этой уродливой картинкой, по которой единственное, что можно понять, - что она опасна для глаз смотрящего?
У меня цыгане на соседней улице живут, так вот от их шмоток в глазах меньше рябит.
Это Ваша проблема. Сочувствую.
Но ведь Glukator прав
Думаете, что хоть один человек на форуме кроме вас может понять что на ней изображено?

Мы видим просто кучу рябящих в глазах линий, циферки какие-то и снизу надпись сбербанк )))

Просто представьте, что не вы ее создали и изначально не знаете что на ней изображено, не реально же разобраться в ней.
 
Glukator, Ну как же "Чем тут хвалиться?" - картинка весьма информативная!
1. Уже сам факт наличия картинки говорит о том, что роботу не доверяют принятие решений: ему-то уж точно никакие картинки не нужны, они - для человека.
2. А раз картинка для человека, то она действительно "уродлива и опасна для глаз смотрящего": яркие цвета, да ещё и на чёрном фоне быстро посадят зрение даже у орла.
3. Дикое нагромождение прямых и кривых линий означает полное неумение выделить и подать в удобном виде действительно важную информацию, в нём не сможет разобраться не только "хоть один человек на форуме", но и сам автор этого кошмара.
4. Фраза "сегодня робот на сбере показал такую картинку с начала года" означает, что:
а) Это не отчёт за год по всему портфелю, а лишь один сраный тикер, за период, который длился как раз "без году неделя".
б) Тем не менее, он длился-таки эту неделю, даже больше, а информация для принятия решений нужна здесь и сейчас, буквально в эту секунду. Следовательно, картинка практически полностью загажена тем, что "было-было-было, но прошло" - это уже мусор, "преданья старины глубокой", которые не только не нужны, но и вредны для принятия решений - недаром скрипту это дело не доверяют.
5. Автор не просто приводит сравнение с техникой "купил и держи", но и хвалится этим. Стало быть, успешно конкурировать даже с этой убогой стратегией у него получается далеко не всегда. Это стратегия моей сестры - она в год совершает примерно столько же сделок, сколько я в день, живёт на дивиденды (кстати, довольно успешно), но даже она время от времени что-то продаёт, балансирует портфель. И для этого ей никакой скрипт нафиг не нужен - даже мой, она его использовать не хочет, хотя не раз видела его "в деле" -.ей и так хорошо.

Вывод: картинка вполне достаточна для вынесения приговора. Того самого, который "окончательный и обжалованию не подлежит".
 
 "Едем дальше, видим больше!"   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)
Страницы: Пред. 1 ... 18 19 20 21 22 ... 26 След.
Читают тему
Наверх