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

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

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 84 След.
Установка отметок на графике через скрипт
 
Цитата
gngngn написал:
всем спасибо. метки все таки появляются на графике, но с сильным смещением вправо, подскажите с чем это может быть связано  
На компе время московское?
Не видны текстовые метки на графике
 
gngngn
Вот  правильный бутерброд.
Код
label_params={["TEXT"]="",["IMAGE_PATH"]="",["ALIGNMENT"]="Left",["YVALUE"]=0,["DATE"]=0,["TIME"]=0,["R"]=0,["G"]=0,["B"]=0,
["TRANSPARENCY"]=0,["TRANSPARENT_BACKGROUND"]=0,["FONT_FACE_NAME"]='Times New Roman',["FONT_HEIGHT"]=10,["HINT"]=""}

function labeldraw(price, textlabel, texthint) 
TS=getInfoParam("SERVERTIME")
TIME =string.sub(TS,1,2)..string.sub(TS,4,5).. string.sub(TS,7,8); 
label_params.DATE =DATE; 
label_params.TIME =TIME; 
label_params.TEXT = textlabel
label_params.TRANSPARENT_BACKGROUND = 1
label_params.YVALUE = price
label_params.HINT = texthint
label_id_text = AddLabel(tiker_id, label_params)
end

function main()
tiker_id = "SBER_ID"
DATE = tostring(os.date("%Y%m%d"))
while  true do
number_of_candles = getNumCandles(tiker_id)
price, _, _ = getCandlesByIndex(tiker_id, 0, number_of_candles - 1, 1)  
sleep(1)
text = "ppppp "..price[0].close
labeldraw(price[0].close, text, "eeeeee")
end
message (tostring(label_id_text))
end
Не видны текстовые метки на графике
 
Цитата
gngngn написал:
gngngn
У Вас скрипт работает лишь один раз.  В майн надо делать бесконечный цикл. Читайте документацию.
Индекс запсииси в таблице ордеров
 
Предположу, что так сбрасывают зависшие каналы, когда их много.
-------------------
"Хотелось бы услышать начальника транспортного цеха"
Установка отметок на графике через скрипт
 
Цитата
gngngn написал:
Добрый день
код который вы скинули кладет терминал

у меня скорей всего что то с самим терминалом, пробивал несколько простых скриптов, метки создаются - message (tostring(label_id_text)) выводи id метки
Чтобы выводились метки надо установить в скрипте интервал равный интервалу на графике.  Установлено 5 минут.
идентификатор графика установлен t ag = "SBER_ID"
версия QUIK 12.8.0.6  сервер тестовый
Метки на графике в скрипте
 
По просьбе трудящихся.


Код
label_params={["TEXT"]="",["IMAGE_PATH"]="",["ALIGNMENT"]="Left",["YVALUE"]=0,["DATE"]=0,["TIME"]=0,["R"]=255,["G"]=255,["B"]=255,
["TRANSPARENCY"]=0,["TRANSPARENT_BACKGROUND"]=0,["FONT_FACE_NAME"]='Times New Roman',["FONT_HEIGHT"]=10,["HINT"]=""}

function labeldraw(price, YYYYMMDD,HMS,textlabel, texthint)  
label_params.TEXT = textlabel;
label_params.DATE = YYYYMMDD; 
label_params.TIME =HMS;
label_params.YVALUE = price;
label_params.HINT = texthint;
label_id_text = AddLabel(tag, label_params)
end

function main()
local i=0; local _size=0; 
while true do
   local  size= getNumCandles(tag);
   while  size>i do
         local t, _, _ = getCandlesByIndex(tag, 0, i, 1)  
         local z=t[0];    local Hi,Li,Ci,Oi=z.high,z.low,z.close,z.open;
             i=i+1;
         local Ti=ds:T(i)
      YYYYMMDD=100*(100*Ti.year+Ti.month)+Ti.day;
      HMS=100*(100*Ti.hour+Ti.min)+Ti.sec;
      labeldraw(Hi, YYYYMMDD,HMS,"A", "B")
   end
   sleep(1)
end
end


function OnInit(p) -- инициализация функции main
sec,clas,int="SBER","QJSIM",5;
tag = "SBER_ID"
ds=CreateDataSource ("sec","QJSIM",5) 
while ds==nil do ds,err=CreateDataSource(clas,sec,int); sleep(1); end
end

Установка отметок на графике через скрипт
 
gngngn,
Вот решение Вашей хотелки - метки в скрипте:




это скрипт:
Код
label_params={["TEXT"]="",["IMAGE_PATH"]="",["ALIGNMENT"]="Left",["YVALUE"]=0,["DATE"]=0,["TIME"]=0,["R"]=255,["G"]=255,["B"]=255,
["TRANSPARENCY"]=0,["TRANSPARENT_BACKGROUND"]=0,["FONT_FACE_NAME"]='Times New Roman',["FONT_HEIGHT"]=10,["HINT"]=""}

function labeldraw(price, YYYYMMDD,HMS,textlabel, texthint)  
label_params.TEXT = textlabel;
label_params.DATE = YYYYMMDD; 
label_params.TIME =HMS;
label_params.YVALUE = price;
label_params.HINT = texthint;
label_id_text = AddLabel(tag, label_params)
end

function main()
local i=0; local _size=0; 
while true do
   local  size= getNumCandles(tag)  message (size)
--   if size>_size then  price, _, _ = getCandlesByIndex(tiker_id, 0, size - 1, 1)    _size=size; end 
   while  size>i do
         local t, _, _ = getCandlesByIndex(tag, 0, i, 1)  
         local z=t[0];    local Hi,Li,Ci,Oi=z.high,z.low,z.close,z.open;
             i=i+1;
         local Ti=ds:T(i)
      YYYYMMDD=100*(100*Ti.year+Ti.month)+Ti.day;
      HMS=100*(100*Ti.hour+Ti.min)+Ti.sec;
      labeldraw(Hi, YYYYMMDD,HMS,"A", "B")
   end
   sleep(1)
end
end


function OnInit(p) -- инициализация функции main
sec,clas,int="SBER","QJSIM",5;
tag = "SBER_ID"
ds=CreateDataSource ("sec","QJSIM",5) 
while ds==nil do ds,err=CreateDataSource(clas,sec,int); sleep(1); end
end
Установка отметок на графике через скрипт
 
Общие сведения

Индикаторы технического анализа представляют собой отдельный класс скриптов,  которые удовлетворяют определенным условиям и расположены в папке LuaIndicators  в каталоге терминала. Если папка отсутствует в каталоге, необходимо создать ее  вручную. Список скриптов не доступен из диалога Сервисы / LUA  скрипты....  

При добавлении нового индикатора на график плагин qlua сканирует папку  LuaIndicators, проверяет файлы с расширением lua и luac (скомпилированные  скрипты lua) на соответствие следующим требованиям:  


  • определена функция Init,
  • определена функция OnCalculate,
  • определена таблица Lua с именем Settings, в которой есть поле
    «Name».

