Долго об яснять. Так у них устроена ЕДП. Это часть настроек админки. Программа BO Client кажется. Пониженное ГО делалось бы через маржинальность фьюча. Но речь не об этом. Тут беседа уплыла в сторону от вопроса который меня интересует
Робот на Луа +API брокера
Пользователь
Сообщений: Регистрация: 05.02.2015
26.12.2016 07:37:09
Цитата
Sergey Gorokhov написал: Космонавт , Ваш вопрос в чем? Как отправить транзакцию через брокерский API или как брокер эту транзакцию обработает? Вам уже три человека сказало что эти вопросы надо решать не здесь а с Вашим брокером. Касаемо советов, для начала просто объясните ему суть проблемы.
Сергей, вы лидируете в рейтинге бесполезных ответов.
Космонавт написал: Господа, спасибо за ответы, но они все о другом. Как торговать через АПИ?
О том как торговать через API брокера никто лучше брокера не расскажет. В связи с чем, рекомендуем обратиться к брокеру.
Какой рецепт решения проблемы можно посоветоаать брокеру? Делать фьючерсы маржинальными они не хотят
Робот на Луа +API брокера
Пользователь
Сообщений: Регистрация: 05.02.2015
26.12.2016 07:03:22
П.С. брокер об яснял что эта проблема решится если они сделают фьючерсы маржинальными, но такое решение не принято, поэтому приходится так выкручиваться.
Робот на Луа +API брокера
Пользователь
Сообщений: Регистрация: 05.02.2015
26.12.2016 06:57:03
Господа, спасибо за ответы, но они все о другом. Как торговать через АПИ?
Робот на Луа +API брокера
Пользователь
Сообщений: Регистрация: 05.02.2015
25.12.2016 18:16:46
У моего брокера есть необычная странность. Если я сегодня поторговал акциями с плечом, внутри дня вошёл и вышел, ночевал в кэше, на следующий день я всё равно не смогу торговать через КВИК фьючерсами. Будет ошибка Превышен лимит. В брокере мне объяснили, что это из за Т+2. На следующий день по Т+2 у меня нет денег, - они "в пути". В то же время, торговать через брокерскую платформу (веб-терминал) можно и через API можно. Поэтому вопрос. Как мне отправлять транзакции через АПИ брокера. Вот исходные данные. 1. У меня робот на луа. Он делает анализ. 2. При наличии сигнала нужно отправить транзакцию через АПИ
Вот коды, которые предлагает брокер: Там есть примеры для Browser / PHP / PHYTON
Отлично что есть примеры, но я не могу понять что мне с ними делать. Нужен какой то дополнительный софт? Нужно ли ставить платформу для питона или пхп? Прошу подсказать для чайника что делать чтобы отсылать эти приказы. Спасибо
Вызов RSI
Пользователь
Сообщений: Регистрация: 05.02.2015
22.12.2016 08:32:07
Придётся Вас "добить" формулой EMA. У её расчётов есть начало и конец
Вызов RSI
Пользователь
Сообщений: Регистрация: 05.02.2015
22.12.2016 08:26:45
Вы заблуждаетесь. Вот формула RSI из вашего же руководства КВИКа
Вызов RSI
Пользователь
Сообщений: Регистрация: 05.02.2015
22.12.2016 08:13:03
Сергей, Вы не уловили нить вопроса. Я хочу расчитать RSI с периодом 12. Нет смысла брать все бары. Поэтому я хочу взять только последние 50.
Вызов RSI
Пользователь
Сообщений: Регистрация: 05.02.2015
21.12.2016 23:20:15
На своём низком уровне понимания я разобрался. Получилось так:
Код
function main()
dofile ("C:\\Program Files (x86)\\Lua\\5.1\\lua\\RSI.lua")
while is_run do
stime=getSTime()
if stime==nil then stime=0 end
sleep (1)
if stime>100000 and stime<184000 then --не считаем вне сессии
func = RSI()
for sec in string.gmatch(ticker_list,"%a+") do
local rsi_count={}
ds = CreateDataSource(class, sec, INTERVAL_M5)
sleep (1000)
num_candles=ds:Size()
for i=1,num_candles do
rsi_count[i]=func(i, {Period=14, VType="Typical"}, ds)
end
indicator[sec].rsi_0 = rsi_count[num_candles]
indicator[sec].rsi_1 = rsi_count[num_candles-1]
indicator[sec].rsi_2 = rsi_count[num_candles-2]
и так далее
что самое противное (и не понятное), в нижеприведённом виде не работает! Ниже попытка считать не все бары, а только 50 последних.
Код
num_candles=ds:Size()
for i=num_candles-50,num_candles do
rsi_count[i]=func(i, {Period=14, VType="Typical"}, ds)
end
И ещё не понятно, рационально ли рассчитывать RSI в колбеке SetUpdateCallback? Я хочу запрашивать обновлённый RSI довольно редко - раз в секунду, скорость не нужна. С этой точки зрения, правильно ли помещать CreateDataSource внутри main в цикле перебора бумаг? Спасибо за советы.
Вызов RSI
Пользователь
Сообщений: Регистрация: 05.02.2015
21.12.2016 20:45:45
а как обратиться к конкретному бару? Скажем последнему или предпоследнему? из вашего кода получается что переменная a постоянно будет менять значение, так как идёт перебор i-элемента
Вызов RSI
Пользователь
Сообщений: Регистрация: 05.02.2015
15.12.2016 10:40:45
Добрый день. В базе кодов есть индикатор RSI написанный разработчиками. У меня не получается вызвать его обычным способом. Спотыкается на строчке внутри индикатора:
Код
val_Up[I] = (val_Up[I-1] * (P-1) + Up[I]) / P
Вызываю так:
Код
DataSource("TQBR","RASP",INTERVAL_M5)
local num_candles=ds:Size()
func=RSI()
local a=func(num_candles, {Period=12, VType="Typical", round=7}, ds)
Вот сам индикатор. Спасибо за подсказки.
Код
Settings = {
Name = "*RSI (Relative Strength Index)",
round = "off",
Period = 14,
VType = "Close", --Open, High, Low, Close, Volume, Median, Typical, Weighted, Difference
line = {{
Name = "RSI",
Type = TYPE_LINE,
Color = RGB(255, 0, 0)
}
}
}
function Init()
func = RSI()
return #Settings.line
end
function OnCalculate(Index)
return func(Index, Settings)
end
function RSI() --Relative Strength I("RSI")
local Up = {}
local Down = {}
local val_Up = {}
local val_Down = {}
return function (I, Fsettings, ds)
local Out = nil
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 14)
local VT = (Fsettings.VType or "Close")
local R = (Fsettings.round or "off")
if I == 1 then
Up[I] = 0
Down[I] = 0
end
if I>1 then
local Val = Value(I,VT,ds)
local ValPrev = Value(I-1,VT,ds)
if ValPrev < Val then
Up[I] = Val - ValPrev
else
Up[I] = 0
end
if ValPrev > Val then
Down[I] = ValPrev - Val
else
Down[I] = 0
end
if (I == P) or (I == P+1) then
local sumU = 0
local sumD = 0
for i = I-P+1, I do
sumU = sumU + Up[i]
sumD = sumD + Down[i]
end
val_Up[I] = sumU/P
val_Down[I] = sumD/P
end
if I > P+1 then
val_Up[I] = (val_Up[I-1] * (P-1) + Up[I]) / P
val_Down[I] = (val_Down[I-1] * (P-1) + Down[I]) / P
end
if I >= P then
Out = 100 / (1 + (val_Down[I] / val_Up[I]))
return rounding(Out, R)
end
end
end
end
function rounding(num, round)
if round and string.upper(round)== "ON" then round=0 end
if num and tonumber(round) then
local mult = 10^round
if num >= 0 then return math.floor(num * mult + 0.5) / mult
else return math.ceil(num * mult - 0.5) / mult end
else return num end
end
function Value(I,VType,ds)
local Out = nil
VType=(VType and string.upper(string.sub(VType,1,1))) or "A"
if VType == "O" then --Open
Out = (O and O(I)) or (ds and ds:O(I))
elseif VType == "H" then --High
Out = (H and H(I)) or (ds and ds:H(I))
elseif VType == "L" then --Low
Out = (L and L(I)) or (ds and ds:L(I))
elseif VType == "C" then --Close
Out = (C and C(I)) or (ds and ds:C(I))
elseif VType == "V" then --Volume
Out = (V and V(I)) or (ds and ds:V(I))
elseif VType == "M" then --Median
Out = ((Value(I,"H",ds) + Value(I,"L",ds)) / 2)
elseif VType == "T" then --Typical
Out = ((Value(I,"M",ds) * 2 + Value(I,"C",ds))/3)
elseif VType == "W" then --Weighted
Out = ((Value(I,"T",ds) * 3 + Value(I,"O",ds))/4)
elseif VType == "D" then --Difference
Out = (Value(I,"H",ds) - Value(I,"L",ds))
elseif VType == "A" then --Any
if ds then Out = ds[I] else Out = nil end
end
return Out
end
Программировать на Луа для Плазы
Пользователь
Сообщений: Регистрация: 05.02.2015
09.12.2016 21:16:28
Уж простите за странный вопрос. Можно ли писать на Луа роботов для Плазы? Увы, я кроме Луа ничего не знаю... А то корявое что я умею писать на Луа - далось с огромным трудом. Учить Си++, Джаву и Си# для меня долго... Спасибо за ответ.
Скорость обработки
Пользователь
Сообщений: Регистрация: 05.02.2015
08.12.2016 20:38:58
Хм. Тогда ещё вопрос. Вот мой колбек.
Код
function mycallbackforallstocks(class,sec,index)
расчёт логики, трудоёмкий процесс анализа
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
пока считается логика, успевает прийти ещё одна сделка по другому инструменту. Или по этому же инструменту. Обработается ли она? Или будет пропущена и забыта?
Космонавт написал: Грамотно ли будет local num_candles превратить в local num_candles[sec]. Ведь возникают риски, что две сделки про разным акциям произойдут одновременно, и с этой переменной произойдёт каша, на неё будут претендовать две акции. или я заблуждаюсь?
У Вас переменная num_candles и так заполняется в зависимости от бумаги. То есть никакой каши не произойдет.
Разве Дата Сорс с колбеком не многопоточны? Если многопоточны, то запросто может быть ситуация с одновременными сделками по разным бумагам. Тогда эта переменная понадобится двум акциям одновременно.
не получать сделки премаркета
Пользователь
Сообщений: Регистрация: 05.02.2015
08.12.2016 09:23:30
Есть ли простой способ не получать с помощью DataSource свечи премаркета (до 10:00), или это делается внутри кода? Спасибо.
OnConnected
Пользователь
Сообщений: Регистрация: 05.02.2015
08.12.2016 08:53:49
О, спасибо! Сергей, если Вас разговорить, Вы даёте блестящие ответы.
Скорость обработки
Пользователь
Сообщений: Регистрация: 05.02.2015
08.12.2016 08:51:51
Спасибо за ответ! Вопрос по этому примеру:
Код
local num_candles=ds[sec]:Size()
if index==num_candles then
func = BB()
line_10[sec],_,line_3[sec]=func(num_candles,...............)
end
Я работаю с множеством акций, по каждой создаётся свой поток ds[sec]. Грамотно ли будет local num_candles превратить в local num_candles[sec]. Ведь возникают риски, что две сделки про разным акциям произойдут одновременно, и с этой переменной произойдёт каша, на неё будут претендовать две акции. или я заблуждаюсь?
OnConnected
Пользователь
Сообщений: Регистрация: 05.02.2015
08.12.2016 08:39:57
Хм... isConnected и так даст результат если её вызвать. Я уже давно ею пользуюсь: if isConnected()==1 then .............
И колбек для этого совсем не нужен. Мне нужно, чтобы глобальную переменную s обновлял именно колбек, а не isConnected.
OnConnected это событие и работать с ним надо как с событием. Если нужно запросить статус это функция isConnected
Ответ не понятен. Приведите пример.
Скорость обработки
Пользователь
Сообщений: Регистрация: 05.02.2015
07.12.2016 21:36:05
Подскажите пожалуйста, различаются ли по скорости обработки два таких варианта:
Код
local num_candles=ds[sec]:Size()
if index==num_candles then
func = BB()
line_10[sec],_,line_3[sec]=func(num_candles,...............)
end
или
Код
if index==ds[sec]:Size() then
func = BB()
line_10[sec],_,line_3[sec]=func(ds[sec]:Size() ,...............)
end
Иными словами, считается ли ds[sec]:Size() трудоёмким элементом? Да и другие функции внутри ДатаСорс - являются ли напряжёнными для вычисления?
OnConnected
Пользователь
Сообщений: Регистрация: 05.02.2015
07.12.2016 20:55:56
Добрый день. Из документации не понятно как работать с функцией OnConnected. Хочу чтобы она писала в глобальную переменную true если квик онлайн и false если не в сети. Увы, руководство пользователя не даёт понимания как это сделать.
s=OnConnected () выдаёт нил.
Что срабатывает быстрее?
Пользователь
Сообщений: Регистрация: 05.02.2015
06.12.2016 00:41:08
Подскажите пожалуйста, что срабатывает быстрее при условии использования колбеков: Цена последней сделки в 1. ДатаСорс 2. Текущая таблица 3. Таблица обезличенных сделок Лучший бид-аск в 1. Стакане 2. Текущая таблица?
Спасибо за ответ.ы
Как не получать все тики через SetUpdateCallback
Пользователь
Сообщений: Регистрация: 05.02.2015
05.12.2016 10:04:14
Спасибо. Вы молодец. Хорошего рабочего дня!
Как не получать все тики через SetUpdateCallback
Пользователь
Сообщений: Регистрация: 05.02.2015
05.12.2016 09:55:02
Ок, так что мне делать?
Как не получать все тики через SetUpdateCallback
Пользователь
Сообщений: Регистрация: 05.02.2015
05.12.2016 09:51:51
Сейчас записей в таблице обезличенных сделок нет.
Как не получать все тики через SetUpdateCallback
Пользователь
Сообщений: Регистрация: 05.02.2015
05.12.2016 09:50:54
В смысле игнорирую? Интервал минутки. На что ещё я не ответил?
Как не получать все тики через SetUpdateCallback
Пользователь
Сообщений: Регистрация: 05.02.2015
05.12.2016 09:48:38
Цитата
Sergey Gorokhov написал: Космонавт , Еще раз, сейчас важно не то как себя ведет робот, а то реально записи в таблице есть или нет. Если до запуска робота они есть, то в роботе колбек не сработает. Если нет, то робот их закажет и сработает колбек. Другой вопрос, а должны ли они вообще там быть до торгов. Это уже зависит от того что это за данные. Если пятничные, значит Вы подключились к серверу до смены торговой сессии. Хотя это странно, обычно брокера меняют торговую сессию гораздо раньше чем за пол часа до торгов. И я все еще надеюсь что интервал у Вас тиковый. Хотя и на этот вопрос ответа не последовало.
Интервал минутки, все графики до единого закрыты.
Как не получать все тики через SetUpdateCallback
Пользователь
Сообщений: Регистрация: 05.02.2015
05.12.2016 09:46:59
Выключил скрипт, включил. Опять та же ерунда:
Цитата
12/05/16 09:45:42,644 BANE Я в колбеке 12/05/16 09:45:42,644 BANE Я в колбеке 12/05/16 09:45:42,644 BANE Я в колбеке 12/05/16 09:45:42,644 BANE Я в колбеке 12/05/16 09:45:42,644 BANE Я в колбеке 12/05/16 09:45:42,644 BANE Я в колбеке 12/05/16 09:45:42,644 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,660 BANE Я в колбеке 12/05/16 09:45:42,675 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,691 BANE Я в колбеке 12/05/16 09:45:42,707 BANE Я в колбеке 12/05/16 09:45:42,707 BANE Я в колбеке
Как не получать все тики через SetUpdateCallback
Пользователь
Сообщений: Регистрация: 05.02.2015
05.12.2016 09:41:55
П.С. Вот сейчас видимо что то доделалось до конца, КВИК отвис, скрипт горит зелёненьким, всё тихо, ждём старта торгов.
Как не получать все тики через SetUpdateCallback
Пользователь
Сообщений: Регистрация: 05.02.2015
05.12.2016 09:37:15
Утро. Полчаса до старта торгов. Запускаю робота. Опять безумные логи и постоянное срабатывание колбека. почему? КВИК само собой висит
Цитата
12/05/16 09:31:07,405 AFKS при запуске нет цены последней сделки number 12/05/16 09:31:07,718 AFKS готова!!! 12/05/16 09:31:07,718 AFLT при запуске нет цены последней сделки number 12/05/16 09:31:07,733 AFLT готова!!! 12/05/16 09:31:07,733 AKRN при запуске нет цены последней сделки number 12/05/16 09:31:07,749 AKRN готова!!! 12/05/16 09:31:07,749 ALRS при запуске нет цены последней сделки number 12/05/16 09:31:07,780 ALRS готова!!! 12/05/16 09:31:07,780 BANE при запуске нет цены последней сделки number 12/05/16 09:31:07,796 BANE готова!!! 12/05/16 09:31:07,796 BANEP при запуске нет цены последней сделки number 12/05/16 09:31:07,811 BANEP готова!!! 12/05/16 09:31:07,811 CHMF при запуске нет цены последней сделки number 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,811 BANEP Я в колбеке 12/05/16 09:31:07,827 CHMF готова!!! 12/05/16 09:31:07,827 BANEP Я в колбеке 12/05/16 09:31:07,827 BANEP Я в колбеке 12/05/16 09:31:07,827 BANEP Я в колбеке 12/05/16 09:31:07,827 BANEP Я в колбеке 12/05/16 09:31:07,827 BANEP Я в колбеке 12/05/16 09:31:07,827 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,842 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,858 BANEP Я в колбеке 12/05/16 09:31:07,874 BANEP Я в колбеке 12/05/16 09:31:07,874 BANEP Я в колбеке
и так до бесконечности...
Код вкратце:
Код
function mycallbackforallstocks(class,sec,index)
toLog (log, sec.." я в колбеке")
func = BB()
local num_candles=ds[sec]:Size()
line_10[sec],_,line_3[sec]=func(num_candles, {Period=60, Metod = "SMA", VType="Typical", round=4, Shift=7}, ds[sec])
tbl:Highlight(line_count_table[sec],'SECURITY',WHITE,RED,1000)
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
function main()
while getSTime()==nil do sleep (10000) end
dofile(getWorkingFolder().."\\LuaIndicators\\BB.lua")
for sec in string.gmatch(ticker_list,"%a+") do
line_count=line_count+1
line_count_table[sec]=line_count
line=tbl:AddLine()
tbl:SetValue(line_count_table[sec],'SECURITY', sec)
lot[sec]=getParamEx(class,sec,"lotsize").param_value
step[sec]=getParamEx(class,sec,"SEC_PRICE_STEP").param_value
line_10[sec]=0
line_3[sec]=0
last_price[sec]=tonumber(getParamEx(class,sec,"last").param_value)
if last_price[sec]==0 or last_price[sec]==nil then
last_price[sec]=tonumber(getParamEx(class,sec,"prevprice").param_value)
toLog (log, sec.." при запуске нет цены последней сделки "..type(last_price[sec]))
end
tablebid = getParamEx(class, sec, "bid") --получаем таблицу "bid"
bid_best[sec]=tonumber(toPrice(sec, tablebid.param_value)) --из таблицы берЄм значение
tableoffer = getParamEx(class, sec, "offer") --получаем таблицу "offer"
offer_best[sec]=tonumber(toPrice(sec, tableoffer.param_value)) --из таблицы берЄм значение
local path=require"pl.path"
if path.exists ("C:\\trash3\\ap"..sec..".log")==false then
status_container ("C:\\trash3\\ap"..sec..".log", "sleep") --создаёт кто то один
end
DataSource(class,sec,interval)
sleep (10)
toLog (log, sec.." готова!!!")
func = BB()
local num_candles=ds[sec]:Size()
line_10[sec],_,line_3[sec]=func(num_candles, {Period=12, Metod = "SMA", VType="Typical", round=4, Shift=2}, ds[sec])
end
while is_run do
stime=getSTime()
if stime==nil then
stime=0
sleep (1)
end
if stime>100000 and stime<184005 then --не считаем вне сессии
for sec in string.gmatch(ticker_list,"%a+") do
................................. и так далее.
Как не получать все тики через SetUpdateCallback
Пользователь
Сообщений: Регистрация: 05.02.2015
05.12.2016 09:18:20
Я уже ответил на ваш вопрос, а вы методами чёрной риторики пытаетесь выжать из меня другой ответ.
Как не получать все тики через SetUpdateCallback
Пользователь
Сообщений: Регистрация: 05.02.2015
05.12.2016 09:15:07
В субботу сервер брокера работал и прогрузил сделки пятницы в полном объёме
Как не получать все тики через SetUpdateCallback
Пользователь
Сообщений: Регистрация: 05.02.2015
05.12.2016 09:12:03
Да, однозачно уверен. Я осознанно жду пока все сделки прогрузятся вплоть до времени 18-50 (конец сессии) и только потом клацаю на запуск робота
Как не получать все тики через SetUpdateCallback
Пользователь
Сообщений: Регистрация: 05.02.2015
05.12.2016 09:04:20
1. Все сделки в КВИК уже давно прогружены. 2. Запускается скрипт. 3. Вышеупомянутая функция mycallbackforallstocks перебирает каждую сделку из таблицы обезличенных сделок. 4. Это занимает 40 минут. Квик в это время нежизнеспособен - висит.
Как не получать все тики через SetUpdateCallback
Пользователь
Сообщений: Регистрация: 05.02.2015
05.12.2016 08:38:42
Господа программисты, если не сложно, скажите пару слов по теме моего вопроса. Для вас эта проблема не сложная и легко решается, а у меня пропал вечер, я не мог по нормальному тестировать свой код. Дайте пожалуйста совет как быть.
Проблема с LuaForWindos
Пользователь
Сообщений: Регистрация: 05.02.2015
04.12.2016 18:11:56
проблема решилась, когда я установил вручную файлик vcredist_x86.exe (он там же лежит, где скачивается LuaForWindows)
Как не получать все тики через SetUpdateCallback
Пользователь
Сообщений: Регистрация: 05.02.2015
04.12.2016 16:01:13
Constantin,вопрос в другом. 1. Почему все тики (с самого начала) начали обрабатываться в субботу? К моменту запуска робота Таблица всех сделок уже давно прогрузилась! 2. Нет ли рисков, что это произойдёт в будний день? 3. Как этого избегать?
Субботний вечер. Тестирую функцию DataSourse с колбеком. Робот работает по 40 акциям. Колбек SetUpdatCallback начинает обрабатывать все то ли свечки, то ли тики, и на полчаса вешает квик. В рабочее время - в пятницу днём - такого не было, всё работало как надо. Почему? И как с этим бороться?
Вот мои функции:
Код
function mycallbackforallstocks(class,sec,index)
toLog (log, sec)
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
Почему медленно работает код
Пользователь
Сообщений: Регистрация: 05.02.2015
03.12.2016 18:36:31
Старатель, лучше с точки зрения скорости. Куда быстрее приходит цена - в тек.таблицу, таблицу всех сделок или в ДатаСорс?
Проблема с LuaForWindos
Пользователь
Сообщений: Регистрация: 05.02.2015
03.12.2016 16:18:30
Добрый день. Ставлю LuaForWindows на виртуалку. Параметры виртуалки:
При установке LuaForWindows появляется ошибка:
Подскажите пожалуйста как с ней бороться. Пакет Visual C++ 2015 установлен вручную с сайта майкрософта.
Николай Камынин написал: Расчет надо делать в колбеках. либо в майн по флагу из колбека.
+ Перебор бумаг в цикле while is_run do лишний. В том же SetUpdateCallback можно сделать весь "не сложный анализ".
А торговать из колбека тоже можно? Отсылать лимитки при выполнении условий (цена, индикатор).
И ещё вопрос. Цену последней сделки откуда лучше брать: из колбека в DataSourse или всё же из таблицы всех сделок?
Почему медленно работает код
Пользователь
Сообщений: Регистрация: 05.02.2015
02.12.2016 19:52:01
Спасибо, попробую! Вот бы ребята из техподдержки Арки тоже научились давать такие ёмкие качественные ответы!
Почему медленно работает код
Пользователь
Сообщений: Регистрация: 05.02.2015
02.12.2016 18:49:23
Да, это скорее всего был квант. Я уже разобрался. Как советовал Старатель, засунул расчёт индикатора в колбек и сразу получил желаемые космические скорости внутри цикла перебора бумаг. П.С. Индикатор по прежнему считает все свечки.
Космонавт написал: 3. Рационально ли составлен код?
Нет. Пересчитывать значение индикатора имеет смысл только при обновлении последней свечи. А вы пытаетесь его пересчитывать каждую мс. Какой в этом смысл, если цена не изменилась? Расчёт индикатора лучше вставить в SetUpdateCallback() и сохранять значения в глобальной таблице.
покажите пожалуйста на примере. Задача не тривиальная. Ведь при каждом новом таймф-фрейме таблицу придётся таки обновлять и запихивать в её поля новый набор свечек. То есть раз в таймфрейм полный пересчёт делать всё же придётся.
Почему медленно работает код
Пользователь
Сообщений: Регистрация: 05.02.2015
02.12.2016 15:35:14
Добрый день. Два дня мучился, осваивал работу через DataSourse. Заработало. Но код работает в 5 раз медленнее, чем когда я получал данные индикатора через идентификатор.
Прошу подсказать почему. Вот код. Боллинджер считается внутри файла BB.lua, который выложили разработчики вот здесь:
Код
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetEmptyCallback ()
return ds[sec]
end
function main()
dofile(getWorkingFolder().."\\LuaIndicators\\BB.lua")
for sec in string.gmatch(ticker_list,"%a+") do
DataSource(class,sec,interval)
end
while is_run do
stime=getSTime()
if stime==nil then stime=0 end
if stime>100000 and stime<184005 then --не считаем вне сессии
for sec in string.gmatch(ticker_list,"%a+") do
toLog (log, sec)
toLog (log, "1")
func = BB()
toLog (log, "2")
local num_candles=ds[sec]:Size()
toLog (log, "3")
line_10,_,line_3=func(num_candles, {Period=12, Metod = "SMA", VType="Typical", round=4, Shift=2}, ds[sec])
toLog (log, "4")
-- tbl:SetValue(line_count_table[sec],'BB_middle', line_10)
-- tbl:SetValue(line_count_table[sec],'BB_lower', line_3)
--sleep (1)
дальше не сложный анализ.
end
А теперь - самое интересное. Места с задержками. Где скорость как у ласточки я не трогал, подсветил только места задержек:
То есть задержка то есть, то нету. Она равна 15 миллисекунд. И она бывает не только между 3 и 4, но и на разных участках кода. Вот например между 1 и 2 шагом.
в итоге я буду получать данные каждый раз при пробеге цикла, а не по апдейту?
SetUpdateCallback зависания системы
Пользователь
Сообщений: Регистрация: 05.02.2015
02.12.2016 13:26:41
И ещё вопрос
Цитата
Код
function mycallbackforallstocks(class,sec,index)
-- Теперь в колбеке нам доступны код и класс инструмента
message(class .. " " .. security,1)
-- Также доступны все параметры, которые приходят с колбеком из терминала
xxx = index
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
функция mycallbackforallstocks похоже для моих целей - лишняя. Как написать строчку
interval = INTERVAL_M1
ticker_list = "AFKS,AFLT,AKRN,ALRS,AVAZP,BANE,BANEP,CHMF,DIXY,FEES,GAZP,GCHE,GMKN,GRAZ,HYDR,IRAO,KMAZ,LKOH,LNTA,LSRG,MAGN,MFON,MGNT,MOEX,MSNG,MSRS,MSTT,MTLR,MTLRP,MTSS,MVID,NLMK,NMTP,NVTK,OGKB,PHOR,PIKK,PLZL,POLY,PRTK,RASP,ROSN,RSTI,RSTIP,RTKM,RTKMP,RUALR,SBER,SBERP,SIBN,SNGS,SNGSP,SVAV,TATN,TATNP,TGKA,TRMK,TRNFP,UPRO,URKA,VTBR,VZRZ,VZRZP,YNDX"
class="TQBR"
ds={}
is_run = true
function mycallbackforallstocks(class,sec,index)
-- Теперь в колбеке нам доступны код и класс инструмента
message(class .. " " .. security,1)
-- Также доступны все параметры, которые приходят с колбеком из терминала
xxx = index
end
function DataSource(class,sec,interval)
ds[sec] = CreateDataSource(class,sec,interval)
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
return ds[sec]
end
function main()
dofile(getWorkingFolder().."\\LuaIndicators\\MA.lua")
for sec in string.gmatch(ticker_list,"%a+") do
DataSource(class,sec,interval)
end
while is_run do
for sec in string.gmatch(ticker_list,"%a+") do
func = MA()
ma_out=func(ds[sec]:Size(), {Period=3, Metod = "EMA", VType="Close", round=2}, ds[sec])
end
end
end
MA.lua - это файл любезно выложенный разработчиками. Строчка 83: