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

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

Страницы: 1 2 След.
ошибка в использовании io, вопрос по синтаксису
 
Цитата
nikolz написал:
Цитата
Eldar написал:
"file_log:write(os.dat
Код
e() .. " ".. proc_name .. "\n")"
если еще актуально, то напишите так:
"file_log:write(tostring(os.date()) .. " ".. tostring(proc_name) .. "\n")"
согласно документации данное выражение и так вернёт строку, так что имеет ли смысл в этом?
или опять в квике гениальные программисты наваяли?!
Код
os.date() .. " ".. proc_name .. "\n"
ошибка в использовании io, вопрос по синтаксису
 
Цитата
Владимир написал:
Eldar, У меня все тикеры обслуживает один скрипт. Как акции, так и фьючерсы.
ну вот когда доделаю скрипт, выведу с одном.
ошибка в использовании io, вопрос по синтаксису
 
Цитата
Владимир написал:
Eldar, Ни с файлом лога проблем нет - он у меня открывается в режиме дописывания и работает месяцами, ни с файлом портфеля - он перезаписывается каждую пару минут на случай падения, никаких проблем нет. А в режиме работы по историческим данным ещё и третий файл используется. Только вот во время работы скриптов я в эти файлы не лезу, по крайней мере, в режиме записи. Думаю, именно поэтому скрипт и падает. Если, конечно, он работал в момент редактирования файла. Вот все операторы с этой функцией в моём скрипте - все работают как часы тыщу лет, и ни разу не правились:
F=io.open(getScriptPath().."//IN.TXT","r");
k=io.open(getScriptPath().."//OUT.TXT","w");
F=io.open(getScriptPath().."//LOG.TXT","a");
FF=io.open(getScriptPath().."//DATA.TXT","r");
в момент работы скрипта не лезу в файлы. проверял после падения терминала, чтобы узнать открыт файл или нет.
ошибка в использовании io, вопрос по синтаксису
 
может проблема с количеством открытия файлов?
у меня 3 индикатора сохраняют свои данные в SqlLite3. и еще 4 скрипта с указанным кодом сохраняют логи. вот как раз с 4ым и падает. теперь в другом скрипте.

эти четыре скрипта ОДИНАКОВЫЕ. там разница только в тикерах (Сбер 2 контракта, РИ, СИ). хотел в одном скрипте все указать, но пока идет отладка 4 разные делаю.
ошибка в использовании io, вопрос по синтаксису
 
Цитата
Владимир написал:
Eldar,  getScriptPath() прекрасно работает - одна из немногих функций, которая ни разу не была замечена в глюках. Скорее всего, ошибка где-то в Вашем коде.
причем с файлом лога проблем нет. я в него захожу, меняю символ и сохраняю. открываю терминал и скрипт падает.

код без математики

Код
--константы
ds = {} --таблица datasource по инструментам
--переменные скрипта
is_run = true      --Режим работы скрипта, работает или остановлен
shares = {}      --Список акций
shares_count = 0   --Количество акций
SEC_PRICE_STEP=0 --шаг цены
t = nil   --Данные для визуальной таблицы
sec_code = "CRH3"
class_code = "SPBFUT"
QUANTITY = 1
MAX_QUANTITY = 1 --максимальное количество дозакупки


file_log = nul         --указатель на файл лога
count_error = 0    --количество ошибок

--Дополнительый поток
function main()
   while is_run do
      if IsWindowClosed(t) then
         is_run=false
         return        
      end   
      sleep(50)
   end
end

event_table = {
        [QTABLE_LBUTTONDBLCLK] = "Левый даблклик",
        [QTABLE_RBUTTONDBLCLK]  = "Правый даблклик",        
        [QTABLE_CLOSE] = "Закрыли таблицу"
        }

-- колбек на изменение данных. расчитывает в текущей свече данные ЕМА и показывает в таблице.
function collback_H1( index )
end


--События основного потока
function OnInit(quik_path)
   --Создаем структуру, описывающую таблицу
   t = AllocTable()

   --столбцы
   CreateWindow(t)
   SetWindowPos(t, 200, 200, 600, 110)
   SetTableNotificationCallback(t, table_str)
   

      InsertRow(t, -1)
      InsertRow(t, -1)
      InsertRow(t, -1)

    
-- заполняем таблицу используя сортировку по ключам
   SetCell(t, 2, 1, tostring(sec_code))

   SetCell(t, 3, 9, tostring(currentprice))
   SERVERTIME = getInfoParam("SERVERTIME")
   file_log, error_desc   = io.open(getScriptPath() .. "\\M15_".. sec_code ..".log", "a")
   if not file_log then 
      message("Ошибка получения файла лога:" .. error_desc)
   else
      writeToLog("OnInit")
      writeToLog(SERVERTIME)
   end
end

function OnStop()
   is_run = false
   DestroyTable(t)
   writeToLog("OnStop")   
end

--служебные функции
function quantity_total() --подсчет количество позиций
end

function price_total() --цена позиции
end

function table_str(t_id, msg, par1, par2)
   --par1 номер строки. par2 номер колонки
   if msg == QTABLE_CLOSE then 
      is_run=false
      return
   elseif (par1 == 3) and (par2 == 9) and (msg == QTABLE_LBUTTONDBLCLK) then
      
   end
end


function apply_scale(value) --округляем до шага цены
   return math.floor((tonumber(value) or 0)/SEC_PRICE_STEP+0.5)*SEC_PRICE_STEP
end

function format_scale(value, scale)
    return string.format("%."..scale .."f", tonumber(value) or 0)
end

function writeToLog(proc_name)
    file_log:write(os.date() .. " ".. proc_name .. "\n")
    file_log:flush()
end
ошибка в использовании io, вопрос по синтаксису
 
Цитата
Владимир написал:
Eldar,  getScriptPath() прекрасно работает - одна из немногих функций, которая ни разу не была замечена в глюках. Скорее всего, ошибка где-то в Вашем коде.
да. данная функция работает хорошо. отладочная информация в порядке.
код примитивный.но падает именно на этой строке "file_log:write(os.date() .. " ".. proc_name .. "\n")"
ошибка в использовании io, вопрос по синтаксису
 
Цитата
nikolz написал:
Цитата
Eldar
 
