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

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

Страницы: Пред. 1 ... 29 30 31 32 33 34 35 36 37 38 39 ... 79 След.
Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы, Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы
 
Цитата
Quikos написал:
Что ж именно я напутал ? ))))
Я прямым текстом так и написал - "Я не хочу иметь дело с терминалом, кроме одного единственного действия - запуска скрипта.".
Дело в том, что скрипт запускается в виртуальной машине луа (VM Lua) , она работает внутри терминала, а скрипт получает все данные через терминал.
поэтому вне вашего желания, если используете скрипт, то значит имеете дело с терминалом .
Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы, Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы
 
Цитата
Quikos написал:крипте.
Я не хочу иметь дело с терминалом, кроме одного единственного действия - запуска скрипта.
Колбек на то и колбек, что вызывается, когда готовы данные, как без него я узнаю, когда проверять данные ?
вы что-то путаете.
-----------------------
Терминал - это  приложение QUIK, которое вы запускаете на компе.
Без него вы не установите обмен данными с сервером.
Поэтому и скрипт Вы запускаете в терминале и работает скрипт в терминале и данные вы получаете в терминале.
----------------------
Колбек вызывается не когда готовы данные, а когда наступило событие связанное с данным колбеком.
Колбек источника данных вызывается на каждое новое значение.
-------------------
Если в пришедшем блоке будет 100 значений, то колбек будет вызван 100 раз.
-------------------------
Если ваш робот торгует в реальном времени,
то получение последней сделки и будет сигналом,
что все данные приняты.
-------------------
Кроме этого, вы можете узнать о приходе всех данных прочитав время и дату последней свечи.
------------------
Но Вы конечно можете делать как желаете.
Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы, Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы
 
Цитата
Quikos написал:
Кстати тут:  https://forum.quik.ru/forum10/topic6449 /   - самое последнее сообщение написано, что SetEmptyCallback - вообще даже не нужен.
В общем случае колбек - это функция, которая вызывается при наступлении события.
Таким образом реализуется механизм асинхронного приема без ожидания.
---------------
Следовательно, если Вам не надо обрабатывать каждое значение в момент его прихода с сервера в терминал, то и колбек вам не нужен.
Более того, вы можете просто подписаться один раз через меню терминала и не заниматься этим в скрипте.
 
Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы, Отписка callback`а SetUpdateCallbackcallback - отписывает ВСЕ заказы
 
Цитата
Quikos написал:
После вызова callback`а от SetUpdateCallback - я сразу отписываюсь от callback`а, но отписываюсь именно от как бы первого объекта CreateDataSource, но почему от отписка происходит от всех последующих от CreateDataSource.  Вот такой простенький код:  
Код
   function   main ()

 local  code_class_ =   "TQBR"           
 local  code_paper_ =   "ZVEZ"            
 local  interval_ =  INTERVAL_W1

my_table_, error_desc  =   CreateDataSource (code_class_, code_paper_, interval_)  

 ------------------------Проверка на ошибки:------------------- 
 if  error_desc ~ =   nil   then  
 message (error_desc)
 end 
 -------------------------------------------------------------- 

my_table_: SetUpdateCallback ( function (idx)my_callback_ CreateDataSource _HISTORY(my_table_, code_class_, code_paper_, intervakla_)  end )




code_class_ =   "TQBR"           
code_paper_ =   "ZVEZ"            
interval_ =  INTERVAL_M15   


 local  my_table_1, error_desc_1  =   CreateDataSource (code_class_, code_paper_, interval_) 

 ------------------------Проверка на ошибки:------------------- 
 if  error_desc_1 ~ =   nil   then  
 message (error_desc_1)
 end 
 -------------------------------------------------------------- 

my_table_1: SetUpdateCallback ( function (idx)my_callback_ CreateDataSource _HISTORY(my_table_1, code_class_, code_paper_, intervakla_)  end )



 ------------------------- 
 while   not  stopped  do  
 sleep ( 1 )
 end  
 ------------------------- 


 end   -- end main()   


То есть я вызываю CreateDataSource для двух значений, которые точно нужно заказывать на сервере.  На два значений вешаю callback`и.  Вызывается первый callback для my_table_ и сразу же отписываюсь от callback`а - НО отписка осуществляется и для таблицы my_table_1, то есть отписка осуществляется для всех ранее заказанных callback`ов для разных парамтеров.  Так и должно быть ?
Дело в том, что Вы не учитываете очень много моментов.
когда Вы первый раз подписываетесь то на сервер уходит Ваша заявка.
Не факт, что к моменту вашей отписке сервер исполнит вашу подписку, так как там есть очередь и транзакции идут пакетами и интернет имеет различные задержки для различных пакетов ну и т д.
Поэтому Ваш финт не только не типичный прием, но и результат не предсказуемый может быть.
При этом непонятно , что это дает и зачем так делать.
А в документации QLUA нет указаний на подобные действия.
---------------------
Поясните с какой целью Вы это делаете.  
QUIK (версия 7.0.1.5), function OnTrade(trade), трехкратный вызов на одно событие.
 