Пример минимального корректного кода для индикатора:

Settings={}
Settings.Name = "minimal"
function Init()
return 1
end
function OnCalculate(index)
return 1
end
Установка отметок на графике через скрипт
 
Цитата
gngngn написал:
день день. Помоги решить вопрос
на графике не отображается метка (текст)
причем при проверки
message (tostring(label_id_text)) сообщение выдает id метки
Так же на графике при нажатии правой кнопки при выборе удалить, строка "все метки в диаграмме" становится активной (получается метка на график попадает, но ее не видно)
скрипт отображения метки следующий:

function labeldraw(price, textlabel, texthint)  label_params = {
 TEXT = textlabel,
 ALIGNMENT = "LEFT",
 DATE = tostring(os.date("%Y%m%d")),
 TIME = tostring(os.date("%H%M%S")),
 R = 0,
 G = 0,
 B = 0,
 TRANSPARENCY = 90,
 FONT_HEIGHT = 10,
 TRANSPARENT_BACKGROUND = 1,
 YVALUE = price,
 HINT = texthint
}

label_id_text = AddLabel(tiker_id, label_params)

end

function main()
tiker_id = "SBER_ID"

number_of_candles = getNumCandles(tiker_id)
price, _, _ = getCandlesByIndex(tiker_id, 0, number_of_candles - 1, 1)  
sleep(300)

text = "ppppp "..price[0].close
labeldraw(price[0].close, text, "eeeeee")
message (tostring(price[0].close))
message (tostring(label_id_text))
end
Метки выставляются в индикаторе, а вы написали скрипт.  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
поправил комментарии
Код
list={
--список инструментов для портфеля
sec="ROSN,GAZP,SBER,PLZL,GMKN,CHMF,HYDR,LKOH,MOEX,SNGS"  
task="task1,task2,task3,task4"  -- список существующих задач
}
user_sec="   interval:1,quote:0,short:0,stop:0,takeprofit:0,task:task1:task2,quota:0"

Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
сделал новый интерфейс еще проще:
Код
list={
--список инструментов для портфеля, если нет, то все инструменты по заданным классам
sec="ROSN,GAZP,SBER,PLZL,GMKN,CHMF,HYDR,LKOH,MOEX,SNGS"  
task="task1,task2,task3,task4"  -- список существующих задач
}
user_sec="   interval:1,quote:0,short:0,stop:0,takeprofit:0,task:task1:task2,quota:0"

--user_sec--параметры пользователя для sec  по умолчанию--interval --интервал свечей
--quote --подписка на стакан
--short -- разрешениe коротких позиций
--stop--флаг разрешения установки стопа  1 -обычный, 2-скользящий,
--takeprofit, -- флаг разрешения TakePrifit
--task---список задач по умолчанию для каждого инструмента
--quota--для средств для покупки в одной заявке
--можно задавать индивидуальные параметры для задач и инструментов
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
VPM,
Возможно Вы не обратили внимание,
но у меня
ВСЯ УНИВЕРСАЛЬНАЯ СИСТЕМА это 380 операторов
из них 120 - это конечный автомат обработки колбеков
и 60 - конечный автомат обработки задач.
-----------------------------
+ скрипты задач.  
которые могут создать событие на выставление удаление перестановку заявок.
----------------------
Интерфейс к ней показал ранее.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
У меня данные обновляются лишь по колбекам.
Поэтому нет смысла их кэшировать.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
"Едем дальше, видим больше"! На мой взгляд данный подход, нужно распространить на получение "Серверных данных". Для понимания проблематики, архитектуру предлагается использовать общею для фондового и сросного рынков?  Задача все та же.

Задача - возможность торговать и управлять 1 инструментом так и портфелем (универсальность), с учетом рисков (как квиковских, так и собственно ручных), ну и конечно одной из основных задач управление позицией.
Структура - модульная, много разового использования.
Интерфейс - наипростейший, понятный бабушке!

Обобщенно свести квиковские в функции в удобную оболочку:

Функции взаимодействия скрипта Lua и Рабочего места QUIK  
getDepoEx - функция для получения позиций по инструментам указанного типа
 getMoneyEx - функция для получения информации по денежным позициям указанного типа
 getFuturesLimit - функция для получения информации по фьючерсным лимитам
 getFuturesHolding - функция для получения информации по фьючерсным позициям
 getSecurityInfo - функция для получения информации по инструменту?
 getTradeDate - функция для получения даты торговой сессии
 CalcBuySell - функция для расчета максимально возможного количества лотов в заявке? (скорее для контроля, уж больно тяжелая?)
 getPortfolioInfoEx - функция для получения значений параметров таблицы «Клиентский портфель» с учетом срока расчётов
 getBuySellInfoEx - функция для получения параметров (включая срок расчётов) таблицы «Купить/Продать» (Важная для маржинальной торговли!)
У меня эти функции спрятаны.
Пользователю доступ к ним не нужен и он про них ничего не знает и знать не хочет.
В задаче он просто читает нужную переменную скрипта.  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Цитата
nikolz написал:
В своем скрипте все параметры типа firmid, client  получаю из QUIK. Т е их не надо вводить пользователю.
Не очень понимаю этот подход, ну если с firmid все еще понятно, зависит в чей терминал скипт загружен. То с client не все очевидно, все равно приходится в водить,  
можете вводить это не принципиально.
Для информации.
Вот что надо ввести пользователю в мой скрипт
Код
clas_list="QJSIM:0,SPBFUT:1,CETS:2"; --список классов счетов и тип инструментов 0 -акции 1-фьючерсы 2- валюта 3- опционы
sec_list="ROSN,GAZP,SBER,PLZL,GMKN,CHMF,HYDR,LKOH,MOEX,SNGS"  --список инструментов для портфеля, если нет, то все инструменты по заданным классам
task_list="task1,task2,task3,task4"  -- список существующих задач
sec_user={ --параметры устанавливаемые пользователем для инструментов по умолчанию
1, --интервал свечей
0, --подписка на стакан
0, --флаг разрешения коротких позиций
0,--флаг разрешения установки стопа  1 -обычный, 2-скользящий, 3 -take 4-stop и take
"task1",
"task2" --список задач по умолчанию для каждого инструмента
}
т е
clas_list - список торгуемых классов
sec_list -список торгуемых инструментов
task_list -- список существующих задач, которые ему дает разработчик или он пишет сам  
sec_user -- параметры для все инструментов
----------------------
Для каждого инструмента,задачи можно  через ':' указать индивидуальные параметры.
Пользователю не надо изучать луа, если он не хочет писать задачи.
===================
У меня тоже универсальная система.  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
и еще
В своем скрипте все параметры типа firmid, client  получаю из QUIK.
Т е их не надо вводить пользователю.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Что делает:

