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

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

Страницы: 1 2 3 4 5 6 7 След.
Заполнение пропусков на графике
 
Но мне нужен именно мелкий таймфрейм. Эти искажения влияют на работу луа-индикатора.
Я сразу понял, что брокер не прав, говоря, что это проблема у меня в КВИКе.
Значит, это они транслируют эти уродливые графики.
Как это исправить?
Заполнение пропусков на графике
 
Да код класса FEN. Это касается всех инструментов из него.
Как видно на графике, эта проблема была всегда, а не только после указанной вам даты.
Я уже неоднократно перезаказывал архив графиков, чистил .dat файлы, в которых они хранятся. Эти пустые свечки не пропадают с графика. Брокер ведёт себя так, словно это проблема у меня на КВИКе, но мой знакомый заходил под моей учёткой в новый скачанный квик на другом конце земного шара, и это проблема выглядела так же. Это брокер транслирует в КВИК эту ерунду, но почему-то ведёт себя странно и не признаёт этого.
Заполнение пропусков на графике
 
Добрый день.
Подписан у брокера Открытие на трансляцию мировых рынков.
График по иностранным инструментам выглядит так:

Искусственно заполняются неторговые часы.
Брокер говорит, что эта проблема есть только у меня. По просьбе брокера я удалил все .dat файлы отовсюду, даже на всякий случай удалил info.wnd.
Проблема осталась. Более того, она также воспроизводится на других экземплярах КВИКА. А у брокера (со слов менеджера) её нет. Верится с трудом.
Теперь брокер просит выслать им архив КВИКа. Я не против, но прошу всё же ответа от компетентного специалиста-разработчика.
Для сравнения, то же самое на других акциях - NVIDIA (ранее я их НЕ скачивал, этот график прилетел ко мне в терминал впервые)
Вопрос про OnAllTrade
 
А как это лучше сделать? Ведь при первом запуске скрипта в, скажем 13 часов, КВИК сначала загружает историю сегодняшних сделок, и они выглядят как свежие, хотя они старые
Вопрос про OnAllTrade
 
Я подписываюсь на новые сделки через INTERVAL_TICK и обрабатываю их в OnAllTrade
Хочу анализировать только новые сделки. Старые сделки, уже прошедшие за сегодня, обрабатывать не хочу.
Есть ли риски, что в OnAllTrade прилетит старая сделка из сегодняшних?
Ну например при первом старте КВИКа в 13 часов в КВИК начнут сыпаться ранее прошедшие сделки. Они мне не нужны. И только потом начнут поступать новые.  
Имитировать continue
 
В последующих версиях Lua есть функция continue, но КВИК работает на древней версии Луа, где такой опции нет.
можно ли как то силами Lua написать свою функцию continue и легко вставлять её в нужные куски кода, например:
Код
function continue ()
--бла-бла-бла

end

for i=1, 10 do

   if i==5 then continue() end
--бла-бла

end
Отправка транзакций из OnParam
 
Вот рабочий вариант, внедрённый в робота. Увы, приходится объявлять переменную paper как глобальную, потому что sec внутри fn не видна.
Код
function fn(t)

    if stop_search then return nil end --stop_search - это флаг. Изначально равен nil

    if t.sec_code == paper and t.client_code==client_code and t.limit_kind==2 then
      stop_search=true      
        return true
    else
        return false
    end

end

function get_position (sec)
   paper=sec
   stop_search=nil --убиваем флаг, выставленный на прежних запусках функции.
   tbl_indxs=SearchItems('depo_limits', 0, getNumberOf("depo_limits")-1, fn)   
   if tbl_indxs then
      limit = getItem("depo_limits", tbl_indxs[1]) --найден 1 индекс, его и берём.
      local lot=lot[sec]--lot[sec] ранее определена
      return limit.currentbal/lot,limit.locked_buy/lot, limit.locked_sell/lot, limit.awg_position_price
   else
      return 0,0,0,0
   end
end
Отправка транзакций из OnParam
 
Nikolay Pavlov,
посмотрите пожалуйста, это оно?
Код
function fn(t)
   if stop_search then return nil end --stop_search - это флаг. Изначально равен nil
    if t.sec_code == sec and t.client_code==client_code and t.limit_kind==2 then
      stop_search=true
        return true
    else
        return false
    end