Код
    f, error_desc     =    io.open (  getScriptPath  ()   ..     "\\M15_"    ..   sec_code   ..   ".log" ,  "a" )
          if     not   f   then   
        message  (  "Ошибка получения файла лога:"     ..   error_desc)
     else  
      writeToLog(  "MA"     ..   tostring(MA))
     end      
 
данный кусок кода присутствует только в function OnInit(quik_path).
Для начала попробуйте заменить функцию getScriptPath () на явный путь. Т е напишите имя файла путь и тип файла одной строкой  например   "D:/test.log"
функция getScriptPath() неправильно работает? Выведу отладочную информацию по путям.
от функции не хочу отказываться, так как в скриптах задействован механизм "версионнойсти". Раскладываю по папкам разные даты и версии.  
ошибка в использовании io, вопрос по синтаксису
 
Цитата
Nikolay написал:
Файл может быть не доступен для записи (права доступа, заблокирован другим процессом).
Также может быть включен Контролируемый доступ к папкам Windows.

как я написал в первом сообщении - права на данную папку полные. Контролируемый доступ
Срабатывает только в одном скрипте. Попробую переименовать переменные. Может в какой-то момент пересекутся константы скриптов и второй скрипт пытается открыть файл первого?!
ошибка в использовании io, вопрос по синтаксису
 
Цитата
nikolz написал:
Цитата
Eldar написал:
Создал скрипт (по аналогии с тремя экранами Элдера) и в нем пишу лог.  
Код
    f   =     nil                --указатель на файл лога  
MA   =     0  
sec_code   =     "SRH3"  
  function    main ()
      while   is_run   do  
          if     IsWindowClosed  (t)   then  
            is_run  =    false  
              return          
          end   
        exMA()
        f, error_desc     =    io.open (  getScriptPath  ()   ..     "\\M15_"    ..   sec_code   ..   ".log" ,  "a" )
          if     not   f   then   
        message  (  "Ошибка получения файла лога:"     ..   error_desc)
     else  
      writeToLog(  "MA"     ..   tostring(MA))
     end  
          sleep  (  50  ) 
     end  
  end  

  function    writeToLog (proc_name)
    f:write( os.date ()   ..     " "    ..   proc_name   ..     "\n"  )
    f:flush()
  end  
    
 работает. делаю копию скрипта. меняю тикер на SRM3 запускаю скрипт и падает квик с ошибкой.
D:\LUA\M15_SRM.lua:524: attempt to index a nil value (global 'f')причем файл создается.
делаю третий файл с тикером RIH3. запускаю SRH3 - работает, запускаю RIH3 - работает. запускаю SRM3 - падает.
открываю снова терминал. закрываю все скрипты. запускаю SRM3 - работает. запускаю SRH3 - работет. запускаю RIH3 - работает.
с правами на папку со скриптами и логами все в порядке.

что за пролтергейст какой-то.
У вас файл открывается в цикле много раз.
Либо закрывайте его каждый раз, либо откройте один раз.
пардон. не так написал. кода много, писал пример. .

Код
f, error_desc   = io.open(getScriptPath() .. "\\M15_".. sec_code ..".log", "a")
        if not f then 
      message("Ошибка получения файла лога:" .. error_desc)
   else
      writeToLog("MA" .. tostring(MA))
   end

данный кусок кода присутствует только в function OnInit(quik_path).
ошибка в использовании io, вопрос по синтаксису
 
Создал скрипт (по аналогии с тремя экранами Элдера) и в нем пишу лог.
Код
f = nil            --указатель на файл лога
MA = 0
sec_code = "SRH3"
function main()
    while is_run do
        if IsWindowClosed(t) then
            is_run=false
            return        
        end 
        exMA()
        f, error_desc   = io.open(getScriptPath() .. "\\M15_".. sec_code ..".log", "a")
        if not f then 
      message("Ошибка получения файла лога:" .. error_desc)
   else
      writeToLog("MA" .. tostring(MA))
   end
        sleep(50) 
   end
end

function writeToLog(proc_name)
    f:write(os.date() .. " ".. proc_name .. "\n")
    f:flush()
end
работает. делаю копию скрипта. меняю тикер на SRM3 запускаю скрипт и падает квик с ошибкой.
D:\LUA\M15_SRM.lua:524: attempt to index a nil value (global 'f')причем файл создается.
делаю третий файл с тикером RIH3. запускаю SRH3 - работает, запускаю RIH3 - работает. запускаю SRM3 - падает.
открываю снова терминал. закрываю все скрипты. запускаю SRM3 - работает. запускаю SRH3 - работет. запускаю RIH3 - работает.
с правами на папку со скриптами и логами все в порядке.

что за пролтергейст какой-то.
QUIK 8.0
 
Цитата
Владимир написал:
Цитата
Eldar написал:
Добрый день.
Нет случаем у кого-нибудь Lua Sqlite3?
пробую собрать проект в VS2017. исходники с lua.sqlite.org.
убрал варнинги. поставил Lua 5.1.5 vc15 (другого не нашел поновее).
остались ошибки типа "ссылка на неразрешенный внешний символ" в куче мест. видимо не подходит Lua.

пробовал с LuaRock, но со всеми плясками компилирует только x86, а не 64
Мне удавалось скомпилить 64 и  на luarock и в VS. Даже запускалось все в quik, но работало 1 минуту и падало вместе с куиком.
Сами исходники написаны без учета особенностей 64 битной системы.

Пришлось на Lua написать небольшую библиотеку работы с текстовыми файлами как с таблицами.
текст не вариант. мне тогда проще на ODBC переделать, либо на Mysql.
все же с sqlite3 проще.
QUIK 8.0
 
Добрый день.
Нет случаем у кого-нибудь Lua Sqlite3?
пробую собрать проект в VS2017. исходники с lua.sqlite.org.
убрал варнинги. поставил Lua 5.1.5 vc15 (другого не нашел поновее).
остались ошибки типа "ссылка на неразрешенный внешний символ" в куче мест. видимо не подходит Lua.

пробовал с LuaRock, но со всеми плясками компилирует только x86, а не 64
Положение ярлыков наносимых на график с помощью LUA, Ярлык находится в позиции раньше на несколько баров, чем нужно.
 
Цитата
Sergey Gorokhov написал:
Цитата
Eldar   написал:
кстати, по поводу документации. не могу найти описание всех param_name для getParamEx в документации. как можно узнать?
В документации на терминал QUI (не QLUA) можно найти список некоторых параметров:
-Раздел 8. Алгоритмический язык QPILE
--Функции для получения значений Таблицы текущих торгов
---Значения параметров функций

