Космонавт (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 2 3 4 5 6 След.
Робот на Луа +API брокера
 
Долго об яснять. Так у них устроена ЕДП. Это часть настроек админки. Программа BO Client кажется. Пониженное ГО делалось бы через маржинальность фьюча. Но речь не об этом.
Тут беседа уплыла в сторону от вопроса который меня интересует
Робот на Луа +API брокера
 
Цитата
Sergey Gorokhov написал:
Космонавт  ,
Ваш вопрос в чем?
Как отправить транзакцию через брокерский API или как брокер эту транзакцию обработает?
Вам уже три человека сказало что эти вопросы надо решать не здесь а с Вашим брокером.
Касаемо советов, для начала просто объясните ему суть проблемы.
Сергей, вы лидируете в рейтинге бесполезных ответов.
Робот на Луа +API брокера
 
Цитата
Sergey Gorokhov написал:
Цитата
Космонавт   написал:
Господа, спасибо за ответы, но они все о другом.
Как торговать через АПИ?
О том как торговать через API брокера никто лучше брокера не расскажет.
В связи с чем, рекомендуем обратиться к брокеру.
Какой рецепт решения проблемы можно посоветоаать брокеру? Делать фьючерсы маржинальными они не хотят
Робот на Луа +API брокера
 
П.С. брокер об яснял что эта проблема решится если они сделают фьючерсы маржинальными, но такое решение не принято, поэтому приходится так выкручиваться.
Робот на Луа +API брокера
 
Господа, спасибо за ответы, но они все о другом.
Как торговать через АПИ?
Робот на Луа +API брокера
 
У моего брокера есть необычная странность. Если я сегодня поторговал акциями с плечом, внутри дня вошёл и вышел, ночевал в кэше, на следующий день я всё равно не смогу торговать через КВИК фьючерсами. Будет ошибка Превышен лимит. В брокере мне объяснили, что это из за Т+2. На следующий день по Т+2 у меня нет денег, - они "в пути".
В то же время, торговать через брокерскую платформу (веб-терминал) можно и через API можно. Поэтому вопрос.
Как мне отправлять транзакции через АПИ брокера.
Вот исходные данные.
1. У меня робот на луа. Он делает анализ.
2. При наличии сигнала нужно отправить транзакцию через АПИ

Вот коды, которые предлагает брокер:
Там есть примеры для Browser / PHP / PHYTON

https://tradernet.ru/tradernet-api/orders-send

Отлично что есть примеры, но я не могу понять что мне с ними делать. Нужен какой то дополнительный софт? Нужно ли ставить платформу для питона или пхп? Прошу подсказать для чайника что делать чтобы отсылать эти приказы.
Спасибо
Вызов RSI
 
Придётся Вас "добить" формулой EMA.
У её расчётов есть начало и конец

Вызов RSI
 
Вы заблуждаетесь. Вот формула RSI из вашего же руководства КВИКа

Вызов RSI
 
Сергей, Вы не уловили нить вопроса.
Я хочу расчитать RSI с периодом 12. Нет смысла брать все бары. Поэтому я хочу взять только последние 50.
Вызов RSI
 
На своём низком уровне понимания я разобрался.
Получилось так:
Код
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
 
а как обратиться к конкретному бару? Скажем последнему или предпоследнему?
из вашего кода получается что переменная a постоянно будет менять значение, так как идёт перебор i-элемента
Вызов RSI
 
Добрый день.
В базе кодов есть индикатор 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
Программировать на Луа для Плазы
 
Уж простите за странный вопрос. Можно ли писать на Луа роботов для Плазы?
Увы, я кроме Луа ничего не знаю... А то корявое что я умею писать на Луа  - далось с огромным трудом.
Учить Си++, Джаву и Си# для меня долго...
Спасибо за ответ.
Скорость обработки
 
Хм. Тогда ещё вопрос.
Вот мой колбек.
Код
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
пока считается логика, успевает прийти ещё одна сделка по другому инструменту. Или по этому же инструменту.
Обработается ли она? Или будет пропущена и забыта?
Скорость обработки
 
Цитата
Sergey Gorokhov написал:
Цитата
Космонавт   написал:
Грамотно ли будет local num_candles превратить в local num_candles[sec]. Ведь возникают риски, что две сделки про разным акциям произойдут одновременно, и с этой переменной произойдёт каша, на неё будут претендовать две акции. или я заблуждаюсь?
У Вас переменная num_candles и так заполняется в зависимости от бумаги.
То есть никакой каши не произойдет.

Разве Дата Сорс с колбеком не многопоточны?
Если многопоточны, то запросто может быть ситуация с одновременными сделками по разным бумагам. Тогда эта переменная понадобится двум акциям одновременно.
не получать сделки премаркета
 
Есть ли простой способ не получать с помощью DataSource свечи премаркета (до 10:00), или это делается внутри кода?
Спасибо.
OnConnected
 
О, спасибо!
Сергей, если Вас разговорить, Вы даёте блестящие ответы.
Скорость обработки
 
Спасибо за ответ!
Вопрос по этому примеру:
Код
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
 
Хм... isConnected и так даст результат если её вызвать.
Я уже давно ею пользуюсь:
if isConnected()==1 then .............

И колбек для этого совсем не нужен.
Мне нужно, чтобы глобальную переменную s обновлял именно колбек, а не isConnected.
OnConnected
 
Цитата
Sergey Gorokhov написал:
Цитата
Космонавт   написал:
s=OnConnected () выдаёт нил.
OnConnected это событие и работать с ним надо как с событием.
Если нужно запросить статус это функция isConnected
Ответ не понятен. Приведите пример.
Скорость обработки
 
Подскажите пожалуйста, различаются ли по скорости обработки два таких варианта:
Код
    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
 
Добрый день.
Из документации не понятно как работать с функцией OnConnected.
Хочу чтобы она писала в глобальную переменную true если квик онлайн и false если не в сети.
Увы, руководство пользователя не даёт понимания как это сделать.

s=OnConnected () выдаёт нил.
Что срабатывает быстрее?
 
Подскажите пожалуйста, что срабатывает быстрее при условии использования колбеков:
Цена последней сделки в 1. ДатаСорс 2. Текущая таблица 3. Таблица обезличенных сделок
Лучший бид-аск в 1. Стакане 2. Текущая таблица?

Спасибо за ответ.ы
Как не получать все тики через SetUpdateCallback
 
Спасибо.
Вы молодец.
Хорошего рабочего дня!
Как не получать все тики через SetUpdateCallback
 
Ок, так что мне делать?
Как не получать все тики через SetUpdateCallback
 
Сейчас записей в таблице обезличенных сделок нет.
Как не получать все тики через SetUpdateCallback
 
В смысле игнорирую?
Интервал минутки. На что ещё я не ответил?
Как не получать все тики через SetUpdateCallback
 
Цитата
Sergey Gorokhov написал:
Космонавт  ,
Еще раз, сейчас важно не то как себя ведет робот, а то реально записи в таблице есть или нет.
Если до запуска робота они есть, то в роботе колбек не сработает.
Если нет, то робот их закажет и сработает колбек.
Другой вопрос, а должны ли они вообще там быть до торгов. Это уже зависит от того что это за данные.
Если пятничные, значит Вы подключились к серверу до смены торговой сессии. Хотя это странно, обычно брокера меняют торговую сессию гораздо раньше чем за пол часа до торгов. И я все еще надеюсь что интервал у Вас тиковый. Хотя и на этот вопрос ответа не последовало.
Интервал минутки, все графики до единого закрыты.
Как не получать все тики через SetUpdateCallback
 
Выключил скрипт, включил.
Опять та же ерунда:
Цитата
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
 
П.С. Вот сейчас видимо что то доделалось до конца,  КВИК отвис, скрипт горит зелёненьким, всё тихо, ждём старта торгов.
Как не получать все тики через SetUpdateCallback
 
Утро. Полчаса до старта торгов. Запускаю робота.
Опять безумные логи и постоянное срабатывание колбека. почему? КВИК само собой висит
Цитата
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
 
Я уже ответил на ваш вопрос, а вы методами чёрной риторики пытаетесь выжать из меня другой ответ.
Как не получать все тики через SetUpdateCallback
 
В субботу сервер брокера работал и прогрузил сделки пятницы в полном объёме
Как не получать все тики через SetUpdateCallback
 
Да, однозачно уверен. Я осознанно жду пока все сделки прогрузятся вплоть до времени 18-50 (конец сессии) и только потом клацаю на запуск робота
Как не получать все тики через SetUpdateCallback
 
1. Все сделки в КВИК уже давно прогружены.
2. Запускается скрипт.
3. Вышеупомянутая функция mycallbackforallstocks перебирает каждую сделку из таблицы обезличенных сделок.
4. Это занимает 40 минут. Квик в это время нежизнеспособен - висит.
Как не получать все тики через SetUpdateCallback
 
Господа программисты, если не сложно, скажите пару слов по теме моего вопроса. Для вас эта проблема не сложная и легко решается, а у меня пропал вечер, я не мог по нормальному тестировать свой код. Дайте пожалуйста совет как быть.
Проблема с LuaForWindos
 
проблема решилась, когда я установил вручную файлик vcredist_x86.exe (он там же лежит, где скачивается LuaForWindows)
Как не получать все тики через SetUpdateCallback
 
Constantin,вопрос в другом.
1. Почему все тики (с самого начала) начали обрабатываться в субботу? К моменту запуска робота Таблица всех сделок уже давно прогрузилась!
2. Нет ли рисков, что это произойдёт в будний день?
3. Как этого избегать?
Как не получать все тики через SetUpdateCallback
 
Constantin, это функция Михаила
http://www.bot4sale.ru/blog-menu/qlua/spisok-statej/379-1-collback-for-al-ds.html

я взял её как есть
Как не получать все тики через SetUpdateCallback
 
Субботний вечер. Тестирую функцию 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
Почему медленно работает код
 
Старатель,
лучше с точки зрения скорости.
Куда быстрее приходит цена - в тек.таблицу, таблицу всех сделок или в ДатаСорс?
Проблема с LuaForWindos
 
Добрый день.
Ставлю LuaForWindows на виртуалку.
Параметры виртуалки:


При установке LuaForWindows появляется ошибка:


Подскажите пожалуйста как с ней бороться.
Пакет Visual C++ 2015 установлен вручную с сайта майкрософта.
Почему медленно работает код
 
Цитата
Старатель написал:
Цитата
Николай  Камынин   написал:
Расчет надо делать в колбеках. либо в майн по флагу из колбека.
+
Перебор бумаг в цикле while is_run do лишний. В том же SetUpdateCallback можно сделать весь "не сложный анализ".
А торговать из колбека тоже можно? Отсылать лимитки при выполнении условий (цена, индикатор).

И ещё вопрос. Цену последней сделки откуда лучше брать: из колбека в DataSourse или всё же из таблицы всех сделок?
Почему медленно работает код
 
Спасибо, попробую!
Вот бы ребята из техподдержки Арки тоже научились давать такие ёмкие качественные ответы!
Почему медленно работает код
 
Да, это скорее всего был квант.
Я уже разобрался.
Как советовал Старатель, засунул расчёт индикатора в колбек и сразу получил желаемые космические скорости внутри цикла перебора бумаг.
П.С. Индикатор по прежнему считает все свечки.
Почему медленно работает код
 
Цитата
Старатель написал:
Цитата
Космонавт   написал:
3. Рационально ли составлен код?
Нет. Пересчитывать значение индикатора имеет смысл только при обновлении последней свечи. А вы пытаетесь его пересчитывать каждую мс. Какой в этом смысл, если цена не изменилась?
Расчёт индикатора лучше вставить в SetUpdateCallback() и сохранять значения в глобальной таблице.
покажите пожалуйста на примере. Задача не тривиальная. Ведь при каждом новом таймф-фрейме таблицу придётся таки обновлять и запихивать в её поля новый набор свечек. То есть раз в таймфрейм полный пересчёт делать всё же придётся.
Почему медленно работает код
 
Добрый день.
Два дня мучился, осваивал работу через DataSourse. Заработало. Но код работает в 5 раз медленнее, чем когда я получал данные индикатора через идентификатор.

Прошу подсказать почему.
Вот код. Боллинджер считается внутри файла BB.lua, который выложили разработчики вот здесь:
ftp://ftp.quik.ru/public/INDICATORS.zip
Код
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

А теперь - самое интересное. Места с задержками. Где скорость как у ласточки я не трогал, подсветил только места задержек:
Цитата
12/02/16 15:18:24,923 LNTA
12/02/16 15:18:24,923 1
12/02/16 15:18:24,923 2
12/02/16 15:18:24,923 3
12/02/16 15:18:24,938 4
12/02/16 15:18:24,938 LSRG
12/02/16 15:18:24,938 1
12/02/16 15:18:24,938 2
12/02/16 15:18:24,938 3
12/02/16 15:18:24,938 4
12/02/16 15:18:24,938 MAGN
12/02/16 15:18:24,938 1
12/02/16 15:18:24,938 2
12/02/16 15:18:24,938 3
12/02/16 15:18:24,938 4
12/02/16 15:18:24,938 MFON
12/02/16 15:18:24,938 1
12/02/16 15:18:24,938 2
12/02/16 15:18:24,938 3
12/02/16 15:18:24,938 4
12/02/16 15:18:24,938 MGNT
12/02/16 15:18:24,938 1
12/02/16 15:18:24,938 2
12/02/16 15:18:24,938 3
12/02/16 15:18:24,938 4
12/02/16 15:18:24,938 MOEX
12/02/16 15:18:24,938 1
12/02/16 15:18:24,938 2
12/02/16 15:18:24,938 3
12/02/16 15:18:24,938 4
12/02/16 15:18:24,938 MSNG
12/02/16 15:18:24,938 1
12/02/16 15:18:24,938 2
12/02/16 15:18:24,938 3
12/02/16 15:18:24,954 4
12/02/16 15:18:24,954 MSRS
12/02/16 15:18:24,954 1
12/02/16 15:18:24,954 2
12/02/16 15:18:24,954 3
12/02/16 15:18:24,954 4

То есть задержка то есть, то нету. Она равна 15 миллисекунд. И она бывает не только между 3 и 4, но и на разных участках кода. Вот например между 1 и 2 шагом.
Цитата
12/02/16 15:18:24,969 PIKK
12/02/16 15:18:24,969 1
12/02/16 15:18:24,985 2
12/02/16 15:18:24,985 3
12/02/16 15:18:24,985 4
12/02/16 15:18:24,985 PLZL
12/02/16 15:18:24,985 1
12/02/16 15:18:24,985 2
12/02/16 15:18:24,985 3
12/02/16 15:18:24,985 4
12/02/16 15:18:24,985 POLY

Вопросы.
1. Почему происходят эти задержки?
2. Почему на разных участках кода?
3. Рационально ли составлен код?

Спасибо.
SetUpdateCallback зависания системы
 
Цитата
Sergey Gorokhov написал:
Космонавт  ,
Для этого специально существует функция SetEmptyCallback
Сергей, вы программист, а я гуманитарий, уточните пожалуйста что мне делать.
Строчку
Код
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
надо заменить на
Код
ds[sec]:SetEmptyCallback () ?
в итоге я буду получать данные каждый раз при пробеге цикла, а не по апдейту?
SetUpdateCallback зависания системы
 
И ещё вопрос

Цитата
Код
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 похоже для моих целей - лишняя.
Как написать строчку
Код
ds[sec]:SetUpdateCallback(function(...) mycallbackforallstocks(class,sec,...) end)
без неё?

Вот так будет работать?
Код
ds[sec]:SetUpdateCallback()
SetUpdateCallback зависания системы
 
Всё равно не работает.
Код
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:
Код
        EMA_TMP[I]=rounding((EMA_TMP[I-1]*(Period-1)+2*Value(I, VType, ds)) / (Period+1),round)
Страницы: Пред. 1 2 3 4 5 6 След.
Наверх