привет!
у меня в квике стояла камарилла аж с 2014 года, когда вы выложили здесь этот индикатор.
квик обновился до 8 и камарилла пропала.
это не исправить?
-- 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
Доводим до вашего сведения, что в начале июля 2019 года компания ARQA Technologies планирует выпустить Рабочее место QUIK версии 8.0, поддерживающее только 64-разрядные ОС Windows. В связи с этим, уведомляем вас о следующем:
— Версии РМ QUIK для 32-разрядных ОС Windows выпускаться более не будут. Текущие версии (x32 6.x, 7.x) будут продолжать работать и смогут подключаться к новым версиям сервера QUIK, но обновлений для этих версий не будет.
— Прекращается поддержка операционной системы Window XP.
Если вы используюте Window XP или x32-релизы других ОС Windows — рекомендуем обновить системы в случае, если вы заинтересованы получать обновления РМ QUIK.
Заголовок «Эмулятор биржевой торговли LbotLight.» уже был (https://smart-lab.ru/blog/293681.php), сегодня будет просто «Путь домой».
4 года и 4 месяца прошло с выхода поста «Торговый робот на LUA для QUIK» (https://smart-lab.ru/blog/200767.php) про конструктор Lbot. За это время он повзрослел, лишился графического интерфейса и… превратился в младшего брата для Lbot3D. И если раньше для Lbot была пробная версия (с одним инструментом и одним лотом), то теперь, фактически, сам превратился в пробную версию для Lbot3D и, с этого дня, предоставляется в свободное пользование с полным функционалом:
Скачать 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
В программе Lbot3D появилась реализация вычисления скользящего экстремума в конкретной стратегии при наличии позиции. Слово «конкретной» звучит потому, что этот самый экстремум можно использовать в других стратегиях из портфеля стратегий. Согласен, это нужно не всем. Скорее так: мало кому он нужен. Тем не менее, продолжу.
Допустим мы придумали стратегию на некотором активе, рассчитанную на тренд:
Покупаем на четверть портфеля. Если цена пошла против нас (пусть на 1%)- стопимся, но если в нашу сторону +1%, то в предположении, что мы тренде, выставим лимитированную заявку на покупку второй четверти на 0.5% ниже достигнутого экстремума: откат вероятен, и после того, как на откате вытряхнут часть пассажиров, (самых пугливых, самых недостойных :)), наш портфель зацепит еще несколько лотов и едем дальше, «на север». Но если первая четверть бумаг размещена в нашем портфеле на «долгосрок», то вторая четверть будет сразу же выставлена на продажу с профитом, например, в 1%.
В своей торговле применяю комбинации рыночных и лимитированных заявок, (методику описывал ранее, "Настоящая торговая стратегия." и "US500: Объемы больше, спреды уже!" ). Временами количество одновременно работающих стратегий зашкаливало за сотню и на некоторые из них не хватало денег под выставление заявок, они отключались, иногда ломая логику работы связанных с ней стратегий. В QUIK в таблице «Состояние счета» считается цифра — «Свободно» — свободные средства под заявки, но сходу вытащить ее из Lua у меня не получилось. И пришлось вписать расчет этой величины в робота.
Сегодня предлагаю вашему вниманию доработанный скрипт Fn044.lua (https://yadi.sk/d/O-6JzZdXkOxyow)
в котором реализован расчет свободных средств для заявок на ФОРТС с учетом имеющихся контрактов и заявок.
Один в один вывести не получилось, как смог.
As is, и все такое!
Все те, кто хотел выйти на зарубежные рынки но почему-то еще не вышел, могут торговать америку не вставая со своего кресла. Спросите как? А вот так:
-- 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
Не буду утомлять вас теорией, что такое базис применительно к фьючерсным контрактам. А то придется писать такие слова, как «контанго и бэквордация», что, во-первых, скучно, а во-вторых, сильно отдалит нас от темы зарабатывания на рынке, да и оффтопом пахнёт ;)
Решил я торговать фьючерсный контракт на курс доллар США — российский рубль, Si-9.18.
Но торговать руками — это здоровье только портить, поэтому без вариантов — роботом. Готовых правил, конечно, нет: у кого есть, самим не хватает, а аналитиков читать — себя не уважать. Пришлось скачивать склеенный фьючерс с Финама и пытать эти данные на предмет поиска закономерностей ценовых движений. Ничего не нашел (плохо искал?). Попытался учесть нюансы склейки, стало только хуже.
От безысходности скачал котировки USDTOD, подкорректировал комиссию биржи и брокера под фьючерс, перезапустил тестер и voilà: