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

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

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 64 След.
примеры колбеков
 
Написал  изучающим Lua примеры вариантов колбеков сделок, заявок и стоп-заявок.
----------------------
Примеры написаны специально для форума и не тестировались, а лишь проверены на синтаксис.
---------------------------
Поэтому, если есть желающие тестить и найдете ошибки, то пишите, исправим вместе.
--------------
В этих колбеках сделки, активные заявки и активные стоп заявки размещаются в соответствующие инструментам рабочие таблицы.
--------------------------------
Код
--таблицы
TRADE={}; -- индексы сделок по инструментам
ORDER={}; -- индексы активных заявок по инструментам
STOP={}; -- индексы активных стоп-заявок по инструментам

function OnTrade(tr)
  local n,m;local sec=tr.sec_code;
  local t=TRADE[sec]; --таблица номеров строк сделок в таблице QUIK инструмента sec
  if t then
   m=TRADE[0]; n=t[0];
 else                --создание таблицы инструмента
   m=getNumberOf("trades"); n=0;
   t=SearchItems("trades",n,m-1, function(p1) if p1==sec then return true;end return false; end,"sec_code")
   TRADE[sec]=t;
end
 if m>t[n] then n=n+1; t[n]=m;  t[0]=n; TRADE[0]=m+1; end
end

local function fOrder(tr,T,s)  --функция обработки для колбеков orders и stop_orders
  local n,m,x;local sec=tr.sec_code; local t=T[sec];  --таблица номеров строк в таблице QUIK активных ордеров или стоп_ордеров инструмента sec
  local flag=tr.flags&1; local num=tr.order_num;
  if t then
    m=T[0]; n=t[0];
   for i=1,n do x=getItem(s,i-1);
      if x.num_order==num then
         if flag==0 then n=n-1;if n>0 then t[i]=t[n]; end break; else return; end
      end
   end
 else                --создание таблицы инструмента
   m=getNumberOf(s); n=0;
   t=SearchItems(s,n,m-1, function(p1,p2) if p1==sec and p2&1==1 then return true;end return false; end,"sec_code,flags")
   T[sec]=t;
end
   if flags==1 then n=n+1; t[0]=n; t[n]=m; T[0]=m+1; end
end

function OnOrder(t)   fOrder(t,ORDER,"orders");  end
function OnStopOrder(t) fOrder(t,ORDER,"stop_orders"); end
 
В чём преимущество OnInit
 
Цитата
VPM написал:
Но все ругают колбеки чего ждать от них не понятно,
Так как не только использую все колбеки QLua, но и пишу свои дополнительные колбеки для скриптов Lua,
то попробую объяснить что это за зверь.
-------------------
колбек - это обычная глобальная функция на Lua (можно и на C), но с конкретным именем.
---------------------
В терминале QUIK , при обработке полученных данных с сервера, перед тем как отправить данные в таблицы терминала,
делается вызов функции Lua с именем колбека и ей передаются данные.
--------------------------
Если такой функции нет, то ее нет в глобальном стеке Lua и ее вызов пропускается.
===================
Резюме:   Если Вы ругаете колбеки, то Вы ругаете "чистое" Lua, так как колбек -это функция на чистом луа.
-------------
Колбеки обычно ругают те, кто  луа не изучил толком и в функциях QLUA не разобрался.
---------------
Но зеркало не виновато, в том ...
Заявки.
 
это Вы про метатрейдер намекаете?
В чём преимущество OnInit
 
пардон опечатка
Вот вам пример преимущества перед чистым LUA
В чём преимущество OnInit
 
относительно не использования библиотек C..
==================
Вот вам пример преимущества перед чистым СИ
---------------------
Вы в срипте как курица с яйцом носитесь с sleep в main,  Много поставите - раздуете  стек или очередь
мало поставите - лишняя пустая загрузка ядра процессора.
-----------------
Делаем библиотеку на си для работы с событиями.
В итоге поток main вызывается максимально быстро (примерно за 0.000001 сек) если надо и не вызывается никогда, если не надо.
sleep вообще не нужен.
-------------
И много чего еще можно сделать на СИ, например библиотека QLUA - вся исключительно на СИ или C++.
В чём преимущество OnInit
 