Цитата
Alexander написал:
Цитата
Alexey Danin написал:
Здравствуйте.
Но я спрашиваю конкретно для своего наипростейшего случая, что описал выше. Например - покупка 1 лота. Нужен контроль того, что покупка 1-го лота 100% прошла и только тогда подавать на продажу того же 1-го лота. Какой алгоритм контроля применить посоветует техподдержка? Уж куда проще то? Мой алгоритм подойдёт? Или можно его упростить, например - вообще не использовать OnTrade()? Достаточно проверить OnOrder() где баланс = 0? Сейчас использую и то и то. А надо ли? Вроде работает.
Объясняю как я делаю это.
--------------------------------
Например, циклический тест  выставления и снятия заявки.
Это тест подобен Вашей задаче.
Отличие лишь в том, что я контролировал снятие заявки, а Вы контролируете исполнение заявки.
Но алгоритм , описанный ниже решает обе задачи.
================
Результат тестирования алгоритма,
показал его безошибочную работу при случайном выставлении и снятии заявки по 200 инструментам.
За 4 часа теста на демо сервере выставлено и снято 200 тысяч заявок без единой ошибки.
==================
Алгоритм:
------------------------------
Преамбула:
Робот - это конечный автомат, который изменяет свое состояние в зависимости от внешних сигналов и своей цели.
Источником внешних сигналов являются колбеки.
------------------------
В моем роботе задействованы все колбеки, описанные в документации библиотеки QLua
Заверяю Вас, что лишних колбеков нет.
Вы можете не использовать какие-либо колбеки, но это подобно тому, что у человека отключить какой-либо орган.
-------------------------------
Если Вы колбек выкидываете, то ваш робот не видит многих событий и просто зависнет в один прекрасный момент.
===========
Если инструмент, по которому я хотел бы выставить заявку активен
,т е произошло событие по данному инструменту ( сделка, изменение заявки),
то проверяем по таблице заявок есть ли активная и  по таблице транзакций есть ли активная   по этому инструменту.
----------------------
Если есть активная , то новая заявка не выставляется, иначе выставляется.
-----------------
В более продвинутом алгоритме выполняется анализ актуальности текущего состояния , но это уже другая задача.
 
Если цены фьючерса и акции не сойдутся к моменту исполнения фьючерса
 
В этом и есть риск предлагать то, что у Вас отсутствует.
Этот риск еще больше на опционах.
Поэтому опционами торгуют либо профи, либо буратины.
Если цены фьючерса и акции не сойдутся к моменту исполнения фьючерса
 
Суть поставочных фьючерсов в том и состоит,  что это страховка от возможных убытков.
Если у Вас уже есть акции, которые Вы купили по 90 и вы заявили что отдадите по 100 и цена 80, то Вы гарантированно получите 100 за акцию за счет покупателя.
Но если Вы заявили что продадите 100 по 100, а их у Вас нет, то вы обязаны купить их на рынке и отдать покупателю.
Убытки за Ваш счет и цена при этом будет та по которой вы сможете купить на рынке. Возможно это будет и 200.
Если цены фьючерса и акции не сойдутся к моменту исполнения фьючерса
 
в любом случае, затраты оплатит тот, кто проиграл.
Если Вы указали что купите 100  по 100, а цена на момент экспирации  110, то убытки за счет продавца, если у него не хватает акций чтобы передать вам
Если Вы продавец, то убытки за ваш счет.
Если цены фьючерса и акции не сойдутся к моменту исполнения фьючерса
 
полагаю, что подробнее есть в регламенте брокера.
если нет, то можно запросить опять же у брокера.
Если цены фьючерса и акции не сойдутся к моменту исполнения фьючерса
 