QuickDataManager:new(firmid, client_code).  Конструктор создаёт экземпляр менеджера с обязательными параметрами firmid и client_code.
Это основные параметры для работы с системой QUIK. Все остальные параметры передаются как опциональные в виде таблицы в функции.

QuickDataManager:_loadData(param, optional_params). Это основная функция для ленивой загрузки данных. В зависимости от параметра (например, "money", "depo", "portfolio", и т.д.), она делает запросы к соответствующим функциям QUIK. Функция также проверяет, есть ли уже кэширов анные данные для этого параметра, и если они есть — возвращает их. Если данных нет, выполняется запрос и кэшируются результаты? Здесь основной вопрос как правильно организовать работу?

QuickDataManager:__index(key).  Метатаблица __index отвечает за доступ к данным через ключи, такие как money, depo, portfolio и другие. Для каждого ключа вызывается соответствующая функция ленивой загрузки, которая получает необходимые данные и кэширует их.

Параметры (например, tag, currcode, limit_kind, sec_code и другие) передаются через опциональные параметры, что позволяет адаптировать запросы под различные нужды и сохранить гибкость подхода.

Пример использования. При первом обращении к данным (manager.money, manager.depo, manager.portfolio, и т.д.) данные будут загружены, затем они будут кэшироваться для последующего использования без лишних запросов к системе. Что позволяет уменьшить нагрузку на систему и ускорить последующие операции. Как альтернатива. Если нужно избежать повторного получения одинаковых данных, можно добавить механизм для "очистки" кэша по истечении времени или по запросу.
Лучше не заставлять пользователя изучать Lua и не вводить без острой надобности специальные термены.
Например,
вместо:
Код
QuickDataManager:new(firmid, client_code). 
написал бы
Код
fimid=XXXX
client_code=EEEE
а в скрипте под капотом написал бы
Код
QuickDataManager:new(firmid, client_code). 
про термины:
"ленивая" загрузка  - пользователю обязательно это знать? Тогда что такое ленивая и какие еще есть ?
----------------------------
Т е сначала решите, для кого Вы пишите эту инструкцию. Т е какой у него уровень знаний должен быть, чтобы понять, что вы написали.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Попурри на тему "Три тополя на Плющихи" в исполнении ... .  ::

Зацените на сколько удобен интерфейс конечного пользователя в этом подходе.

Код

Преимущества MARKETDATA_PRO v1.0:

Вы не учитываете тот факт, что только Вы знаете это .
Мне как пользователю непонятно  зачем мне это.
--------------------------
Слишком.сложно, много букв. Трудно выявлять ошибки.
--------------------
Попробуйте не дублировать уже описанное.
--------------------
Все общее разместите в начале. Например так:
Код
-- Примеры использования универсальной системы: 
market  =   "TQBR"    
ticker  =   "SBER"  
 -- Глобальный экземпляр 
MDP  =  MarketData_Pro.Manager:new()

 -- 1. УНИВЕРСАЛЬНЫЙ ТЕХНИЧЕСКИЙ АНАЛИЗ ДЛЯ ЛЮБЫХ ДАННЫХ 

 -- Анализ цены последней сделки 
 local  price_analysis  =  MDP:getOrCreate{ interval  =  INTERVAL_H1,   param  =   "last" }
 print ( "Цена SMA20:" , price_analysis:sma( 20 ))
 print ( "Цена RSI14:" , price_analysis:rsi( 14 ))

 -- Анализ стакана (биды) 
 local  bid_analysis  =  MDP:getOrCreate{    interval  =  INTERVAL_M5,  param  =   "bid" }
 print ( "Биды EMA10:" , bid_analysis:ema( 10 ))
 print ( "Биды STDDEV20:" , bid_analysis:getIndicator( "STDDEV" ,  20 ))

 -- Анализ объема 
 local  volume_analysis  =  MDP:getOrCreate{  interval  =  INTERVAL_M15,  param  =   "volume" }
 print ( "Объем SMA30:" , volume_analysis:sma( 30 ))

 -- 2. КАСТОМНЫЕ ИНДИКАТОРЫ ДЛЯ ЛЮБЫХ ПАРАМЕТРОВ 

 -- Регистрация индикатора для спреда 
MDP:registerIndicator( "SPREAD_EMA" ,  function (buffer, period)
     if  buffer.size  <  period  then   return   nil   end 
     local  sum  =   0 
     for  i  =   1 , period  do  sum  =  sum  +  buffer:last(i).value   end 
     return  round(sum / period,  4 )
 end ,  "EMA for Spread" , {"numeric"})

 -- Анализ спреда bid/offer 
 local  spread_data  =  MDP:getOrCreate{    description  =   "Bid-Offer Spread" }
 -- Здесь можно обновлять буфер вручную с вычисленным спредом 
spread_data:updateBuffer( "value" ,  0.15 )  -- пример спреда 

 print ( "Спред EMA10:" , spread_data:getIndicator( "SPREAD_EMA" ,  10 ))

 -- 3. УНИВЕРСАЛЬНЫЙ АНАЛИЗ РАЗНЫХ ТИПОВ ДАННЫХ 

 local  analyses  =  {
    {param  =   "last" , desc  =   "Price Analysis" },
    {param  =   "bid" , desc  =   "Bid Analysis" }, 
    {param  =   "volume" , desc  =   "Volume Analysis" },
    {param  =   "value" , desc  =   "Value Analysis" }
}

 for  _, analysis  in  ipairs(analyses)  do 
     local  data  =  MDP:getOrCreate{ ticker  =   "GAZP" , interval  =  INTERVAL_D1, param  =  analysis.param  }
     local  sma  =  dat a:sma( 20 )
     local  rsi  =  dat a:rsi( 14 )
    print ( string.format ( "%s - SMA20: %.2f, RSI14: %.1f" ,  analysis.desc, sma  or   0 , rsi  or   0 ))
 end 

 -- 4. COMPLEX MULTI-PARAMETER ANALYSIS 

 interval  =  INTERVAL_H1

 -- Анализ нескольких параметров одновременно 
 local  multi_analysis  =   function ()
     local  price  =  MDP:getOrCreate{  param  =   "last"   }
     local  volume  =  MDP:getOrCreate{ param  =   "volume"      }
     local  bids  =  MDP:getOrCreate{ param  =   "bid"     }
     local  price_trend  =  price:ema( 10 )  >  price:ema( 20 )
     local  volume_spike  =  volume:sma( 5 )  >  volume:sma( 20 )  *   1.5 
     local  bid_strength  =  bids:ema( 5 )  >  bids:ema( 10 )  
     return  price_trend  and  volume_spike  and  bid_strength
 end 

 -- 5. DYNAMIC INDICATOR CREATION 

 -- Создание индикатора на лету 
 local  dynamic_indicator  =   function ()
    MDP:registerIndicator( "VOLUME_PRICE_RATIO" ,  function (buffer, priceBuffer, period)
         if   not  priceBuffer  or  buffer.size  <  period  then   return   nil   end 
        
         local  volume_avg  =   0 
         local  price_avg  =   0 
        
         for  i  =   1 , period  do 
             local  vol_item  =  buffer:last(i)
             local  price_item  =  priceBuffer:last(i)
             if  vol_item  and  price_item  then 
                volume_avg  =  volume_avg  +  vol_item.value
                price_avg  =  price_avg  +  price_item.value
             end 
         end 
        
        volume_avg  =  volume_avg / period
        price_avg  =  price_avg / period
        
         return  volume_avg /  math.max (price_avg,  0.001 )
     end ,  "Volume-Price Ratio" , {"volume"})
 end 