end


function get_position (sec)
   stop_search=nil --убиваем флаг, выставленный на прежних запусках функции.
   tbl_indxs=SearchItems('depo_limits', 0, getNumberOf("depo_limits")-1, fn)
   limit = getItem("depo_limits", tbl_indxs[1]) --найден 1 индекс, его и берём.
   local lot=lot[sec]--lot[sec] ранее определена
   return limit.currentbal/lot,limit.locked_buy/lot, limit.locked_sell/lot, limit.awg_position_price
end
Отправка транзакций из OnParam
 
Nikolay Pavlov,
спрошу про другой случай.
Я знаю, что в нужной мне таблице только один элемент с нужным параметром. Например, я ищу в depo_limits текущий остаток по SBER. Как мне в SearchItems оборвать поиск сразу после того как SBER был найден?

Я делаю что-то в таком духе:
Код
function fn(t)
    if t.sec_code == sec and t.client_code==client_code and t.limit_kind==2 then 
        return true
    else
        return false
    end
end

tbl_indxs=SearchItems('depo_limits', 0, getNumberOf("depo_limits")-1, fn)

и второй вопрос, как мне в функцию fn передать переменную sec?
Отправка транзакций из OnParam
 
Nikolay Pavlov,
спасибо за совет!
вопрос по SearchItems. Никогда с ней не работал.

Хочу получить мои сделки за сегодня по BANEP
Код
function fn (t)
   if t.sec_code=='BANEP' then
      return true
   end
end

tbl=SearchItems('trades', 0, getNumberOf("trades")-1, fn, "qty,class_code, sec_code")
в результате таблица tbl выглядит так:
Цитата
1=0;2=1;3=2;4=3;5=4;6=5;7=6;8=7;9=8;10=9;11=10;12=11;13=12;14=13;15=14;16=15;17=16;18=17;19=18;20=19;21=20;22=21;23=22;24=23;25=24;26=25;27=26;28=27;29=28;30=29;31=30;32=31;33=32;34=33;35=34;36=35;37=36;38=37;39=38;40=39;41=40;42=41;43=42;44=43;45=44;46=45;47=46;48=47;49=48;50=49;51=50;52=51;53=52;54=53;55=54;56=55;57=56;58=57;59=58;60=59;61=60;62=61;63=62;64=63;65=64;66=65;67=66;68=67;69=68;70=69;71=70;72=71;73=72;74=73;75=74;76=75;77=76;78=77;79=78;80=79;81=80;82=81;83=82;84=83;85=84;86=85;87=86;88=87;89=88;90=89;
у меня за день и правда 90 сделок, но не понятно в чём толк этой функции?
----------------

Если написать чуть-чуть иначе:
Код
function fn (t)
   if t.sec_code=='BANEP' then
      return t
   end
end

tbl=SearchItems('trades', 0, getNumberOf("trades")-1, fn)

то он пишет такое:
Цитата
1=18;2=20;3=21;
19,21,22 - это номера моих сделок с Башнефтью. С учётом сдвига всё верно. Но как получить все поля по этим сделкам?
Отправка транзакций из OnParam
 
Nikolay Pavlov,
переменная ticker_list из моего примера:
Код
1=SBER;2=GAZP;3=GMKN;4=LKOH;................
Ключ - число, значение - тикер.
Ваш совет:
Код
function tableContains(table, key)    
return table[key] ~= nil
end
не подойдёт в чистом виде.
Разве что переделать тикер лист в
Код
'SBER'=1; 'GAZP' = 2; 'GMKN' = 3;
тогда ваша функция сработает. Но и в этом случае она где-то там невидимо для меня будет перебирать всю таблицу в поисках ключа.
Спасибо за помощь!
Отправка транзакций из OnParam
 
Nikolay Pavlov,
посмотрел описание функции SearchItems. Почему вы её рекламируете по сравнению с
Код
for i=0,getNumberOf("orders")-1,1 do
В ней тоже задаётся список строчек  с какой по какую искать. Если у меня за день 10 000 заявок, скрипт будет пробегать по всем. Разве не так?
Отправка транзакций из OnParam
 
