local tag={} sec = { 'NGQ3', 'EDU3', -- 9.6 p; ГО 6598; 'RMU3', -- RTSM-9.23 Индекс РТС (мини) Расчетный фьючерс на RTSI. Стоимость пункта цены 18,46 p; ГО 3546; 'NAU3', -- NASD-9.23 Nasdaq 100 Расчетный фьючерс на Invesco QQQ ETF Trust Unit Series Стоимость пункта цены 0,92p; ГО 1799; };
for i=1,#sec do tag[i] = 'J'..string.sub( sec[i], 1,2 ) print(type(tag[i]), tag[i]) end
Так тоже ошибку не давал? string.sub( sec[i], 0,2 )
Сергей написал: В код пришлось вводить много дополнительных условий и переменных, т.к. в процессе написания выяснилось, что иногда бывает несколько одинаковых index на свечу.
Не бывает ни когда. Индекс пришел или не пришел.
Можно отслеживать:
newbar = Индекс > Индекс1 or false; Индекс1=Индекс
Сергей написал: Любой индикатор легко считается в скрипте qlua, сделать там же среднюю по значениям индикатора не проблема, вопрос именно в пристыковке средней к индикатору на графике силами кода индикатора.
Вы сами то понимаете что написали?
Цитата
Сергей написал: Обычно на такое не отвечаю, но просто чтобы не набежала еще толпа желающих просто посотрясать воздух и пофилосовствовать, коих на форуме стала тьма
Вам тут больше на код не кто не скажет, "Белиберда", просто потому что время дороже.
Цитата
Сергей написал: а не посоветовать что-то в конкретном коде:
Цитата
VPM написал: Алгоритмы все известны, пишите сразу RSI, усредняйте (Period RSI + Period Вашего усреднения).
Индикаторы Опубликованы на этом сайте, берите, усредняйте, при вычислении результатов учитывайте два периода усреднения (Период усреднения RSI и Ваш период). Примеров двойного усреднения полно опубликованных. Хотел в своей библиотеке найти где то был сразу не нашел. Но вот пример как я пользуюсь индикаторами через присвоение.
function Cached.RSI__() local log=math.log local exp=math.exp local abs=math.abs local Price={} local EMA={} local Noise,Peak={},{} local UOE={}
local fLaguerre=Cached.Laguerre_Ehlers() local fPeriod=Cached.Period_SineWave()
return function( I,FSettings,ds )
local I = I local ds=ds local FSettings = (FSettings or {})
Cached -- моя библиотека дальше присвоение и создание переменных (для данной ф. это глобальные).
return function( I,FSettings,ds ) - это замыкание в луа, собственно сама функция то что мы считаем. дальше присвоение и создание локальных переменных
Не я не про код! Только маленькая ремарка в отношении смысла. Про постановку вопроса? А зачем?
Вы читаете значение из RSI?, и пытаетесь его ещё дополнительно сгладить, Вы представляете какой период оцениваете?
Нет технических вопросов совсем нет, до нас все придумали ! Вашем исполнении техника мягко говоря хромает,. зачем создавать индикатор в QUIk а потом его читать, (QUIk без Вашей помощи упадет )
Алгоритмы все известны, пишите сразу RSI, усредняйте (Period RSI + Period Вашего усреднения). А зачем? Это из области "Если Все прыгнули в колодец, то и мне пора"
Высказываясь так, "Ни чего личного", хочу чтоб Вы для себя с формулировали задачу. А зачем?
Альфа эквивалентной EMA связана с длиной простой скользящей средней как
Nikolay, Чтоб точно ГО считать мне пока не нужно, достаточно получать его, все равно необходим зазор чтоб позиция дышала. стоимость контракта = price_last * pos_qty* lot ?
Владимир, Этот форум устроен для поддержки, а главное обнаружению и устранению "косяков" QUIK. То что в нём закралась страничка по обмену опытом в программировании на луа, нужно сказать спасибо организаторам и поддерживать ее.
Цитата
Владимир написал: Боря не той помощи искал, которую может дать этот форум. И уж точно не от Вас. Он очень грамотный трейдер, в биржевой торговле понимает гораздо больше, чем подавляющее большинство участников этого форума - включая меня, например.
Не важно кто что ищет, важно кто что дает, а если "очень грамотный трейдер" тои давай такие же советы, я тоже с удовольствием послушаю "очень грамотный трейдер"
uuh написал: В такой ситуации робот перевыставит заявку на те же 10 лотов.И есть шанс вместо 10 купить 17 лотов.Он может не реализоваться, но он есть и далеко не нулевой.
Нет в этой реализации не каких 17 не может быть, ордер знает 10 и пока ему не подтвердит кщлбек исполнение будет стоять 10 или набираться частями до 10.
dofile("hacktrade.lua") ---Загруили
function Robot()
----- Получили т.тек.торгов
feed = MarketData{
market="QJSIM",
ticker="SBER",
}
----- создаем ордера
order = SmartOrder{
account="NL0011100043",
client="74808",
market="QJSIM",
ticker="SBER",
}
----- Получили индикаторы
ind = Indicator{
tag="MAVG",
}
----- Торгуем
while true do
if feed.last > ind[-1] then
order:update(feed.last, 10)
else
order:update(feed.last, -10)
end
Trade()
end
end
"Это пример реверса по скользящей средней.
Пример тривиальный, но надёжный. Робот догоняет цену.
Если снимите заявку, он выставит количество, которое не успел купить/продать."
uuh написал: А если колбэки о сделке еще не пришли, order.position не обновился, то и количество лотов в заявке может быть не тем, которое задумывалось.
uuh написал: Ну так hacktrade набирает позицию в рамках своих знаний о ней. А эти его знания можно посмотреть в order.position.Если обновлять заявку order:update в рамках своих знаний о текущей позиции, то робот то выставит на биржу заявку в соответствии со своими знаниями о позиции.
Ну подождите, по порядку: В начале до основного цикла формируем заявки им присваивается уникальный номер, согласно этого номера и действуем. Нужно при следующем обращении поменять цену, меняем, нужно поменять количество меняем, нужно снять снимаем. Если исполняется у нее есть два статуса активна и исполнена, активная цена ушла снимаем.
На исполнена придет OnTrade мы его отловим, если не вся заявка исполнена она будет добиваться,
Так что два параллельных мира. мы управляем ценой и количеством (т.е денюшкой) в ордере, А hacktrade исполнением ордера и взаимодействует с терминалом.
VPM написал: И что это было 1 час в борьбе за подключение к сервера? Да уж.
А было это графики.
Вернул расчеты алгоритмов в main убрал лишние графики и вот оно чудо. Все грузится. Идея вести расчеты в квик, подходит для для единичных инструментов.
Цитата
Владимир написал: Господи, канал-то здесь при чём?
function OnTrade(trade)
local key = trade.trans_id
if working
and key~=sdelka.id
--and trade.sec_code==symbol
--and trade.class_code==class
then
local i=tonumber(sdelka[0]); i=i+1; ---- новый размер стека сделок из прерывания
sdelka[0]=i; ---- записываем изменение стека:
---- сохраняем новую сделку;
sdelka[i]={}; -- заводим новый элемент стека
sdelka[i][0]=sdelka[0];
sdelka[i][1]=trade.trans_id; -- ID транзакции
sdelka[i][2]=get_date(trade.datetime)
sdelka[i][3]=get_time(trade.datetime)
-- по умолчанию это покупка
sdelka[i][4]="B"; if bit.band(trade.flags,4)~=0 then sdelka[i][4]="S"; end;
local dir = sdelka[i][4]=="B" and 1 or sdelka[i][4]=="S" and -1 or 0;
sdelka[i][5]=trade.qty*dir; -- количество в сделке (в лотах)
sdelka[i][6]=trade.price; -- цена сделки
----- comission
sdelka[i][7]=trade.clearing_comission+trade.exchange_comission+trade.tech_center_comission;
sdelka[i][8]=trade.order_num;
sdelka[i][9]=trade.trade_num;
sdelka[i][10]=trade.sec_code; -- тикер
---- Защита от повторений:
sdelka.id=trade.trans_id;
end
end;
"Ни когда не было и вот опять". Подскажите что я не так делаю?
Хочу снять активную заявку по trans_id, вот вызов:
if active then KillOrders_id( trans_id ) end
Но получаю: "Ошибка: ord.sec_code CNYRUBF; Не указан режим транзакции"
Вот сама функция:
function KillOrders_id(trans_id)
local NumberOf = getNumberOf("orders") for i = 0, NumberOf - 1 do local ord = getItem("orders", i) local ord_status = get_order_status(ord.flags)
if ord_status and ord_status~='' and ord_status == "active" --and ord.sec_code == symbol --and ord.account == account and ord.trans_id == trans_id --trans_id NUMBER Идентификатор транзакции then
local trans_id = get_trans_id(); Log:trace( "KillOrders trans_id: ".."; status= ".. tostring(ord_status).."; trans_id= ".. tostring(trans_id) ) local trans_params = { --ACCOUNT=account, --CLIENT_CODE=client, CLASSCODE = ord.cllas_code, TRANS_ID = tostring(trans_id), ACTION = "KILL_ORDER", ORDER_KEY = tostring(ord.order_num) } local res = sendTransaction(trans_params) if 0 < string_len(res) then Log:info('KillOrders_id - Ошибка: '.."ord.sec_code "..tostring(ord.sec_code)..'; '..res,1) end end end end
VPM написал: Фондовый рынок просто выкупают, правда непонятно кто гребет, но мы сними
Цитата
Владимир написал: Примерно час назад рынок ломанулся вниз, сейчас вроде как остановился.
Похоже на выходные закрываются, или что вышло?
Цитата
Владимир написал: Это было весь позавчерашний вечер, весь вчерашний день и всё сегодняшнее утро.
Ну вот говорили не проблем со связью.
После общения с провайдером, как в прошлом инженер, делаю вывод "канал сквозняком сдуло" Так как связь есть но она не работает, Роутер поближе, витую пару наготове!
Смена стратегии на трендовую в торговой системе HT, (да уже можно заявлять о торговой системе), дает возможность сосредоточиться на усовершенствовании TS не отвлекаясь на сделки.
HT ведет себя прекрасно - замечаний нет.
Цитата
VPM написал: Сколько открывать SmartOrder? Которая на прямую упираемся "что делать с открытыми позициями во время пере запусков" и как их согласовывать с SmartOrder?
Присвоил вес каждому инструменту, предварительно рассчитал количество в торговой позиции согласно этому кол. открываю SmartOrder. Во время пере запусков согласовываю с кол. открытых SmartOrder с разрешенным количеством.
В силу определенной тенденции открываем поз. по тренду. Если позиция растет количество контрактов растет. Если позиция падает количество контрактов уменьшается.
И так стает вопрос как поступить. Вариант 1: HT встроить в рабочий скрипт. Вариант 2: До работать данный проект.
Выбор - развить данный.
Все вынес на отдельный счет.
RM: local RiskDay = round(E*RiskDay*0.01,2); -- Задаем риск на торговый день Вынесен в отдельный скрипт, если достигнута просадка все сбросит.
Сделок маловато, добавим бумагу и средовую стратегию, все это легко делается.
Добавлю сбор статистики по сделкам для оценки торговых стратегий. Но в таком состоянии это бессмысленно, так как стратегия реверсная, нужен более вразумительный выход из позиции.
OrderSmart[trans_id]:update(feed[i].last, 0);
Я просто не перестаю восхищаться насколько все лаконично реализовано!
При выполнении условия на закрытие цена просто будет догонять пока все не сбросит. Вперед!
Владимир написал: А подумать? К тому же, я тыщу раз говорил открытым текстом: список тикеров, которыми ему вообще разрешено торговать и сумму, которой ему дозволено распоряжаться, определяю я
Подумал.
Цитата
Владимир написал: Повторяю: НЕ БЫЛО за мно никаких "конечных решений". Я дал ему денег - И ВСЁ!
Владимир, Я вот Вас ни как не пойму, зачем все передергиваете?
Цитата
Владимир написал: VPM, У меня сейчас запущены в тестовом режиме 43 тикера, хочу погонять месячишко, чтобы посмотреть, заслуживают ли они того, чтобы торговать ими в боевом режиме. По первому впечатлению, половина из них годится для этого, но пока ещё и недели не прошло.
А как же это. "Повторяю: НЕ БЫЛО за мно никаких "конечных решений".
А здесь,
Цитата
Владимир написал: А "торговать на всю котлету" - наивернейший способ остаться без штанов, причём НА ЛЮБЫХ тикерах
Я ведь показал расчет
Цитата
VPM написал: local FreeMoney = cur_cost() -- Возвращает доступные средстваlocal E = FreeMoney*fraction; -- fraction - разрешение на использование средств (доля)
fraction - разрешение на использование средств (доля).
Цитата
VPM написал: local RiskDay = round(E*RiskDay*0.01,2); -- Задаем риск на торговый день
это риск на торговый день, Причем тут "бабушкины котлеты"?
Цитата
Владимир написал: Наконец, маневрирование ресурсами между тикерами на все 146% задача скрипта.
Задача проекта не соревнование с Вашим скриптом, 1)
Цитата
VPM написал: Здесь главная цель достигнута, Все можно подключить не зависимо к движку, и Все работает!
2) и главное
Цитата
VPM написал: Но Напомню, задача теста состоит выяснить насколько стабильна работа Фреймворка.
Столкнувшись с тем что, в моем рабочем скрипте, на больших Таймфремах на одно событие стало приходит несколько приказов, начел исправлять, вспомнил о данной разработке, где все уже за меня решено, способами мне не доступными, теперь проверяю на ошибки, чем их больше вылезет сей час тем лучше, тем спокойней будет дальше. Есть замечания милости просмм.
Цитата
Владимир написал: У меня сейчас запущены в тестовом режиме 43 тикера
А на это я Вам свое мнение сообщал; Изначально неверно сформулирована задача.
Как бы нас Владимир, не критиковал, суть в следующим:
1) отобрал бумаги разношерстные, от медленного вечного фьючерса CNY, До шустрого Nasdaq 100 (Portfel); 2) Выделил средства под проект (Capital); 3) Определил риск на проект (RM); 4) Определил кол. которым буду торговать по каждому инструменту (MM); 5) Задал стратегию - трендовая классический реверс (TS);
Здесь главная цель достигнута, Все можно подключить не зависимо к движку, и Все работает!
Да пусть пока примитивные расчеты, "совершенству нет предела"! Да нет управлением позицией. Да нет управлением риском на сделку.
Но с этим уже можно работать кто бы что не говорил! Но Напомню, задача теста состоит выяснить насколько стабильна работа Фреймворка.
Добавьте сюда статистику по сделкам, и появится инструмент для анализа входа и выхода в сделку!
А это, возможно поможет начинающим найти свой подход в автоматизации процессов и не делать хотя бы мои ошибки. Так как они уже сделаны за них. И называется это поделиться опытом.
'NGQ3', -- Натуральный газ 'RMU3', -- RTSM-9.23 Индекс РТС (мини) Расчетный фьючерс на RTSI. Стоимость пункта цены 18,46 p; ГО 3546; 'CNYRUBF', -- CNYRUBF Юань - Рубль Расчетный фьючерс на CNY/RUB. Торгуется до 31.12.2099 (еще 27909 дней) Стоимость пункта цены 1000 p; ГО 1036; 'NAU3', -- NASD-9.23 Nasdaq 100 Расчетный фьючерс на Invesco QQQ ETF Trust Unit Series Стоимость пункта цены 0,92p; ГО 1799; --'SFU3', -- SPYF-9.23 S&P 500 Расчетный фьючерс на SPDR S&P 500 ETF Trust Стоимость пункта цены 92,3p; ГО 5243;
Да забыл сказать, понравился 'NAU3', NASD-9.23 Nasdaq 100 Расчетный фьючерс на Invesco QQQ ETF Trust Unit Series Стоимость пункта цены 0,92p; ГО 1799; недорогой летает как самолет , да еще озвучивает лучшие мировые компании.
Добавил!
Теперь 4 бумаги в портфеле, пришлось отменить принцип "каждому по заслугам", решаю я теперь кому чего.