Универсальная система - это такая система, разработчик которой не имеет представления где и как ее будут применять.
-----------------------
Пользователь такой системы не в состоянии понять все, что включил в нее разработчик.
-------------------------
В результате реально либо используется 10 процентов  возможности такой системы, либо пользователь начинает делать свою - не универсальную.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
nikolz,  1. Вы не отвечаете на заданные Вам вопросы, ну как минимум в общении это не вежливо!   , для меня  это и не важно.
2. Ну, нужны Вам все эти гигибайты истории, да и храните, я же не против, я привёл паттерн для текущей задачи.
3. Именно так создал, этот подход убираю ошибки для тестирования.
4. С песней в точку что вижу, с чем разбираюсь, про то и пою, 20 раз уже на это отвечал, если есть проблемы с памятью я записывайте, нет мне несложно повторить и 100 раз одно и тоже.
5. И уж пожалуйста, про время не нужно, оно мне интересно в рамках исполнения моих задач, описанных в скрипта.  А про   оптимизацию в песнях ни слова . Задачей оптимизации, следящий раз, сейчас найти приемлемое решение для задач описанных выше!
6. Возможно у такого специалиста есть рекомендации по задаче? Или " Слов из песни не выбросить "?  ::  
У Вас много слов в песне, возможно пропустил Ваш вопрос.  Если не сложно, то повторите.  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
VPM,
Если вы останавливаете корутины, то теряете время на их остановке и запуске. Это дорогая процедура.
Но Вам же время не важно.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
VPM,
Не в обиду, но мне Ваши опусы напоминают песню ямщика:
-Ямщик - ты о чем поешь?
-Так что вижу, так  о том и пою.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Существует несколько подходов к организации данных в QUIK. Нужно выбрать структуру для проекта, который будет включать в себя:
а) DataPoller.lua (планировщик опросов в корутинах);
б) MarketData (модуль для работы с рыночными данными);
с) DataManager (менеджер данных, который объединяет все вместе).

Учитывая, что задача стоит  избежать фризов и минимизировать задержки, а также обеспечить актуальность данных , предлагается следующий подход:

DataPoller будет заниматься асинхронным опросом данных (через корутины) и обновлением кэша.
MarketData будет предоставлять интерфейс для доступа к данным (через метатаблицы с ленивой загрузкой и кэшированием).
DataManager будет управлять созданием и жизненным циклом источников данных, а также взаимодействием между Poller и MarketData.

При этом мы можем использовать комбинацию подхода 3 (ООП-ленивый доступ) и 4 (кэш + корутина). Тогда концепция выглядит следующим образом:

1. DataPoller. Создает и управляет корутинами для периодического обновления данных.
Каждый источник данных (например, тикер) регистрируется в планировщике.
Планировщик обновляет кэш данных в фоновом режиме.

2. MarketData. Представляет объект-источник данных (например, свечи, стакан, параметры инструмента).
При первом обращении к полю, если данных нет в кэше, они запрашиваются синхронно (редкий случай, но как fallback (запасной план) ).
Основной доступ к данным идет из кэша, который асинхронно обновляется планировщиком.

3. DataManager. Инициализирует планировщик и создает источники данных.
Предоставляет интерфейс для получения источника данных (например, по тикеру и интервалу для свечей).
Управляет жизненным циклом данных (создание, удаление, обновление).

Пример последовательности:
Пользователь запрашивает у DataManager данные по SBER (например, свечи M1).
DataManager создает объект MarketData для SBER M1, если он еще не создан, и регистрирует его в DataPoller.
DataPoller начинает периодически (каждые N ms) обновлять данные для SBER M1 (например, запрашивать последние свечи и класть в кэш).
Пользователь обращается к объекту MarketData (например, candles:getValue("close", -1)), и получает данные из кэша.
Таким образом, мы имеем асинхронное обновление данных и синхронный доступ к ним без блокировок?

Теперь код для каждого модуля. Начнем с DataPoller (адаптируем тот, что уже есть, но упростим и настроим под эту задачу).

DataPoller будет: Принимать задачи (источники данных) с callback для обновления. Запускать корутины, которые периодически вызывают callback и обновляют кэш.
MarketData (источник данных) будет: Иметь метод update() (который будет вызываться планировщиком) для обновления своих данных. Иметь кэш для хранения последних данных. Предоставлять методы для доступа к данным (например, getValue).
DataManager будет: Хранить все созданные источники данных (например, по ключу market_ticker_interval). Создавать новые источники, если их нет, и регистрировать их в DataPoller.
Вы это сделали или просто рассуждаете?
Если сделали то покажите профиль задержек на тестах и оцените сколько инструментов вы сможете обрабатывать. Какие у Вас результаты на истории?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Еще раз. Идеальный производственный паттерн работы с QUIK:  В QUIK нет смысла "стримить" все свечи постоянно — нужно один раз получить исторический буфер и дальше обновлять только последнюю (текущую, незакрытую) через callback/опрос?

Тогда, Алгоритм модуля MarketData_Pro.Poller, который:
а) Загружает исторические свечи (100–500 штук) в UniversalBuffer при инициализации.
б) Держит кеш последней свечи (текущий бар) отдельно.
с) Обновляет кеш по событию или через быстрый опрос QUIK (getParamEx / getCandlesByIndex).
д) По таймфрейму???  проверяет закрытие свечи > переносит кеш в буфер и очищает кеш?
е) Отдает актуальные данные любому индикатору через getValue() или прямой доступ к буферу?
Вы ошибаетесь.
История торгов нужна не для того, чтобы постоянно ее обрабатывать. На истории проверяют идеи торгов. Я на истории обучаю роботов.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Т е примерно в 10000 раз меньше, чем у Вас, если Вы поставите sleep на 1 сек
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Цитата
nikolz написал:
Собственно задачей может быть не только функция, выполняемая в main, но и любой процесс или другой поток со своей VMLua или любом другом языке и даже в облаке или у соседа на компе.
Вот этого точно, не обсуждаю. 1 терминал, 1 маин, множество корутин или сейчас рассматриваю как предлагал альтернативу Nikolay, . Все остальное к программистам системщикам или TGB,   ::

