Блог им. XXM |Camarilla Equation. Индикатор для QUIK. Часть 3.

    • 22 августа 2019, 12:29
    • |
    • XXM
  • Еще
Получил такое сообщение:

привет!
у меня в квике стояла камарилла аж с 2014 года, когда вы выложили здесь этот индикатор.
квик обновился до 8 и камарилла пропала.
это не исправить?

Глянул по тэгу https://smart-lab.ru/tag/Camarilla/ и вот они:
1. Camarilla Equation. Индикатор для QUIK.
2. Camarilla Equation. Индикатор для QUIK. Часть 2.

Выкладываю вариант, не зависящий от обновлений QUIK.

-- Camarilla.lua
Settings={
	Name = "Camarilla",
	period = 'D',
	line =
		{
			{Name = "S5", Color = RGB(255, 0, 0), Type = 1, Width = 2},
			{Name = "S4", Color = RGB(255, 165, 0), Type = 1, Width = 2},
			{Name = "S3", Color = RGB(255, 255, 0), Type = 1, Width = 2},
			{Name = "PP", Color = RGB(0, 255, 0), Type = 1, Width = 2},
			{Name = "R3", Color = RGB(0, 191, 255), Type = 1, Width = 2},
			{Name = "R4", Color = RGB(0, 0, 255), Type = 1, Width = 2},
			{Name = "R5", Color = RGB(139, 0, 255), Type = 1, Width = 2},
		}
}

local math_floor = math.floor
local levels = 0
local ydH, ydL, ydC, ydO = {},{},{},{}
local PP, R3, R4, R5 = 0,0,0,0
local S3, S4, S5 = 0,0,0
	local delta = 0
	local cl = 0
local predThisDay=0
local function dTs(t) return 100*(100*t.year+t.month)+t.day; end
local OldDay = ''	-- для выделения начала торгового дня

function Init ()
	local t=getDataSourceInfo()
	local tt = t.interval
	if tt == -3 then 
		message('Месячный график не обрабатывается.',1)
		return 
	end
	return 7
end