Цитата
TGB написал:
Цитата
    Не надо бегать по таблице сделок. Достаточно сохранять ее размер и только если он изменился, читать только новые записи.
колбек дает сигнал, когда размер таблицы изменится.
Поэтому с колбеком даже не надо проверять размер таблицы.
--------------------------------
Более того, можно в колбеке не разбирать таблицу на составляющие , а запоминать последний номер.
В итоге в колбеке все будет очень просто и при этом не будет проблем с уборщиком мусора.
Как запустить скрипт qlua из командной строки?
 
технически сделать так можно.
--------------------
Но поясню что не так в вашем понимании.
-------------------------
скрипт луа выполняет виртуальная машина луа ,если знаете есть виртуальная машина джава и еще куча виртуальных машин для других языков программирования.
виртуальная машина - это программная реализация некоторого вычислительного устройства.
У него своя система команд, свои регистры и свой процессор, не такой как тот, на котором исполняется эта программа.  
----------------
В программе КВИК запущена программа VMLua.
VMLua работает сама по себе, исполняя загружаемые в нее скрипты.
Т е разработчики КВИК не разрабатывали VMLua,
а взяли готовый код и запустили его внутри своей программы.
---
В нее можно грузить любой скрипт на луа и она будет его исполнять.
-------------
Чтобы передать VMLua данные из терминала QUIK, разработчики написали библиотеку QLUA на СИ и таким образом организовали обмен информацией между двумя процессами , один из которых на VMLua.
------------
Запуск скрипта для исполнения в VMLua осуществляем в соответствующем окне терминала QUIK.
==============
Ччтобы делать это автоматом надо  написать соответствующий скрипт для виртуальной машины либо для планировщика задач с использованием библиотеки функций манипуляции с экраном. В скриптах это делается хуками.  Я делал это на AutoIt.
===============
Но прикол в том, что разработчики встроили блокировку в новые версии QUIK,
которая  не позволяет работать с отладчиками.
Индикатор MACD настройки оформления и отображения графика, Две скользящие средние в индикаторе MACD отображаются не как две линии, а как одна линия и гистограмма в место второй линии
 
Вот так у Вас?

а надо так?

делается так:

 
В чём преимущество OnInit
 
Прикольно, буря в стакане.
Казалось бы все просто.
Сам вопрос темы не корректный
спросили " в чем преимущество OnInit" , но забыли указать с чем сравнивать.
Написал три возможных варианта
Касалось бы все ясно.
Если ты чайник в программировании, то делай как рекомендуют разработчики КВИК и спи спокойно.
Нет, начинается треп а зачем, а мне насрать, а че это за такие преимущества и бла-бла бла.
В чём преимущество OnInit
 
Цитата
swerg написал:
Цитата
Но вот чтобы узнать какие callback-функции в скрипте определены - QUIK (да и  вообще Lua) вынужден весь скрипт полностью выполнить, это определит для Lua имеющиеся в скрипте функции, про них станет известно.
Вы уверены в тот, что для нахождения всех колбек надо выполнить скрипт.
---------------
Не знаю как реализовали разработчики, но полагаю, что это не обязательно делать.
Определение существующих колбеков можно делать либо один раз после загрузки скрипта и формировать специальную таблицу указателей (давно это тестил и вроде бы пришел к такой схеме)
Но можно это делать налету при приходе соответствующих данных в терминал.
----------------
Относительно Вашего замечание "делайте как нравится"
Я привел ранее аналогию перекрестка. Можно ходить на зеленый, а можно - как нравиться - с закрытыми глазами.  Если потом откроите и поймете, что в больнице, ну тогда будете ходить по правилам. Но может Вам и повезет.  
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Применительно к скриптам в которых ставите в main sleep(500)
либо создаете очередь,
либо пропускаете данные и потом хвалитесь на форуме,
что вы самый лучший алгоритмист, та как Вам на все на...ть.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Очередь не связана с передачей данных потокам или еще куда-нибудь.
-----------------------
Очередь связана лишь с обработкой данных в реальном времени.
------------------------
Реальное время - это время за которое Вы обрабатываете очередную порцию данных.
-----------------
И если Вы не успеваете обработать эту порцию до прихода новой, то возникает очередь.
------------------
Поэтому и имеет значение как быстро Вы можете обрабатывать данные.
===============
И если кто-то говорит что он может обрабатывать тысячи данных, и при этом обрабатывает их по таймеру через 0.5 секунды,
то это значит , что тысячный элемент он обработает лишь через 9 минут ,
следовательно интервал обработки нового значения первого элемента будет не 0.5 сек, а 500 секунд,
так как все элементы будут стоить в очереди.
 
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
Владимир,  Добрый день!