Цитата
nikolz написал:
Свчеи хранятся в сжатом формаье (степень сжатия примерно 7 раз .  10 лет  SBER на 1 мин это 2 млн свечей. Сжатый объем 28МБайт.
Но это тоже для Ваших каких то специфических задач.
"Дата соурсе" в квик организовано как интерфейс получения данных о свечах, получил к примеру 100 бар в буфер, обработал расчеты  допустим индикатора и все. Обновляется буфер согласно тайм фрейма. Текущее (не завершенную свечу) держим в кеш, обновляется оперативно по колбеку.

Я у Вас спрашивал как вы обрабатываете события последовательно перебираете очередь или есть приоритеты, если есть то чем обосновываете
Приоритеты не имеет смысла делать, так как очередь пока короткая.
У моего робота реакция на колбек составляет  не более 0.1 ms.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
посмотрел объем сохраненных данных  за период 10 лет по 26 инструментам.
Всего   603МБ. сжатых 7Z.  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
nikolz,  А можете описать полный алгоритм, и если приоритеты, если есть на чем основываете? Будет интересно, думаю не только мне.  
А смысл? Время уйдет много и не факт что это имеет смысл
-------------------------
Могу отвечать на конкретные вопросы,  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Сделал автомат получения свечей с биржи по списку торгуемых инструментов.
Свчеи хранятся в сжатом формаье (степень сжатия примерно 7 раз .
10 лет  SBER на 1 мин это 2 млн свечей. Сжатый объем 28МБайт.
При считывании автоматом распаковываются.
В результате разработку торговой системы можно делать на истории любой глубины на таймах от 1 мин.
Текущий торговый день сохраняю из QUIK в несжатом виде.
На следующий день данные записываются в архив в сжатом виде с биржи.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Основной поток main() нельзя блокировать. main() — это кооперативная петля; если вставить бесконечный цикл без sleep, терминал “зависнет”.   Лучшее решение на мой не профессиональный взгляд опрос в отдельной корутине. Почему именно корутина?   Lua-корутины позволяют “распараллелить” логику.    Можно делать yield-циклы с sleep(1000) без потери отзывчивости терминала.    Каждая корутина может следить за своим источником данных (деньги, позиции, котировки и т.п.).  
Решаю эти проблемы так.
-------------------
Если main делать нечего, то  ждет события от колбеков.
------------------------------
Колбеки свои события складывают в очередь.
------------------------------
Если очередь не пустая, то main обслуживает очередь.
-----------------------------------------
Задачи тоже могут создавать события.
-------------------------
Собственно задачей может быть не только функция, выполняемая в main,
но и любой процесс или другой поток со своей VMLua или любом другом языке и даже в облаке или у соседа на компе.
--------------------------------
 
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
И так обсудили разные подходы по организации полного жизненного цикла заявки. Каким подходом пользоваться, каждый определяет для себя сам. Это архитектурная дилемма. Так как окончательного мнения у меня не сложилось, буду пользоваться наиболее понятными для меня подходами. Задача все еще прежняя, собрать модульную структуру в которой торговые стратегии работают независимо отдавая приказы на исполнение. И технологическая, все это дело обслуживает.

Таким образом можно выделить 3 главных блока, которые взаимодействуют ка между собой так и с апи  квик.
А. полный жизненный цикл заявки.
Б. полный жизненный цикл  сделки.
С. полный жизненный цикл money.

Следовательно в блоках можно условно выделить основное взаимодействие, это пары:
1. заявка / сделка = depo;
2. актив depo / актив money, что в свою очередь можно представить как depo + money = capital.

Следовательно, следующая задача,  нужно организовать жизненный цикл money.
Уу меня получилась два конечных автомата и менеджер задач.
1) обрабатывает события по OnOrder, OnStopOrder,OnTanseReblay, и все колбеки в которых нет sec_сode.
2)  обрабатывает колбеки, в которых есть sec_code, кроме указанных ранее.
3) менеджер задач  запускает задачи торгуемых инструментов.
2) и 3) объединены в одну функцию для оптимизации скорости работы и затрат памяти.
---------------------
Список существующих задач определяемся в файле init
-----------------------------------
Каждая задача записывается в отдельном файле как отдельная функция
------------------------------  
Объем скрипта   составляет 500 операторов(строк),
из который 300 исполняются лишь при старте скрипта.
Определение направления заявки
 
Цитата
Димч написал:
bit.band(order.flags, 0x4)
У Вас ошибка.
результат операции логического И  (bit.band)  не 1 , а 4 , если бит установлен.
т е в вызове должно быть
Код
 local a = ActiveLimitOrderExists(52.50, 0x4)

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

В Lua 5.3 и 5 4  нет надобности в библиотеке bit
вместо
Код
bit.band(order.flags, 0x4)
можно записать так:
Код
order.flags&4
Как экономить на интернет трафике в системе Квик
 
Цитата
Алкотрейдер написал:
Здравствуйте, может кто знает и подскажет, есть временное подключение через мобильного оператора связи, как значительно снизить потребляемый трафик программой, в свойствах сети я обнаружил как квик за полчаса 700 мб интернета скушал, уничтожив все запасы мобильного интернета.  
Настройте получение данных лишь те инструменты, которые Вы используете в торгах.
Не подписывайтесь на ненужные параметры.
Не подписывайтесь на обезличенные сделки.
Не Используйте умные настройки.  Настройки все руками.
Не открывайте стаканы инструментов которыми не торгуете.
Проверьте число подписанных инструментов и параметров.
остановка скрипта при запуске QUIK
 
Если Вам надо чтобы скрипт, запущенный в QUIK остановился при новом старте нужно первую строку в  колбек OnInit записать так:
Код
function OnInit(path)
 if os.clock()<2 then return  end
Автозапуск скрипта LUA при старте QUIK
 
Андрей,
Чтобы запущенный скрипт не стартовал автоматом надо сделать так:
В колбеке onInit  первую  строку запишите так:
Код
function OnInit(path)
 if os.clock()<2 then return  end
--.... 
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Замечу, что замыкание можно заменить обычной функцией с передачей ей таблицы с параметрами, которые хранятся в замыкании.
Такая реализация проще в понимании и полностью эквивалентна замыканию.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Любая процедура, вызванная из main не блокирует QUIK. Любая. Хоть завернутая в корутину, хоть вызванная напрямую, хоть в замыкании.
Присоединяюсь  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Поэтому если отправили транзакцию на ордер, то результат - это не колбек OnTransReply, а появление записи по этому ордеру в таблице ордеров. Колбек же OnOrder - это уже следствие появления этой записи, а не наоборот.
Вы ошибаетесь, как раз наоборот
Сначала будет колбек,OnOrder, а потом появится запись в таблице заявок.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Если вынести повторяющуюся часть кода в функции (для чего они и придуманы):
Код
function order(t,Tor,Nor)
local N=Tor[0]; local flags=t.flags local flag=flags&1; local num=t.order_num; local id=t.trans_id;
for i=1,N do
   local s=Tor[i]; --s,id,js,num
   if s[4]==num or (id~=0 and s[2]==id) then
      if flag==0 then -- заявка не активна удаляем из списка активных если она есть в списке
         if N>1 then Tor[i]=Tor[N] end Tor[N]=nil; Tor[0]=N-1;
   else  --заявка активная записываем ее номер
      s[4]=num --записываем номер новой заявки по транзакции
      if s[3]==0 then s[3]=Nor; Nor=Nor+1 end
   end
   break;
   end  -- заявка в списках
   end
   if flag==1 and id==0 then
   N=N+1; Tor[N]={t.sec_code,0,Nor,num}; Nor=Nor+1 Tor[0]=N;   --- активная заявка не найдена заявка выставлена не из скрипта создаем ее
   end;   -- таблица заявок,стоп-заявок инструмента
