Александр Правилов (Все сообщения пользователя)

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

Страницы: 1
Цена закрытия в предторговом акционе
 
Sergey Gorokhov,в понедельник, сделаю скрин на открытии
Цена закрытия в предторговом акционе
 
Sergey Gorokhov, все правильно, мне нужна цена закрытия, а не цена последней сделки.  
Цена закрытия в предторговом акционе
 
Коллеги, добрый день!

Подскажите, как получить цену закрытия в предторговой сессии?

Имею следующий код, но

1. В предторговой сессии в переменной LAST получаю nil всегда
2. Как только начинается основная сессия, в переменную LAST получаю цену закрытия как положено

Как быть?

---Код сокращен, всё отрабатывает, значения в таблицу пишутся, в этом плане всё ок---
Код
is_run = true

 tbl=QTable:new()
 tbl:SetCaption('Робот')
 tbl:AddColumn('LAST',QTABLE_STRING_TYPE ,20)
 tbl:Show()
line_count_table={}

function OnParam (class, sec)
    if class=="TQBR" or class=="TQDE" then
   local LAST_T = getParamEx(class,  sec, "PREVPRICE")
   LAST=tonumber(toPrice(sec, LAST_T.param_value))   
    end
end

function main()
   while is_run do
   sleep (50)
   end 
end 
Открытие по рынку
 
Lena Po, так же вариант отловить в ОнТрансРипли, какой там стоит флаг
Открытие по рынку
 
Lena Po,вы уверены, что открываете по рынку, а не лимиткой по встречной цене? В терминале прям тыкаете галочку "рыночная"?  Бывает на демо запрещены операции по рынку  
Мгновенная отмена заявки
 
Sergey Gorokhov,ага, посмотрел... а вот серчайтем не будет работать...ну да ладно :)
Мгновенная отмена заявки
 