функция для снятия всех заявок.
в неё передаётся таблица с тикерами.
Код
function CleanActive (ticker_list) --переписать её, чтобы искать с конца.
   local row={}
   for i=0,getNumberOf("orders")-1,1 do
      row=getItem("orders",i)   
      local sec=row.sec_code
      if table_contains(ticker_list, sec) and orderflags2table(row.flags).active then
         res,ms=killOrder(tostring(row.order_num),sec,row.class_code)
      end
   end
end
Код
function table_contains(table, element)   
   for _, value in pairs(table) do
      if value == element then return true end
   end
   return nil
end   
Я запускаю CleanActive из OnStop и из самого начала функции main. Это очень часто вешает квик, приходится его убивать через окно с процессами.
Отправка транзакций из OnParam
 
Заметил, что отправка транзакций - выставление и снятие заявок - трудоёмкая операция.
Торгую 50-ю акциями. Если у меня висит 50 заявок, то при их массовом одновременном снятии квик подвисает на несколько секунд. При быстром выставлении такого же числа заявок он тоже зависает.
Поэтому вопросы.
1. Наблюдения верны? Отправка транзакций - ресурсоёмкая процедура?
2. Хочу отправлять транзакции из OnParam. Это плохая идея? С точки зрения логики работы программы это было бы очень удобно. Сейчас у меня отправка заявок идёт в функции main, там в бесконечном цикле перебираются одна за другой 50 акций на соблюдение условия выставления/снятия. Хочу перенести этот блок в OnParam.
Заявок ставится много, они всё время перевыставляются. В день отправляется до 10 тысяч заявок, то есть с учётом снятия это 20 000 транзакций.  
Критерий исполнения заявки OnTrade
 
Вопрос, связанные с троекратным приходом сделки.
Если у меня заключается много сделок, в том числе почти одновременно, возможно ли, что три колбека перемежаются колбеками от соседних сделок.
Ну например прилетает первый колбек по Сберу, потом один по Газпрому, а потом долетают ещё по два колбека от Газпрома и Сбера?
Или они приходят строго очередями? Сначала три по одной бумаге, потом три по другой?
---
Ну и раз вам эта проблема знакома, то какой лучший способ с нею бороться?
Критерий исполнения заявки OnTrade
 
И ещё вопрос. Можно ли факт заключения сделки отслеживать через OnTransReply или он только для отправки ордеров?
Критерий исполнения заявки OnTrade
 
Мне мерещится, или колбек OnTrade срабатывает три раза на каждую сделку?
Один за другим приходят три отчёта о совершении одной сделки.
Выставить кодировку
 
Пишу код в Notepad++
Стоит эта кодировка:


Строка
Код
send_msg ("Снята: "..k)
, где k - тикер, в  квике выглядит так:


Как с этим бороться?
Локальность переменной
 
Я не знаю быстрый или не быстрый. Просто читал что локальные переменные работают быстро.
Ваше сообщение означает, что скорости не прибавится?
Критерий исполнения заявки OnTrade
 
Как с помощью колбека OnTrade понять, что заявка с известным номером исполнилась полностью или частично?
Как то же самое узнать с помощью колбека OnOrder?
Локальность переменной
 
Я хочу, чтобы таблица (или любая переменная) была локальной ради скорости её обработки

local row={}
for i=0,getNumberOf("orders")-1,1 do
row=getItem("orders",i)
end

является ли в этом примере row локальной?
Строка row=getItem("orders",i) не превращает ли её в глобальную? Ведь здесь идёт повторное объявление.
No such file
 
Получаю ошибку


Скрипт организован вот так:

То есть он не видит файл в той же папке где лежит запускаемый скрипт.
Но стоит запускамый скрипт Unitas 3.0.lua удалить а потом добавить, как всё начинает работать:


Запустил КВИК, нажал кнопку Запустить - не работает.
Удалил скрипт из списка, добавил снова, запустил - работает.
биржа или брокер?
 

биржа штрафует за ошибочные транзакции.
хочу уточнить - если я вижу такое сообщение, значит моя транзакция не долетела до биржи и отбита сервером брокера?
Индикатор фрактал
 
