Избранное трейдера Роджер (веселый).
-------------------------------------------------------------------------------------------------------
--- Функция получения результатов свечей в .CSV в виде:
--- <Инструмент> <Дата> <Время> <Цена_Open> <Цена_High> <Цена_Low> <Цена_Close> <Объем>
--- BRN0 1 20200605 200100 42.15 42.16 42.1 42.1 2150
-------------------------------------------------------------------------------------------------------
is_run=true
-- Параметры
tInstr="BRN0" --код инструмента/бумаги
classcode="SPBFUT" --код класса инструмента/бумаги, если нужен фондовый рынок - вводить TQBR вместо SPBFUT
iNterval=INTERVAL_M1 --таймфрейм
-- доступные таймфреймы указаны в справке Quik (qlua.chm в папке с quik) по поиску CreateDataSource
-- пример INTERVAL_H1
corrTime=3 --Время МСК. C сервера время приходит без корректировки.
pFile="w:\\temp" --путь, где будет создаваться файл
cBars=10 --сколько свечей надо вывести
--настройка параметров
function OnInit()
out_file=io.open(pFile .."\\"..tostring(tInstr)..".csv","w")
is_run=(out_file~=nil)
ds=CreateDataSource(classcode, tInstr, iNterval ) --создаем источник данных
ds:SetUpdateCallback(NewChartData) --обновление последних данных
end
function strText(int)
local m=tostring(int)
local mLen=string.len(int)
if mLen==1 then
Output="0" .. tostring(m)
else Output=m
end
return Output
end
function main()
while is_run do
local Size=ds:Size() --Получение количества всех свечей в источнике данных
if cBars>Size then
cBars=Size-1
end
for i=Size-cBars, Size, 1 do
local O=ds:O(i) -- Значение цена открытия свечи
local H=ds:H(i) -- Значение High для свечи
local L=ds:L(i) -- Значение Low для свечи
local C=ds:C(i) -- Значение Close для свечи
local V=ds:V(i) -- Значение Volume для свечи
local T=ds:T(i) -- Значение Time для свечи
sTime=os.time(T)
datetime=os.date("!*t",sTime)
--вывод в файл
out_file:write(tInstr..";"..tostring(iNterval)..";"..tostring(datetime.year)..tostring(strText(datetime.month))..tostring(strText(datetime.day))..";"..tostring(strText(datetime.hour + corrTime))..tostring(strText(datetime.min))..tostring(strText(datetime.sec))..";"..tostring(O)..";"..tostring(H)..";"..tostring(L)..";"..tostring©..";"..tostring(V).."\n")
out_file:flush() --запись данных
end
out_file:close()
sleep(1000) -- приостановка на 1 секунду
out_file=io.open(pFile .."\\"..tostring(tInstr)..".csv","w")
end
end
--
-- Выполнение действий с массивами.
--
local pairs = pairs
local type = type
module(...)
--- Создать копию массива (таблицы)
-- @return копию массива (таблицы)
function copy(array)
local copy_array = {}
if type(array) ~= "table" then
return array
end
for k, v in pairs(array) do
if type(v) == "table" then
copy_array[k] = copy(v)
else
copy_array[k] = v
end
end
return copy_array
end
--- Узнать, начинается ли индексация в массиве с нуля или с единицы.
-- @return 0 или 1
function base(array)
if array[0] ~= nil then
return 0
else
return 1
end
end
--- Вычислить число элементов в массиве.
-- @return число элементов в массиве
function size(array)
local n = 0
for _, _ in pairs(array) do
n = n + 1
end
return n
end
--- Проверить пустой или нет массив.
-- @return true/false
function isEmpty(array)
for _, _ in pairs(array) do
return false
end
return true
end
--- Получить первый индекс массива, где ничего не записано. Поиск начинается с 1.
-- @return первый индекс массива, где ничего не записано
function firstEmptyIndex(array)
local i = 1
while array[i] ~= nil do
i = i + 1
end
return i
endТем, кто не читал предыдущий топик этой темы, рекомендую для начала ознакомиться с ним [1].
В комментариях к предыдущему топику меня критиковали за неоптимальность кода Python. Однако, текст читают люди с совершенно разной подготовкой — от почти не знающих Python или знающих другие языки программирования, до продвинутых пользователей. Последние легко могут обнаружить неоптимальность кода и заменить его своим. Тем не менее, код должен быть доступен и новичкам, возможно не обладающим знанием пакетов и продвинутых методов. Поэтому, в коде я буду, по возможности, использовать только базовые конструкции Python, не требующие глубоких знаний, и которые могут легко читаться людьми, программирующими на других языках. Вместе с тем, по мере изложения, без фанатизма, буду вводить и новые элементы Python.
Если вы хотите как-то улучшить или оптимизировать код, приводите его в комментариях — это только расширит и улучшит изложенный материал.
Ну, а сейчас мы займемся разработкой и тестированием индикаторов. Для начала нам нужна простейшая стратегия с использованием МА — его и построим. Самой лучшей по характеристикам МА является ЕМА. Формула ЕМА:
Для моделирование ТС на Python, прежде всего нужен сам Python. Pythonы бывают очень разные.
Самый большой и длинный Python — Anaconda (https://anaconda.org/). Скачать дистрибутив Anaconda можно здесь — Индивидуальное издание -https://www.anaconda.com/products/individual.
Я работаю именно с Anaconda. Установив Anaconda мы получаем сам Python, уже установленные значительную часть нужных и ненужных пакетов с библиотеками Python, и несколько сред разработки. И все это сразу готово к работе, и нам, по большей части, уже не придется дополнительно устанавливать пакеты и среды.
Самый маленький Python последней версии 3.8.2. скачивается с сайта самого Python — https://www.python.org/. Это, практически, только сам язык, компилятор и минимальный набор пакетов. Сделать с ним практически ничего невозможно, и для работы придется постоянно устанавливать нужные пакеты. Среду разработки придется также устанавливать самостоятельно.
Этот Python больше подходит для запуска и работы с уже отлаженными законченными программами.

Распадская — возможен выкуп примерно по 140 руб., на фоне жалобы миноритариев в ЦБ.
Дивидендные акции — рост ограничен, финал близок. Если не будет дальнейшего снижения ставок.
Мечел – обычка лучше. Если Игорь Зюзин докупит обычку и у него будет 51% уставного капитала, ему не надо будет платить дивиденды на префы. Префы растут по инерции за обычкой.
Газпром — через 5 лет может стоить 400-500 руб., если акции будут давать 30-35 руб. дивидендов.
Ленэнерго преф. — дивиденды за 2019 год скромные, за 2020 год примерно 19руб. на акцию.
Но никто не знает, что будет после 2020 года, неизвестно как повлияет реорганизация.