Системная математика  видимо имеется в виду QUIK, но основную лепту вносит биржа.
ARQA Technologies декларирует что дают то и передаем.

Согласен с Вами реализация мягко говоря не "кудышняя", одно пустое обновление версий чего стоит (windows уже отстал).
Но  QUIK старая система писалась еще для сибирской биржи, вот и латают как могут.

Язык бессмысленно ругать другого нет. Я люблю луа - чтоб делал без него (Qpile).

Какие из торговых алгоритмов применять дело индивидуальное. Я люблю солянку.

Событие не включать имеет мин. риск.

Но мы ведь обсуждаем Вкл. Чтоб сделку совершил, вел ее по установленным правилам RM MM  и желательно закрыл в +.
Да еще при всем этом желательно чтоб терминал не падал  ::

Ну а если серьезно посмотрите TradingVieW современная более серьезная разработка со своим языком, да и профи привлекают.
Правда брокер на ММВБ один Алор.

с уважением, VPM
Напоминает басню Эзопа "Лиса и виноград"
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
изначально этот код выложен здесь:
http://www.lua.org/pil/11.4.html
Ему в обед 20 лет.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
этому коду в обед 12 лет
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
Всем Добрый день!

Уж коль тема называется  Программирование на языке Lua , обращусь к профи за пояснениями.

Взят Пример из книги Р.Е.

------ Очереди и двойные очереди

"Простейшим способом реализации очередей в Lua является использование функций ins ert и remove из библиотеки table.
Эти функции вставляют и удаляют элементы из произвольной позиции массива, сдвигая остальные элементы для согласования действий.
Однако, подобные перемещения могут быть дорогими для больших структур.

Более эффективная реализация использует две индекса, один для первого элемента и один для последнего:

function ListNew () return {first = 0, last = -1} end

Во избежание загрязнения глобального пространства имен мы
определим все операции со списком внутри таблицы, которую мы соответственно назовем List
(таким образом, мы создадим модуль)."

Код
      local  List  =  {};
 function   List.new ()
     return  {first  =   0 , last  =   -  1 }
 end 
 --Теперь мы можем вставлять и удалять элементы с обоих концов за постоянное время: 
 function  List.pushfirst (list, value)
    local  first  =  list.first  -   1 
   list.first  =  first
   list[first]  =  value
 end 
 function  List.pushlast (list, value)
    local  last  =  list.last  +   1 ;
   list.last  =  last;
   list[last]  =  value;
    --message('List.pushlast: ' ..'; '..tostring(last)..'; '.. tostring(value.price)..'; '.. tostring(value.qty)) 
 end 
 function  List.popfirst (list)
    local  first  =  list.first;
    if  first  >  list.last  then  
    --error("list is empty")  
    return   nil 
    end 
    local  value  =  list[first]
   list[first]  =   nil   -- чтобы разрешить сборку мусора 
   list.first  =  first  +   1 
    return  value
 end 
 function  List.poplast (list)
    local  last  =  list.last
    if  list.first  >  last  then  error( "list is empty" )  end 
    local  value  =  list[last]
   list[last]  =   nil   -- чтобы разрешить сборку мусора 
   list.last  =  last  -   1 
    return  val ue
 end 
 
  
Если вы будете использовать эту структуру для обслуживания в порядке поступления, вызывая только pushlast и popfirst,
то и first, и last будут постоянно расти.

Однако, так как мы представляем массивы в Lua при помощи таблиц,
вы можете индексировать их как с 1 до 20, так и с 16 777 216 до 16 777 236.

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

-----------------------------------------------------------------------

Реализовал у себя для обработки  OnAllTrade:

Создаем т.  list
local list=List.new()

Получаю, сохраняю list и уматываю.
function OnAllTrade(at)
   if is_run and at and at.sec_code==symbol and at.class_code==class then
   List.pushlast(list, at);
end

Получаю из  list строку для обработки.
function AllTrade()
   at = List.popfirst(list);