К сожалению привести полный список не представляется возможным, т.к. на разных рынках разные параметры и даже более того, на одних и тех же классах у разных брокеров, список доступных параметров может быть разным.
Для того чтобы однозначно определить имя любого нужного параметра, достаточно построить таблицу текущих торгов и вывести ее по DDE с галкой "Формальные заголовки"
Вам конечно уже неприятно выслушивать многочисленные потоки упреков и обвинений, но они все заслужены.
Я спросил в ветке LUA, пишу под LUA, почему мне читать документацию к qpile?

почему у вас документация скрытая и пользователям НУЖНО искать недокументированные вещи!
Положение ярлыков наносимых на график с помощью LUA, Ярлык находится в позиции раньше на несколько баров, чем нужно.
 
Цитата
Sergey Gorokhov написал:
Цитата
Иван Ру   написал:
При использовании такого параметра функция вообще не работает
Параметр точно рабочий, если не работает пришлите полную версию кода.
Цитата
Иван Ру   написал:
насколько я помню - ALIGNMENT нет в спецификации в числе параметров доступных AddLabel
На этот случай есть документация. Вот скриншот:
кстати, по поводу документации. не могу найти описание всех param_name для getParamEx в документации. как можно узнать?
и снова о горизонтальных объёмах
 
Ответ на данный вопрос, о не реализации БОЛЬШИНСТВА запрашиваемых сообществом, скорее всего один - надо переписывать заново очень многое в программе. В основном реализацию графического блока вывода.
поэтому не можем программно рисовать прямоугольники или линию с конечными координатами. не можем обрывать индикаторы и снова их отрисовывать. не можем что-то горизонтально отображать.
так же и не могут сделать 64 битную версию.
не могут исправить вылет терминала при недоступности ресурса в работе через http. и многое многое многое еще чего.
Вы новых версиях Квика INIT в индикаторах появляется только один раз
 
Цитата
Sergey Gorokhov написал:
Не нравится не используйте, никто не заставляет.
что именно не использовать?
просто не понятна логика.  
если я изменю настройки индикатора, то в любом случае он будет пересчитываться весь с первой свечи! так зачем событие? при изменении не будет входа в функцию Init. ну этого мы избежим и грамотнее код напишем.
Цитата
Sergey Gorokhov написал:
Простите, т.е. по сути Вы хотите чтобы настройки индикатора вообще не работали? Тогда зачем они вообще нужны, удалите из кода и все.
не надо передергивать мои слова и вести общение в другую сторону.
я добавляю индикатор на график. есть начальные настройки, которые указываю. так и нужно. но например я открываю настройку области на графике и хочу изменить какие либо настройки самой области (например убрать сетку) или меняю области местами, а индикаторы пересчитываются. вот именно в данном случае не стоит все пересчитывать. или например я поменял цвет линии!! и тут не нужно пересчитывать индикатор.

Интересно будет ли работать при смене настроек или при пересчете индикатора при условиях, что я выше указал:
Код
function OnCalculate(index)
   local old_value = 0 
   old_value = GetValue(index, 1)
   return old_value
end

Цитата
Sergey Gorokhov написал:
Вы хотите получить винегрет на графике? такого никогда не будет.
а почему бы и нет? например я показываю склееный график, но код инструмента не рассчитываю, а указываю в настройках через запятую.
Вы новых версиях Квика INIT в индикаторах появляется только один раз
 
Цитата
Sergey Gorokhov написал:
А что именно не понятно из предыдущего ответа?
в том то и дело, что ничего не понятно.
вы указываете на график с 1 свечой - что это за график такой мегауникальный.
если я изменяю настройки индикатора, то и весь индикатор пересчитывается с новыми настройками и без надобности событие по изменению.
вот ЕСЛИ бы при изменении не происходил обязательный перерасчет с 1 свечи - тогда да, получил событие - понял что изменились настройки и пошел пересчет. либо со свечи, в которой поменялись настроки, пошел пересчет с новыми настройками. тогда логично и правильно.
но при обязательном пересчете - все равно проверять какой параметр изменился, так проще и так в коде проверять. вот только зачем проверять, если все равно с начала пересчитывается!!!
Вы новых версиях Квика INIT в индикаторах появляется только один раз
 
Цитата
Sergey Gorokhov написал:
опять не понятно, это вопрос или утверждение?
утверждение. нет же знака вопроса.
Цитата
Sergey Gorokhov написал:
вопрос не понятен. Изменили параметр, случился OnChangeSettings, далее все по старому, перерасчет и т.д
не понимаю что с введением данного события улучшится. логики применения не представляю. ну поменялись настройки, так все равно заново с нуля будет индикатор пересчитываться. в чем смысл обрабатывать данное событие?

но мы уже уходим вне тематики темы.
Графические инструменты и метки
 
Цитата
Egor Zaytsev написал:
Обновление идут с сервера, значит брокер этот файл разместил у себя на сервере.
потому, что данный файл идет в дистрибутиве и это логично.
вот хорошо бы в настройки указать загрузку WinRosа, нет галки - не загружаем и не проверяем обновление.
Вы новых версиях Квика INIT в индикаторах появляется только один раз
 
Цитата
Sergey Gorokhov написал:
Цитата от туда
сейчас изменение параметра вызывает пересчет всего индикатора с 1 по текущую свечу.
в 7.16 данное изменение не приведет к пересчету? изменение параметра будем отлавливать по событию?

по индикатору из 1 свечи - сравниваем с Size(). хотя как показала практика и общение на форме, Size() это не количество свечек на графике, а количество интервалов.
Графические инструменты и метки
 
Цитата
Egor Zaytsev написал:
Уточните подробней, что именно за механизм?
Как по таблице всех сделок вы определяете, что данные еще не дозагрузились и кто должен оповещать об этом?
О каких неактуальных данных идет речь, приведите примеры.
банально - сегодня утром я включил терминал. ввел логин-пароль и один из моих индикаторов пустой. оказалось, что таблица обезличенных сделок пустая. зашел в настройки таблицы, нажал ок и пошел поток данных. через пару минут индикатор заработал.
вопрос - как мне проверить, что например по инструменту нет сделок или просто нет потока сделок от сервера?!