Sergey Gorokhov, с помощью функции getNumberOf нельзя получить количество строк в созданной скриптом таблице? Сначала показалось, что работает, но видимо показалось :(

Таблица создается, выводится, заполняется (относительно работы с таблицей внешняя библиотека норм работает)

В сount всегда -1
Код
require"QL"

is_run = true

 tblord=QTable:new()
 tblord:SetCaption('Таблица')
 tblord:AddColumn('Security_',QTABLE_STRING_TYPE,15)
 tblord:AddColumn('NameStock_',QTABLE_STRING_TYPE,50)
 tblord:Show()



function main()

   while is_run do
   
      line=tblord:AddLine()
      rand2 = random(1,1000)
      tblord:SetValue(line,'Security_', rand2 )
      tblord:SetValue(line, 'NameStock_', rand2)
      count = getNumberOf("tblord") 
      sleep(500)
   end 
   
end 
Мгновенная отмена заявки
 
Иван Ру, спасибо, я уже понял, что доп.таблицы мне не избежать, буду продумывать как это всё лучше организовать. Kill balance это снятие заявки, если выполнена частично?
Мгновенная отмена заявки
 
Imersio Arrigo, где в main нужно организовывать очередной цикл для поддержания работы скрипта? Ну как то тоже не интересно.

Николай Камынин,  да  я уже понял, что квик так сделан, и уже принял неизбежность формирования таблицы необходимых мне состояний, просто всё это увеличит кол-во проверяемых условий и общую нагрузку на объем кода.
Мгновенная отмена заявки
 
Николай Камынин, как можно организовать второй вариант? Есть какая-нибудь рекомендуемая литература? От OnParam не откажусь, не нашел альтернативы в получении специфических параметров.
Мгновенная отмена заявки
 
Николай Камынин, в этом то самая и большая проблема, в невозможности получить ответ, пока не закончится OnParam или не подождать в OnParam, к примеру через event.timer или event.pull, могу ошибаться. Ну да ладно, что-нибудь придумаю, благо для текущего алгоритма, скорость не является приоритетной.  
Мгновенная отмена заявки
 
Sergey Gorokhov, спасибо :(  
Мгновенная отмена заявки
 
Николай Камынин,Да дело не в таблице состояний, это не то. Этот способ режет скорость. После отправки транзакции в OnParam есть ещё код и пока этот код не выполнится, не придет ответ от OnTransReply и OnOrder, а надо получить ответы еще при выполнении кода в OnParam.
Мгновенная отмена заявки
 
Sergey Gorokhov,можно ли в колбэке OnParam указать код, который поставит OnParam в ожидание прихода другого события, например OnTransReply? Можно ли хоть как-то добиться асинхронности колбэков или какой-нибудь "псевтоасинхронности". на гл.странице сайта квика есть пример, где отправляется транзакция и отслеживается, но там сделано хитро, транзакция отправляется в main, там то понятно, разные потоки, main работает и параллельно приходят колбэки. А как быть если отправить в OnParam?

немного нашел информацию про event, якобы ожидает прихода события, может есть что-то подобное?
Мгновенная отмена заявки
 
Sergey Gorokhov,какая ещё среду позволяет запускать отладку кода подключаясь к квику?

Перепроверю ещё раз ссылку, с браузером всё ок
Мгновенная отмена заявки
 
Sergey Gorokhov, какой среду разработки вы могли бы порекомендовать?

Да, я переходил по ссылке, но её уже не существует, вылетает просто на форум.

Не соглашусь в этом плане относительно decod'a, ибо я в режиме онлайн могу запросить вместо заявок - сделки и всё будет ок. и если я в режиме онлайн игнорируя эту ошибку пропишу через точку row.order_num к примеру, число выдастся, поэтому в принципе работать можно  
Мгновенная отмена заявки
 
Sergey Gorokhov,выяснил такой момент, за пятницу было 16 заявок, getItem("orders",i) отрабатывает когда заявка была исполнена, если снята, то показывает ошибку xml
Мгновенная отмена заявки
 
Код
is_run = true

function main()

    for i=1,getNumberOf("orders") do
   local row=getItem("orders",i)
   local row=getItem("trades",i)
    end

end 

function OnStop(s)
  is_run = false
  message ("fr", 2)
 
end
Мгновенная отмена заявки
 
Sergey Gorokhov, переделал скрипт

В режиме отладки, в Decoda, выполняю изменение параметров в функции (один и тот же сеанс)

Если getItem("Orders",i) тогда ошибка xml
Если getItem("Trades",i) тогда всё ок и трейды выдает  
Мгновенная отмена заявки
 
Николай Камынин, если с кодировкой что-то не то, почему остальной код работает? Николая, подскажите кучочек кода, как перевести в состояние ожидания ответа по заявке?
Мгновенная отмена заявки
 
Николай Камынин, не согласен с вами, колбэками управлять нельзя, они приходят как приходят, посмотрите мой пример выше, как разрулить эту ситуацию?

Sergey Gorokhov,  Сергей, подскажите другой момент, что то не получается получить таблицу заявок, в чем может быть ошибка?

в row=getItem("orders",i) пишет - improperly formatted XML data
Код
 for i=1,getNumberOf("orders") do
   
        local row=getItem("orders",i)
   if row ~= nil and row[sec_code]==sec then

         local trid,ms = killOrder(row[order_num],sec,class)
             if trid ~= nil then
                  tbl:SetValue(line_count_table[sec],'ÅñòüÇàÿâêà', string.format("Cancel"))
                  tbl:SetValue(line_count_table[sec],'ÖåíàÇàÿâêè', string.format("0"))
             end
   end
end
Мгновенная отмена заявки
 
Sergey Gorokhov, дело в том, что не обязательно транзакция должна отмениться сразу, оно может должна отмениться в следующий раз

К примеру

Условие: если b > c тогда отправить транзакцию, если c > b тогда отменить (b,c -какие то параметры бумаги)

Стек вызовов:
OnParam
OnParam
OnTransReply
Код
-- OnParam - Отправилась транзакция

b = 5,  c =3
Если b > c Тогда
ОтправитьТранзакцию (Цена = B)
ИначеЕсли c > b Тогда
ОтменитьАктивнуюТранзакцию
ОтправитьТранзакцию( Цена = С)

--2. OnParam - Меняется b и c, а транзакция ещё не дошла

b = 3,  c =5
Если b > c Тогда
ОтправитьТранзакцию (Цена = B)
ИначеЕсли c > b Тогда
ОтменитьАктивнуюТранзакцию       -- Отменять нечего и выставится ещё одна заявка (задвоится)
ОтправитьТранзакцию( Цена = С)

--3. OnTransReply -- По сути уже не нужна
Мгновенная отмена заявки
 
Sergey Gorokhov,в OnParam я получаю необходимые мне данные по инструменту, цена, максимальная цена, средняя цена, цена последняя, цена закрытия и т.п.

И исходя уже из полученных данных выполняю определенные математические операции и сравнения.
Мгновенная отмена заявки
 
Sergey Gorokhov, может мне использовать цикл while внутри onParam? Сделать какую-нибудь переменную в значение false и, если транзакция прошла, ждать пока не появится заявка в таблице с флагом активна?

Или она не прилетит в таблицу пока OnParam не закончится?
Мгновенная отмена заявки
 
Цитата
Николай Камынин написал:
Надо строить робота на основе событийной модели, тогда таких проблем не будет.
Т е робот - это конечный автомат, который полностью описывается набором его состояний.
Поэтому надо фиксировать эти состояния и программировать условия перехода из одного состояния в другое.
Я с Вами полностью согласен, но в lua нет событийности, всё зависит от стека функций об.вызова, как они придут и потока всего два и основной стек находится в одном потоке.
Мгновенная отмена заявки
 
Вся моя проблема в том, что OnParam может прийти несколько раз по одному и тому же инструменту, когда OnOrder только раз.
Проблему нескольких приходов решил с помощью добавления новой колонки таблицы и записи туда переменных, как в коде, но
может возникнуть вот такая проблема, как можете посоветовать её решить? :(

Опишу некую ситуацию:
Стек вызовов
1 OnParam
2 OnParam
3 OnOrder (или OnTransReply)
Код
--Функция выполнилась, транзакция отправлена, переменная "а" меняется на "Активна", но заявка ещё не пришла
1. Функция OnParam 
 Если а == "ждать" тогда
 ОтправитьТранзакцию
 а = "Активна"
 ИначеЕсли а == "Активна" Тогда
 НайтиТранзакцию
 Отменить
 ОтправитьНовуюТранзакцию
 Конец

--Переменная "а" уже "Активна", но функция "НайтиТранзакцию" её не найдет
2. Функция OnParam  Если а == "ждать" тогда
 ОтправитьТранзакцию
 а = "Активна"
 ИначеЕсли а == "Активна" Тогда
 НайтиТранзакцию
 Отменить
 ОтправитьНовуюТранзакцию
 Конец
В таком ключе OnTransReply быстрее отработает?

Сергей,подскажите, у отправленной транзакции есть мой уникальный ID, можно ли отследить данную транзакцию и успеть её отменить до того как она улетела на биржу?
Какие варианты может принимать аргумент ACTION="NEW_ORDER" в транзакции?
Мгновенная отмена заявки
 
Так же следует отметить, выставление заявки происходит при выполнении условия, вообще ячейку таблицы с "Wait" на "Active" я хотел меня в OnOrder, где флаг заявки бы указывал на то, что она активна, но пока приходит ответ от OnOrder OnParam успевает выставить порядка 4х заявок, тоже беда :(  
Мгновенная отмена заявки
 
Коллеги, добрый день!

Имеем следующий код (только отрывок который интересует, функции отправки и снятия заявок - 100% рабочие, проверено):

Дело в том, что заявка выставляется и попадает в систему, но следующая за выставлением заявки функция отмены всех заявок не отрабатывает, я так понимаю, потому что заявка ещё не попала в таблицу квика по скорости.
Если функцию отмены перенести в колбэк OnOrder - она снимется.

При тесте,что до запуска скрипта уже есть активные заявки, снимаются все, кроме только что отправленной.

Вопрос - есть возможность как-то быстро снять заявку только-что выставленную? или придется ждать завершения всего кода в OnParam, только после этого отработает OnOrder и я смогу её снять?
Код
function OnParam (class, sec)
.......
if Delta > 0.9 and CurentActiveOrder.image == "Wait" then
        
        --Отправляем заявку
        local id,ms = sendLimit(class,sec,"S",string.format(AUCTPRICE),1,account,client_code,"Коммент")
        --Помещаем в ячейку необходимую фразу
        tbl:SetValue(line_count_table[sec],'ЕстьЗаявка', string.format("Active"))
        --Тут же отменяем все заявки
        local trid,ms = killAllOrders(nil)
end
Использование данных при вызове OnParam, вопрос
 
Sergey Gorokhov,да, разобрался, простите за глупость
Использование данных при вызове OnParam, вопрос
 
Sergey Gorokhov, да, через мессадж выводится.

Подскажи, как тогда правильно присвоить это наименование значению таблицы?
Использование данных при вызове OnParam, вопрос
 
Цитата
Николай Камынин написал:
LONGNAME
Не помогает (К слову "name" и "short_name" и "long_name", тоже не работают)


Но работает "CODE"

Использование данных при вызове OnParam, вопрос
 
Цитата
Николай Камынин написал:
LONGNAME
Не помогает (К слову "name" и "short_name" и "long_name", тоже не работают)
1. Скрин с LONGNAME
[img]data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4RE8RXhpZgAATU0AKgAAAAgABAE7AAIAAAA3AAAISodpAAQAAAABAAAIgpydAAEAAAA6AAAQ+uocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANCf0YDQsNCy0LjQu9C+0LIg0JDQu9C10LrRgdCw0L3QtNGAINCh0LXRgNCz0LXQtdCy0LjRhwAAAAWQAwACAAAAFAAAENCQBAACAAAAFAAAEOSSkQACAAAAAzUwAACSkgACAAAAAzUwAADqHAAHAAAIDAAACMQAAAAAHOoAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMDE3OjA0OjA0IDEyOjAxOjQ2ADIwMTc6MDQ6MDQgMTI6MDE6NDYAAAAfBEAEMAQyBDgEOwQ+BDIEIAAQBDsENQQ6BEEEMAQ9BDQEQAQgACEENQRABDMENQQ1BDIEOARHBAAA/+ELSWh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iPjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+PHhtcDpDcmVhdGVEYXRlPjIwMTctMDQtMDRUMTI6MDE6NDYuNTAyPC94bXA6Q3JlYXRlRGF0ZT48L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJkZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOmxpPtCf0YDQsNCy0LjQu9C+0LIg0JDQu9C10LrRgdCw0L3QtNGAINCh0LXRgNCz0LXQtdCy0LjRhzwvcmRmOmxpPjwvcmRmOlNlcT4NCgkJCTwvZGM6Y3JlYXRvcj48L3JkZjpEZXNjcmlwdGlvbj48L3JkZjpSREY+PC94OnhtcG1ldGE+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/eHBhY2tldCBlbmQ9J3cnPz7/2wBDAAcFBQYFBAcGBQYIBwcIChELCgkJChUPEAwRGBUaGRgVGBcbHichGx0lHRcYIi4iJSgpKywrGiAvMy8qMicqKyr/2wBDAQcICAoJChQLCxQqHBgcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKir/wAARCADBAbkDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6B1nWYNFtI5ZYprmaaQQ29rbKGluJDkhVBIHQEkkgAAkkAE1Ho+uDVJJ4LjT7zTLyAKz2t4I9+xs7XDRu6MDgjhjgjnFV/EdpetNpmp6Zb/bJdNuGle1DhGmRo2RghYhd43AjcQDjGRnI5TVv7U8R6hfF/D2oafdwRW0lpbTojG5SK4SZ8zIzQKxK7VQyZ6k4BoW/9f0w/r+v6/M9CmmeKSFUt5JhI+1nQqBEME7myQcZAHGTkjjGSK2r6rBouni7ukkeMzQw4jAJ3SSLGvUjjLjPtmuMt9G1y+8Rf2pPpMtgkmvJeCOaaJnjhGnmHc2x2GfM4wCfXpVIeFdRk8H3Om23h82Gvmaz+060RbN/aDx3CM0+4PvbAVn2yBTzgDtT6r5f1/X/AA12V1r/AFdnomp6hFpOmT39yrtDbrvk8sAkKOpx7Dn8Kpy+I7GDWLzTpfMWSzsxeySFf3ezJBAbP3hgEjsGX1qroOjiPwvPpd7pwtHk8yO6YMrC7dhh59wJY785+bDevYnlW8K+IbnQbVryzhbU7u6NpqWZ14smVInYMBzlYY32+rEdqW7t/Wv9denYhPq1/X9f0z0S1uBdWUNyI5IhLGsmyQYZMjOCBnkUzTtQtdW0231DT5fNtbmNZYpNpXcpGQcEAj8a4LVPCd/qvxOi1K60dWtIpfKadYrQQzWjW7KySEgzu29iCmRHt28EiqWm+EJtO8LaBZXvgsX1lYRSQ32jotoVuJyE23e1pBG4+Rx8xD/PnGaejV/6/rb/AIbUaWlmz0Wx1WC/1DUbSFJFk06ZYZS4GGZo0kG3nphx1xzmr1eeah4KmudU1XVYtKUX/wDa1hcafKZE3wwotusuz5sJ8qSKwGNwGPmGK9Dosrf12QPyCiiikIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArmrfxrZRadePryHS7/Tyq3dkWMjZY4QxYAMqueEKjLH5cBgVHS1wtx4P1HxLfQ+JdWkGma3ZEnR4QFlWwU9RLg4lZxw+DhRwhBHmMAddpV1d3ulw3Go2J0+4kBY2xlEjRjJ2hiON23BIGQDkAsBk3Kp6VcXt1pcMuq2QsbwgiWASiRVYEjKsOqnGRnBwRkA5AuUAFFUPMf++350eY/99vzoAv0VQ8x/77fnR5j/AN9vzoAv0VQ8x/77fnR5j/32/OgC/RVDzH/vt+dHmP8A32/OgC/RVDzH/vt+dHmP/fb86AL9FUPMf++350eY/wDfb86AL9FUPMf++350eY/99vzoAv0VQ8x/77fnR5j/AN9vzoAv0VQ8x/77fnR5j/32/OgC/RVDzH/vt+dHmP8A32/OgC/RVDzH/vt+dHmP/fb86AL9FUPMf++350eY/wDfb86AL9FUPMf++350eY/99vzoAv0VQ8x/77fnR5j/AN9vzoAv0VQ8x/77fnR5j/32/OgC/RVDzH/vt+dHmP8A32/OgC/RVDzH/vt+dHmP/fb86AL9FUPMf++350eY/wDfb86AL9FUPMf++350eY/99vzoAv0VQ8x/77fnR5j/AN9vzoAv0VQ8x/77fnR5j/32/OgC/RVDzH/vt+dHmP8A32/OgC/RVDzH/vt+dHmP/fb86AL9FUPMf++350eY/wDfb86AL9FUPMf++350eY/99vzoAv0VQ8x/77fnR5j/AN9vzoAv0VQ8x/77fnR5j/32/OgC/RVDzH/vt+dHmP8A32/OgClqep22j6e97fGUQoyqfJheZyWYKoCICzElgMAHrTdL1a31i3aa0jvI0VthF3ZTWzZxnhZVUkc9QMVQ8Y2U2oeGZre2tbm7fz7dzDaTiGV1SZGbY5dNp2qedw+tczfaFqOo6TaxaJpOraRf280jpd6tqS3EiIUAeMOJpW2y8JjOFwXwCq7npYa1Z6FRXlUOgDUdVu4tN8JvYXcGo2zw6ixtwNPRIoGeAFZC4yoZCEUod3Jxk1Jq3gGU+HtAtk0m4mggtiL+0sUspJHuCkYErC6BjcgIy787xkAEgmi2lw0ueo0wyqLhYSH3MpYEIduAQOWxgHnpnJ59DXmM/hC/OsSyw6PqVwz2XlPf3stqbkKLXywsE6OHjkLE7lZWiLZYFc5Mdp4O1ZNOeOHw/FbWiq4+xKsFtJcx+ZbFkkWKRot8ixSAldqN/EEyaLK9rhbY9VorzrS/A8d5esdV8OwQaOy3RttJuFhZLTd5G1TGjMmS0cjjbkDd1BNdD4a024sp4WvtNaO5XSrSCa+a63mV035jK5ONpOd38W/2otp/Xn/kL+vy/r+rnSUUUUgCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKzItSupoUlW1hCuoYZnPcf7ladY1j/AMg62/65L/IUAWft13/z6w/9/wA//EUfbrv/AJ9Yf+/5/wDiK4nR/Ft5feIhaHUdJvUN3cQTWNpEwuLFIy+2SVvNbg7FHKLzIMHsZNN+J+gatJcx2LPK8UYkhSOaCR7kFggCqkhZCWZBiQIfm5xg4B2Oy+3Xf/PrD/3/AD/8RR9uu/8An1h/7/n/AOIrldW8eWugxWT65pt1p/2tmGy4urRWjwQM7fPy/UHEe8+2eKdp/iedlEH2G81O4E83nNbCJVt4hO6IW3umeEPC7j8p49TpcR1H267/AOfWH/v+f/iKPt13/wA+sP8A3/P/AMRXNaj4mVrTSmsPNifUTBOhZFOImmiVlPJwSJe3vzVC5+Ilq8Ouwadas+paVbyS+Qbi3l37DtJIjmJXBxkPsbHQZBAdn+f4B/X3nafbrv8A59Yf+/5/+Io+3Xf/AD6w/wDf8/8AxFcgfiPpEWv2+jXkclpeyvHFJHNcWwaGRwCqFBKXYncvKKy/N14bHXUW0uBctpvtFpDPt2+YivtznGRnFS1V0z/kE2n/AFwT/wBBFWqQBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVjWP8AyDrb/rkv8hWzVX+zLH/nyt/+/S/4UAc+fDNoBbNDPcQzW08kyTxsu8iRy8kZyMFGzggjspGGAYV4fCKw2Elh/bWpyWQVVtoHMJ+yFWDIyP5e8lSBjezdOc11H9mWP/Plb/8Afpf8KP7Msf8Anyt/+/S/4UAcjc+CheeYbrX9Vke4t/s11Jttla5jBYqGKwjG3e2Nm3PfNWF8KRwXKTWGqX9kxZjOIvKYXCtI0m198bYALsAV2nDdeldN/Zlj/wA+Vv8A9+l/wo/syx/58rf/AL9L/hQByUHge1ia387U9Ruo7VVjtopnj2wxq6OEG1ASMxqMsS2M5Pei28D2cFq9tNqF/c2/2OSxiikaNBBC+35V2IpyNowTk+pNdb/Zlj/z5W//AH6X/Cj+zLH/AJ8rf/v0v+FF2Bzdr4als78XUGv6oC7K9zGRblLp1ULuYeVlSVVQdhQcZxnJO7U/9mWP/Plb/wDfpf8ACj+zLH/nyt/+/S/4UAGmf8gm0/64J/6CKtUiqqIFRQqqMAAYAFLQBS1aSWOxT7PM0LyXEEXmIASoeVFONwIzhj1FT/2FP/0HNR/74t//AI1VbWP+PSD/AK/bX/0ojrjdR8X6lb6tdCw8RLc6vHcX0Y8OeXD8iRRymFjGEM53bI2zuw2/gYIFHmNK53f9hT/9BzUf++Lf/wCNUf2FP/0HNR/74t//AI1Xm6axqGreELybUfGNhPbWt/Yym903ULe7ktF84bzKRaxoigAMNyEjDbjjirPh7SXsorjxRBpunww2c9/cSalpzK99qib5RsceWiAZw4yzjKLwOzta9+n+Vxb7f1/X/Dnf/wBhT/8AQc1H/vi3/wDjVH9hT/8AQc1H/vi3/wDjVefeHPEfiDWNRi0seJ4biKa5TGoWM9vetsaGclBItvHHkNEp+42Ock5wI9X8b6zB4i1NdM1iIRIt1CLGa5glmtXjidlkMCQBkUtHkF5m3K33Rn5Xyu9hX0uei/2FP/0HNR/74t//AI1R/YU//Qc1H/vi3/8AjVefeJ7zWrfR9atr/XWvbQNdWLR3NtCqshsjOHYqqnKt8vBA28EE/NS6Xdabouh3Vz4L1Xwfe6n58Ajs/DVjDbfbj82LeTEsp+YbiH+XZtLHKhqXm/L8R77Hc3VglgiPfeJrq2WRxGjTG2QMx6KMx8ng8UWlgl/B51h4mu7mLON8JtnXP1EfvWLo11HrWu6LNf3zXrSabdSxhkCBZTIiSptAGGjB8vB+YAsCSSTUWteAfCK65oO7w1pcxnvGSVp7RJWkVbaTarMwJIG1cA8DAos+v9a2/QT30/rqdN/YU/8A0HNR/wC+Lf8A+NUf2FP/ANBzUf8Avi3/APjVcBqMPhxbbVIbxLRfG63Ey6YrhReqQ5+zeRj5xCF2fd+XG/d/HXNXMGnY1h7SXw/d6i76qt1bWFosd7EhE3zXUodi0WdowUXlo+uMESvsVb87f1/Wp7BcaWbS3ee68RXsEMYy8kn2dVUepJiwKINKN1As1r4ivZom+7JGLdlPbgiKua8K6VY2+raxouo6Rp2hm7t4saNp7/6PPGu7dcIwSPcSXCOAoK+WmeGUnsbSfT7W8Oi2jbZoIBOYcMdsbMwB3Hjkq3Gc8GhqzRKM+GziuLqS1g8UXMtxF/rIUa2Lp9QI8jqPzqx/YU//AEHNR/74t/8A41XO+M/DFrc6npUunxJDqU9+80c7EkCZbeRkYjP95FzjsMVgTW8yaxPdeL4hDbXv2O41yEyB4YIytyFjkboYlYRKx+6cEn5S1Jba/wBf1/W4+56D/YU//Qc1H/vi3/8AjVH9hT/9BzUf++Lf/wCNV5XrsXhiS8gXRrjw3a+FGvYSkt/bLPpYuPIuPM2JvSM8eV9xgN+c/NmtN49HtrfT5dAn0e40vyPL1+XQoI4rRrQyHb8gd9uHL5+Y/J55JztppXY3p/X9f8PodzDZxXF1JaweKLmW4i/1kKNbF0+oEeR1H50XdnFYbPt3ii5tvMOE85rZNx9BmPmrM8Wj6A1xq8qi3M7ossq7m3s7KijaM8k7RwKm1fSrLVLYfb4BN5O548sRtJUjPB9Cahu0biV2yD+wp/8AoOaj/wB8W/8A8ao/sKf/AKDmo/8AfFv/APGq4m313QdW8B+HoDqllfaXaC3TXI4LhJFhj8hgBcAE7Y/MC7g3GAd3y7qpjTtH1LxFa2/g6S3g0M3cb2k2nj/Ro7xbe5LvDj5CABFuCcFtwPO6tHGza7B0+R6F/YU//Qc1H/vi3/8AjVH9hT/9BzUf++Lf/wCNV55Je2V5qV9N4wtraPSlvZ0uYNSISyF4sFsEErOCNnEmxiCpyCMnbUmgPG89xr2i6fb2aWenxKbPT5TPDJbedchhEQo3rwJEwo6AAYNS9I83lf8Ar+ttQ62/rex3/wDYU/8A0HNR/wC+Lf8A+NUf2FP/ANBzUf8Avi3/APjVeZtqt2LPQtVs9Jvbu18O2Fm73kTRCKEOitc7w0gc4gKkbVbk1Jd6RqD+Ftb+yLGNCvGv726kV8MJ45pAqAdw/wC7Ykf88mB+/VOLTt52/r+vIS1V0d5rFq+i6Hfapcaxq0sVjbSXDxwxW7O6opYhQYxkkDgZHNJYpZanNJDpvi6W8liVWkS3ltZGQNnaSBHwDg49cV5TfR6BFoPi24GpeDDq622sFLZbCMaoGxP1l84sTjn/AFf3ePevUpdLstH8S+H4tKhWEk3EbIGJ/c+WCep6B0io0smJt30NH+wp/wDoOaj/AN8W/wD8ao/sKf8A6Dmo/wDfFv8A/Gq16KkoyP7Cn/6Dmo/98W//AMao/sKf/oOaj/3xb/8AxqteigDI/sKf/oOaj/3xb/8Axqj+wp/+g5qP/fFv/wDGq16KAMj+wp/+g5qP/fFv/wDGqP7Cn/6Dmo/98W//AMarXooAyP7Cn/6Dmo/98W//AMao/sKf/oOaj/3xb/8AxqteigDI/sKf/oOaj/3xb/8Axqj+wp/+g5qP/fFv/wDGq16KAMj+wp/+g5qP/fFv/wDGqP7Cn/6Dmo/98W//AMarXooAyP7Cn/6Dmo/98W//AMaqqYLiw122t21C4u4praZys6xjDK0QBBRF7Oa6GsbUf+Rm0/8A687n/wBDgoAsVnx6t5sayJZ3BVgGBynIP/Aq0KxrH/kHW3/XJf5CgC3/AGkf+fK4/OP/AOKo/tI/8+Vx+cf/AMVWHqfiFdN1yw082/mJckCaffgQbjtjyMc7m+XqKqXnjPT4dat7KGUmNZpUu7mS3lEEQjid2xMQI9wK4I3EjDZHBwbq4eR0/wDaR/58rj84/wD4qj+0j/z5XH5x/wDxVc/oviSPXNVvobOOYW9vBC6G4tJbd2Zy+eJFBK4UYIGOvJqO38VrLJp4mtPJjubQzzO0wP2dwCfL6cn5JcnjGz34HpuC12Ok/tI/8+Vx+cf/AMVR/aR/58rj84//AIqsK38TWxNhDfw3NpdXkUbhfs0rwozjIQzhPLznjBIJOOORVSz8c6bcWLXE8N/E4uZbdYU0+4kkfYxBZVEe5lwASQCFJwTmm9Nw3Oo/tI/8+Vx+cf8A8VR/aR/58rj84/8A4qua0PxdZ6pOLSZnS7eeeNALaVY28uRxtEhG0vtXJXdu68CuipAXYJluLeOZAQsiBwD1wRmpKq6Z/wAgm0/64J/6CKtUAUNZyLBHCSOI7q3kYRoXbasyMSAAScAE8VWibQItcbVtmsy3Rzt8+O+lijJGCUiYFEOOMqoOCR3NbFFHW4Ef/CR2H9y//wDBdcf/ABFH/CR2H9y//wDBdcf/ABFSUUAR/wDCR2H9y/8A/Bdcf/EUf8JHYf3L/wD8F1x/8RUlFAEf/CR2H9y//wDBdcf/ABFH/CR2H9y//wDBdcf/ABFSUUAUbvUtGvprWW5g1BpLSXzYXWxukKNgjqEGQQSCDwe4NWv+EjsP7l//AOC64/8AiKkooAzNWutD1u3jhv49VAjfzI3t7e8t5EbBGVeNVYcEg4PIJFXh4i09VACX+AMc6dcH/wBkqWigCP8A4SOw/uX/AP4Lrj/4ioY9Y0mK8muo4L4TzhVkf+zrjLBc7R9zoMn8zVqigCP/AISOw/uX/wD4Lrj/AOIo/wCEjsP7l/8A+C64/wDiKkooAj/4SOw/uX//AILrj/4ij/hI7D+5f/8AguuP/iKkooAq3OsaTeLGtzBfSCKVZUB0644dTlT9zseam/4SOw/uX/8A4Lrj/wCIqSigCP8A4SOw/uX/AP4Lrj/4ij/hI7D+5f8A/guuP/iKkooAj/4SOw/uX/8A4Lrj/wCIo/4SOw/uX/8A4Lrj/wCIqSigCP8A4SOw/uX/AP4Lrj/4ij/hI7D+5f8A/guuP/iKkooApalqejavpV3puoW9/NaXkLwTx/YLld6OpVhkICMgnkHNINR0Uas2p+RqBu2hEHmNY3RCpnOFUphcnGSACcLnOBi9RQBH/wAJHYf3L/8A8F1x/wDEUf8ACR2H9y//APBdcf8AxFSUUAR/8JHYf3L/AP8ABdcf/EUf8JHYf3L/AP8ABdcf/EVJRQBH/wAJHYf3L/8A8F1x/wDEUf8ACR2H9y//APBdcf8AxFSUUAR/8JHYf3L/AP8ABdcf/EUf8JHYf3L/AP8ABdcf/EVJRQBH/wAJHYf3L/8A8F1x/wDEUf8ACR2H9y//APBdcf8AxFSUUAR/8JHYf3L/AP8ABdcf/EUf8JHYf3L/AP8ABdcf/EVJRQBH/wAJHYf3L/8A8F1x/wDEUf8ACR2H9y//APBdcf8AxFSUUAR/8JHYf3L/AP8ABdcf/EVSe+j1HxFaSW0dyI4bWdXeW1kiALPFgZdRk/KenpWjRQAVjWP/ACDrb/rkv8hWzVJdJtEUKomVQMAC4k4/8eoA5PWfA9vrV1fXlxfXaXc4j+zPFcSpHb+XzGTErhZNr5f5h3xUVx4Lu7wPa3Orp/Z3m3EscUdptlUzJIGzIXIIBlJX5BwADu612X9l23/Tb/wIk/8AiqP7Ltv+m3/gRJ/8VRsrDuYWjaTqFnfXN7q2oQXtxcRRRH7PamBFCFyCAXc87/Xt+FULjwb51nfwJflGurszI5h3GKNiS8Q55yJJQD238Dius/su2/6bf+BEn/xVH9l23/Tb/wACJP8A4qnfW4tjjNQ8DDUPFC6s89kwS4hnjaaw8y5h8sr+7jmL/JGdp+UL1Zjnmpl8M6raXHn6ZrFrHLHNOYTcWDSARTP5jIwWVdxDgYYFeOCD1rrf7Ltv+m3/AIESf/FUf2Xbf9Nv/AiT/wCKpdLAYFr4fa3Sw33QdrO8nuiRFgOZPM+XGTjHmdeenvW1Uv8AZdt/02/8CJP/AIqj+y7b/pt/4ESf/FUAO0z/AJBNp/1wT/0EVapsUawwpFGMIihVGegFOoAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACqS6taOoZTMykZBFvJz/AOO1drGsf+Qdbf8AXJf5CgC7/alt/wBNv/AeT/4mj+1Lb/pt/wCA8n/xNRVHPPHbW8k87hIokLux6KAMk0AWf7Utv+m3/gPJ/wDE0f2pbf8ATb/wHk/+JrmF8WSsscjaDqVtBNLEkM90I0WRXkVAcK7Opw4ba6qe3BzjQTxFosi3pTWLBhp//H4RdIfs3X/Wc/J0PXHQ0Aa/9qW3/Tb/AMB5P/iaP7Utv+m3/gPJ/wDE1jHxNoIjs5DrenbL9tto32uPFwc4xGc/MckDjPNalAEv9qW3/Tb/AMB5P/iaP7Utv+m3/gPJ/wDE1FRQBfikWaFJYzlHUMpx1Bp1VdM/5BNp/wBcE/8AQRVqgAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKxrH/AJB1t/1yX+QrZrPj0nyo1jS8uAqgKBhOAP8AgNACVT1bT49X0a806Zikd3A8LMACVDAjODx3q/8A2af+f24/KP8A+Jo/s0/8/tx+Uf8A8TQNOzucq9j4m1K2itNVh0qGOGWGQ3FtcyM0xSVGJ2GMCPIVjjc/JAzxmsf/AIQzVpbCC3u7XTZE020W0tUhvZoBcgSxv5jsiboWHlAgKX5Y846+hf2af+f24/KP/wCJo/s0/wDP7cflH/8AE002tUJaHnE3gfWLiVLjUfK1OS4t/Ju4/wC2LixCgSSPybeNVm4kI+aNOmf4jXoYGABUn9mn/n9uPyj/APiaP7NP/P7cflH/APE0X0sD1d2Mop/9mn/n9uPyj/8AiaP7NP8Az+3H5R//ABNICTTP+QTaf9cE/wDQRVqo4IVt7eOFCSsaBAT1wBipKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDB8bMU8FakykqwiBBB5B3CnHwR4fXANpcHgH/AI/pvT/epnjj/kSNU/64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QyNuyOjKeaZY+CrnSord9HvdB0u5jMqSjT9E8m3lik2Z/dCbIkBjXD7iMcFTxjt6KXcDn28OQzeF9O0C6u0nsreKOG7Vkx9rRFxtOG+UEgEjkEZXoaq2vg2zYbdduk1ZEW2EXnIVZTbyO8Ts247mG5QTxkqTjDYHVUU3Jt3+YdLHJaf4a1PSNbe703W7AW1w2bmG4sGd2Xz5ZcI4mUKcTFclW6A47VJ4i8NXer3V4+n6zBYw6hZizvEltfOYqu/a0bb12H942chgRjGDyepoouBxFn4Bit/Fy63LeafI6XEsyzCwxeSLIjr5clwZCWVd42gKoAUDHFZ198MZdTsba01DVtLvEt7MWcUl1pPmvAq52PDmbbHIQV3MF+bauAuBj0iiktLB38xgdAAN6/nS+Yn99fzp1FADfMT++v50eYn99fzp1FADfMT++v50eYn99fzp1FADfMT++v50eYn99fzp1FADfMT++v50eYn99fzp1FADfMT++v50eYn99fzp1FADfMT++v50odScBgT7GlooAzv4U/3F/kKKP4U/3F/kKKAMDxx/yJGqf9cf6iuwoooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDO/hT/AHF/kKKKKAP/2QA=[/img]
Использование данных при вызове OnParam, вопрос
 
Sergey Gorokhov,еще такой вопрос, как получить наименование акции? Именно "МосБиржа", к примеру.

В справке использую структуру данных - инструменты
code STRING Код инструмента
name STRING Наименование инструмента
short_name STRING Короткое наименование инструмента
Пишу:
local NameStock_T = getParamEx(class,  sec, "name")
local NameStock_T = getParamEx(class,  sec, "short_name")

Но в отладчике внутри нули.

Если ставлю

local NameStock_T = getParamEx(class,  sec, "code")

То возвращает TQBR нормально.
Использование данных при вызове OnParam, вопрос
 
Цитата
Николай Камынин написал:
Цитата
Александр Правилов   написал:
Итак, имеем код:
Функция getstime уже вам известна.

1. Проверяем условие и получаем true
2. Рассчитываем LASTDEPTHT - всё ок
3. Выходим из условия
4. В Delta присваиваем LASTDEPTHT - не работает LASTDEPTHT = nil
Код
              if   getSTime()  >    100000     and   getSTime()  <    184003     then  

          local   LASTDEPTHT_T   =     getParamEx  (class,  sec, «LAST»)
          local   LASTDEPTHT  =  tonumber(toPrice(sec, LASTDEPTHT_T.param_value))

        tbl:  SetValue  (line_count_table[sec],'LAST',  string.format (LASTDEPTHT))

          end  

          local   Delta   =   LASTDEPTHT    
сделайте так:
Код
    local  LASTDEPTHT_T,LASTDEPTHT; 
  if  getSTime() >  100000   and  getSTime() <  184003   then 
   LASTDEPTHT_T  =   getParamEx (class,  sec, «LAST»)
   LASTDEPTHT = tonumber(toPrice(sec, LASTDEPTHT_T.param_value))
        tbl: SetValue (line_count_table[sec],'LAST',  string.format (LASTDEPTHT))
         end 

         local  Delta  =  LASTDEPTHT  
Уже всё дописал) Спасибо)
Использование данных при вызове OnParam, вопрос
 
Аааааа, то есть даже условие влияет, вообще странности языка))
Я бы понял, если, как в 1С - в пределах функции\процедуры видятся локальные переменные, но в пределах условия,это ужс.