end

Все инструмента нормально для обработки одного инструмента,  но в процессе работы скрипт накапливает память.

Вопрос к Профи, как нужно сделать чтоб максимально быстро обрабатывалась и очищалась очередь?
Кто то может пример показать.
Вы забыли дать ссылку, откуда Вы скопировали этот код.
https://stackoverflow.com/questions/18843610/fast-implementation-of-queues-in-lua

,
В чём преимущество OnInit
 
Цитата
VPM написал:
Оказывается nil запускает сборщик.
Вы где это прочитали?
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
пардон, опечатка
1) запись X в стек:     t[#t+1]=X
2) выталкивание из стека:   X=t[#t],  t[#t]=nil
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Применительно к скриптам на луа стек реализуется гораздо проще, чем Вы написали.
Алгоритм такой
1) запись X в стек:     t[#t+1]=X
2) выталкивание из стека:   X=t[#t],  #t=nil
-----------------
Для указатель стека можно использовать значение таблицы с индексом 0.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Возможно ошибаюсь,
но Вы реализовали очередь по принципу LIFO - это стек,
но классическая очередь ( "кто последний", не "последний", а "крайний")  это принцип FIFO, на пример которой Вы сослались   Программирование на языке Lua,
-----------------
Т е Вы просто вместо очереди из книги делаете стек - совершенно другую организацию очереди.
Ваша реализация - это тоже классика реализации стека.
Некорректность вывода по DDE, При выводе по DDE не совпадают данные в таблице ТТС и в таблице вывода - почему?
 
Цитата
sandyman написал:
Добрый день,

При выводе по DDE не совпадают данные в таблице ТТС и в таблице вывода - почему?
Причём это не похоже на какую-то задержку - данные постоянно не совпадают...

[img]data:image/png;base64, *[/img]
Попробуйте отключить все фильтры в таблице. Фильтры таблицы не действуют на вывод по DDE  
В чём преимущество OnInit
 
QUIK создает 7 потоков.  
Скрипты  -запускают  main в следующих по очереди потоки.
В чём преимущество OnInit
 
Объясняю, тем кто не понял.
--------------
Если у Вас скрипт запускается одновременно с запуском QUIK,
то нет особой разницы, где Вы устанавливаете и загружаете
начальные параметры  скрипта.  
-------------------------
Но если Вы запускаете скрипт при работающем QUIK, т е в реальном времени торговли,
то возможны следующие последствия в зависимости
от места , где вы устанавливаете переменные.
Рассмотрим эти варианты:
------------------
1) В начале скрипта присваиваем значения.
В этом случае присвоение происходит до полной загрузки скрипта и запуска функции main.
присвоение произойдет лишь при загрузке скрипта.
При этом могут быть еще не определены Ваши функции, которые Вы используете для назначения параметров.
-------------------
2) В начале функции main
В этом случае весь скрипт уже загружен и все функции определены.
Но так как main - это отдельный поток, то при длительной процедуре инициализации переменных могут поступить данные по колбекам
и эти данные могут оказать влияние на установку переменных.
Вот пример  теста main c установкой параметров:
Код
local beg=os.clock();
local x={}
local function sig(i)   return i end
function main()
      Log:write("main начинаем устанавливать начальные значения"..os.clock()-beg.."\n"); --Log:flush();
   for i=1,10000 do x[i]=math.sin(i); Log2:write("X="..x[i].."\n"); Log2:flush();
   end;
         Log:write("закончили установку нач значений\n"); Log:flush();
    while true do
--       nkevent.wait(event); --ждем события
      Log:write("main основной цикл="..os.clock()-beg.."\n"); Log:flush();
      sleep(10);
   end