Цитата
Egor Zaytsev написал:
Речь про Lua или настройки рабочего места? Что под периодом вы подразумеваете.
в настройках рабочего места есть фильтр по инструментам.
я про LUA. а период - например только с начала дня или с начала текущего часа.
Цитата
Egor Zaytsev написал:
Зачем? WinRose необходим для работы с системой технического анализа
MetaStock. Если MetaStock не используйте, то удалите данный файл.
удаляю. только постоянно предлагает скачать и обновить.

Цитата
Egor Zaytsev написал:
Ваши пожелания зарегистрированы. Мы постараемся рассмотреть их и
сообщить Вам результаты анализа. Впоследствии, по результатам анализа,
будет приниматься решение о реализации пожеланий в будущих версиях ПО.
пост был больше о том, что предложения очень редко когда доживают до реализации.
понятно, что обычные пользователи это не ваши клиенты, клиенты все же брокеры.
большинство предложений заставит много чего переписывать, в том числе и блок вывода графической информации.
но надо же стараться. пользователи признательны, что все же разработка движется, но медленно и с куцей информацией.
Вы новых версиях Квика INIT в индикаторах появляется только один раз
 
Цитата
Sergey Gorokhov написал:
Здравствуйте,
Из описания не понятно ,в "новых версиях" это в каких?
В версии 7.16, для корректной обработки изменения настроек индикатора, было добавлено новое событие OnChangeSettings.
ну мы только на 7.14 обновились.
вопрос - если изменили настройки индикатора, разве он не с 1 свечи будет вызывать OnCalculate?
где можно почитать описание нового события ?
Вы новых версиях Квика INIT в индикаторах появляется только один раз
 
Цитата
Eldar написал:
насколько я экспериментировал Инит вызывается при первом добавлении индикатора на график, при перезапуске скрипта.
при смене ТФ не вызывается, при переподключении к серверу без рестарта терминала - тоже.
причем расчет идет также со свечи с индексом 1. ну вот если не инициализируется скрипт индикатора, зачем пересчитывать все свечи?!
Вы новых версиях Квика INIT в индикаторах появляется только один раз
 
насколько я экспериментировал Инит вызывается при первом добавлении индикатора на график, при перезапуске скрипта.
при смене ТФ не вызывается, при переподключении к серверу без рестарта терминала - тоже.
Графические инструменты и метки
 
Хотелось бы еще указывать в скрипте прикрепление к левой или правой шкале. причем в индикаторе определенные значения к левой, определенные значения к правой.
Графические инструменты и метки
 
Цитата

Добрый день,

Мы рассмотрели Ваше пожелание. По итогам его анализа сообщаем Вам, что мы также считаем целесообразным его реализацию и постараемся включить в план доработок при выпуске одной из следующих версий нашего ПО.
скорость исполнения пожеланий, признанных целесообразными, просто "поражает".
даже не хочется просить сделать программное рисование на графике прямоугольников, отдельной линии из координаты 1 в координату 2.
это когда нибудь будет присутствовать в терминале?
желательно так же многопоточное исполнение lua скриптов.
1. программное рисование из скрипта или индикатора на графике прямоугольника. линии-отрезка. желательно к данным объектам прикреплять уникальный идентификатор, чтобы потом можно было к нему обращаться (удалять, изменять).
2. многопоточное исполнение lua скриптов, а то из-за тяжелого скрипта могут подвисать и индикаторы и соответственно вывод на график.
3. желательно механизм оповещения, что запрашиваемые данные еще не подгрузились с сервера брокера. например таблицу всех сделок. торги идут, график строится, индикатор рассчитывает, но таблица всех сделок неполная и еще не подгрузилась.или признака неактуальности данных.
4. добавить заказ и получение таблицы всех сделок с фильтром по инструменту, периода,
5. поиск и обращение к свечке из индикатора по времени, а не по индексу.
6. процедуру, которой можно передать сформированную таблицу значений индикатора для отображения на графике. передается например время/индекс свечи, значение первой линии, значение второй линии и т.д.
7. отключение winros сервера.

и это малые крохи, которые хотелось бы увидеть в терминале. я уже не говорю про сохранение значений индикатора встроенными средствами, чтобы не пересчитывать уже расчитанные значения. в данном случае приходится пользоваться сохранением в файл, в базу данных типа sqlite и т.д.
Ошибка SetValue
 
вместо кучи message используй сообщение отладки PrintDbgStr("QLua: row=" .. row .. " col_ind=" .. col_ind)
self.data[row][]
и
просмотр https://docs.microsoft.com/en-us/sysinternals/downloads/debugview
при открытии сделай фильтр по "QLua"
Многомерные массивы и получение CreateDataSource
 
Цитата
Алексей написал:
Код
  T  =  {}
 local   function   storeDateTableByIndex (index, ya, mn, d)
   local  date  =  {
    year  =  ya,
    month  =  mn,
    day  =  d
  }
  T[index]  =  date
 end 
  
спасибо.  
Многомерные массивы и получение CreateDataSource
 
Как хотя бы объявляется таблица типа date time, как в индикаторе
T[index].year T[index].month

чувствую, что мозги уже так загружены, что не замечаю чего-то простого
Многомерные массивы и получение CreateDataSource
 
Доброе время суток.
для теста стратегии хочу выбрать сумму ОИ по всем страйкам. много кода, но упростил для теста до минимума и есть путаница
кусок скрипта:
Код
OI_Opt = {}
SecList = getClassSecurities("SPBOPT")
SecCode="BRX7" --тест по текущей нефти. заработает, допилим по газпрому
interval = 1

for TempSecCode in string.gmatch(SecList, "([^,]+)") do --перебираем опционы по очереди. --опускаю код сравнения базового актива опциона с нужным.
   ds_oi, dserror = CreateDataSource("SPBOPT", TempSecCode , interval, "NUMCONTRACTS") --подписался на ОИ
   ds_oi:SetEmptyCallback() --если нет в ТТП опциона, подпишемся
        
   for candle_num = 1, ds_oi:Size() do --перебираю исторические данные

-- отладочная информация.
      PrintDbgStr("QLua: " .. TempSecCode .. " " .. ds_oi:T(candle_num).month .. "." .. ds_oi:T(candle_num).day .. "." .. ds_oi:T(candle_num).hour .. "." .. ds_oi:T(candle_num).min .. " " ..ds_oi:C(candle_num))