Спасибо!
Использование данных при вызове OnParam, вопрос
 
Цитата
Sergey Gorokhov написал:
Александр Правилов  ,

Вы же сами сказали что причина в префиксе local у переменной LASTDEPTHT
так уберите его и все.
Но ведь это не правильное решение, так быть не должно.
То есть если есть условие то убираем Local, если нет условия, то всё ок работает. Как то кривовато.
Как условие то может влиять на переменную?

ок, оставить вопрос риторическим) разберусь)
Использование данных при вызове OnParam, вопрос
 
Итак, имеем код:
Функция getstime уже вам известна.

1. Проверяем условие и получаем true
2. Рассчитываем LASTDEPTHT - всё ок
3. Выходим из условия
4. В Delta присваиваем LASTDEPTHT - не работает LASTDEPTHT = nil
Код
        if getSTime()>100000 and getSTime()<184003 then

        local LASTDEPTHT_T = getParamEx(class,  sec, «LAST»)
        local LASTDEPTHT=tonumber(toPrice(sec, LASTDEPTHT_T.param_value))

        tbl:SetValue(line_count_table[sec],'LAST', string.format(LASTDEPTHT))

        end

        local Delta = LASTDEPTHT
Использование данных при вызове OnParam, вопрос
 
Цитата
Sergey Gorokhov написал:
Цитата
Александр Правилов   написал:
Ну почему никак, неужели я средствами lua в скрипте не смогу получить, например, время ПК?
Вы не правильно поняли.
Ваш вопрос конкретно звучал "как средствами функции getTradeDate узнать время". И конкретно на этот вопрос ответ был "Никак".
На вопрос, как вообще узнать время, в частности время компьютера, ответ - через стандартную Lua функцию os.time()
Описание по ссылке:
http://www.lua.ru/doc/5.8.html
А по поводу функции GetsTime, она и у меня работает и возвращает как раз дату, которую мне нужно.
Дело то в другом, что после выхода из условия я в этой переменной получаю nil