end
а вот результат работы этого скрипта с колбеками
Код
OnI nit=0.0
main начинаем устанавливать начальные значения0.0010000000002037
On All=0.0020000000004075
On All=0.0020000000004075
On All=0.0020000000004075
...
On All=0.0060000000003129
On All=0.0060000000003129
On All=0.0060000000003129
...
On All=0.029999999999745
On All=0.029999999999745
On All=0.029999999999745
On All=0.029999999999745
On All=0.029999999999745
On All=0.029999999999745
закончили установку нач значений
main основной цикл=0.029999999999745
On All=0.029999999999745
On All=0.029999999999745
On All=0.029999999999745
Внутри цикла установки параметров в функции main вызывается колбек OnAllTrade в основном потоке .
----------------------
3) Установка параметров в колбеке OnInit()
это самый безопасный и предсказуемый способ установки.
OnInit вызывается ,когда весь скрипт загружен и определены все наши функции.
OnInit  вызывается в основном потоке, когда поток main еще не запущен.
Так как все колбеки вызываются в основном потоке, то они не могут быть вызваны пока OnInit не завершит работу.
===================
Т е все переменные будут определены и загружены без каких-либо неожиданностей.
====================
Приведу для наглядности аналогию.
На перекрестке есть светофор.
Особо буйные могут ходить через перекресток не взирая на сигналы светофора.
Особо продвинутые могут даже ходить с закрытыми глазами.
Особо осторожные будут ходить лишь на зеленый.
---------------------
Выбор за Вами.
В чём преимущество OnInit
 
Код
OnI nit=0.0
main=0.0
OnPa ram=0.072999999999979
OnPa ram=0.072999999999979
OnPa ram=0.072999999999979
OnPa ram=0.072999999999979
OnPa ram=0.073999999999984
OnQu ote=0.074999999999989
OnPa ram=0.074999999999989
OnPa ram=0.074999999999989
OnPa ram=0.074999999999989
OnPa ram=0.074999999999989
main=0.114
OnPa ram=0.17699999999999
OnPa ram=0.17699999999999
main=0.22299999999998
OnPa ram=0.31699999999998
main=0.333
OnPa ram=0.41199999999998
main=0.441
OnPa ram=0.517
OnPa ram=0.517
OnPa ram=0.517
main=0.54999999999998
OnQu ote=0.61199999999999
OnPa ram=0.61199999999999
OnPa ram=0.61199999999999
OnPa ram=0.61199999999999
main=0.65899999999999
main=0.76899999999998
OnPa ram=0.81699999999998
OnPa ram=0.81699999999998
OnPa ram=0.81699999999998
Индикатор на lua, получить значения High и Low дневных баров в индикатор
 
Читайте документацию на .библиотеку QLua.
там все есть.
или Вам надо номер страницы каждый раз называть?
Индикатор на lua, Значение индикатора не меняется при смене инструмента
 
ставьте вывод в лог файл и отлаживайте свой скрипт.
Я вам написал что не так.
Но как Вам надо знаете лишь Вы. Никто за Вас делать не будет.
--------------------------
Рекомендую изучить документацию на библиотеку QLua и программирование на Lua
Там есть функции которые Вам надо применить.
Индикатор на lua, Значение индикатора не меняется при смене инструмента
 
Цитата
Энн написал:
Цитата
nikolz написал:
У Вас значения вычисляются лишь один раз при запуске скрипта
Чтобы значение пересчитывалось надо вычисления поместить в функцию OnCalculate
Попробуйте так:  
Код
      function    Init ()
  return     1  
  end  

  function    OnCalculate (index)
x   =     getNumCandles  (  'ACTIVE'  )   -- расчет количества баров на дневном графике с идентификатором "ACTIVE"  
ACTIVE, ACTIVE_N, ACTIVE_Name   =     getCandlesByIndex  (  'ACTIVE'  ,   0  ,   0  , x)   -- поиск параметров конкретного бара на дневном графике с идентификатором "ACTIVE"  
L1_ACTIVE   =   ACTIVE[ACTIVE_N  -    2  ].low   -- low -1 бара  
  return   L1_ACTIVE   -- вывожу искомое значение  
  end  
   
 
Спустя время квик выдает 17 тысяч оповещений.