--получаю по порядковому номеру значение ОИ
      OI_Opt[candle_num] = tonumber(OI_Opt[candle_num]) + ds_oi:C(candle_num)
   end
end
не получается по одной причине. данные минутного графика (я же запросил минутки) выдает мне в таком виде (Тикер) месяц.дата.час.минута значение
QLua: BR34BV7 7.4 12.50 4
QLua: BR34BV7 7.5 9.17 4
QLua: BR34BV7 7.5 17.51 8
QLua: BR34BV7 7.6 9.17 8
QLua: BR34BV7 7.7 9.17 8
QLua: BR34BV7 7.10 9.17 8

центральные страйки выдают более менее кучные результаты. но тоже есть пропуски интервалов.
но для того, чтобы их получить сумму, мне необходимо раскидать по времени и суммировать.
не понимаю как создать многомерный массив. плюс хочу хранить отдельно колы и путы. плюс теоретическую цену на тот момент, волатильность и т.д.
потом, почему ОИ мне показывает по времени вне торгов (в примере стоит 09.17)?!

многое пробовал, сейчас уже на пути создания базы данных (MySQL), чтобы и там все дело хранить, суммировать.
плохо, что CreateDataSource не работает в коде индикатора. там могу получить текущие данные из таблицы параметров. а из скрипта не могу, по рассчитаным данным, изменить линию индикатора.
делаешь индикатор по текущим данным, но изменение ТФ, добавление другого индикатора или изменение параметров Другого индикатора пересчитывает текущий индикатор и исторические показатели очищаются, он становится бесполезен, так как нет предыдущих данных.

как мне создать многомерный массив/таблицу, где хранить данные типа ДатаВремя (пусть будет строка, потом распарсю), ОИ Путов, ОИ Колов, Теорит.Цена. запутался в ключах, вложеных таблицах.
Спасибо.
Уровни Фибоначчи
 
Цитата
тот самый написал:
ну как же нетак? я же вам даже на картинке всё расписал.
потому, что начальная точка должна быть 0%, конечная точка - 100%. а никак не большее-меньшее.

Цитата
тот самый написал:
врядли это будет сделано. т.к. графики привязываются к конкретным точкам на конкретном графике. И... чтобы это всё нормально отображалось на другом графике, с другим масштабированием и ценовым диапазоном - надо хорошо постараться.
Поэтому, данная информация (если я правильно понимаю) - не сохраняется в шаблонах.
дело не в точках, к которым привязывается индикатор, а в его параметрах, как цвет, типы линий, уровни индикатора.
Уровни Фибоначчи
 
Цитата
тот самый написал:
про 76,4 - как вариант - открываете настройки графика - и вписываете свой уровень туда. Сетка скорректируется под его отображение.
изначальный вопрос прочитаете? мне надо указать настройки индикатора так, чтобы после каждого применения не ПОЛЗАТЬ В НАСТРОЙКИ.
каждый раз менять - так я об этом знаю.

Цитата
тот самый написал:
всё именно так и работает.
не так! откуда тяну становится 100%, потому что левее (при нисходящем тренде), а конечная точка - 0%.
Цитата
тот самый написал:
это всё ваши мысли. вам нравится так - другому так. на всех неугодишь. поэтому и сделали так как сделали...
поэтому я и задаю вопрос разработчикам. и жду адекватного ответа.
могу оформить в качестве пожелания, чтобы в настройках программы можно было задать шаблоны параметров инструментов!
Уровни Фибоначчи
 
Цитата
тот самый написал:
Цитата
Eldar   написал:
зачем отводить точки правее-левее.
сделано так - как задумано. Просто сделали индикатор - универсальным - хочешь - от большего к меньшему, хочешь - от меньшего к большему.

насчёт 161,8...
вот что за привычка читать через несколько строк?!
и я указал не просто 161.80, а МИНУС 161,8!!!
про 76,40% может прокомментируете?
тянуть надо от начального уровня, до конечного - от 0% до 100%. тут более универсально, от и до. а не от большего к меньшему и наоборот!
Уровни Фибоначчи
 
Цитата
тот самый написал:
Цитата
Eldar   написал:
Интересует логика программирования уровней фибоначчи.
уровень от которого тяну - должен быть 0%, куда тяну - 100%.
версия квика 7,2,1,5.
не логичнее, что точка, от которой тянут будет 0%, а куда тянут - 100%. зачем отводить точки правее-левее.

плюс видно определенные точки откуда-куда проведены уровни.

но самое главное - как задать дополнительные уровни, как 76,4 или -161,8? чтобы каждый раз в редактирование не лезть?
Уровни Фибоначчи
 
Интересует логика программирования уровней фибоначчи.
если я по тренду строю уровни. например при нисходящем тренде. тяну от 69 от 65. при этом 65 - 0%, 69 - 100%
соответственно в настройках 65 - цена справа и 69 - слева, что не соответствует логике построения. уровень от которого тяну - должен быть 0%, куда тяну - 100%.
как мне забить дополнительные уровни, как 76,4%, -161,8%, чтобы они были установлены каждый раз, когда размещаю инструмент Уровни Фибоначчи на графике?
Работа с OnOrder
 
Цитата
swerg пишет:
Ну т.е. проблема ваша решена, в смысле ответ получен? или что-то еще не понятным осталось?
фактически да. пришлось изобретать костыли
Работа с OnOrder
 
Цитата
swerg пишет:
Ну, не получить OnTransReply - это сильно капец что должно произойти, хоть и возможно.
А "исполнилась заявка" - это значит сделку надо ловить, вообще-то. OnTrade.

По поводу номера заявки: так вы просто сохраните номер заявки, полученный в OnOrder, и если придёт еще один OnOrder с тем же номером заявки - ничего не делайте. сразу выходите из обработчика.
логика программы вроде такая:
OnTransReply - колбек на все транзакции (заявки, стоп-заявки и т.д.)
OnOrder - колбек на постановку заявки или изменение состояния заявки (поставилась, исполнена, отменена, частично исполнена, удалена и т.д.)
OnTrade - колбек на сделку.