По факту:
- захожу в условие - всё ок
- внутри условия вычисляются необходимые мне переменные - всё ок
- выхожу из цикла. переменная nill

Но, если у переменной убрать local, работает.

Подскажите, если я в таблицу присвоил значение переменной
LASTDEPTHT=tonumber(toPrice(sec, LASTDEPTHT_T.param_value))

как мне, например в переменную LAST получить значение из этой таблицы?
Использование данных при вызове OnParam, вопрос
 
Цитата
Sergey Gorokhov написал:
Цитата
Александр Правилов   написал:
В справке нашел функцию getTradeDat, как на основе неё сделать условие?
if (Значение функции getTradeDat) >10:00:00 and (Значение функции getTradeDat) < 18:40:03 then
Никак, согласно документации, (да и в судя по названию функции), функция getTradeDate () возвращает  дату , а не время.

Ваша функция getSTime() у нас работает. Почему не работает у Вас, к сожалению не понятно.
Проверьте, какие значения она у Вас возвращает, перед тем как попасть в условие if.
Ну почему никак, неужели я средствами lua в скрипте не смогу получить, например, время ПК?
Использование данных при вызове OnParam, вопрос
 
Цитата
Sergey Gorokhov написал:
Здравствуйте,
По всей видимости проблема кроется в функции getSTime()
Что это за функция, нам не известно. Это какая-то Ваша функция. Ищите проблему в ней.
Функция getSTime
Код
function getSTime()
   --возвращает текущее время сервера в виде числа формата HHMMSS
   local t = ""
   local a = tostring(getInfoParam("SERVERTIME"))
   for s in a:gmatch('%d+') do
      t=t..s
   end
   return tonumber(t)