Пытаюсь переписать на Питоне индикатор Фрактал (код ниже). Но не могу понять что в этом коде происходит. Помогите пожалуйста написать на питоне индикатор фрактал для самого простого случая - список цен:
Например, как найти верхний фрактал (для пиков)?
price=[186.99,190.99,191.24,197,196.75,196.8,196.8,198,201.26,203.32,208.44,207.17,207.95,210.4,212.2,212,209.7,213.61,213.14,217.9,216.29,215.5,217.85,216.59,211.01,210.43,214,219.1,213.9,204.43,208,204.19,202.08,206.89,203.41,205.25,205.86,205.8,205.4,207.8,206.54,205.5,202.92,205,203.95,205.25,205.1,206,203.66,203.55,205.9,207.7,209.8,210.61,207.7,214,218,214.1,215.07,214.42,217.7,218.23,219.05,221.8,227.5,232.3,238,243.68,238.86,239.5,237.8,233.24,234.3,232.79,232.6,235.41,235.67,236,227.8,223.18,228.8,225.17,229.1,232.52,232.8,231.49,230,227,224.22,227.88,228.69,228.19,226.94,226]

Код
Settings = {
Name = "*FRACTALS (Fractals)", 
Period = 5,
line = {{
      Name = "Horizontal line",
      Type = TYPE_LINE, 
      Color = RGB(140, 140, 140)
      },
      {
      Name = "FRACTALS - Up", 
      Type = TYPE_TRIANGLE_UP, 
      Color = RGB(0, 206, 0)
      },
      {
      Name = "FRACTALS - Down", 
      Type = TYPE_TRIANGLE_DOWN, 
      Color = RGB(221, 44, 44)
      }
      },
Round = "off",
Multiply = 1,
Horizontal_line="off"
}
         
function Init()
   func = FRACTALS()
   return #Settings.line
end

function OnCalculate(Index)
local Out1,Out2 = func(Index, Settings)
   SetValue(Out1, 2, ConvertValue(Settings,H(Out1)))
   SetValue(Out2, 3, ConvertValue(Settings,L(Out2)))
   return tonumber(Settings.Horizontal_line),nil,nil
end

function FRACTALS() --Fractals ("FRACTALS")
   local H_tmp={}
   local L_tmp={}
   local it = {[1]=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 5)
if (P>0) then
   if I == 1 then
      H_tmp={}
      L_tmp={}
      it = {[1]=0, l=0}
   end
   if CandleExist(I,ds) then
      if I~=it[Squeeze(it.l,P)] then
         it.l = it.l + 1
         it[Squeeze(it.l,P)] = I
      end
      local Ip,Ipppp = Squeeze(it.l,P),Squeeze(it.l,P-1)+1
      local nP = math.floor(P/2)*2+1
      H_tmp[Ipppp] = GetValue(it[Ip],HIGH,ds)
      L_tmp[Ipppp] = GetValue(it[Ip],LOW,ds)
      if it.l >= nP then
         local S = it[Squeeze(it.l-nP+1+math.floor(nP/2),P)]
         local val_h=math.max(unpack(H_tmp))
         local val_l=math.min(unpack(L_tmp))
         local L = GetValue(S,LOW,ds)
         local H = GetValue(S,HIGH,ds)
         if (val_h == H) and (val_h >0) 
            and (val_l == L) and (val_l > 0) then
               return S,S
         else
            if (val_h == H) and (val_h > 0) then
               return S,nil
            end
            if (val_l == L) and (val_l > 0) then
               return nil,S
            end
         end
      end
   end
end
return nil,nil
end
end


SMA,MMA,EMA,WMA,SMMA,VMA = "SMA","MMA","EMA","WMA","SMMA","VMA"
OPEN,HIGH,LOW,CLOSE,VOLUME,MEDIAN,TYPICAL,WEIGHTED,DIFFERENCE,ANY = "O","H","L","C","V","M","T","W","D","A"

function CandleExist(I,ds)
return (type(C)=="function" and C(I)~=nil) or
   (type(ds)=="table" and (ds[I]~=nil or (type(ds.Size)=="function" and (I>0) and (I<=ds:Size()))))
end

function Squeeze(I,P)
   return math.fmod(I-1,P+1)
end