C:\QuikFinam\LuaIndicators\aaa.lua:19: attempt to index a nil value (field '?')
в 19 строке параметр не определен. Ищите в своем коде 19 строку и проверяйте что там. 17 тысяч - это число рпз вызова OnCalculate
Если Вам не надо обрабатывать все свечи ( в вашем случае это так то попробуйте так
Код
 function   OnCalculate (index)
if index==1 then
x  =   getNumCandles ( 'ACTIVE' )  -- расчет количества баров на дневном графике с идентификатором "ACTIVE" 
ACTIVE, ACTIVE_N, ACTIVE_Name  =   getCandlesByIndex ( 'ACTIVE' ,  0 ,  0 , x)  -- поиск параметров конкретного бара на дневном графике с идентификатором "ACTIVE" 
L1_ACTIVE  =  ACTIVE[ACTIVE_N -  2 ].low  -- low -1 бара 
end
 return  L1_ACTIVE  -- вывожу искомое значение 
 end 
Индикатор на lua, Значение индикатора не меняется при смене инструмента
 
У Вас значения вычисляются лишь один раз при запуске скрипта
Чтобы значение пересчитывалось надо вычисления поместить в функцию OnCalculate
Попробуйте так:
Код
function Init()
return 1
end

function OnCalculate(index)
x = getNumCandles('ACTIVE') -- расчет количества баров на дневном графике с идентификатором "ACTIVE"
ACTIVE, ACTIVE_N, ACTIVE_Name = getCandlesByIndex('ACTIVE', 0, 0, x) -- поиск параметров конкретного бара на дневном графике с идентификатором "ACTIVE"
L1_ACTIVE = ACTIVE[ACTIVE_N-2].low -- low -1 бара
return L1_ACTIVE -- вывожу искомое значение
end
В чём преимущество OnInit
 
вообще-то ответ есть в документации:
-------------
OnInit   Функция вызывается терминалом QUIK перед вызовом функции main(). В качестве  параметра принимает значение полного пути к запускаемому скрипту.

Формат вызова:  

OnInit(STRING script_path)



В данной функции пользователь имеет возможность инициализировать все
необходимые переменные и библиотеки перед запуском основного потока main().  
В чём преимущество OnInit
 
в итоге если вы параметры торговли определяете в main, то колбеки начнут работу без параметров и могут такого вам наторговать, что будет мучительно стыдно за такой скрипт.  
В чём преимущество OnInit
 
Цитата
Ziveleos написал:
Всё же, хотелось бы получить комментарий разработчика, в чем сакральный смысл функции OnInit?
В том, что это этот колбек вызывается раньше всех других колбеков и раньше функции main.
Без него у Вас колбеки будут вызываться раньше, чем будет вызвана функция main.
Интервалы CreateDataSource
 
Цитата
Sergey Gorokhov написал:
Цитата
nikolz написал:
Cвечи формирует сервер биржи, а не QUIK.
То, что Вам нужно биржа не формирует.
Это не так.
Cвечи формирует сервер QUIK, а не биржа.
Но свечи формируются по сделкам полученным с биржи.
то-то я не мог понять, почему у вас открытие свечи для ликвидной бумаги сбербанк запаздывают от времени биржи иногда до 10 секунд. А это сервер QUIK такой тормазнутый.
Интервалы CreateDataSource
 
Cвечи формирует сервер биржи, а не QUIK.
То, что Вам нужно биржа не формирует.
Работа нескольких скриптов с одним файлом, Выдает периодически ошибку при работе нескольких скриптов с одним файлом
 
Цитата
Дмитрий написал:
Hазобрался, настроил, вроде работает как надо. спасибо.
Последний вопрос для закрепления материала )))
а вот эта запись " Log:flush() " - что означает в вашем примере записи в Log ?
Log - это имя файла моего - я вам дал пример строки из своего скрипта.
flush() -  записать данных в файл, иначе они запишутся в память, а в файл лишь после того ,как накопятся в памяти.  .
Работа нескольких скриптов с одним файлом, Выдает периодически ошибку при работе нескольких скриптов с одним файлом
 