end
Использование данных при вызове OnParam, вопрос
 
Цитата
Sergey Gorokhov написал:
Здравствуйте,
По всей видимости проблема кроется в функции getSTime()
Что это за функция, нам не известно. Это какая-то Ваша функция. Ищите проблему в ней.
Как мне правильно прописать условие на проверку времени, используя стандартные функции qlua?
В справке нашел функцию getTradeDat, как на основе неё сделать условие?

if (Значение функции getTradeDat) >10:00:00 and (Значение функции getTradeDat) < 18:40:03 then
Использование данных при вызове OnParam, вопрос
 
Добрый день, товарищи!
Есть определенный набор тиккеров в скрипте.

При колбэке OnParam получаю определенные параметры, параметры отправляются в таблицу, так же в таблице присутствует расчетный параметр Delta.
Но незадача в том, что как только я добавляю закомментированное условие, всё, что после данного условия перестает выполняться.

При присвоении Delta - LASTDEPTHT, LASTDEPTHT в отладчике уже nil
Если убрать условие - всё ок

Не понимаю как условие на проверку времени дает такой эффект.

Пожалуйста, расскажите, почему? Я только изучаю Lua и могу что-то делать не правильно, прошу натолкнуть на путь истинный )

З.Ы.
В моей задаче необходимо получать значение последней сделки только при проведении основных торгов, далее, после основных производить вычисление только с последним значением.
Если условие не поставить, то по фонде цифра последней сделки поменяется после аукциона, а мне этого не надо.
Код
function OnParam (class, sec)
   