function ConvertValue(T,...)
local function r(V, R) 
   if R and string.upper(R)== "ON" then R=0 end
   if V and tonumber(R) then
      if V >= 0 then return math.floor(V * 10^R + 0.5) / 10^R
      else return math.ceil(V * 10^R - 0.5) / 10^R end
   else return V end
end
   if arg.n > 0 then
      for i = 1, arg.n do
         arg[i]=arg[i] and r(arg[i] * ((T and T.Multiply) or 1), (T and T.Round) or "off")
      end
      return unpack(arg)
   else return nil end
end

function GetValue(I,VT,ds) 
VT=(VT and string.upper(string.sub(VT,1,1))) or ANY
   if VT == OPEN then         --Open
      return (O and O(I)) or (ds and ds:O(I))
   elseif VT == HIGH then       --High
      return (H and H(I)) or (ds and ds:H(I))
   elseif VT == LOW then      --Low
      return (L and L(I)) or (ds and ds:L(I))
   elseif VT == CLOSE then      --Close
      return (C and C(I)) or (ds and ds:C(I))
   elseif VT == VOLUME then      --Volume
      return (V and V(I)) or (ds and ds:V(I)) 
   elseif VT == MEDIAN then      --Median
      return ((GetValue(I,HIGH,ds) + GetValue(I,LOW,ds)) / 2)
   elseif VT == TYPICAL then   --Typical
      return ((GetValue(I,MEDIAN,ds) * 2 + GetValue(I,CLOSE,ds))/3)
   elseif VT == WEIGHTED then   --Weighted
      return ((GetValue(I,TYPICAL,ds) * 3 + GetValue(I,OPEN,ds))/4) 
   elseif VT == DIFFERENCE then   --Difference
      return (GetValue(I,HIGH,ds) - GetValue(I,LOW,ds))
   else                     --Any
      return (ds and ds[I])
   end
return nil
end
Стакан или Текущая таблица
 
ds_bid=CreateDataSource ("TQBR","SBER", INTERVAL_TICK,'bid')
ds_bid:Size() возвращает 0.

ds_bid=CreateDataSource ("TQBR","SBER", INTERVAL_M5,'bid')
ds_bid:Size() возвращает 544

Мне нужна непрерывная запись изменяющегося лучшего бида. Объясните пожалуйста, как мне его получить с помощью CreateDataSource.
Или всё-таки придётся писать онлайн лог изменения текущей таблицы?
Стакан или Текущая таблица
 
Майк, получилось
ds=CreateDataSource ("TQBR","SBER", INTERVAL_M5,'bid')
Стакан или Текущая таблица
 
И ещё вопрос разработчикам. Это как? Надо в функцию кидать Number, а в качестве параметра указана строка INTERVAL_M5
Стакан или Текущая таблица
 
Цитата
s_mike@rambler.ru написал:
Цитата
Let_it_go написал:
Записываю лучшие биды и аски по акциям средней ликвидности, например Распадская RASP.
Что лучше выбрать: OnParam или OnQuote?
Сомнения связаны с тем, что текущая таблица транслируется срезами раз в 50 миллисекунда, то есть будут пропущенные данные.
А стакан? Он транслируется срезами или безостановочно?
получать историю параметра 'лучший бид' через createdatasource
Майк, спасибо за ответ. Не первый раз выручаете. Но я не понимаю как это сделать. Документация не раскрывает подробности:
Стакан или Текущая таблица
 
Записываю лучшие биды и аски по акциям средней ликвидности, например Распадская RASP.
Что лучше выбрать: OnParam или OnQuote?
Сомнения связаны с тем, что текущая таблица транслируется срезами раз в 50 миллисекунда, то есть будут пропущенные данные.
А стакан? Он транслируется срезами или безостановочно?
attempt to concatenate field '?' (a nil value)
 
Строка
Код
" sd="..(t_big[candle][6] or "nil")

выдаёт ошибку attempt to concatenate field '?' (a nil value)
6-поле действительно нил. Как правильно написать эту фразу?
Шаг вперёд в цикле
 