Цитата
k4rkpin написал:
Цитата
nikolz написал:
цена не просто сойдется, а цена исполнения фьючерса будет приравнена цене акции.
nikolz, я смотрел схождение цен в день экспирации и заметил различие графиков цены фьючерса от Quik и от MOEX ( создал тему   https://forum.quik.ru/messages/forum1/message66158/topic7676/#message66158  )  Вот эти графики:
еще раз,
цена в момент экспирации фиксируется для сделок по фьючерсам. А на бирже в этот момент цена биржевая
это две разные цены.  
------------------
Можно выделить следующие этапы экспирации:
1. Экспирация поставочного фьючерса. Проходит в вечерний клиринг (18:45–19:00 МСК).
2. Покупка (продажа) базового актива. Происходит на следующий рабочий день после экспирации.
3. Зачисление (списание) базового актива. По облигациям происходит на следующий рабочий день после сделки, а по акциям — на второй.
----------------
Если цены фьючерса и акции не сойдутся к моменту исполнения фьючерса
 
и еще...
При этом никакой продажи или покупки на бирже не происходит. акции переписываются с одного брокера на другого.
Поэтому цена никуда не двигается.
Если цены фьючерса и акции не сойдутся к моменту исполнения фьючерса
 
Цитата
k4rkpin написал:
Если  цены фьючерса и акции не сойдутся к моменту исполнения фьючерса ...

Для исполнения  поставочных  фьючерсов , количество активов  для продажи, равно количеству активов  для покупки. И если бы все клиенты, открывшие позиции по фьючерсам, имели достаточное количество активов для встречного удовлетоврения обязательств,  биржа смогла бы списать их активы по взаимозачету.
В противном случае,  для исполнения фьючерсов, потребуются дополнительные покупки (продажи),  а они могут сильно изменить цены актива.
Цена исполнения поставочного фьючерса определяется на 1 сессию раньше, чем его исполнение.  
    Скрытый текст            Скрытый текст       условия от Мосбиржи
Исполнение:  Поставка ценных бумаг путем заключения сделки в Секции фондового рынка в  порядке, предусмотренном Правилами проведения торгов на фондовом рынке  ПАО Московская Биржа, по цене,  равной результату деления РЦ  Контракта, определенной по итогам вечернего Расчетного периода   последнего дня заключения Контракта, на лот Контракта.
Однако, цена актива от момента определения расчетной цены  до  исполнения фьючерсов, может  измениться.

Вопрос: если цена актива на следующей сессии не сойдется с ценой исполнения фьючерса, за чей счет будет оплачена разница в цене и в каких таблицах Quik я смогу увидеть мои потери от разницы?
цена не просто сойдется, а цена исполнения фьючерса будет приравнена цене акции.
По постановочному фьючерсу брокер потребует от Вас наличие на счете нужного количества акций до экспирации.
Либо наличие соответствующего счета depo для зачисления акций, которые будут автоматом списаны у продавца, у которого они будут заблокированы на счете.  
Отладка своей dll подключенной к Quik ?, Quik вылетает !
 
и еще...
Если надо вызвать функцию QLUA в своей DLL,
то для отладки делаю заглушку с имитацией передачи данных.
Отладка своей dll подключенной к Quik ?, Quik вылетает !
 
Цитата
BVladimir написал:
Приветствую, All !

Есть своя dll к Quik, написанная год назад, Quik 9.7.1.10 и VS 2019. Помнится, в том году, для отладки подключался к процессу info.exe из VS 2019 спокойно и все видел. Сейчас пробую - не важно запущен ли с скрипт с подключением dll или нет, Quik выходит с кодом 0 (без ошибок) вообще без слов. Что то сломалось не пойму куда копать то ?
Я отлаживаю DLL для QUIK так же как и для любой другой VMLua ( например для встраиваемых микропроцессорных систем).
В DLL на C ставлю вывод prirntf.
Как правило большинство писателей для QUIK не используют библиотеку QLUA в DLL так как DLL обычно пишем для ускорения скриптов
а QLUA уже написана на СИ.
-----------------
Пишу тест на луа в Scite.
При запуске теста сообщения из dll по printf выводятся в окно редактора SCITE вместе с сообщениями теста Lua.
--------------------
Так как отладка для QUIK ничем не отличается от любой другой, то можно использовать любые любимые отладчики.
----------------
После отладки добавляю свою dll в скрипт QUIK и без проблем.  
Как надлежаще уведомить брокера через Quik ?
 
Цитата
k4rkpin написал:
При наличии у меня открытой позиции - проданных поставочных фьючерсов на акции, хочу просить  брокера, чтобы во исполнение фьючерса списал с моего счета  имеющихся в наличии одноименные акции, те произвел взаимозачет, а не покупал дополнительные.

Вопрос 1 Достаточно написать письмо брокеру через "Неторговые поручения, свободная форма", за сколько дней до экспирации это сделать ?  
Вопрос 2 Указывать цену акций, по которой хочу продать, или будет автоматически использована последняя расчетная цена фьючерса?
Вопрос 3 Нужно письменное подтверждение от брокера, оно придет через Quik или другими каналами?
Вопрос 4 Насколько хорошо документируются такие переговоры в Quik, можно их использовать как доказательство в случае конфликта ?
Рекомендую сделать следующее:
-------------------------------
1) прочитать регламент брокера на предмет решения Вашего вопроса

2) если в регламенте ответа нет,
то написать брокеру письменно брокеру просьбу
добавить в Ваш с ним договор сформулированное Вами пожелание услуги брокера по данному вопросу
------------------------
Брокер либо включит Ваше пожелания как доп соглашение либо отклонит его, так как это его право.
-------------------
В любом случае, лишь письменный ответ брокера  будет реальным ответом на ваш вопрос.
Получение цены инструмента
 
и еще..
если торгуете неликвидом, то в качестве признака торговой сессии можно использовать опять же время и наличие заявок.
Но я роботов на неликвид не делаю.  
Получение цены инструмента
 
Цитата
Kolossi написал:
В принципе с подпиской получилось нормально. Всем спасибо.

Задумался вот, а почему статус торговой сессии нужно получать по определенному инструменту а не в общим параметром?
Я определяю статус торговой сессии по времени и наличию сделок.
время компа синхронизирую по серверу точного времени.  время торгов на бирже тоже синхронизировано по такому же серверу.
в результате дополнительные затраты ресурсов относительно ресурсов для торговли инструментом полностью отсутствуют.
Создать новый стек Lua, Создать новый стек Lua
 