if string.find(ticker_list,sec)~=nil and (class==«TQBR» or class==«SPBFUT») then

        local BIDDEPTHT_T = getParamEx(class,  sec, «BID»)
        local BIDDEPTHT=tonumber(toPrice(sec, BIDDEPTHT_T.param_value))
        tbl:SetValue(line_count_table[sec],'BID', string.format(BIDDEPTHT))

        local OFFERDEPTHT_T = getParamEx(class,  sec, «OFFER»)
        local OFFERDEPTHT=tonumber(toPrice(sec, OFFERDEPTHT_T.param_value))
        tbl:SetValue(line_count_table[sec],'OFFER', string.format(OFFERDEPTHT))

        ------if getSTime()>100000 and getSTime()<184003 then

        local LASTDEPTHT_T = getParamEx(class,  sec, «LAST»)
        local LASTDEPTHT=tonumber(toPrice(sec, LASTDEPTHT_T.param_value))

        tbl:SetValue(line_count_table[sec],'LAST', string.format(LASTDEPTHT))

        ------end

        local Delta = LASTDEPTHT
        tbl:SetValue(line_count_table[sec],'Отклонение', string.format(Delta))
end
Перестал работать DDE с квика, Перестал работать DDE с квика
 
Цитата
Sergey Gorokhov написал:
Александр Правилов  ,
Какой именно офис Вы тестировали?
Ранее были ситуации когда на версии Offise 2010 Starter (сокращенная версия офиса), DDE не работал.
На остальных должен работать, с такими проблемами ранее никто не обращался.
А на счет 13го, к сожалению подсказать затруднимся
Я же написал наверху. Сначала поставил 13, потом снем, поставил 10, потом поставил 13. (все проф, лицензии)
Единственное, что этому предшествовало, это сброс системы. То есть была установка и квика и офиса на чистую систему.
Перестал работать DDE с квика, Перестал работать DDE с квика
 