Цитата
Sergey Gorokhov написал:
for i=start_year,cur_year,1 do
--если размер таблицы НЕ нулевой то работаем
--иначе ничего не делаем
end
Если размер таблицы первый раз НЕ нулевой, то тоже НЕ работаем.
Работаем только если она второй раз не нулевой.
Шаг вперёд в цикле
 
Есть цикл, внутри которого качаются котировки с финама по многим инструментам.
for i=start_year,cur_year,1 do

end
В начале почти по всем акциям прилетают пустые годы (котировок ещё нет)
Первый НЕпустой год я брать не хочу, потому что котировки ещё не адекватные.
Я хочу брать второй не пустой год.
То есть цикл должен быть таким
Код
for i=start_year,cur_year,1 do
  --если размер таблицы нулевой, шагаем на 2 шага
  --после этого всегда шагаем 1 шагом
end
как это написать?
доступ к большим таблицам
 
Цитата
sergei написал:
data mining вряд ли целесообразно на lua делать, особенно в таких масштабах
производительность должна быть в разы (если не на порядки) ниже более целесообразного варианта

при сбое в электропитании даже промежуточных результатов не будет, да?
У меня виртуалка, там такого не бывает.
доступ к большим таблицам
 
новичок, там на одном из параметров шаг изучения мелкий, поэтому много итераций.
доступ к большим таблицам
 
Есть две огромных таблицы, которые описывают одни и те же свечки
Код
t_big[candle] --хранит цены: {1=open,2=high,3=low,4=close}
sd[candle]--хранит стандартные отклонения для этих свечек: sd[candle]=4.6432234444
Брут форс многкратно обращается к этим полям в поисках наилучших параметров. Крутит цикл, внутри него ещё цикл, а потом ещё цикл. На просчёт пятиминуток за 12 лет по 21 акции у меня ушла неделя.
Объединение этих таблиц в одну приведёт ли к ускорению доступа к их полям? Хотя бы небольшому. Или это нейтрально?
Код
t_big[candle] --хранит цены: {1=open,2=high,3=low,4=close, 5=sd}
Загрузить одну функцию
 
Цитата
Сергей написал:
Интересно вы роботов пишете! Ни одной тривиальной проблема :)

Что там с темным окошком и питоном было? Хоть о финалах этих битв сообщайте! Жуть, как интересно )
Поставил sleep(100) между записью в файл и запуском этого файла в питоне. Пока проблема не повторялась. Возможно раньше, на момент когда питон обращался к этому файлу, с ним ещё что то происходило.  
Загрузить одну функцию
 
Хочу загрузить из большой библиотеки "QL.lua" только одну функцию
Пытаюсь сделать так:
Код
local f = package.loadlib("C:/Program Files (x86)/Lua/5.1/lua/QL.lua", "math_round")
появляется странное окошко:

подскажите, что делать.
Данная идея возникла по прочтении Иерусалимскиса здесь:

Чёрное окошко (Питон, Луа)
 
Цитата
Сергей написал:
Файл tmp.txt может быть залочен или что-то подобное?
В lua ошибку искать просто негде. Отдельно питоновский скрипт всегда работает?
Не знаю, как идет процесс отладки питонов под виндой, но можно тупо добавить там print после каждой строки. Может, он у вас до седьмой строки часто не доходит, не только до 14.
Спасибо. попробую поставить принт везде.
Глобальные таблицы Lua на C++
 
Цитата
Вы удивитесь, но с большой вероятностью у вас обработка таблиц будет медленнее, чем в луа.
Причина тому в индексе У вас - стринг, а в луа хеш.

Вернулся к этой теме. Прошу пояснить эту реплику Николая.
Вот мап на Си++:
Код
  std::map < std::string, int >  period_muvinga;
  period_muvinga[ "GAZP" ]  =   23 ;
  period_muvinga[ "SBER" ]  =   19 ;
  period_muvinga[ "GMKN" ]  =   20 ;
Стринг в роли индекса. Николай пишет, что это медленно.
ОК. А что если каждой акции задать число? Ну например:
Код
  period_muvinga[ 1 ]  =   23 ; 
  period_muvinga[ 2 ]  =   19 ;
  period_muvinga[ 3 ]  =   20 ;
Так будет быстрее?
Чёрное окошко (Питон, Луа)
 