function OnCalculate (index)
	local time tt=T(index); ---время из свечи
	--local ThisDay=dTs(tt)	-- дата в формате yyyyMMdd
	local tDay=dTs(tt)	-- дата в формате yyyyMMdd
	local ThisDay = tDay
	if Settings.period == 'W' then
		ThisDay=tt.week_day	-- номер недели
	end
	if index == 1 then
		--message('First ThisDay = '..tostring(ThisDay),1)
		local t=getDataSourceInfo()
		--7.2.5 Функция предназначена для получения информации об источнике данных для индикатора.
		local scale = getSecurityInfo(t.class_code, t.sec_code).scale	--	NUMBER, Количество значащих цифр после запятой
		mul = 10^scale  -- возведение в степень
		local tt = t.interval
		if tt == -3 then tt = 'месяц' 
		elseif tt == -2 then tt = 'неделя'
		elseif tt == -1 then tt = 'день' 
		else
			tt = tt..' мин.'
		end
		--message(t.sec_code..'('..t.class_code..'), цифр после запятой: '..scale..', mul = '..mul..', дата = '..ThisDay,1)
		levels = levels + 1
		if ThisDay ~= OldDay then
			OldDay = ThisDay
		end	
		predThisDay = ThisDay
		--
		delta = H(index) - L(index)
		cl = C(index)
		R5 = (H(index) / L(index))*cl
		calcLevels(index)
		local per = 'daily'
		if Settings.period == 'W' then
			per = 'weekly'
		end
		message('Camarilla '..per..', Т = '..tt..', © xsharp.ru 20.06.2015', 1)
		return
	end
	if Settings.period == 'W' then
		if ThisDay < OldDay then	-- для неделек
			OldDay = OldDay + 1
			if OldDay ~= ThisDay then
				OldDay = ThisDay
			end
			levels = levels + 1
			delta = ydH[levels-1] - ydL[levels-1]
			cl = ydC[levels-1]
			R5 = (ydH[levels-1] / ydL[levels-1])*cl
			calcLevels(index)
			--if index<120 then
			--message('index= '..tostring(index)..', Смена недели: '..tostring(ThisDay)..', OldDay: '..tostring(OldDay)..', d='..tDay..', R3= '..R3..', PP= '..cl..', S3= '..S3,1)
			--end
			predThisDay = ThisDay
		else
			if ThisDay ~=predThisDay then
				--message('index= '..tostring(index)..', ThisDay= '..tostring(ThisDay)..', predThisDay: '..tostring(predThisDay)..', d='..tDay..', R3= '..R3..', PP= '..cl..', S3= '..S3,1)
				predThisDay = ThisDay
				OldDay = OldDay + 1
			end
			ThisDayF(index)
		end
	elseif Settings.period == 'D' then
		if ThisDay ~= OldDay then	-- для дневок
			OldDay = OldDay + 1
			if OldDay ~= ThisDay then
				OldDay = ThisDay
			end
			levels = levels + 1
			delta = ydH[levels-1] - ydL[levels-1]
			cl = ydC[levels-1]
			R5 = (ydH[levels-1] / ydL[levels-1])*cl
			calcLevels(index)
			--if index<120 then
			--message('index= '..tostring(index)..', Смена недели: '..tostring(ThisDay)..', OldDay: '..tostring(OldDay)..', d='..tDay..', R3= '..R3..', PP= '..cl..', S3= '..S3,1)
			--end
			predThisDay = ThisDay
		else
			if ThisDay ~=predThisDay then
				--message('index= '..tostring(index)..', ThisDay= '..tostring(ThisDay)..', predThisDay: '..tostring(predThisDay)..', d='..tDay..', R3= '..R3..', PP= '..cl..', S3= '..S3,1)
				predThisDay = ThisDay
				OldDay = OldDay + 1
			end
			ThisDayF(index)
		end
	elseif Settings.period == 'H4' then
		if ThisDay ~= OldDay then	-- для дневок
			OldDay = OldDay + 1
			if OldDay ~= ThisDay then
				OldDay = ThisDay
			end
			levels = levels + 1
			delta = ydH[levels-1] - ydL[levels-1]
			cl = ydC[levels-1]
			R5 = (ydH[levels-1] / ydL[levels-1])*cl
			calcLevels(index)
			--if index<120 then
			--message('index= '..tostring(index)..', Смена недели: '..tostring(ThisDay)..', OldDay: '..tostring(OldDay)..', d='..tDay..', R3= '..R3..', PP= '..cl..', S3= '..S3,1)
			--end
			predThisDay = ThisDay
		else
			if ThisDay ~=predThisDay then
				--message('index= '..tostring(index)..', ThisDay= '..tostring(ThisDay)..', predThisDay: '..tostring(predThisDay)..', d='..tDay..', R3= '..R3..', PP= '..cl..', S3= '..S3,1)
				predThisDay = ThisDay
				OldDay = OldDay + 1
			end
			ThisDayF(index)
		end
	end
	return S5, S4, S3, cl, R3, R4, R5
end

function round(value)
	return math_floor(value*mul + 0.5) / mul
end

function ThisDayF(index)
	ydC[levels] = C(index)
	if H(index) > ydH[levels] then
		ydH[levels] = H(index)
	end
	if L(index) < ydL[levels] then
		ydL[levels] = L(index)
	end
end

function calcLevels(index)
	ydO[levels] = O(index)
	ydH[levels] = H(index)
	ydL[levels] = L(index)
	ydC[levels] = C(index)
	--
	R3 = cl + delta * 1.1/4
	R4 = cl + delta * 1.1/2
	--
	S3 = cl - delta * 1.1/4
	S4 = cl - delta * 1.1/2
	S5 = cl - (R5-cl)
	--
	R5 = round(R5)
	R4 = round(R4)
	R3 = round(R3)
	S3 = round(S3)
	S4 = round(S4)
	S5 = round(S5)
end
  • обсудить на форуме:
  • QUIK