Цитата
Sergey Gorokhov написал:
Здравствуйте,
В самом Excel, в параметрах, не должно быть галки "Игнорировать DDE-запросы от других приложений"
Где эта галка расположена в Вашей версии Excel, к сожалению подсказать затруднимся.
Я же написал в самом первом посте, что галка не стоит. :(
Перестал работать DDE с квика, Перестал работать DDE с квика
 
Цитата
Denis написал:
Не давайте удаленный доступ незнакомым людям, никогда! Скайпом не пользуюсь...
Только что успешно вывел в excel свою таблицу котировок фьючей, тоже открытие, версия квика 75072
удаленный доступ вы бы не получили, а видели картинку, про безопасность можно не переживать ;-)
как выводится я знаю, есть какая-то проблема, вот и всё.
Перестал работать DDE с квика, Перестал работать DDE с квика
 
Цитата
Denis написал:
если стоит галка excel "запускать приложение DDE сервера автоматически", то excel запускать вручную не нужно. Квик сам запустит книгу. Если путь к книге и имя листа прописаны корректно, то все должно работать.
Если бы работало, вопросов бы не было :) Я даже могу удаленный доступ дать, возможно это бы помогло решить мою проблему. Скайп helskk
Перестал работать DDE с квика, Перестал работать DDE с квика
 
Я же написал, что при указании файла, с конкретным листом и указанием листа, ничего не меняется. Галка стоит.  
Перестал работать DDE с квика, Перестал работать DDE с квика
 
Примечание: При указании конкретно существующей книги и листа, ничего не меняется.
Перестал работать DDE с квика, Перестал работать DDE с квика
 
Добрый день!
Дано:
— Чистая ОС Win 10 Лицензия
— MS Office сначала 13, потом 10, потом опять 13 (тестировал)
— Чистый квик от Открытия
— В офисе галка об игнорировании DDE не стоит
— Все рекомендации в справке квика сделаны
— От имени админа запускал
— На другом ПК работает (и на этом тоже работало)

Суть: Не работает вывод через DDE в Excel, вообще никак… не могу понять почему, возможно кто-то сталкивался с данной проблемой и знает пути решения, поделитесь, пожалуйста :(

По скрину: книга запущена и лист тоже. сам Excel через квик загружается нормально.

Страницы: 1
Наверх