У меня из скрипта Луа вызывается питоновский скрипт. Это происходит так:
Код
os.execute("C:\\InstallPython\\python.exe C:\\FINAM\\py+lua\\Finam_parser.py")
Когда всё работает нормально, в чёрном окошке пишется то, что задумано.

Это пишет питоновская функция print:

Lua-функция os.execute возвращает 0 (признак успеха).
Но часто бывает такая ерунда. Чёрное окошко появляется, в нём ничего не пишется. До print в 14 строчке не доходит.

И так навеки, пока это окошко не закрыть. После закрытия окошка функция os.execute раздупляется и возвращает огромное отрицательное число, например -1073741510
Данные не получены, надо запускать скрипт заново.
Помогите побороть этот глюк. Самое обидное то, что функция os.execute на время пустого чёрного окошка оказывается в подвешенном состоянии. Пока висит чёрное окошко, она ничего не возвращает, а значит нельзя обработать ошибку.  
Задать градиент
 
Есть ряд чисел от 0 до 10 с шагом 0,1
0 - белый цвет (точнее розовый, доведённый до стадии белого)
промежуточные цвета - розовые разной насыщенности
10 - красный цвет
Чем ближе к 10, тем сильнее розовый превращается в красный.
помогите пожалуйста задать это на Луа.
Это будет работать в таблице КВИКа и задаваться через SetColor
Если по простому, мне это надо, чтобы сильно упавшие акции были ярко-красными, а слабо упавшие были розовыми. Чем сильнее упала акция, тем интенсивнее красный цвет.
Надеюсь, понятно выразил мысль.  
Как все таки сделать http запрос из Lua?
 
Когда-то скачал робота, который заходит на сайт Смарт Лаб и считывает с него календарь дивидендов, сигналит в КВИК если завтра ожидается дивидендный гэп. Сейчас скрипт не работает, потому что смарт лаб поменял вёрстку дивидендной страницы, но раньше я этот скрипт запускал и всё работало.
Код
if string.find(package.path,'C:\\Program Files (x86)\\Lua\\5.1\\lua\\?.lua')==nil then
   package.path=package.path..';C:\\Program Files (x86)\\Lua\\5.1\\lua\\?.lua;'
end
if string.find(package.path,'C:\\Program Files\\Lua\\5.1\\lua\\?.lua')==nil then
   package.path=package.path..';C:\\Program Files\\Lua\\5.1\\lua\\?.lua;'
end

require "socket"
is_run=true
http = require 'socket.http'
local address = 'http://smart-lab.ru/dividends/index/order_by_t2_date/desc/'
local ts={"tr","strong","span"}
local lMax=91 --число строк в таблице