Цитата
Дмитрий написал:
Цитата
nikolz написал:
У меня один лог файл. В него пишут разные потоки. Так как я могу создавать любое число потоков и Lua машин, то мне нет надобности создавать еще какие-то скрипты.  Но мой вариант работы эквивалентен вашему варианту с двумя скриптами.У меня проблемы запись в этот  файл.  Попробуйте открывать файлы один раз с дозаписью и завершать запись принудительной записью в файл.типа так: Log:write(os.date()..","..tostring(s)..",num="..tostring(num)..","..tostring(count).."\n"); Log:flush();
Вот это, наверное, то, что нужно, только я не понял всю конструкцию - как открыть один раз и потом дописывать? т.е. просто у вас один раз в начале открыт Log = io.open('...', 'a'), а потом уже без открытия просто по ходу вставляете Log:write(os.date()..' и так дает дописывать?
p.s. я кажется свою проблему понял, у меня не второй скрипт конфликтил с первым, у меня в первом колбеки могли при стечении обстоятельств писать "логи" одновременно с main(), а так как я постоянно "io.open" и "close' при каждой записи - получалась коллизия, а если буду держать файл открытым, то будут писать оба без ругани, получается. Так?
Если надо не только передавать но и обмениваться, то проще  открыть каждому скрипту свой файл для передачи данных другим с ключом "w".
Файлы других скриптов открываете с ключом "r"
Работа нескольких скриптов с одним файлом, Выдает периодически ошибку при работе нескольких скриптов с одним файлом
 
опечатка:
У меня проблемы запись в этот  файл нет .  
Работа нескольких скриптов с одним файлом, Выдает периодически ошибку при работе нескольких скриптов с одним файлом
 
Цитата
Дмитрий написал:
В моей ситуации, я так понимаю, это не поможет. У меня 2 скрипта иногда открывают один и тот же файл (мне надо иметь общий файл, а одновременное открытие - совпадение, которое
надо как-то нейтрально обходить), а потом кто-то его первый закрывает, а второй при попытке закрыть еще раз выдает ошибку. Я так это вижу исходя из того, что именно на FileWrite:close() в первом скрипте происходит ошибка (во втором скрипте открывает на чтение и отрабатывает быстрее - там никогда ошибку не выдает - я там вообще только первую строку читаю, больше не надо).
Отсюда вопрос: а как-то статус, что файл стал "close" можно получить запросом? пытался выводить значение переменной "FileWrite" через "tostring", чтоб по нему как-то зацепиться, но выдает какой-то буквенно-цифровой код, описание структуры которого в инете найти не смог.
У меня один лог файл. В него пишут разные потоки. Так как я могу создавать любое число потоков и Lua машин, то мне нет надобности создавать еще какие-то скрипты.  Но мой вариант работы эквивалентен вашему варианту с двумя скриптами.
У меня проблемы запись в этот  файл.  
Попробуйте открывать файлы один раз с дозаписью и завершать запись принудительной записью в файл.
типа так:
Log:write(os.date()..","..tostring(s)..",num="..tostring(num)..","..tostring(count).."\n"); Log:flush();
Работа нескольких скриптов с одним файлом, Выдает периодически ошибку при работе нескольких скриптов с одним файлом
 
Цитата
Дмитрий написал:
"либо писать метку в строку и искать эту метку" - а это как работает?
скрипт открывает файл на дозапись и пишет лог файл. каждая запись содержит метку времени  .
другой скрипт открывает файл на чтение и читает этот файл по строкам.
Время в метке сравнивает с текущим временем и читает строки, время которых больше.  
Работа нескольких скриптов с одним файлом, Выдает периодически ошибку при работе нескольких скриптов с одним файлом
 
Цитата
Дмитрий написал:
И что-то такая конструкция работает не правильно, теперь у меня файл до остановки скрипта пустой. Наверное, скрипт держит его открытым и не фиксирует запись.
Если хотите передавать данные через файл, то надо делать один из следующих алгоритмов:
либо контролировать момент изменения файла,
либо уничтожать его после чтения
либо делать уникальное имя
либо писать метку в строку и искать эту метку.
Работа нескольких скриптов с одним файлом, Выдает периодически ошибку при работе нескольких скриптов с одним файлом
 
Цитата
Дмитрий написал:
Спасибо. А вы не могли бы в 2-х словах пояснить как работает условие без значения, ну т.е. я понимаю когда, например " if Filewrite == nil then ... ", а что значит переменная без сравнения в  конструкции " if Filewrite then ..." ?  
оператор if   исполняется если следующее выражение true.
если  File  что-то присвоено, то это true.  
Работа нескольких скриптов с одним файлом, Выдает периодически ошибку при работе нескольких скриптов с одним файлом
 
Цитата
Дмитрий написал:
function mark_Fail (zap, mark) - моя функция записи в файл FileWrite = io.open('D:\\QLUA\\fails\\mark.txt', zap) FileWrite:write(mark)  FileWrite:close()end
попробуйте так:
Код
function mark_Fail (zap, mark) - моя функция записи в файл
FileWrite = io.open('D:\\QLUA\\fails\\mark.txt', zap)
FileWrite:write(mark)
if Filewrite then FileWrite:close() end
end
Дельта - хеджер, Буду рад комментариям по коду
 
В  QPile есть три существенных недостатка.
1) интерпретатор - медленно интерпретирует
2) ограничение на количество переменных
3) скрипт работает по тайиеру, а не по событиям торгов.
Равнение на "Яндекс"!!!
 