end

function transOrd(t,Tor)
      local id=t.trans_id; local s,js;
   for i=1,N do s=Tor[i]; --s,id,js,num
      if s[2]==id then  js=s[3];
      if js==0 then if N>1 then Tor[i]=Tor[N] end Tor[N]=nil; Tor[0]=N-1; return  --отменяем выставление
         else s[3]=-js; return end -- отменяем удаление
         end
   end
end
то конечный автомат для этих колбеков будет совсем простой:
Код
elseif m==2 then --onOrder
order(t,Tor,Nor);
elseif m==3 then --onStopOrder
order(t,Tso,Nso);
elseif m==4 then
local x=t.status local msg=t.result_msg;
if Log then Log:write("status="..x..": транзакция "..t_mes[x+1]..">"..msg.."\n"); Log:flush();end
if x==3 or 2>x or x==15 then return end
---удаляем ошибочные транзакции
message("status="..x..": транзакция "..t_mes[x+1]..">"..msg, 3)
transOrd(t,Tor);
transOrd(t,Tso);

Вот и все.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
А если жизненный цикл (путь), расписать по шагам в конкретные процедуры (как Nikolay, ) подход сам напрашивается. И что делать с ожиданиями? Нужен фоновый подход?
У меня все гораздо проще построено.
Для заявок и стоп-заявок одинаково.
Есть три таблицы
----------------------
Код
Tnt={[0]=0}; --таблица активных транзакций  содержит trans_id,jts
Tor={[0]=0}; --таблица активных заявок 1-trans_id 2- номер в таблице QUIK 0-если выставляется , минус на удаление
Tso={[0]=0}; --таблица активных стоп-заявок 1-trans_id 2- номер в таблице QUIK 0-если выставляется , минус на удаление
Любая транзакция записывается в таблицу транзакций,
Эта таблица обрабатывается в OnTransReply
Если транзакция не прошла или прошла, то она удаляется из Tnt. Таким образом мы всегда знаем сколько транзакций отправили но не получили ответ.
-----------------------
Если была ошибка, то отменяются действия по ней.
Например транзакция на действия над существующей заявкой (удаляем или переставляем).
----------------------
Если выставляется новая заявка, то она записывается в таблицу активных, когда поступит сообщение об успешной отправки транзакции.
------------------------
Если пришло сообщение об исполнении или удалении то она удаляется из таблицы активных.
======================
Вот и весь алгоритм .
-------------------------------
вот рабочий фрагмент конечного автомата, который обрабатывает эти три колбека
Код
elseif m==2 then --onOrder
local N=Tor[0]; local flags=t.flags local flag=flags&1; local num=t.order_num; local id=t.trans_id;
for i=1,N do
   local s=Tor[i]; --s,id,js,num
   if s[4]==num or (id~=0 and s[2]==id) then
      if flag==0 then -- заявка не активна удаляем из списка активных если она есть в списке
      if N>1 then Tor[i]=Tor[N] end Tor[N]=nil; Tor[0]=N-1;
      else  --заявка активная записываем ее номер
      s[4]=num --записываем номер новой заявки по транзакции
      if s[3]==0 then s[3]=Nor; Nor=Nor+1 end
      end
   break;
   end  -- заявка в списках
   end
   if flag==1 and id==0 then
   N=N+1; Tor[N]={t.sec_code,0,Nor,num}; Nor=Nor+1 Tor[0]=N;--- активная заявка не найдена заявка выставлена не из скрипта создаем ее
end;   
elseif m==3 then --onStopOrder
local   N=Tso[0]; local flag=t.flags&1;    local num=t.order_num; local id=t.trans_id;
for i=1,N do
   local s=Tso[i]; --s,id,js,num
   if s[2]==id or s[4]==num then
   if flag==0 then -- заяка не активна удаляем из списка активных если она есть в списке
   if N>1 then Tso[i]=Tso[N] end Tso[N]=nil; Tso[0]=N-1;
   else  --заявка активная записываем ее номер
   s[4]=num --записываем номер новой заявки по транзакции
   if s[3]==0 then s[3]=Nso; Nso=Nso+1 end
   end
   break;
   end; -- таблица заявок,стоп-заявок инструмента
end
if flag==1 and id==0 then
N=N+1; Tso[N]={t.sec_code,0,Nso,num}; Nso=Nso+1 Tso[0]=N;--- активная заявка не найдена заявка выставлена не из скрипта создаем ее
end
elseif m==4 then
local x=t.status local msg=t.result_msg;
if x==3 or 2>x or x==15 then return end
   ---удаляем ошибочные транзакции сделок
   message("status="..x..": транзакция "..t_mes[x+1]..">"..msg, 3)
local id=t.trans_id; local s,js;   local N=Tor[0]; --ищем по заявкам
for i=1,N do s=Tor[i]; --s,id,js,num
   if s[2]==id then  js=s[3];
   if js==0 then if N>1 then Tor[i]=Tor[N] end Tor[N]=nil; Tor[0]=N-1; return  --отменяем выставление
   else s[3]=-js; return end -- отменяем удаление
   end
   end
N=Tso[0]; --ищем по стоп-заявкам
for i=1,N do local s=Tso[i]; --s,id,js,num
   if s[2]==id then local js=s[3];
   if js==0 then if N>1 then  Tso[i]=Tso[N]  end Tor[N]=nil; Tor[0]=N-1; return  --отменяем выставление
   else s[3]=-js; return end -- отменяем удаление
   end
end   
Демо: две сделки с одинаковым номером на разные заявки
 
Цитата
Максим написал:
Классно картинка вставилась... Вот текстом:
   TRADENUM    TRADETIME    ORDERNUM    TRANSID    SECNAME    BUYSELL    PRICE    QTY    VALUE    STATUS    BROKERREF    TSCOMM    CLEARING_COMMISSION    EXCHANGE_COMMISSION    TRADING_SYSTEM_COMMISSION    BROKER_COMMISSION4    6177611930    04:05:33    9999740073    1073745885    SMLT [QJSIM]    SELL    865,0    1    865,00        10226//    0,00    0,00    0,00    0,00    0,19