Цитата
Quikos написал:
Есть такой простой код:

В квике Lua-скрипт:
Код
   function   main ()

Quik_Lua_connector =   require ( "Quil_Lua_connector_work_TEST" )    

 Quik_Lua_connector.TestFunc_run_WinConsole_for_dll ()

 Quik_Lua_connector.run_Cpp () 

 ------------------------- 
 while   not  stopped  do  
 sleep ( 1 )
 end  
 ------------------------- 
 end   

В С++ соответственно:
Код
  static int run_Cpp(lua_State *  Lua_stek)
{

    lua_State *  L  =  luaL_newstate();

     if  (L  =  =  NULL)
    {
        std::cout  <  <   "L == NULL"   <  <  std::endl;    //Ошибки нет.
    }

lua_getglobal(L,  "CreateDataSource" );           

lua_pushstring(L,  "TQBR" );    
lua_pushstring(L,  "GAZP" );         
lua_pushnumber(L,  "INTERVAL_MN1" );                

std::cout  <  <   "Size_stack:"   <  <  lua_gettop(L)  <  <  std::endl;   //Размер  4   -  как и должно быть

int status_lua_pcall  =  lua_pcall(L,  3 ,  2 ,  0 );   
    
 if (status_lua_pcall   !  =   0 )
{
std::cout <  < "Error" <  < std::endl;   //attempt to call a  nil  value
}

}  

То есть я хочу использовать автоматически не созданный при вызове функции run_Cpp - Lua стек, а создать своей новый - через luaL_newstate.
Стек создается, он не равен нулю.
В стек добавляются элементы - то есть он рабочий.
Но, как я вызываю lua_pcall - то lua_pcall завершается ошибкой "attempt to call a nil value".

Со автоматически созданный стеком Lua_stek - никаких ошибок нет, все работает.

Что это может быть ?
Попробуйте почитать учебники по программированию на API C for Lua.
Так как API C, то попробуйте не делать кашу из С и С++.
Быстрее научитесь писать без ошибок.
Квик ПАДАЕТ от простейшего кода
 
Нет слов, просто ужас какой-то. :shock:
Просто тащусь от такой программы. :what:
-----------------
М можно еще подобные шедевры в выложить,
а то давно так не смеялся. :lol:  :lol:  :lol: :lol:  :lol: :lol:  :lol:  
Не работает простейший скрипт вывода сообщения
 
Да Владимир это редкое имя,
почти такое же редкое как Иван.  
Net error "Удалённый хост принудительно разорвал существующее подключение", Такая ошибка ,как правило, возникает ближе к концу торгов.Подключиться после этой ошибки невозможно в этот день. На пк установлено ещё 2 квика,они при этом работают нормально. Подключение через USB-модем
 
Цитата
Андрей написал:
Установил причину  ошибки.
Пока вылетов нет.
снял одну планку DDR5,  нету вылета DDR5 установлена по мануалу

мат плата asus z690 prime a,  
ddr5 32 GB, две планки   по 16  ADATA 16GB ram mother PC5 ddr5 4800 МГц

в других программах ошибки не было
весьма возможно что в других программах процессор не лазил в эту область памяти либо процессору стало жарко.
можно сделать следующее:
1) проверить температуру процессора  и на всякий случай очистить вентилятор процессора от пыли.
2) установить у процессора динамическое изменение частоты.
3) увеличить тайминг памяти.
 
Глюк в стакане котировок, версия 9.3.1.11, Вверх тормашками
 
если пишите на луа, то до реализации в квике
можете сравнительно просто реализовать в индикаторе и отобразить как метку.
Глюк в стакане котировок, версия 9.3.1.11, Вверх тормашками
 
если правильно понял,
то чел хочет чтобы где-то отображалось время по модулю таймфрейма.
т е время, прошедшее с начала создания текущей свечи.
Предварительная проверка наличия в базе Quik инструмента (опциона), Subscribe_Level_II_Quotes и getParamEx не существующего опциона приводят к зависанию Quik
 
Цитата
Boris написал:
Цитата
nikolz написал:
Т е читайте любой из указанных параметров и проверяйте его на вшивость.
я это пробовал задолго до того как тут на форуме вопрос задать.

Проверял и на пустую строку и то что в значении число и что оно не nul
Но всё равно Quik намертво виснет.

Вероятно он виснет не на этапе getParamEx, а ещё ранее и где именно - абсолютно непонятно.
Но происходит это точно в тот момент когда в Quik обновляются данные и появляются сдохнувшие опционы.
Памяти скрипт ест - 8-15мб - не более.

Может какой то кэллбэк есть "инструмент исключён из базы" ??
как я понял Вы используете вывод по dde.
Я тоже с ним работаю, но сервер у меня свой на СИ.
поэтому пару слов по особенностям этого вывода. Так как это может быть причиной зависания.
--------------
В документации по применению DDE в квик, есть указание (место не помню где, но действительно влияет на результата вывода)
что нельзя использовать фильтры в таблице если она выводится по DDE.
Поэтому для начала отключите все фильтры на выводимой по DDE таблице.
-------------
Кроме того, зависание возможно по причине некорректной обработки пустых строк в вашем приложении  DDE
Примерно так.
Передать в SetUpdateCallback дополнительные параметры
 