«Яндекс» увеличил фонд своей программы багбаунти «Охота за ошибками» в 2023 году в 2 раза до 100 млн рублей. В 2022 году компания выплатила белым хакерам 39,7 млн рублей за нахождение уязвимостей и багов в своих сервисах и службах.
Функция CreateDataSource никогда не возвращает ошибку, И это создаёт большие проблемы при разработке. В неё можно запихнуть любой мусор, и она скажет: "Всё отлично".
 
Цитата
paluke написал:
Брокер же получает данные с биржи. Я не знаю, как оно там внутри устроено, но вполне возможно, что если вы первый клиент, подписывающийся на какой-то инструмент, то именно в этот момент и будет отправлен запрос на биржу. А вот есть ли в биржевых протоколах (plaza, fix/fast) возможность узнать, придут ли вообще данные?
Объясняю как там устроено.
----------------------
Биржа рассылает общую информацию периодически в  широковещательном режиме.
Все профи ее получают вне зависимости от вашего подписания.
Когда Вы подписываетесь,
то Вас включат в список рассылок на сервере брокера  QUIK ( разработчики QUIK поправят, им виднее).
Дельта - хеджер, Буду рад комментариям по коду
 
Цитата
Олег123 написал:
Это понятно. Но qpile я выучил за день и скрипт написал за час. накидать на коленке самое оно.
если комменты по вашему скрипту, то выкладывайте его на форум. Лень ходить на файлообменник.  
QIUK 9.8.0.11 выходит при attach MSVC 2019 debugger - защита или проблема?
 
Цитата
Variable написал:
Цитата
nikolz написал:
Я делаю это в редакторе SciTe, который написан на луа
Здравствуйте, nikolz!
Интересно.Никогда не работал со SciTe.Т.е. в нём можно, не запуская квик, войти на сервер, вызвать функцию DLL, которая в свою очередь вызовет функцию типа CreateDataSource() и потом сможет обработать возвращаемые по callback  или без callback данные, отлаживая DLL под MSVC ?
нет, так нельзя.
----------------------
В SCITE можно отлаживать скрипты на луа, питон и др языках, а также отлаживать dll для этих языков.
==========
Когда я делаю новые функции для луа в виде dll, то отлаживаю эти функции.
После их отладки, я отлаживаю скрипты с отлаженными dll в демо-версии qUIK.
Вызывать в сырых dll функции из QLua не вижу смысла, так как это лишь усложняет отладку dll.
Ошибка Trans2Quik.dll при переходе на Quik v10 c v7
 
https://forum.quik.ru/forum12/topic1043/
ДемоСчет. Что не так?
 
Цитата
Igor_User написал:
Такой вопрос.
Когда на демо-счёте покупаю/продаю фьючерс по рынку, то на счёте блокируется несколько больше средств, чем гарантийное обеспечение данного фьючерса. Возможно это уже с учётом комиссий. Но где можно посмотреть, какие комиссии на демо-счёте?

P.S. Возможно это где-то уже обсуждалось на форуме, но у меня найти не получилось...
не заморачивайтесь конкретными значениями на демо счете.
---------------------------------
Этот счет исключительно для тестирования работоспособности скриптов и освоения нажатия клавиш а КВИКЕ.  
Работа в режиме аукциона
 
если  Вы про предторговый период , то его можно определить по времени.
Добавление флагов в скрипт
 
Цитата
Станислав написал:
Цитата
Beginner написал:
 
Цитата
nikolz  написал:
у вас flag всегда ноль.
 а как правильно нужно?  
flag=0 --ИСХОДНОЕ ЗНАЧЕНИЕ ФЛАГА

Сейчас переменной присваивается значение 0 на каждой итерации цикла while. Очевидно, что инициализацию переменной нужно вынести за его пределы.
надо вынести начальное значение из цикла.
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 64 След.
Наверх