5    6177611930    04:05:33    9999740086    1073745985    SMLT [QJSIM]    BUY    865,0    1    865,00        10226//    0,00    0,00    0,00    0,00    0,19
похоже ,что Вы совершили сделку с самим собой.  
Автозапуск скрипта LUA при старте QUIK
 
Цитата
Alexander написал:
Так как сделать так, чтобы при закрытии терминала скрипт не запускался, когда он сам себя корректно остановил при закрытии терминала?
Например, можно контролировать время от начала запуска приложения( os.clock() .    
Если оно меньше порога, то это означает ,что скрипт запустился автоматом и его надо остановить.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
и еще... То , что я разрабатываю, необходимо именно для торговли.
---------------------
Все эти задачи возникли в процессе разработки торговой системы  на основе нейросетей и ИИ на платформе QUIK,
для тестирования торговых алгоритмов и реальной алгоритмической торговли.
 ----------------------
Например, возможность создать любое число функций main позволяет делать систему торговли на одном скрипте (не надо писать кучу колбеков), запускаемом в КВИКЕ.
При этом, если у Вас комп с многими ядрами (например 16), то можно запустить 16 main и ускорить работу в 16 раз.
Добавьте к этому запуск  в потоках Luajit, что еще ускорит вычисления от 10 до 100 раз по сравнению с луа.
------------------------
Создание векторов Int и float вместо таблиц Lua  позволяет увеличить объем для данных примерно в 10-20 раз, а использование mapping file  позволяет работать практически с любым объемом данных совместно кучи потоков.
-------------------------------
Вы постоянно мне возражаете, что вам не надо быстродействие. (Напоминает басню "Лиса и виноград")
-------------------------------------------
Но разве Вы не хотите иметь робота, который сам обучается торговли и самостоятельно может формировать портфель из любых инструментов?
---------------------------------
Я хочу не просто его иметь, но и пишу такого робота, на основе моего опыта и знаний. Мне это интересно.
--------------------------------------
И об этом пишу именно на форуме разработчиков торговой системы QUIK.
---------------------------------
Было бы неплохо, если бы можно было бы обсуждать  на форуме конкретные алгоритмы для торговых роботов на луа для QUIK, как это можно делать на форуме торговой системы MT.   Но на этом форуме большинство - это начинающие буратино, которые  прочитали книжку "Как стать миллионером"  и закапывают свои пять золотых на поле чудес.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Уважаемый nikolz,  Вы поймите одну простую истину, здесь пользователи собрались, для  ТОРГОВЛИ , а не для изучения языков программирования, тем более таких как Си.  ::

Что касается меня так, я уже не помню как писать на Бейсик и Фортран, уж не приходится говорить о Си. C Lua разбираюсь по тому что он встроен в терминал, с таким же успехом разбирался бы с любым другим. На нем можно проверять свои торговые идеи, и не только, атематические торговые программы, с гордым названием Робот. Я пишу про это. Для этого не нужен ни Си ни какой другой язык, Lua с избытком. Даже он в некоторых случаях сложен, если учитывать как реализован сам торговый терминал. Язык встроенный необходим нам для автоматизации торговых решений.
Если уж писать то грамотно, приходится придерживаться нескольких основополагающих принципов.

А для того чтоб торговать вообще не нужны ни какие языки, да и образования достаточно царской - приходской школы, арифметики. И причем тут Ваши изыски?  
Согласен, что знания языков программирования нужны для программирования, как и специальные знания для любой области человеческой деятельности.
----------------------
Если на форуме собрались пользователи для ТОРГОВЛИ, то они ошиблись местом.
Место для торговли - это биржа, а не сайт  разработчика торговой системы и не тема "Программирование на Lua"
-------------------------
Вы противоречите сами себе.
В теме программирование на луа, вы пишите про нечеткую логику. При этом Ваши знания в этом разделе науки еще меньше, чем знания в луа.
====================
Я не могу понять , в чем смысл  пересказываний дилетанта того, что гораздо лучше уже описано в учебниках
======================
Говоря о том, что Вы пришли на форум для ТОРГОВЛИ, Вы пока не написали ничего конкретного для ТОРГОВЛИ.
---------------------------
Все ваши рассуждения голословны и субъективны. Не обладая проф знаниями ни в одной теме, которые Вы затрагиваете, Вы с большим пафосом поверхностно излагаете  демагогию на тему про луа, программирование, про нечеткое множество,
---------------------------
Согласитесь, что нести знания в массы может лишь профессионал в этих знаниях, иначе это просто болтовня.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Сейчас реализовал  дополнительные функции на СИ, который позволяют:
1) создать любое число функций main, каждая в своем потоке  Позволяет подключить Tensorflow и Torch.
2) создавать векторы целых,вещественных чисел ф формате С  (позволяет примерно на порядок уменьшить требуемый объем памяти и скорость обработки)
3) потокобезопасную обработку таблиц и векторов.
---------------------------------
Алгоритмы торговли пишутся в отдельные файлы и грузятся в основную программу или запускаются как самостоятельные задачи .  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
nikolz,  Так оно так и есть, создаем конфигурацию к робот, строим необходимую торговою логику или используем заготовки торговых стратегий и в бой.

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

Например вот файл конфигурации к стратегии описанной выше:
Код
   --[[ КОНФИГУРАЦИЯ ]]-- 
 local  Config  =  {
         --Config.Trading.account  Config.Trading.client_code 
    Trading  =  {
        market  =   "TQBR" ,
        ticker  =   "SBER" ,
        account  =   "L01+00000F00" ,
        client_code  =   "21045400" ,
        firmid  =   "MC0031400000" ,
        order_type  =   "LIMIT" ,
        time_in_force  =   "GTC" ,
        volatility_period  =   20 ,
        regime_detection  =   true ,
        
        max_order_retries  =   3 ,       -- максимум 3 попытки перевыставления 
        retry_delay  =   5 ,             -- задержка 5 секунд между попытками 
        order_timeout  =   30            -- таймаут ордера 30 секунд 
    },

    Grid  =  {
        levels  =   5 ,
        base_lot  =   1 ,
        step_type  =   "ADAPTIVE" ,
        step_ticks  =   5 ,
        min_ticks  =   3 ,
        max_ticks  =   8 ,
        grid_levels  =   5 , 
        lots_per_level  =   1 ,
        grid_step  =   0.1 ,
         --account = "L01+00000F00",    -- ДУБЛИРУЕМ ДЛЯ GridManager 
         --client = "21045400",         -- ДУБЛИРУЕМ ДЛЯ GridManager 
        
        martingale  =  {
            enabled  =   true ,
            type  =   "OPTIMAL" ,
            factor  =   1.3 ,
            max_levels  =   3 ,
        },
        
        take_profit  =  {
            type  =   "DYNAMIC" , 
            ticks  =   8 ,
            multiplier  =   1.6 ,
        },
        
        hedge_enabled  =   true ,
        auto_rebalance  =   true ,
        rebalance_threshold  =   0.7 ,
    },
    
    Risk  =  {
        total_capital  =   1000000 ,
        risk_per_trade  =   0.02 ,
        max_instrument_risk  =   0.05 ,
        max_portfolio_risk  =   0.15 ,
        reserve_ratio  =   0.1 ,
        margin_safety  =   1.5 ,
        max_position_value  =   0.2 ,
        max_total_exposure  =   0.4 ,
        stop_loss_individual  =   0.05 ,
        stop_loss_portfolio  =   0.08 ,
        daily_loss_limit  =   0.05 ,
        max_drawdown_limit  =   0.15 ,
        position_sizing  =   "KELLY" ,
        kelly_fraction  =   0.5 ,
    },

    GUI  =  {
        enabled  =   true ,
        update_interval  =   2 ,
        show_detailed_stats  =   true ,
        alert_on_limits  =   true ,
    }
}  
У меня файл конфигурации такой:
Сравните с Вашим.
Код
client="XXXX" --код клиента
clas_list="QJSIM:0,SBFUT:1,CETS:2"; --список классов счетов и тип интсрументов 0 -акции 1-фьючерсы 2- валюта 3- опционы
--clas_user={} --параметры устанавливаемые пользователем для класса по умолчанию
sec_list="ROSN,GAZP,SBER,PLZL,GMKN,CHMF,HYDR,LKOH,MOEX,SNGS"  --список инструментов для портфеля, если нет, то все инструменты по заданным классам
--"s,c,min_price_step,scale,lot_size" --параметры инструментов
sec_user={ --параметры устанавливаемые пользователем для инструментов по умолчанию
1, --интервал свечей
0, --подписка на стакан
0, --флаг разрешения коротких позиций
0,--флаг разрешения установки стопа  1 -обычный, 2-скользящий, 3 -take 4-stop и take
}