Цитата
Quikos написал:
Цитата
nikolz написал:
 Вы можете передать любые параметры в любую функцию через внешние для нее параметры
Это могут быть либо глобальные либо локальные параметры блока
Например в вашем случае делаем так:
 
Код
       local   param1,param2;
  -------------------------------------  
  function   my_callback_ (index) 
  --Теперь тут доступны внешние локальные параметры...my_table_, param1, param2 - помимо стандартного index  
  end  
  ----------------  
  local   my_table   =     CreateDataSource   (code_class, code_paper_ interval)
parametr_1   =     "1"  
parametr_2   =     "2"  
my_table :   SetUpdateCallback   ( my_callback )
    
 И не надо огород городить.
Вы можете таким же образом передать и таблицу и все что хотите.

Не сочтите за наглость, Вы сами по поняли, что написали ?

1)Во первых даже если мы рассматриваем Lua - где тут передача параметров в функцию ? Я что спрашивал про глобальные параметры ? Почему вы вообще применяется к глобальным переменным термин "передать" ?? Это и так ГЛОБАЛЬНАЯ переменная.
2)Во вторых я четко спросил про Си, то есть, как это реализовать на Lua api в Си.

Будем откровенны - Вы написали очень глупую глупость :)
Я вам пояснил, что указанное вами решение - это нагромождение огорода - именно для луа.
---------------------
В подсмотренном но не понятом Вами варианте , параметры будут загружаться в стек луа вне функциию
------------------------------
В моем варианте параметры определены как upvalue и будут загружены в стек  луа внутри функции.
-----------------
Разница лишь в том, что ваш вариант содержит больше букв .
-----------------
Если Вы не поняли, то что я Вам написал, то нет смысла объяснять Вам как это делать на СИ.
Вы это тем более не поймете.
Шаг сетчика в операторе for, Некорректная работа оператора for при нецелочисленном шаге
 
например так:
for x=1,2.05,0.1 do  print("x="..x) end
------------
x=1.0
x=1.1
x=1.2
x=1.3
x=1.4
x=1.5
x=1.6
x=1.7
x=1.8
x=1.9
x=2.0
-----------------
Шаг сетчика в операторе for, Некорректная работа оператора for при нецелочисленном шаге
 
чтобы было  правильно ,
надо изменить границу цикла, чтобы результат проверялся не на равно.
как правило путем добавления половины шага
Шаг сетчика в операторе for, Некорректная работа оператора for при нецелочисленном шаге
 
вообще-то  ,
обычно в букварях по программированию предупреждают,
что не надо использовать точное сравнение для вещественных чисел.
чтобы не было мучительно больно.
Шаг сетчика в операторе for, Некорректная работа оператора for при нецелочисленном шаге
 
Цитата
BlaZed написал:
Сегодня столкнулся с некорректной работой оператора for, если задать не целочисленный шаг счетчика

Простой пример
Код
   for  x =  1 , 2 , 0.1   do 
  message ( "x="  .. x)
 end 
  
Логично ожидать перебор значений от 1 до 2 включительно с шагом 0.1
Однако перебор значений идет от 1 только до 1.9
В данном случае на последнем шаге получается x=2.0+8.8817841970013e-016  
Передать в SetUpdateCallback дополнительные параметры
 
Цитата
Quikos написал:
При вызове SetUpdateCallback по умолчанию передать туда доп. параметры нельзя:


Код
   function   my_callback_ (index)

 --index - индекс свечи в таблице my_table, НО сама таблица по умолчанию не приходит, что просто дикость. 

 end 


 local  my_table  =   CreateDataSource (code_class, code_paper_ interval)

my_table : SetUpdateCallback (my_callback_)  


Но, передать доп. параметры в callback - можно с помощью такой контракции, в данном случае я не знаю, что она означает на Lua, просто подсмотрел на данном форуме:

Код
   function   my_callback_ (my_table_, param1, param2, index)

 --Теперь тут доступны переданные дополнительные параметры...my_table_, param1, param2 - помимо стандартного index 

 end 


 local  my_table  =   CreateDataSource (code_class, code_paper_ interval)

parametr_1  =   "1" 
parametr_2  =   "2" 

my_table : SetUpdateCallback ( function (idx)my_callback_(my_table,parametr_1, parametr_2, idx)  end )  



И теперь параметры замечательно переданы в callback SetUpdateCallback.  И вот подскажите пожалуйста, а можно ли подобное провернуть в Си ??
Вы можете передать любые параметры в любую функцию через внешние для нее параметры
Это могут быть либо глобальные либо локальные параметры блока
Например в вашем случае делаем так:
Код
 local param1,param2;
-------------------------------------
function my_callback_ (index) 
--Теперь тут доступны внешние локальные параметры...my_table_, param1, param2 - помимо стандартного index
end
----------------
local my_table = CreateDataSource (code_class, code_paper_ interval)
parametr_1 = "1"
parametr_2 = "2"
my_table : SetUpdateCallback ( my_callback )
И не надо огород городить.
Вы можете таким же образом передать и таблицу и все что хотите.
Получение цены инструмента
 