function do_smart ()
   local body = http.request(address)
   ----------------------
   for i=1,#ts do
      body = string.gsub (body,"(<%s*"..ts[i].."[^>]*>)","")
      body = string.gsub (body,"(<%s*/"..ts[i].."[^>]*>)","")
   end
   body = string.gsub (body," "," ")
   local t={}  -- результат
   local j=0; local k=0; local text=0;
   local m=1; 
   local n=string.find(body,"td>",m,#body,true);
   local x=string.byte(body,n-1); 
   m=m+3;
   -----------------
    while #body>m do
      n=string.find(body, "td>",m,#body,true);
      if n then  local n1=n;
        if x~=47 then
          x=string.byte(body,n-1); if x==47 then n=n-1; end
          text = string.sub(body, m,n-2); text = nkdelspace(text);
          local len=string.len(text);
          if len<20 then
            j=j+1; if j==1 then k=k+1; t[k]={} end
            local tt=t[k]; tt[#tt+1]=text;
            if j==8 then     if k==lMax then break end
            j=0 end
          end
        else
          x=string.byte(body,n-1);
        end
      m=n1+3;
      else break;
      end
   end

   trade_date=getParamEx("TQBR","GAZP","TRADE_DATE_CODE").param_image
   prev_date=getParamEx("TQBR","GAZP","PREVDATE").param_image
   for k,v in ipairs (t) do
      local td=trade_date.." "
      local pd=prev_date.." "
      if td==t[k][2] then
         message ("Zavtra GAP "..t[k][1].." div="..t[k][6].." | "..t[k][8],1)
      end
      
      if pd==t[k][2] then
         message ("Segodnya GAP "..t[k][1].." div="..t[k][6].." | "..t[k][8],1)
      end
      
   end

end
function OnCleanUp ()
sleep (700000)
do_smart ()
end

function OnConnected ()
do_smart ()
end

function OnStop ()
   return 100
end

--------------------
function nkdelspace(s)
   local len=string.len(s); local z=""; local x1=32;
   for i=1,len do local x=string.byte(s,i); if x<32 then x=32 end
      if (x~=32 or x1~=32) then
         if z=="" then z=string.char(x) else z=z..string.char(x) end
         x1=x; end
   end    --убираем проблелы
return z;
end

do_smart ()

function main ()
   while is_run do
      sleep (1000)
   end
end
в комплекте скрипта в архиве были библиотеки Socket и mime

Вот пост где автор опубликовал этого робота с описанием что он делает
https://smart-lab.ru/blog/401675.php
Итераторы на Луа
 
Насчёт кода с allwords разобрался.
Вызывать надо так:
Код
for word in allwords() do
print(word)
end
Итераторы на Луа
 
видимо, это как-то связано с тем, про что я сейчас читаю: замыкания, запоминание состояний...
Итераторы на Луа
 
Enfernuz,
в первом коде
Код
local element = values(t)() 
со скобками в конце не является эквивалентом
Код
local element = iter()
потому что выводит до бесконечности
Итераторы на Луа
 
Цитата

Этот код будет выводить Вам все слова из введённой строки, пока Вы не введёте пустую строку. Если не проверять на ввод пустой строки, то программа сама не завершится, т.к. пустая строка -- это всё ещё строка (т.е. не nil).
Всё же оно чуть по другому работает.

дублирует одну строку. Если бы я как-то ухитрился ввести здесь 10 строк, он бы выдал 10 строк. Но не понятно как в этом окошке ввести ради тестов более чем 1 строку.
Итераторы на Луа
 
И раз уж пошла такая пьянка, второй вопрос оттуда же.
Код
function allwords ()
   local line = io.read() -- текущая строка
   local pos = 1 -- текущая позиция в строке
   return function () -- итерирующая функция
         while line do -- повторяет, пока есть строки
            local s, e = string.find(line, "%w+", pos)
            if s then -- слово найдено?
               pos = e + 1 -- следующая позиция после этого слова
               print(string.sub(line, s, e))
               return string.sub(line, s, e) -- возвращает это слово
            else
               line = io.read() -- слово не найдено; пробуетследующую строку
               pos = 1 -- перезапуск с первой позиции
            end
         end
   return nil -- строк больше нет; конец обхода
   end
end
Как эту функцию вызвать?
io.read считывает вводимый мною текст, и ничего не просиходит
Итераторы на Луа
 
Читаю книжку Иерусалимскиса про Луа.
Вот код оттуда.
Код
function values (t)
   local i = 0
   return function () i = i + 1; return t[i] end
end

t = {10, 20, 30}
iter = values(t) -- создает итератор
while true do
   local element = iter() -- вызывает итератор
   if element == nil then break end
   print(element)
end
Код работает как запланировано:


Почему всё становится плохо, если строку
Код
local element = iter() -- вызывает итератор
заменить на
Код
local element = values(t)

Чем отличаются эти варианты?
возможности и производительности LUA
 
Если у вашего брокера несколько серверов, вы можете запустить три КВИКа и в каждом открыть по 200 стаканов. Не вживую открыть, а с помощью Луа естественно.
Я в Открытии так и делаю. Если приноровиться и понять какие сервера позволяют это делать, можно залогиниться одновременно тремя квиками. Например
Сервер Билайн
Сервер №3
Сервер Макомнет.
откуда x
 
Ещё один вопрос оттуда же
Код
function newCounter ()
   local i = 0
   return function () i = i + 1 return i end
end
c1 = newCounter()
print(c1()) --> 1
print(c1()) --> 2
Почему второй принт выводит 2, а не 1?
Ведь во второй строчке идёт обнуление переменной i. Она не может сохранить старое значение 1 и превращается в 0. Откуда 2?
Страницы: 1 2 3 4 5 6 7 След.
Наверх