pTH="D:/QUIK_SCRIPT/bot25/" --путь к каталогу функций
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Цитата
nikolz написал:
Еще надежнее вообще без функций на луа.
Большинство так и пишет.  
Цитата
nikolz написал:
17.2  пустая корутина 0.6  пустая функция 0.4  пустой if
Скорость исполнения полезно знать, но не нужно путать задачи?

* If - встроенный оператор сравнения, и так понятно что самая быстрая операция (фильтрация, больше не для чего ни годится);
* функция - разделение кода по функциональности,  (полную задачу делим, хотя бы чтоб можно было читать);
* корутина - это сервис для исполнения  минимального кода, что бы была возможность "за ходить в гости в точку С, а не просто шагать из А до Б".

Вот и смысл: "А И Б сидели на трубе, А - упало, Б - пропало, кто остался на требе?"  ::  
Если учесть особенности построения роботов, как программ обработки данных в реальном времени,
то чтобы можно было читать и все работало максимально быстро на Lua ,
используем технологию структурного программирования:
--------------------
1) Разбиваем алгоритм на блоки (функции)
2) Блоки (функции)пишем в отдельные файлы, которые включаются в основную прогу операторами dofile и loadfile.
3) Основная программа (конечный автомат состоит из бесконечного цикла и обработчика событий.
4) обработчик событий делается в виде оператора if... then ... else ...
------------------------
Индекс запсииси в таблице ордеров
 
Цитата
Nikolay написал:
Это уже не дает ошибку, т.к. после OnCleanUp внутри сессии происходит сброс индексов таблицы ордеров и заново ищем ордера по номеру, когда они появятся. Некорректные индексы появились с выходом 12 версии, ранее такого никогда не было.

Сейчас уже вопрос в том - зачем. Скорость загрузки данных - это уже дело десятое, хотя появление записей в таблице ордеров после восстановления подключения через минуты - это не сказать, что хорошо.
У меня 12 версия от сбербанка вообще затормозила комп. Выкинул и вернулся на 8.7. Ляпота!!!
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
TGB написал:
Цитата
nikolz написал:
   «Баба-яга против!» ::
                        Мультфильм
сделал прикольный тест на оценку быстродействия корутин.
Код
function foo (a)  return coroutine.yield(2*a) end

function foo1 (a) return 2*a end

 co = coroutine.create(foo)
 tstart()  coroutine.resume (co ,10 ) print(tstop())

tstart()  foo1 (10) print(tstop())

tstart()  local a=10   a=2*a  print(tstop())
результат:

17.2  пустая корутина
0.6  пустая функция
0.4  пустой if
------------------------
Корутина в 25 раз медленнее функции и в 40 раз медленнее условного оператора.
Индекс запсииси в таблице ордеров
 
Цитата
Nikolay написал:
Еще брокеры с таким поведением

SERVER: ВТБ24, IPCOMMENT: Сервер1
quik_version 12.5.0.20

[INFO  2025-10-24 12:39:35] :           OnDisconnected

INFO  2025-10-24 12:41:37] : OnCleanUp   [INFO  2025-10-24 12:47:56] :           OnCleanUp

[INFO  2025-10-24 12:48:00] : OnConnected flag true

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

Брокер Кит-финанс
quik_version 12.7.1.8 [INFO  2025-10-22 11:34:16] :  OnDisconnected

[INFO  2025-10-22 11:34:48] :  OnCleanUp

[INFO  2025-10-22 11:35:02] :  OnCleanUp

[INFO  2025-10-22 11:35:41] :  OnConnected flag true


Все же возникает вопрос - зачем в середине торговой сессии вызывать OnCleanUp?

При этом данные после такой чистки загружаются минуты.
Можете показать пример перемешивания? А то что-то не врублюсь, где это даст ошибку.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
Nikolay написал:
Не важно какой подход используется - важно как он работает и работает ли он надежно. Если Вы делаете решение для себя и готовы постоянно заниматься отладкой пограничных ситуаций, то делайте как угодно.
Хотя уже здесь корутины начинают привносить излишнюю сложность. Те же замыкания прекрасно справляются с запоминанием окружения и позволяют решать ту же задачу.
Далее, что самое важное - это воспроизводимость результатов, обработка ошибок. И здесь колбеки - это не лучшее решение, т.к. они не гарантированы, приходят в случайном порядке. Для задач реального времени - это приговор.

Представьте, что датчик выдает данные. Вы решаете использовать "модную" библиотеку с колбеками. Но начиная использовать её, получаете данные с пропусками, данные могут приходить из прошлого. Во многих отраслях - это просто недопустимое поведение.

Так что нет, я уж как нибудь сам организую чтение данных, как эти делали последние лет 50.

Я понимаю, что есть соблазн использовать подход со слугой - сказал ему, что делать, он сообщит когда будет результат. Но такой подход всегда требует надсмотрщика, проверки. Так что самому подойти к кастрюле и проверить как там каша - надежней.
Еще надежнее вообще без функций на луа. И замыкания оказываются ненужными.
Какой смысл запоминать окружение?
Например , портфель из 100 бумаг.  
Что будете запоминать для каждой бумаги в замыкании?  
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 84 След.
Наверх