Цитата
Kolossi написал:
Подскажите, есть ли возможность получения цены последней сделки по инструменту запросом с сервера не занося его в таблицу текущих торгов руками и не создавая всю базу через CreateDataSource ?
Можно.
Для этого Вам надо установить режим по подписке
и подписаться на нужные инструменты
В ТТТ ни руками ни ногами заносить инструмент не требуется.  
Предварительная проверка наличия в базе Quik инструмента (опциона), Subscribe_Level_II_Quotes и getParamEx не существующего опциона приводят к зависанию Quik
 
Цитата
Boris написал:
Периодически сервера Quik перестают транслировать данные по некоторым опционам.
Выглядит это так как опцион был и все его параметры транслировались, эти опционы постоянно мониторятся lua скриптом - который был запущен в тот момент когда опционы все ещё были живы.
В какой то момент некоторые дальние опционы "дохнут" (ещё до истечения по сроку) и исчезают из трансляции серверов Quik как доступные инструменты.

Если эти опционы находятся в таблице торгов то у них в таблице пропадают такие параметры как:
Спрос    Предл.    Цена послед.    Волатильность    Теор. цена

Вместо нулевых значений начинает отображаться пустое значение.

Если таблицу отредактировать и заново заполнить по фильтру - то эти опционы исчезают.

В итоге по DDE из указанной таблицы начинают транслироваться пустые значения - что приводит к зависанию DDE сервера - до тех пор пока сдохнувшие опционы не будут удалены из таблицы

В lua мониторятся стаканы этих опционов - запускается скрипт и формируется список для мониторинга в тот момент когда опцион ещё жив, но в тот момент когда опционы дохнут - попытка мониторинга приводит к зависанию Quik намертво (даже ошибок lua не показывает)

Подобная конструкция - для предварительной проверки успешности запроса getParamEx через параметр result - не помогает, скрипт всё равно вешает Quik.
Какие функции позволят заблаговременно отследить исчезновение инструмента из трансляции сервера Quik ?
Вы в своем вопросе написали ответ.
-----------------------
Если эти опционы находятся в таблице торгов то у них в таблице пропадают такие параметры как:
Спрос Предл. Цена послед. Волатильность Теор. цена

Вместо нулевых значений начинает отображаться пустое значение.
-----------------
вот это и нужно проверять.
Т е читайте любой из указанных параметров и проверяйте его на вшивость.
Поток в котором вызывается SetUpdateCallback, Поток в котором вызывается SetUpdateCallback
 
Цитата
Quikos написал:
В документации естественно таких данных нет, но может кто знает ?  Когда вызывается callback SetUpdateCallback от CreateDataSource - он вызывается всегда только в одном потоке, как в Lua, так и в С++ ?  Кстати интересен данный вопрос и касаемо функции OnQuote.  Вопрос естественно связан с синхронизацией доступа в случае - многотонной SetUpdateCallback .
Какая разница в каком потоке вызывается функция?
-------------------------
Полагаю Вы знаете, что любая библиотека dll хранится в памяти компа в единственном экземпляре
--------------------------------
Это значит, что все потоки, даже если их тысяча вызывают один и тот же код функции
-------------------
Важным моментом является какие данные изменяют эти потоки.
------------------
Именно обращение к данным надо синхронизировать, а не обращение к коду функций.
------------------
Уточните свой вопрос.
Вызвать Lua функцию из С++ c передачей callback`а, Вызвать Lua функцию из С++ c передачей callback`а
 
Цитата
Quikos написал:
Подскажите пожалуйста, есть ли пример, как вызывать функцию к примеру SetUpdateCallback с передачей в нее параметров ?  Ну то есть, вот аналог код в Lua:  
Код
   local  my_table_ =   CreateDataSource (code_class_, code_paper_, interval)

my_table_: SetUpdateCallback ( function (idx)my_callback_(my_table_, code_class_, code_paper_, interval)  end )
  
       
Код
   function   my_callback_ (my_table_, code_class, code_paper, interval)
 .. .код

 end   
 
Код
  //В L  -  на вершине стека уже находится таблица возвращенная  CreateDataSource .

lua_getfield(L,  -  1 ,  "SetUpdateCallback" );          //"Извлекаем" на вершину стека из  "таблицы"  функцию  SetUpdateCallback .  


Теперь нужно поместить в стек последовательно параметры функции SetUpdateCallback, но тут уже не могу понять:
- как поместить function(idx)
- как поместить my_callback_

Не могу понять, где должна быть объявлена моя функция callback ?