OnTransReply не подходит, так как будет вызываться чаще и не вызывается на ручные заявки.
OnTrade - не подходит, так как надо проверять по заявке еще и остаток.
по логике мне нужен колбек на OnOrder, чтобы поймать изменение заявки на Исполнена, чтобы разрешить постановку новых заявок. в том числе (позже) обрабатывать мои ручные заявки.
Работа с OnOrder
 
делал и на OnTransReply. но не прокатило по такой же причине. переделал на OnOrder.
Цитата
swerg пишет:
охранять номера заявок, для которых был вызов OnOrder.
для чего мне номер заявки? заявка будет одна. мне надо чтобы после выполнения роботу разрешить выставлять новые.

Цитата
swerg пишет:
Кстати, почитайте еще раз справку. OnOrder - это получение терминалом заявки от биржи или изменение каких-то параметров заявки.
цитата из руководства:
Цитата
2.2.4 OnOrder
Функция вызывается терминалом QUIK при получении новой заявки или при изменении
параметров существующей заявки.
догадываюсь что отличие OnOrder от OnTransReply в том, что первый для заявок, второй для всех транзакций (Стоп-заявки, заявки и т.д.)

но в свое время ознакомился с http://forum-archive.quik.ru/forum/lua/113513/113513/
и понравилось то, что "Имейте ввидк, что "OnTransReply может просто не прийти" - цитата сотрудников ARQA. "

оказывается я не одинок. https://forum.quik.ru/forum10/topic996/

идея такая: получил сигнал. выставил заявку. получить колбек по исполнению заявки и значит можно делать новые заявки при сигнале.
при торговле на часовом таймфрейме я могу получать сигналы в течении этого часа и робот может молотить заявки пока не придет обновление о количестве.
Работа с OnOrder
 
простенький робот со скользяшками.
интересующие куски кода:


Код
TRANS_ID = 1

function main()
   while is_run do
        sleep(350)
        robot()
   end
end

function robot()
   --сигнал на вход
   if (price ~= 0) and (need_order) and (quantity_total() < Maximum_quantity) and (quantity_total() > 0-Maximum_quantity) then --проверка на цену, необходимость выставления заявки и что текущее количество не больше разрешенного для лонга/шорта
      SetOrder("B", price, 1) --выставляем заявку
      need_order = false --условие, что есть заявка, то новую не ставим
   end
end

function SetOrder(type, price, qua) -- подать заявку
    Status =  tonumber(getParamEx(ClassCode,  SecCode, "status").param_value);    
    if (Status ~= 1) then 
        writeToLog("Status of " .. SecCode .. " is " .. Status)
        return
    end    
    if  (qua == 0) then
        writeToLog("QUANTITY is 0")
        return
    end
    
    if  (price == 0) then
        writeToLog("Price is 0")
        return
    end
    
    local    trans = {
      ["CLASSCODE"]=ClassCode,
      ["SECCODE"]=SecCode,
      ["ACTION"]="NEW_ORDER",
      ["ACCOUNT"]=ACCOUNT,
      ["CLIENT_CODE"]=CLIENT_CODE,
      ["TYPE"]="L",
      ["OPERATION"]=type,
      ["QUANTITY"]=tostring(qua),
      ["PRICE"]=tostring(price),
      ["TRANS_ID"]=TRANS_ID
                    }        
    local res = sendTransaction(trans)
end

function OnOrder(trans_reply) -- обработка  событий по заявке
    nord = trans_reply["order_num"]  -- номер заявки ORDERNUM    
    
    if nord==nil or nord==0 or nord=="0" then
        message("Заявка не выставилась",1)
        need_order = true
        return        
    elseif tostring(trans_reply["trans_id"]) == tostring(TRANS_ID) then        
        writeToLog(table2string(trans_reply))
        if trans_reply["flags"] == 24 or trans_reply["flags"] == 26 or trans_reply["flags"] == 28 then
            if trans_reply["balance"] == 0 then
                need_order = true --здесь условие, что выставленная заявка выполнилась и дальше контроль только на превышение разрешенного от депо
            end
        end
    end
    
end

вопрос у меня следующего характера. сигналы получаю по идентификатору скользяшки.
НО! функция OnOrder срабатывает три или четыре раза с одинаковыми флагами
вот возвращаемая таблица по функции

withdraw_datetime={week_day=1;hour=0;ms=0;mcs=0;day=1;month=1;sec=0;year=1601;
min=0;};price=10242;value_entry_type=0;balance=0;repo_value_balance=0;value=20
484;qty=2;passive_only_order=0;class_code=SPBFUT;activation_time=0;userid=*****;expiry=-1;flags=28;linkedorder=0;ordernum=********;sec_code=SRH6;s
ide_qualifier=0;client_code=********;firmid=SPBFUT;datetime={week_day=2;hour=13
;ms=937;mcs=937000;day=15;month=12;sec=52;year=2015;min=13;};yield=0;reject_re
ason=;capacity=0;acnt_type=0;repo2value=0;start_discount=0;min_qty=0;ext_order
_flags=0;exec_type=0;order_num=******;repovalue=0;repoterm=0;accruedint=0
;account=******;seccode=SRH6;uid=******;brokerref=********;exchange_code=;settl
ecode=;price2=0;trans_id=1;bank_acc_id=;

и таких строчек несколько. соответственно несколько.
временами заявка срабатывает, а таблица FUTURES_CLIENT_HOLDINGS не обновляет количество в позиции и выставляется новая заявка, которая превышает лимит по возможному количеству.
возврат количества


Код
function quantity_total() --подсчет количество позиций
    local q_total=0
    
    for i = 0,getNumberOf("FUTURES_CLIENT_HOLDINGS") - 1 do
        if getItem("FUTURES_CLIENT_HOLDINGS",i).sec_code == SecCode then -- ЕСЛИ строка по нужному инструменту           
            q_total = getItem("FUTURES_CLIENT_HOLDINGS",i).totalnet
            if q_total== nil then
                return 0
            else
                return q_total -- возвращаем количество позиций
            end
       end;
    end;
    return 0
end

как мне контролировать, чтобы только одна заявка заявка выставлялась?
Графики с помощью Qlua, Графики с помощью Qlua
 
Цитата
Старатель пишет:
В текущей версии можно нарисовать только непрерывную линию.
ок. спасибо.
а вы не в курсе случаем, в будущем не планируется внедрить такие вещи? а будет расширение документации с примерами?
Графики с помощью Qlua, Графики с помощью Qlua
 
