Избранное трейдера Сергей Сергаев
------------------------------------------------------------------------------------------------------- --- Функция получения результатов свечей в .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
Settings = {
Name = "*BB (Bollinger Bands) %B oscillator",
Period = 20,
Metod = «SMA», --(SMA, MMA, EMA, WMA, SMMA, VMA)
VType = «Close», --(Open, High, Low, Close, Volume, Median, Typical, Weighted, Difference)
Shift=2,
line = {{
Name = «Horizontal line (top)»,
Type = TYPE_LINE,
Color = RGB(221, 44, 44)
},
{
Name = «Horizontal line (bottom)»,
Type = TYPE_LINE,
Color = RGB(221, 44, 44)
},
{
Name = «Bollinger Bands %B oscillator line»,
Type = TYPE_LINE,
Color = RGB(255, 255, 255)
}
},
Round = «off»,
Multiply = 1,
Horizontal_line=«0»
}
function Init()
func = BB_B()
return #Settings.line
end
function OnCalculate(Index)
local Out = ConvertValue(Settings, func(Index, Settings))
local HL = tonumber(Settings.Horizontal_line)
if HL then
return 1+HL,HL,Out
else
return nil,nil,Out
end
end
function BB_B() --Bollinger Bands %B oscillator («BB_B»)
local BB_MA=MA()
local BB_SD=SD()
local it = {p=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 20)
local M = (Fsettings.Metod or SMA)
local S = (Fsettings.Shift or 2)
local VT = (Fsettings.VType or CLOSE)
if (P > 0) then
if I == 1 then
it = {p=0, l=0}
end
local b_ma = BB_MA(I, {Period=P, Metod = M, VType=VT}, ds)
local b_sd = BB_SD(I, {Period=P, Metod = SMA, VType=VT}, ds)
if CandleExist(I,ds) then
if I~=it.p then it={p=I, l=it.l+1} end
if it.l >= P and b_ma and b_sd then
-- -- Выполнение действий с массивами. -- 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 больше подходит для запуска и работы с уже отлаженными законченными программами.
Финансисты, участники рынка, люди серьезные. Но иногда они, дабы разбавить свою суровую жизнь толикой юмора, придумывают разные, порой смешные, сленговые выражения.
Чтобы лучше ориентироваться в нашем птичьем языке, предлагаю вам словарь-помощник.
Быки – игроки, мечтающие о том, что все будет гораздо выше и толкающие цены вверх.
Бычара – ярко выраженный, несгибаемый, «упертый» бык. Удивительная штука: в жизни бывает нормальный человек, но как он «раскрывается» на полях биржевых сражений! А ведь никто бы не мог подумать. 😀
Мамба – наша уважаемая Московская биржа, произошло от предыдущего официального названия биржи – ММВБ. Сам грешу этим. Что поделаешь – привычка.
Сиплый – S&P 500. Не частое выражение, но сочное.
Вдуть, запарить, впарить, слить – продать. «Вдули ему по самым хаям» – крылатое выражение сейлзов, работающих с клиентами. В обьяснении не нуждается. Как говорится, «поубивал бы их всех...» Циничные люди. Бог придумал пиратов, а потом решил, что они тихие добрые агнцы. И тогда он создал сейлзов… Кровожадный народец, знаете ли. Но куда без них?😉
Северсталь представила операционные результаты за 1-ый квартал 2020 года.
Объем производства чугуна увеличился на 2% к предыдущему кварталу и составил 2.41 млн. тонн (4 кв. 2019: 2.36 млн. тонн) в связи с завершением краткосрочных работ на доменных печах в 4 кв. 2019.
Производство стали увеличилось на 5% и составило 2.85 млн. тонн (4 кв. 2019: 2.71 млн. тонн) в связи с увеличением количества плавок в 1 кв. 2020 и завершением краткосрочных работ на конвертерных и электросталеплавильных мощностях в 4 кв. 2019.
Снижение выплавки стали к 1-му кварталу 2019 года вызвано продажей сортового завода в Балаково.
Производство концентрата коксующегося угля на «Воркутауголь» сократилось из-за уменьшения объемов производства горной массы в связи с перемонтажом лав на шахте «Комсомольская» в 1 кв. 2020.
Производство железорудного сырья выросло на 1% и 7% относительно прошлого квартала и 1-го квартала 2019 года соответственно.