В Lua скрипте и тогда мне ее нужно просто получить через Lua_global или же в C++ ?
Не совсем понятно, что Вы не знаете -луа или библиотеку QLUA, поэтому поясняю оба момента.
----------------------------
см. документацию  луа:
----------------
Следующий пример показывает, как хост-программа может выполнять эквивалент этого кода Lua: a = f("как", т.x, 14)
Вот оно в C:
lua_getglobal(L, "f"); /* вызываемая функция */
lua_pushliteral(L, "как"); /* 1-й аргумент */
lua_getglobal(L, "t"); /* таблица, подлежащая индексации */
lua_getfield(L, -1, "x"); /* результат ввода t.x (2-й аргумент) */
lua_remove(L, -2); /* удалить 't' из стека */
lua_pushinteger(L, 14); /* 3-й аргумент */
lua_call(L, 3, 1); /* вызов 'f' с 3 аргументами и 1 результатом */
lua_setglobal(L, "a"); /* установить глобальный 'a' */
=================
см документацию библиотеки QLUA ,
-----------------
Формат функции обратного вызова:  function call_back(NUMBER index)
Пример получения времени из свечки:
function cb( index )   -- объявили колбек функцию
local t = ds:T(index)
end
------------------
SetUpdateCallback(ds,cb)   -- запихнули ссылку на нее в таблицу источника
===============================
если Вы пишите на Си то колбек объявляете на СИ,
но можете и на луа.
в любом случае это глобальная функция.
-----------------
ВСЕ функции библиотеки QLUA - глобальные.
-----------------------
вроде бы все понятно?
----------------------
попробуйте  написать, потом выложите и спросите что не так.
=================
QUIK съедает более 2 ГБ памяти вне зависимости от брокера.
 
Добрый день,
Периодически на форуме появляются душераздирающие вопли о том,
что мол у брокера .... QUIK съедает .. ГБ.
Попытка объяснить ,
что и как надо сделать наталкивается либо на вопли "мы все это знаем",
либо на рассуждения о том, что это не у любого брокера, а лишь у избранного.
----------------------
Полагаю, что проблема не в зеркале,
то есть не в брокере,
а как обычно, в отсутствии знаний у пользователя.
-----------------
Доказательство:
-------------------
брокер СБЕРБАНК.
Чтобы доказать, что брокер не виноват,
специально настроил QUIK так, чтобы получить наибольшую загрузку памяти для этого брокера.
---------------------------
Желающие могут получить и большую загрузку.
Я к этому не стремился, но знаю как это сделать.
-----------------
итак вот картинка результата сегодня:


а это результат обычной настройки

-----------------------------------------------
Успехов в борьбе за знания, т.е. за память.
Съедается оперативная память, Пустой запуск съедает 2ГБ памяти
 
Цитата
СергейК написал:
Цитата
nikolz написал:
как я понял у него объем потребления памяти уменьшился с 1800 Мб до 350 т е в 5 раз
У него ничего не уменьшилось:
Цитата
Дмитрий Б. написал:
Запустил пустой квик без вкладок и без любых котировок, всё отключил.  Изменений нет .
 
Цитата
Дмитрий Б. написал:
Эксперимент завершил. Отсутствие файлов dat не повлияло на память. Сегодня ВТБ обновил версию до 9.8.0.11. А  память забирают все столько же - 2Гб

И не путайте оперативную память и размер файла info.log на диске.
Квик ВТБ жрёт  памяти  2Г и больше, это показывает диспетчер задач.
180М (а не 1800!) и 350М - это размеры  файла   info.log !

Цитата
nikolz написал:
Как я понял Вы из тех кому важно все обосрать
Из тех, но с учётом того, что я никого не обсирал, они существуют только в вашем воображении.  
СергейК,
Был неправ. Приношу извинения.
getCandlesByIndex в индикаторе, getCandlesByIndex в индикаторе
 
Konstantin777,
Скажите, что не так в картинках ниже:
это исходное


это изменили инструмент через легенду в окне

это изменили интервал

Все верно?
getCandlesByIndex в индикаторе, getCandlesByIndex в индикаторе
 
если изменять инструмент через меню, то надо изменить инструмент и в индикаторе.
тогда все работает.
--------------------
Резюме:
Изменение данных в индикаторе будет происходить:
1) при изменении тайма
2) при изменении инструмента якорем
3) при изменении инструмента через меню в окне и в индикаторе
4)  Можно сделать изменение инструмента через меню лишь в окне, но тогда изменение в индикаторе можно сделать лишь на следующей обезличенной сделке.
Konstantin777,
Какой из этих 4 вариантов или иной Вам нужен?
getCandlesByIndex в индикаторе, getCandlesByIndex в индикаторе
 
Konstantin777,,
Как Вы изменяете инструмент?
------------------
Дело в том, что если Вы изменяете интервал или инструмент с помощью якоря, то эти изменения приводят к пересчету индикатора
--------------------
Но если инструмент заменяется через меню окна, то индикатор не пересчитывается.
getCandlesByIndex в индикаторе, getCandlesByIndex в индикаторе
 
Konstantin777,
Я не понял, зачем Вам два окна с двумя инструментами.
Напишите подробнее, что Вы хотите сделать.
Возможно есть решение именно того, что хотите , но пока я не понимаю в чем смысл двух инструментов и
наблюдение трех первых и трех последних, если это не арбитраж.
----------------------  
Можно решить задачу многими способами.
В первом приближении выбранный вами неудачный.
getCandlesByIndex в индикаторе, getCandlesByIndex в индикаторе
 