А можно ли на lua-индикаторе реализовать такую вещь: на графике индикатором нарисовать линию по двум(трем и т.д.) барам.
например при росте вверх три бара подряд - нарисовать по их минимумам линию cо сдвигом на величину ATR, при прекращении роста - прервать линию, при снижении - нарисовать зеркально (по хаям баров) . или например по двум хаям обозначить уровень линией по их хаям.
Использование Subscribe_Level_II_Quotes, получение данных стакана без открытия стакана
 
так у меня вопросы касаются работы именно в сочетании с quik.
с break понятно.
но тогда все еще не понятен вопрос, как именно ОСТАНОВИТЬ выполнение скрипта. вот как через меню "Доступные скрипты" - Остановить.
и вопрос про функцию Subscribe_Level_II_Quotes по моему мнению тоже резонный.
спасибо за разьяснения, но вроде вопросов все больше и больше. буду пробовать допиливать.
Использование Subscribe_Level_II_Quotes, получение данных стакана без открытия стакана
 
Спасибо. что-то проясняется.
например найден BREAK. но так как документация скудная, появился следующий вопрос.
после BREAK не выполнится функция OnStop(), я правильно понимаю?
Использование Subscribe_Level_II_Quotes, получение данных стакана без открытия стакана
 
плохо, что нельзя свое сообщение редактировать. приходится добавлять.
может мне проще Subscribe_Level_II_Quotes использовать в функции OnInit()?
Использование Subscribe_Level_II_Quotes, получение данных стакана без открытия стакана
 
Ошибка тут:

delta=(tonumber(price_max)/closeprice-1)*100


Ошибка плавающая. иногда сразу выскакивает, иногда через час.
Цитата
Sergey Gorokhov пишет:
Вы программист, Вам решать какую логику использовать.
дело в том, что не понятно как работает функция Subscribe_Level_II_Quotes:
1. запрашиваем стакан по тикету. получаем единоразово стакан и обрабатываем через getQuoteLevel2
2. помечаем стакан тикета на отслеживание изменений. отслеживаем изменения стакана через OnQuote.обрабатываем через getQuoteLevel2.
скуповата документация.
Цитата
Sergey Gorokhov пишет:
Да, используйте для этого условие на функцию IsWindowClosed
в этой функции я могу пометить is_run как false и не обрабатывать в main, но скрипт все еще будет запущен.
а мне надо остановить его в коде, как через меню "Остановить". скрипт выполнил расчет, нужный тикет мне показал через message и остановился.
Использование Subscribe_Level_II_Quotes, получение данных стакана без открытия стакана
 
Цитата
Sergey Gorokhov пишет:
Выложите полный текст скрипта.
Код
--константы
data_file = "s_test.txt"   --путь к файлу со списком акций и кодов классов

--переменные скрипта
is_run = true      --Режим работы скрипта, работает или остановлен
shares = {}      --Список акций
shares_count = 0   --Количество акций
table_data = nil   --Данные для визуальной таблицы
class_code = "TQBR"     --Код классов
t = nil         --Указатель на визуальную таблицу


--Дополнительый поток
function main()
   while is_run do
      for key, value in spairs(shares) do
         i = i + 1
                   Subscribe_Level_II_Quotes(class_code, key)
         Quotes(key)         
      end
   end
end

function OnInit(quik_path)
   --читаем из файла акции и коды классов
   for line in io.lines(getScriptPath() .. "\\" .. data_file) do
      pos = string.len(line)
      share = string.sub(line, 0, pos)

      share_item = {}
      share_item["class"] = class_code
      shares[share] = share_item
      shares_count = shares_count + 1
   end

   table.sort(shares)

   --содержимое таблицы   
   table_data = {}


   --Создаем структуру, описывающую таблицу
   t = AllocTable()

   --столбцы
   AddColumn(t, 1, "Ticker", true, QTABLE_STRING_TYPE, 10)
   AddColumn(t, 2, "Count Bid", true, QTABLE_INT_TYPE, 10)
   AddColumn(t, 3, "Bid Price", true, QTABLE_STRING_TYPE, 10)
   AddColumn(t, 4, "Count Ask", true, QTABLE_INT_TYPE, 10)
   AddColumn(t, 5, "Ask Price", true, QTABLE_STRING_TYPE, 10)
   AddColumn(t, 6, "Delta", true, QTABLE_STRING_TYPE, 10)

   CreateWindow(t)
   SetWindowCaption(t, "Price_Delta")
   SetWindowPos(t, 200, 200, 500, 600)

   for i=1, shares_count do
      InsertRow(t, -1)
   end
 
   i = 0

   -- заполняем таблицу используя сортировку по ключам
   for key, value in spairs(shares) do
      i = i + 1
      sec_code = key
      SetCell(t, i, 1, tostring(sec_code))
      SetColor(t, i, 1, RGB(150, 150, 150), QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR)
   end
end


function OnStop()
   is_run = false
   for key, value in spairs(shares) do      
      Unsubscribe_Level_II_Quotes(class_code, key)
   end
end