Блог им. XXM |Торговый робот на Lua для QUIK.

    • 27 декабря 2018, 09:39
    • |
    • XXM
  • Еще

4 года и 4 месяца прошло с выхода поста «Торговый робот на LUA для QUIK» (https://smart-lab.ru/blog/200767.php) про конструктор Lbot. За это время он повзрослел, лишился графического интерфейса и… превратился в младшего брата для Lbot3D. И если раньше для Lbot была пробная версия (с одним инструментом и одним лотом), то теперь, фактически, сам превратился в пробную версию для Lbot3D и, с этого дня, предоставляется в свободное пользование с полным функционалом:

Торговый робот на Lua для QUIK.

Скачать Lbot180.zip можно тут: drive.google.com/open?id=1DL9jGEBm2Uhk89PcQdlK-ObaOe2zihnx
INI-файл написан для демо-QUIK на 3 инструмента — Сбербанк, Газпром и Лукойл. Стратегия на Газпроме — безиндикаторная, на Сбербанке — на скользящих средних, на Лукойле — на пересечениях MACD.

encoding = "UTF-8"
FREQUENCY = 1000
account = NL0011100043, 10110
PositionSize = 300000
xy = 421, 0, 859, 118
;-------------------------------------------------------------------------------
[GAZP]
Security = GAZP, QJSIM, Gazp_moex
WorkSize = 3		//  рабочий объем, в штуках;
LossLimit = 100		// ограничение на убыток по стратегии
OpenSlippage = 10	// допустимое проскальзывание на сделке, в количестве минимальных шагов цены;
OpenLong =  {Close, 1} < {High, 2}	// цена 'close' предыдущей 'полной' свечи превысила 'high' предшествующего ей бара;
OpenShort = {Close, 1} > {Low, 5-2}	// цена 'close' предыдущей 'полной' свечи принизила 'low' 5-2 баров;
StopLoss = 2
TakeProfit = 3, 1, 1
EOD = 18:29:00	//закрытия позиции в указанное время.
autoBot = Y
[SBER]
Security = SBER, QJSIM, Sber_moex
WorkSize = 10
LossLimit = 100
OpenSlippage = 10
OpenLong	= {Ema1} > {Ema2}
CloseLong	= {Ema1} < {Ema2}
OpenShort	= {Ema1} < {Ema2}
CloseShort	= {Ema1} > {Ema2}
autoBot = Y
[LKOH]
WorkSize = 2
Security = LKOH, QJSIM, Lkoh_moex
LossLimit = 225
OpenSlippage = 10
OpenLong	= cross(macd_Lkoh.0, macd_Lkoh.1)
OpenShort	= cross(macd_Lkoh.1, macd_Lkoh.0)
;OpenLong =  {Close, 1} < {Low, 5-2}
;OpenShort = {Close, 1} > {High, 2}
StopLoss = 30
TakeProfit = 50, 10, 10
autoBot = Y


( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

Блог им. XXM |Fn044.lua, версия 2.1

    • 29 октября 2018, 16:07
    • |
    • XXM
  • Еще

В своей торговле применяю комбинации рыночных и лимитированных заявок, (методику описывал ранее, "Настоящая торговая стратегия."  и "US500: Объемы больше, спреды уже!" ). Временами количество одновременно работающих стратегий зашкаливало за сотню и на некоторые из них не хватало денег под выставление заявок, они отключались, иногда ломая логику работы связанных с ней стратегий. В QUIK в таблице «Состояние счета» считается цифра — «Свободно» — свободные средства под заявки, но сходу вытащить ее из Lua у меня не получилось. И пришлось вписать расчет этой величины в робота.
Сегодня предлагаю вашему вниманию доработанный скрипт Fn044.lua (https://yadi.sk/d/O-6JzZdXkOxyow)
Fn044.lua, версия 2.1

в котором реализован расчет свободных средств для заявок на ФОРТС с учетом имеющихся контрактов и заявок.
Один в один вывести не получилось, как смог.
As is, и все такое!

  • обсудить на форуме:
  • Quik Lua

Блог им. XXM |fn044.lua

    • 09 октября 2018, 15:33
    • |
    • XXM
  • Еще
fn044.lua — скрипт для расчета стоимости фьючерсных контрактов в портфеле относительно депозита.
Скачать: https://yadi.sk/d/e7XRt3CQ2v7Miw

fn044.lua

Файл настроек:
-- fn044set.lua расчет стоимости фьючерсных контрактов в портфеле относительно депозита
-- © smart-lab.ru/profile/xxm 08.10.2018

-- торговый счет (из таблицы «Позиции по клиентским счетам (фьючерсы)»)
account = 'SPBFUT0003f'

--положение окна с таблицей. Левый верхний угол в координаты left,top и размеры в width и height.
xy = {} 
xy.left, xy.top, xy.width,xy.height = 0, 232, 722, nil

--ширина столбцов таблицы
t_width = {12, 6, 10, 8, 10, 10, 9, 7, 6, 11, 10, 11}

-- месяц и год исполнения, 2 символа, https://www.moex.com/s205
MonthYear = "Z8"
-- код базового актива, 2 символа
-- если 4 символа, то переменная "MonthYear" не учитывается
SecCodes={
	{"MM"}, --контракт на индекс МосБиржи
	{"Si"}, --руб/доллар FORTS
	{"SR"}, --Sber FORTS
	{"LK"}, --контракт на Лукойл
	{"GZ"}, --контракт на Газпром
	{"BRX8"}, --контракт на нефть Брент, месяц и год - "X8"
	{"ED"}, --контракт на ED
	{"RN"}, --контракт на Роснефть
	{"GD"}, -- Gold
	}

--Если xy.height == nil, то вычислить ее.
--Для разных мониторов коэффициенты (17, 45 и 868 - подобраны эмпирически) будут разными.
local height = xy.height or ((#SecCodes + 1)*17 + 45)
if height > 868 then height = 868 end
xy.height = height


( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

Блог им. XXM |Настоящая торговая стратегия.

    • 09 апреля 2018, 08:32
    • |
    • XXM
  • Еще

Мацуо Басё



Что нужно для того, чтобы торговать так, как нарисовано ниже?

Сбербанк, 2017 год



( Читать дальше )

Блог им. XXM |Торговая система "купи-продай".

    • 16 октября 2017, 08:10
    • |
    • XXM
  • Еще

Представляю торговую систему «купи-продай».

Суть ее очень проста: Покупаем некоторое количество бумаг (start_qty), и выставляем заявки по лесенке на продажу через определенное количество пунктов.
Шаг лесенки назовем step. Да, бумаги следует продавать одинаковыми пачками, по qty_in_step лотов.
(Оставляем пока за бортом поста тему — а что делать, если купили, выставили заявки на продажу, а бумага пошла вниз?)
Поведение Equity при разных start_qty приведено на рисунке.
Супер-система, купи-продай. Многие знают, но стесняются говорить ;)


Индикаторы можете скачать со страницы www.xsharp.ru/indikators  файл StockTest.zip, два индикатора:
1. StockTest.lua — проставляет метки сделок. Ее следует добавить на график бумаги;
2. StockEquity.lua — строит кривую Equity, следует добавить на отдельное окно.

Успешной игры по тренду!


Блог им. XXM |Новая версия Рабочего места QUIK — 7.10

    • 28 марта 2017, 09:57
    • |
    • XXM
  • Еще

Новая версия Рабочего места QUIK — 7.10


arqatech.com/ru/about/news/quik-7-10/

Цифры — шок:

Среди других нововведений версии следует отметить увеличение количества сохраняемых «свечек» графиков в локальном хранилище Рабочего места с 3000 до 65000.


Если ранее к тестированию в QUIK можно было относиться как к забаве, то теперь это становится уже интересным делом!

www.xsharp.ru/tester

Скачивайте, тестируйте. Будут вопросы — пишите.


Блог им. XXM |Список бумаг, которые транслирует ваш QUIK.

    • 22 декабря 2016, 20:27
    • |
    • XXM
  • Еще

Готовый пример для акций, класс — TQBR.
Список всех классов выводится на вторую строку лог-файла.

-- seclist_csv.lua, © smart-lab.ru/profile/XXM/
-- список бумаг, транслируемые QUIK-ом

local ver = '0.91'      --      22.12.2016
local scriptPath = getScriptPath()
local Terminal_Version=getInfoParam('VERSION')
local logFile = scriptPath..'\\'..'seclist.csv'
local file = io.open(logFile, "w")
assert(file, "Ошибка открытия "..logFile)

function string.split(str, sep)
        local fields = {}
        str:gsub(string.format("([^%s]+)", sep), function(f_c) fields[#fields + 1] = f_c end)
        return fields
end

function write_log(str)
        file:write(str .. "\n")
end

function Main()
        local local_datetime = os.time(os.date("*t"))
        local dtd = os.date("%d.%m.%Y %H:%M",local_datetime)
        local mes = 'Start seclist_csv '..ver..', QUIK '..Terminal_Version..', '..dtd
        message(mes);
        file:write(mes .. "\n")
        class_list = getClassesList()
        mes = 'class_list =  '..class_list
        message(mes); write_log(mes);
        local class_listT = {}
        class_listT = string.split(class_list, ',')
        for i = 1, #class_listT do
                local fline = class_listT[i]
                if fline == 'TQBR' then
                        -- для примера - только акции!
                        local classInfo = {}
                        classInfo = getClassInfo(fline)
                        -- 3.2.2 getClassInfo
                        -- Функция предназначена для получения информации о классе.
                        local sec_list = getClassSecurities(classInfo.code)
                        local sec_listTable = {}
                        sec_listTable = string.split(sec_list, ',')
                        for i = 1, #sec_listTable do
                                local classCode = classInfo.code
                                local secCode = sec_listTable[i]
                                local securityInfo = getSecurityInfo(classCode, secCode)
                                local name = securityInfo.name
                                local step = securityInfo.min_price_step
                                local secInfo = classInfo.name..';'..classCode..';'..name..';'..secCode..';'..step
                                write_log(secInfo);
                        end
                end
        end
        local mes = 'Готово!'
        message(mes); write_log(mes);
        file:flush()
        file:close()
end

Main()

-- seclist_csv.lua
На выходе получил список из 292 ценных бумаг.
Здесь: moex.com/a3503 — 310. Не смотрел, почему такая разница.

Блог им. XXM |Визуализация сделок участников ЛЧИ в Quik. Часть 3.

    • 26 сентября 2016, 17:09
    • |
    • XXM
  • Еще

1. Визуализация сделок участников ЛЧИ-2015 в Quik. 
2. Визуализация сделок участников ЛЧИ-2015 в Quik. Часть 2. 
3. Скачать индикаторы на языке Lua.

Визуализация сделок участников ЛЧИ в Quik. Часть 3.

На ЛЧИ 2016 не запускал, вирусов нет, применяйте, как хотите, не хотите — не применяйте.

UPD 19:17, 26.09.2016:
Написали сообщение: «Индикаторы для ЛЧИ-2016 подходят»


#ДоброПропадает


Блог им. XXM |Lbot3D: углубление внутреннего содержания.

    • 14 апреля 2016, 08:51
    • |
    • XXM
  • Еще
                                                         

Открылась бездна звезд полна;
Звездам числа нет, бездне дна.
                     М. В. Ломоносов

Конструктор стратегий Lbot позволяет создавать разнообразные торговые стратегии.
Он хорош для составления долгосрочных стратегий: входы и выходы из позиций — по рыночным ценам, в арсенале — весь набор индикаторов QUIK.
Созданный на его основе конструктор Lbot3D — программа с бо́льшими возможностями: входы и выходы возможны по лимитированным заявкам, и по одному инструменту могут быть запущены одновременно неограниченное количество стратегий, совершенно независимых друг от друга. Они могут управлять своими долями от части денежных средств, выделенных для этого инструмента из общего депозита.

( Читать дальше )

....все тэги
UPDONW
Новый дизайн