вариант при котором индикатор работает при смене инструмента, если включить якорь
но при этом смена происходит и во всех окнах и название индикатора тоже изменяется


 
getCandlesByIndex в индикаторе, getCandlesByIndex в индикаторе
 
Тот факт что индикатор остается привязанный к первоначальному инструменту косвенно подтверждает название окна индикатора
если его поместить в третье окно
На картинке
индикатор помещен первоначально  со Сбербанком
После смены инструмента название окна индикатора не меняется

 
getCandlesByIndex в индикаторе, getCandlesByIndex в индикаторе
 
Цитата
но он отображает 0, а не данные предыдущего инструмента
Если индикатор написан правильно, то отображает предыдущее значение а не ноль
 
Съедается оперативная память, Пустой запуск съедает 2ГБ памяти
 
Цитата
СергейК написал:
Цитата
nikolz написал:
Выкладываю картинки с настройками
Тут ничего особенного нет, у меня всё приблизительно так же.
И даже если бы дело было в настройках, проблема была бы и раньше, а она в ВТБ появилась только недавно в сентябре.
А советы ваши давно описаны в начальных постах по теме и все давно испробованы, не работает ничего
Вообще-то я Дмитрию помогаю,
как я понял у него объем потребления памяти уменьшился с 1800 Мб до 350 т е в 5 раз.
-----------
Вам я советов не давал, и тем более не спрашивал вашего мнения.
Как я понял Вы из тех кому важно все обосрать.  
Не исполняется ордер на валютной секции
 
Цитата
Михаил Филимонов написал:
Кто-нибудь торгует на Валютной секции на Едином брокерском счете в Открывашке через TRANS2QUIK  API ?  
Вы зря полезли в  TRANS2QUIK API. это такое старье.
появилось еще задолго до встраивания VMLua в QUIK.
------------------------
переходите на LUA - чем раньше сделаете, тем меньше будет проблем.
---------------------------
"Ох, нелегкая это работа -Из болота тащить бегемота!"
getCandlesByIndex в индикаторе, getCandlesByIndex в индикаторе
 
Konstantin777,
Объясняю вам, почему  данные не изменяются при смене инструмента.
-------------
Проблема в том, что индикатор использует данные инструмента, который отображен перед  загрузкой индикатора на график,
т е при начальной инициализации индикатора в нем сохраняется указатель на архив данных инструмента.
----------------
Когда Вы изменяете инструмент на графике, то в индикаторе остается указатель на прежний инструмент.
Поэтому он продолжает отображать данные первоначального инструмента.
--------------
Поэтому для смены инструмента в индикаторе при смене его на графике Вам надо обеспечить отслеживание этой замены в индикаторе
и при обнаружении замены изменить источник данных для индикатора.
---------------
Полагаю, что это можно сделать задействовав функции создания источника данных.
Но помогать Вам я не буду, нет желания.
Съедается оперативная память, Пустой запуск съедает 2ГБ памяти
 
Цитата
Дмитрий Б. написал:
Цитата
СергейК написал:
 
Цитата
nikolz  написал:
сохраняли историю многих параметров
 Это где настраивается?
350Мб пока самое большое.
Выкладываю картинки с настройками
Так как не знаю как у Вас настроено.
Установите как на них. Потом, если что-то не хватит выложу еще.






Потом удалите все log и data и содержимое arxive и снова подключитесь к серверу.
Надеюсь, что станет еще лучше.
getCandlesByIndex в индикаторе, getCandlesByIndex в индикаторе
 
Цитата
Konstantin777 написал:
Цитата
Konstantin777 написал:
я не понимаю чем Ваш пример от моего отличается.
понял, у Вас getCandlesByIndex вызывается в OnCalculate, а моем примере в Init. Однако  
Цитата
Konstantin777 написал:
Я также тестировал пример с постоянными попытками забора значений свечей(как первых так и последних), и он также криво работает, тупо не видит цены, ни одной, однако если переставить индикатор все идет как по маслу.
я такой же пример сам писал, и все так же плохо работает
Странный Вы человек.
Вместо того, чтобы задавать вопросы и высказывать недовольство,
просто надо было бы привести результат теста, а не рассказывать мне что вы делали что-то не работающее.
Я же не должен за вас все проверять,
написал же вам выше , проверьте если что не так напишите поправлю.
Но в любом случае Я делаю это если у меня есть желание Вам помогать.
Съедается оперативная память, Пустой запуск съедает 2ГБ памяти
 
еще заметил, что у ВТБ все файлы с расширением dat почему-то 65536 байт т е 2 в 16 степени, а у меня т е сбербанка есть и 1024 байта.
------------------
Если вы не удаляли эти файлы как я писал ранее, то удалите их тоже.
Съедается оперативная память, Пустой запуск съедает 2ГБ памяти
 
Рекомендую в дальнейшем их не сохранять, будет память как у меня.
Страницы: Пред. 1 ... 29 30 31 32 33 34 35 36 37 38 39 ... 79 След.
Наверх