function Quotes(code)
   sleep(150)
   for i=1, shares_count do
      local row = GetCell(t, i, 1)
      row_sec = tostring(row["image"])
           if (row_sec == code) then
              q = getQuoteLevel2(class_code, code)
                   bid_count = tonumber(q["bid_count"])
         ask_count = tonumber(q["offer_count"])

         bid = q["bid"]   --покупатели
         ask = q["offer"]   --продавцы
                   max_bid_count = 0   --количество лотов (максимальный спрос)
         max_ask_count = 0   --количество лотов (максимальное предложение)
         max_bid_price = ""   --цена максимального спроса
         max_ask_price = ""   --цена максимального предложения


         --перебираем всех покупателей и находим самый большой объем
         for ii=1, bid_count, 1 do
            bid_quantity = tonumber( bid[ii]["quantity"] )
            if (bid_quantity > max_bid_count) then
               max_bid_count = bid_quantity
               max_bid_price = bid[ii]["price"]
            end
         end

         --перебираем всех продавцов находим самый большой объем
         for ii=1, ask_count, 1 do
            ask_quantity = tonumber( ask[ii]["quantity"] )
      
            if (ask_quantity > max_ask_count) then
               max_ask_count = ask_quantity
               max_ask_price = ask[ii]["price"]
            end
         end
                   
         SetCell(t, i, 2, tostring(max_bid_count))
         SetColor(t, i, 2, RGB(50, 250, 50), QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR)
         SetCell(t, i, 3, tostring(max_bid_price))
         SetColor(t, i, 3, RGB(50, 250, 50), QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR)
         SetCell(t, i, 4, tostring(max_ask_count))
         SetColor(t, i, 4, RGB(250, 50, 50), QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR)
         SetCell(t, i, 5, tostring(max_ask_price))
         SetColor(t, i, 5, RGB(250, 50, 50), QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR)
          

         if (max_ask_count>max_bid_count) then   
            price_max=max_ask_price
            SetCell(t, i, 2, "")
            SetColor(t, i, 2, RGB(255, 255, 255), QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR)
            SetCell(t, i, 3, "")
            SetColor(t, i, 3, RGB(255, 255, 255), QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR)   
         elseif (max_ask_count<max_bid_count) then
            price_max=max_bid_price
            SetCell(t, i, 4, "")
            SetColor(t, i, 4, RGB(255, 255, 255), QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR)
            SetCell(t, i, 5, "")
            SetColor(t, i, 5, RGB(255, 255, 255), QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR)   
         else 
            price_max=max_bid_price
         end
          
         closeprice=tonumber(getParamEx(class_code, code,"last").param_value)
         if (closeprice==0) then
            delta=0
         else
            delta=(tonumber(price_max)/closeprice-1)*100
         end
         
         SetCell(t, i, 6, apply_scale(delta,2))
         if delta>=2 then
            SetColor(t, i, 6, RGB(50, 250, 50), QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR)
         elseif delta<=-2 then
            SetColor(t, i, 6, RGB(250, 50, 50), QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR)
         else 
                           SetColor(t, i, 6, RGB(255, 255, 255), QTABLE_DEFAULT_COLOR,QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR)
         end
      end
   end   
end
 

ну как-то так
и что по поводу логики подскажете
Цитата
Eldar пишет:
получается что обычно OnQuote работает с открытыми стаканами, но через Subscribe_Level_II_Quotes я подписываюсь на изменения.
то есть в первом цикле делаю Subscribe_Level_II_Quotesпо всем тикетам, а потом отрабатываю через OnQuote (а внутри через getQuoteLevel2) ?
второй цикл не нужен, так как изменить данные нужной строки таблицы вывода я могу через SetCell, где ключем будет код бумаги.
Использование Subscribe_Level_II_Quotes, получение данных стакана без открытия стакана
 
вопрос немного у другую тему - а могу я автоматически стопануть скрипт, если закрыто окно с таблицей вывода?
Использование Subscribe_Level_II_Quotes, получение данных стакана без открытия стакана
 
Цитата
Sergey Gorokhov пишет:
Тогда уберите getQuoteLevel2 и все что с ним связано из второго цикла. Ее достаточно взять 1 раз перед циклом "for i=1, 30 do"
но мне надо получать данные стакана регулярно, а не только один раз.
плюс все же тут не весь код.
мне надо понять логику.
получается что обычно OnQuote работает с открытыми стаканами, но через Subscribe_Level_II_Quotes я подписываюсь на изменения.
то есть в первом цикле делаю Subscribe_Level_II_Quotesпо всем тикетам, а потом отрабатываю через OnQuote (а внутри через getQuoteLevel2) ?
второй цикл не нужен, так как изменить данные нужной строки таблицы вывода я могу через SetCell, где ключем будет код бумаги.
Цитата
Sergey Gorokhov пишет:
То есть ограничить просмотр строк в стакане количеством этих строк.
Для этого надо использовать параметры "bid_count" и "offer_count"
каким образом? я получаю таблицу через getQuoteLevel2. потом получаю таблицу BID и OFFER

Код
bid_count = tonumber(q["bid_count"])
ask_count = tonumber(q["offer_count"])
bid = q["bid"]
ask = q["offer"]
и перебираю данные в

Код
for bid_i=1, bid_count, 1 do
   bid_quantity = tonumber( bid[bid_i]["quantity"] )
   if (bid_quantity > max_bid_count) then
      max_bid_count = bid_quantity
      max_bid_price = bid[bid_i]["price"]
   end
end 
почему я тут могу получить NIL? или если у меня не загрузится стакан, то как раз поэтому у меня NIL и выходит?
Использование Subscribe_Level_II_Quotes, получение данных стакана без открытия стакана
 
Цитата
Sergey Gorokhov пишет:
Далее, для каждой из этих бумаг Вы вызываете функцию Quotes в которой вызываете цикл "for i=1, 30 do"
Таким образом, если в таблице "tikets" у Вас 30 бумаг, то в общем случае, за одну итерацию, цикл "for i=1, 30 do" приведет к тому что функции внутри него будут вызваны 30*30=900 раз.
Конечно, сложно судить не видя полного кода, но на мой взгляд 900 раз вызывать одни и те же функции совершенно излишне.
первый цикл - это запрос стаканов по бумагам.
второй цикл - это внесение изменений в таблицу.
Использование Subscribe_Level_II_Quotes, получение данных стакана без открытия стакана
 
Цитата
Sergey Gorokhov пишет:
Цитата
Eldar пишет:
поломался код
Какую ошибку пишет?
это по форуму. код нечитабельный стал. не вставился тег CODE. может у меня глюк.

Цитата
Sergey Gorokhov пишет:
Вынесите Subscribe_Level_II_Quotes в отдельный цикл, перед строкой "while is_run do" заказывать постоянно одни и те же стаканы нет смысла. Плюс, сам цикл "for i=1, 30 doсовершенно не понятен. Зачем он?
мне надо запросить объемы в стаканах по 30 бумагам.
мне Subscribe_Level_II_Quotes запросить один раз на каждую бумагу в отдельном цикле?  а потом получать стакан по getQuoteLevel2?

Цитата
Sergey Gorokhov пишет:
Тут проще, если стакан не полный, то при обращении к пустой строке стакана функция выдаст nil, отсюда и ошибка.
то есть ставить условие

Код
 if (max_bid_price~=nil) or (max_bid_price==0) then

                delta==0
долго, потому что наверно в цикле делаю Subscribe_Level_II_Quotes, потом иду обрабатывать данные. но попробую уменьшить количество окон и почистить код
Страницы: 1 2 След.
Наверх