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

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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 82 След.
Система принятия решений и/или Нечеткая логика(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 бумаг.  
Что будете запоминать для каждой бумаги в замыкании?  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
VPM,
Но это просто написание функций которые обращаются к вложенным функциям и т д.
можно сделать еще более обобщенную функцию для вашего примера, так:
пишем файл robot.lua:
Код
dofile("hacktrade.lua")
function Robot()
  ind = Indicator{tag}
  while true do
    if feed.last > ind[-2] then
      order:update(feed.last, 1)
    elseif feed.last < ind[-2] then
      order:update(feed.last, -1)
    end
    Trade()
  end
end
тогда готовый робот запишем так:
Код
market.ticker,account,client,tag = "MCODE","TCKR","ACNT1234567890","775533","MYIND"
dofile("robot.lua")
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
пардон, ссылка  попала ошибочно, но удалить ее невозможно.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
VPM,
Вы  правильно назвали свой восторг по поводу скрипта  HackTrade сказкой.
Ваш восторг сильно преувеличен.
-----------------------
Все возможности, которые вы описали можно реализовать проще, так как coroutine не вычисляются параллельно, а исполняются в бесконечном цикле main,
то в более простом решении можно выиграть и в быстродействии и в затратах памяти.
====================
Поясняю упрощенно:
------------------------
Если какая-то функция вызывается в скрипте робота лишь в одном операторе , то ее реализация является избыточной.
Эту функцию можно заменить на условный оператор. Нет никаких передаваемых параметров вообще, значит и время на вызов равно нулю.
При такой реализации  не только быстрее исполняется скрипт,  но и существенно меньше затраты памятиhttps://www.lua.org/manual/5.3/manual.html#pdf-coroutine.create.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
До кучи...
'trans_id'" и "'order_num'"  - это идентификаторы для разных серверов (биржи и брокера)  и разных источников их генерации (биржа и клиент брокера) Поэтому их два и они не зависимые друг от друга.
MOVE_ORDER на фондовом рынке мос.биржи?
 
Цитата
ildarskii написал:
'PRICE': str(sell_order_lmtPrice),  # Цена исполнения. Для рыночных фьючерсных заявок наихудшая цена в зависимости от направления. Для остальных рыночных заявок цена = 0 'QUANTITY': str(int(order_size / lot_size)),  # Кол-во в лотах

Параметры и принимаемые ими значения:

ПараметрЗначение
CLASSCODEКод класса, по которому выполняется транзакция, например TQBR. Обязательный  параметр
SECCODEКод инструмента, по которому выполняется транзакция, например SBER  
ACTION

Вид транзакции, имеющий одно из следующих значений:

  • «NEW_ORDER» - новая заявка,
  • «NEW_NEG_DEAL» - новая заявка на внебиржевую сделку,
  • «NEW_REPO_NEG_DEAL» – новая заявка на сделку РЕПО,
  • «NEW_EXT_REPO_NEG_DEAL» - новая заявка на сделку модифицированного РЕПО
    (РЕПО-М),
  • «NEW_STOP_ORDER» - новая стоп-заявка,
  • «KILL_ORDER» - снять заявку,
  • «KILL_NEG_DEAL» - снять заявку на внебиржевую сделку или заявку на сделку
    РЕПО,
  • «KILL_STOP_ORDER» - снять стоп-заявку,
  • «KILL_ALL_ORDERS» – снять все заявки из торговой системы,
  • «KILL_ALL_STOP_ORDERS» – снять все стоп-заявки,
  • «KILL_ALL_NEG_DEALS» – снять все заявки на внебиржевые сделки и заявки на
    сделки РЕПО,
  • «KILL_ALL_FUTURES_ORDERS» - снять все заявки на рынке FORTS,
  • «MOVE_ORDERS» - переставить заявки на рынке FORTS,
  • «NEW_QUOTE» - новая безадресная заявка,
  • «KILL_QUOTE» - снять безадресную заявку,
  • «NEW_REPORT» - новая  заявка-отчет о подтверждении транзакций в режимах РПС
    и РЕПО,
  • «SET_FUT_LIMIT» - новое ограничение по фьючерсному счету
FIRM_IDИдентификатор участника торгов (код фирмы)
ACCOUNTНомер счета Трейдера. Параметр обязателен при «ACTION» =  «KILL_ALL_FUTURES_ORDERS». Параметр чувствителен к верхнему/нижнему регистру  символов.
CLIENT_CODE20-ти символьное составное поле, может содержать код клиента и текстовый  комментарий (поручение) с тем же разделителем, что и при вводе заявки вручную.  Необязательный параметр
TYPEТип заявки, необязательный параметр. Значения: «L» – лимитированная (по  умолчанию), «M» – рыночная
MARKET_MAKER_ORDERПризнак того, является ли заявка заявкой Маркет-Мейкера. Возможные значения:  «YES» или «NO». Значение по умолчанию (если параметр отсутствует):  «NO»
OPERATIONНаправление заявки, обязательный параметр. Значения: «S» – продать, «B» –  купить
EXECUTION_CONDITION

Условие исполнения заявки, необязательный параметр. Возможные значения:

  • «PUT_IN_QUEUE» – поставить в очередь (по умолчанию),
  • «FILL_OR_KILL» – немедленно или отклонить,
  • «KILL_BALANCE» – снять остаток
QUANTITYКоличество лотов в заявке, обязательный параметр
PRICE Цена заявки, за единицу инструмента. Обязательный параметр. При выставлении  рыночной заявки (TYPE=M) на Срочном рынке FORTS необходимо указывать значение  цены – укажите наихудшую (минимально или максимально возможную – в зависимости  от направленности), заявка все равно будет исполнена по рыночной цене. Для  других рынков при выставлении рыночной заявки укажите price= 0.
REPOVALUEОбъем сделки РЕПО-М в рублях
START_DISCOUNTНачальное значение дисконта в заявке на сделку РЕПО-М
LOWER_DISCOUNTНижнее предельное значение дисконта в заявке на сделку РЕПО-М
UPPER_DISCOUNT Верхнее предельное значение дисконта в заявке на сделку РЕПО-М
STOPPRICEСтоп-цена, за единицу инструмента. Используется только при «ACTION» =  «NEW_STOP_ORDER»
STOP_ORDER_KIND

Тип стоп-заявки. Возможные значения:

  • «SIMPLE_STOP_ORDER» – стоп-лимит,
  • «CONDITION_PRICE_BY_OTHER_SEC» – с условием по другому инструменту,
  • «WITH_LINKED_LIMIT_ORDER» – со связанной заявкой,
  • «TAKE_PROFIT_STOP_ORDER» – тейк-профит,
  • «TAKE_PROFIT_AND_STOP_LIMIT_ORDER» - тейк-профит и стоп-лимит,
  • «ACTIVATED_BY_ORDER_SIMPLE_STOP_ORDER» – стоп-лимит по исполнению
    заявки,
  • «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER» – тейк-профит по исполнению
    заявки,
  • «ACTIVATED_BY_ORDER_TAKE_PROFIT_AND_STOP_LIMIT_ORDER» - тейк-профит и
    стоп-лимит по исполнению заявки.

Если параметр пропущен, то считается, что заявка имеет тип  «стоп-лимит»

STOPPRICE_CLASSCODEКласс инструмента условия. Используется только при «STOP_ORDER_KIND» =  «CONDITION_PRICE_BY_OTHER_SEC».
STOPPRICE_SECCODEКод инструмента условия. Используется только при «STOP_ORDER_KIND» =  «CONDITION_PRICE_BY_OTHER_SEC»
STOPPRICE_CONDITIONНаправление предельного изменения стоп-цены.
Используется только при  «STOP_ORDER_KIND» = «CONDITION_PRICE_BY_OTHER_SEC».
Возможные значения:  «<=» или «>= »
LINKED_ORDER_PRICEЦена связанной лимитированной заявки. Используется только при  «STOP_ORDER_KIND» = «WITH_LINKED_LIMIT_ORDER»
EXPIRY_DATE

Срок действия стоп-заявки. Возможные значения:

  • «GTC» – до отмены;
  • «TODAY» - до окончания текущей торговой сессии;
  • Дата в формате «ГГГГММДД»
STOPPRICE2Цена условия «стоп-лимит» для заявки типа «Тейк-профит и  стоп-лимит»
MARKET_STOP_LIMITПризнак исполнения заявки по рыночной цене при наступлении условия  «стоп-лимит». Значения «YES» или «NO». Параметр заявок типа «Тейк-профит и  стоп-лимит»
MARKET_TAKE_PROFITПризнак исполнения заявки по рыночной цене при наступлении условия  «тейк-профит». Значения «YES» или «NO». Параметр заявок типа «Тейк-профит и  стоп-лимит»
IS_ACTIVE_IN_TIMEПризнак действия заявки типа «Тейк-профит и стоп-лимит» в течение  определенного интервала времени. Значения «YES» или «NO»
ACTIVE_FROM_TIMEВремя начала действия заявки типа «Тейк-профит и стоп-лимит» в формате  «ЧЧММСС»
ACTIVE_TO_TIMEВремя окончания действия заявки типа «Тейк-профит и стоп-лимит» в формате  «ЧЧММСС»
PARTNERКод организации – партнера по внебиржевой сделке.Применяется при «ACTION» =  «NEW_NEG_DEAL», «ACTION» = «NEW_REPO_NEG_DEAL» или «ACTION» =  «NEW_EXT_REPO_NEG_DEAL»
ORDER_KEYНомер заявки, снимаемой из торговой системы. Применяется при «ACTION» =  «KILL_ORDER» или «ACTION» = «KILL_NEG_DEAL» или «ACTION» = «KILL_QUOTE»  
STOP_ORDER_KEYНомер стоп-заявки, снимаемой из торговой системы. Применяется только при  «ACTION» = «KILL_STOP_ORDER»
TRANS_IDУникальный идентификационный номер заявки, значение от «1» до «2 147 483  647»
SETTLE_CODEКод расчетов при исполнении внебиржевых заявок
PRICE2Цена второй части РЕПО
REPOTERMСрок РЕПО. Параметр сделок РЕПО-М
REPORATEСтавка РЕПО, в процентах
BLOCK_SECURITIESПризнак блокировки инструментов на время операции РЕПО («YES»,  «NO»)
REFUNDRATEСтавка фиксированного возмещения, выплачиваемого в случае неисполнения  второй части РЕПО, в процентах
COMMENTТекстовый комментарий, указанный в заявке. Используется при снятии группы  заявок
KILL_IF_LINKED_ORDER_PARTLY_FILLEDПризнак снятия стоп-заявки при частичном исполнении связанной лимитированной  заявки. Используется только при «STOP_ORDER_KIND» = «WITH_LINKED_LIMIT_ORDER».  Возможные значения: «YES» или «NO»
OFFSETВеличина отступа от максимума (минимума) цены последней сделки. Используется  при «STOP_ORDER_KIND» = «TAKE_PROFIT_STOP_ORDER» или  «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»
OFFSET_UNITS

Единицы измерения отступа. Возможные значения:

  • «PERCENTS» – в процентах (шаг изменения – одна сотая процента),
  • «PRICE_UNITS» – в параметрах цены (шаг изменения равен шагу цены по данному
    инструменту).

Используется при «STOP_ORDER_KIND» = «TAKE_PROFIT_STOP_ORDER» или  «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»

SPREADВеличина защитного спреда. Используется при «STOP_ORDER_KIND» =  «TAKE_PROFIT_STOP_ORDER» или  ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»
SPREAD_UNITS

Единицы измерения защитного спреда. Возможные значения:

  • «PERCENTS» – в процентах (шаг изменения – одна сотая процента),
  • «PRICE_UNITS» – в параметрах цены (шаг изменения равен шагу цены по данному
    инструменту).

Используется при «STOP_ORDER_KIND» = «TAKE_PROFIT_STOP_ORDER» или  «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»

BASE_ORDER_KEYРегистрационный номер заявки-условия. Используется при «STOP_ORDER_KIND» =  «ACTIVATED_BY_ORDER_SIMPLE_STOP_ORDER» или  «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»
USE_BASE_ORDER_BALANCEПризнак использования в качестве объема заявки «по исполнению» исполненного  количества инструментов заявки-условия. Возможные значения: «YES» или «NO».  Используется при «STOP_ORDER_KIND» = «ACTIVATED_BY_ORDER_SIMPLE_STOP_ORDER» или  «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»
ACTIVATE_IF_BASE_ORDER_PARTLY_FILLEDПризнак активации заявки «по исполнению» при частичном исполнении  заявки-условия. Возможные значения: «YES» или «NO». Используется при  «STOP_ORDER_KIND» = «ACTIVATED_BY_ORDER_SIMPLE_STOP_ORDER» или  «ACTIVATED_BY_ORDER_TAKE_PROFIT_STOP_ORDER»
BASE_CONTRACTИдентификатор базового контракта для фьючерсов или опционов. Обязательный  параметр снятия заявок на рынке FORTS
MODE

Режим перестановки заявок на рынке FORTS. Параметр операции «ACTION» =  «MOVE_ORDERS» Возможные значения:

  • «0» – оставить количество в заявках без изменения,
  • «1» – изменить количество в заявках на новые,
  • «2» – при несовпадении новых количеств с текущим хотя бы в одной заявке, обе
    заявки снимаются
FIRST_ORDER_NUMBERНомер первой заявки
FIRST_ORDER_NEW_QUANTITYКоличество в первой заявке
FIRST_ORDER_NEW_PRICEЦена в первой заявке
SECOND_ORDER_NUMBERНомер второй заявки
SECOND_ORDER_NEW_QUANTITYКоличество во второй заявке
SECOND_ORDER_NEW_PRICEЦена во второй заявке
KILL_ACTIVE_ORDERSПризнак снятия активных заявок по данному инструменту. Используется только  при «ACTION» = «NEW_QUOTE». Возможные значения: «YES» или «NO»
NEG_TRADE_OPERATIONНаправление операции в сделке, подтверждаемой отчетом
NEG_TRADE_NUMBERНомер подтверждаемой отчетом сделки для исполнения
VOLUMEMNЛимит открытых позиций, при «Тип лимита» = «Ден.средства» или  «Всего»
KGOКоэффициент клиентского гарантийного обеспечения
USE_KGO

Параметр, который определяет, будет ли загружаться величина КГО при загрузке  лимитов из файла:

  • при USE_KGO=Y – величина КГО загружает.
  • при USE_KGO=N – величина КГО не загружается

При установке лимита на Срочном рынке Московской Биржи с принудительным  понижением (см. Создание лимита) требуется указать  USE_KGO= Y

CHECK_LIMITSПризнак проверки попадания цены заявки в диапазон допустимых цен. Параметр  Срочного рынка FORTS. Необязательный параметр транзакций установки новых заявок  по классам «Опционы ФОРТС» и «РПС: Опционы ФОРТС». Возможные значения: «YES» -  выполнять проверку, «NO» - не выполнять
MATCHREFСсылка, которая связывает две сделки РЕПО или РПС. Сделка может быть  заключена только между контрагентами, указавшими одинаковое значение этого  параметра в своих заявках. Параметр представляет собой произвольный набор  символов (допускаются цифры и буквы количеством до 10). Необязательный  параметр
CORRECTION

Режим корректировки ограничения по фьючерсным счетам. Возможные значения:

  • «Y» - включен, установкой лимита изменяется действующее значение,
  • «N» - выключен (по умолчанию), установкой лимита задается новое
    значение

Команды снятия группы заявок по условию («KILL_ALL_ORDERS»,  «KILL_ALL_STOP_ORDERS», «KILL_ALL_NEG_DEALS», «KILL_ALL_FUTURES_ORDERS»)  обрабатываются следующим образом:

  1. Параметры «CLASSCODE», «TRANS_ID», «ACTION», «ACCOUNT» являются
    обязательными.
  2. Возможные дополнительные параметры для команд снятия заявок по
    условию:
    • «KILL_ALL_ORDERS»: «SECCODE», «ACCOUNT», «OPERATION», «CLIENT_CODE»,
      «COMMENT»
    • «KILL_ALL_STOP_ORDERS»: «SECCODE», «ACCOUNT», «OPERATION», «CLIENT_CODE»,
      «COMMENT», «EXPIRY_DATE»
    • «KILL_ALL_NEG_DEALS»: «SECCODE», «ACCOUNT», «OPERATION», «CLIENT_CODE»,
      «COMMENT», «PARTNER», «SETTLE_CODE»
    • «KILL_ALL_FUTURES_ORDERS»: «ACCOUNT», «OPERATION»
  • Снятию подлежат заявки, соответствующие всем указанным в транзакции
    параметрам (логическое «И»).

    Перестановка заявок на рынке FORTS выполняется по следующим правилам:

    • Если MODE=0, то заявки с номерами, указанными после ключей
      FIRST_ORDER_NUMBER и SECOND_ORDER_NUMBER, снимаются. В торговую систему
      отправляются две новые заявки, при этом изменяется только цена заявок,
      количество остается прежним;
    • Если MODE=1, то заявки с номерами, указанными после ключей
      FIRST_ORDER_NUMBER и SECOND_ORDER_NUMBER, снимаются. В торговую систему
      отправляются две новые заявки, при этом изменится как цена заявки, так и
      количество;
    • Если MODE=2, то заявки с номерами, указанными после ключей
      FIRST_ORDER_NUMBER и SECOND_ORDER_NUMBER, снимаются. Если количество
      инструментов в каждой из снятых заявок совпадает со значениями, указанными после
      FIRST_ORDER_NEW_QUANTITY и SECOND_ORDER_NEW_QUANTITY, то в торговую систему
      отправляются две новые заявки с соответствующими параметрами.

    См. также Примеры строк, которые могут  содержаться в файле

    Руководство пользователя QUIK © ARQA Technologies / www.arqatech.com/ru/products/quik/
  • Автопереключение соединения без обрыва связи?, Способен ли Quik переключатся на другое соединеие без обрыва связи?
     
    Цитата
    EugeneE написал:
    Цитата
    EugeneE написал:
    В этом и проблема. Вопрос - можно ли в принципе переключать QUIK на резервную связь , без переподключения.
    Пробовал роутер с автопереключением wan и 4g, но QUIK  замечает переключение и обрывает связь. Такое вообще возможно реализовать?
    Это невозможно, так как в Вашем варианте у Вас два IP адреса
    Сервер брокера не даст подключится по второму пока не разорвет соединение по первому.
    Кто меняет разрешение системного таймера?
     
    посмотреть квант таймера можно прогой  ClockRes
    https://learn.microsoft.com/en-us/sysinternals/downloads/clockres
    Правильно вывести время и дату последней сделки, Как правильно выводить в поля таблицы окна интерфейса скрипта дату и время сделки?
     
    Цитата
    Olnikchur написал:
    Здравствуйте все!
    Помогите разобраться где у меня в скрипте поворот не туда? Получаю параметры последней сделки, выбираю нужные мне, вывожу их для контроля в лог-файл. В лог-файл всё выводится,а в таблицу нет.
    Покажите  скрипт
    Совершить сделку по цене открытия бара, Как выставить заявку, не зная цену?
     
    Цитата
    Graf Graf написал:
    Цитата
    nikolz написал:
    нажимаете мышкой на открытие свечи .
    открывается окно выставления заявки с ценой открытия. с количеством по умолчанию.
    Внимательно перечитайте вопрос прежде, чем отвечать.
    Нет желания вам отвечать.
    Совершить сделку по цене открытия бара, Как выставить заявку, не зная цену?
     
    нажимаете мышкой на открытие свечи .
    открывается окно выставления заявки с ценой открытия. с количеством по умолчанию.
    MoveOrder - цену меняет, а объем не меняет. Что это., Пытаюсь использовать стандартные возможности функции. Не меняется объем. На новую позицию заявка переезжает.
     
    Цитата
    Михаил Понамаренко написал:
    first_order_new_quantity=1.0
    может количество задано не в том формате?
    DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
     
    Код
    function OnStop (signal)
       if t_id then DestroyTable (t_id) end -- Завершение!
        StopFlag = true
      return 1000 -- Тайм-аут 1 сек вместо стандартных 5
    end
    
    function Create (caption, rowNum, cols)
       t_id = AllocTable()
      for i = 1, #cols do         -- name       *    type       width
        assert (1==AddColumn (t_id,i,cols[i][1],true,cols[i][2],cols[i][3])
          ,string.format ("%2d %s %s %s", i, tostring(cols[i][1])
            ,tostring (cols[i][2]), tostring (cols[i][3])))
      end -- * false - all cells invisible
      assert (1 == CreateWindow (t_id))
      assert (SetWindowCaption (t_id, caption))
      local top, left, bottom, right = GetWindowRect (t_id)
      local totalWidth = right - left + 10 -- Эмпирика |
      local frameHeight = 60                      --"- |
      local rowHeight   = 20                      --"- |
      for i = 1, rowNum do
        local row = InsertRow (t_id, -1)
        assert (row == i)
        assert (SetCell (t_id, row, 1, "row".. i))
        for j = 2, #cols do
          local val = i * 10 + j
          assert (SetCell (t_id, row, j, tostring(val), val))
        end
      end
      assert (SetWindowPos (t_id, left, top
        ,totalWidth, frameHeight + rowHeight * rowNum))
    end -- Cre ate ()
    
     function main()
      local rowNum = 2
      local cols = {
        {"Column1", QTABLE_STRING_TYPE, 10,}
       ,{"Column2", QTABLE_INT_TYPE,    10,}
       ,{"Column3", QTABLE_DOUBLE_TYPE, 10,}
      }
     while StopFlag==nil do
      if t_id==nil then Create ("Caption", rowNum, cols) end
        sleep (10)
       end
    end -- main()
    
    DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
     
    Рекомендую сделать так:
    Код
    function OnStop (signal)
       if t_id then DestroyTable (t_id) end -- Завершение!
        StopFlag = true
      return 1000 -- Тайм-аут 1 сек вместо стандартных 5
    end
    
    function Create (caption, rowNum, cols)
      local rowNum = 2
      local cols = {
        {"Column1", QTABLE_STRING_TYPE, 10,}
       ,{"Column2", QTABLE_INT_TYPE,    10,}
       ,{"Column3", QTABLE_DOUBLE_TYPE, 10,}
      }
      t_id = AllocTable()
      for i = 1, #cols do         -- name       *    type       width
        assert (1==AddColumn (t_id,i,cols[i][1],true,cols[i][2],cols[i][3])
          ,string.format ("%2d %s %s %s", i, tostring(cols[i][1])
            ,tostring (cols[i][2]), tostring (cols[i][3])))
      end -- * false - all cells invisible
      assert (1 == CreateWindow (t_id))
      assert (SetWindowCaption (t_id, caption))
      local top, left, bottom, right = GetWindowRect (t_id)
      local totalWidth = right - left + 10 -- Эмпирика |
      local frameHeight = 60                      --"- |
      local rowHeight   = 20                      --"- |
      for i = 1, rowNum do
        local row = InsertRow (t_id, -1)
        assert (row == i)
        assert (SetCell (t_id, row, 1, "row".. i))
        for j = 2, #cols do
          local val = i * 10 + j
          assert (SetCell (t_id, row, j, tostring(val), val))
        end
      end
      assert (SetWindowPos (t_id, left, top
        ,totalWidth, frameHeight + rowHeight * rowNum))
    end -- Cre ate ()
    
     function main()
      if t_id==nil then Create ("Caption", rowNum, cols) end
      while StopFlag==nil do  sleep (10) end
    end -- main()
    
    DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
     
    пардон, еще исправление:
    Код
    function OnStop (signal)
       message ("Destroying ".. t_id)
       if DestroyTable (t_id) then -- Завершение!
            message ("Destroying success ".. t_id)
          else
            message ("Destroying failed ".. t_id)
        end
        StopFlag = true
      return 1000 -- Тайм-аут 1 сек вместо стандартных 5
    end
    
    function Create (caption, rowNum, cols)
      t_id = AllocTable()
      for i = 1, #cols do         -- name       *    type       width
        assert (1==AddColumn (t_id,i,cols[i][1],true,cols[i][2],cols[i][3])
          ,string.format ("%2d %s %s %s", i, tostring(cols[i][1])
            ,tostring (cols[i][2]), tostring (cols[i][3])))
      end -- * false - all cells invisible
      assert (1 == CreateWindow (t_id))
      assert (SetWindowCaption (t_id, caption))
      local top, left, bottom, right = GetWindowRect (t_id)
      local totalWidth = right - left + 10 -- Эмпирика |
      local frameHeight = 60                      --"- |
      local rowHeight   = 20                      --"- |
      for i = 1, rowNum do
        local row = InsertRow (t_id, -1)
        assert (row == i)
        assert (SetCell (t_id, row, 1, "row".. i))
        for j = 2, #cols do
          local val = i * 10 + j
          assert (SetCell (t_id, row, j, tostring(val), val))
        end
      end
      assert (SetWindowPos (t_id, left, top
        ,totalWidth, frameHeight + rowHeight * rowNum))
      return t_id
    end -- Cre ate ()
    
     function main()
      local rowNum = 2
      local cols = {
        {"Column1", QTABLE_STRING_TYPE, 10,}
       ,{"Column2", QTABLE_INT_TYPE,    10,}
       ,{"Column3", QTABLE_DOUBLE_TYPE, 10,}
      }
      t_id = Create ("Caption", rowNum, cols)
      while not IsWindowClosed (t_id) do
        sleep (10)
      end -- while
    end -- main()
    
    DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
     
    Разобрался
    Исправил скрипт так:
    Код
    function OnStop (signal)
       message ("Destroying ".. t_id)
       if DestroyTable (t_id) then -- Завершение!
            message ("Destroying success ".. t_id)
          else
            message ("Destroying failed ".. t_id)
        end
        StopFlag = true
      return 1000 -- Тайм-аут 1 сек вместо стандартных 5
    end
    
    function Create (caption, rowNum, cols)
      local t_id = AllocTable()
      for i = 1, #cols do         -- name       *    type       width
        assert (1==AddColumn (t_id,i,cols[i][1],true,cols[i][2],cols[i][3])
          ,string.format ("%2d %s %s %s", i, tostring(cols[i][1])
            ,tostring (cols[i][2]), tostring (cols[i][3])))
      end -- * false - all cells invisible
      assert (1 == CreateWindow (t_id))
      assert (SetWindowCaption (t_id, caption))
      local top, left, bottom, right = GetWindowRect (t_id)
      local totalWidth = right - left + 10 -- Эмпирика |
      local frameHeight = 60                      --"- |
      local rowHeight   = 20                      --"- |
      for i = 1, rowNum do
        local row = InsertRow (t_id, -1)
        assert (row == i)
        assert (SetCell (t_id, row, 1, "row".. i))
        for j = 2, #cols do
          local val = i * 10 + j
          assert (SetCell (t_id, row, j, tostring(val), val))
        end
      end
      assert (SetWindowPos (t_id, left, top
        ,totalWidth, frameHeight + rowHeight * rowNum))
      return t_id
    end -- Cre ate ()
    
     function main()
      local rowNum = 2
      local cols = {
        {"Column1", QTABLE_STRING_TYPE, 10,}
       ,{"Column2", QTABLE_INT_TYPE,    10,}
       ,{"Column3", QTABLE_DOUBLE_TYPE, 10,}
      }
      t_id = Create ("Caption", rowNum, cols)
      while not IsWindowClosed (t_id) do
        sleep (10)
      end -- while
    end -- main()
    
    Все работает нормально.
    DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
     
    Цитата
    Ростислав Дм. Кудряшов написал:
    Версия Quik 12.5.0.20. Код скрипта
    Код
       function  OnStop (signal)
      StopFlag  =   true 
       return   1000   -- Тайм-аут 1 сек вместо стандартных 5 
     end 
    
     function  Create (caption, rowNum, cols)
       local  t_id  =   AllocTable ()
       for  i  =   1 ,  # cols  do           -- name       *    type       width   
        assert ( 1  =  =  AddColumn  (t_id,i,cols[i][ 1 ], true ,cols[i][ 2 ],cols[i][ 3 ])
          ,string.format ( "%2d %s %s %s" , i, tostring(cols[i][ 1 ])
            ,tostring (cols[i][ 2 ]), tostring (cols[i][ 3 ])))
       end   -- * false - all cells invisible 
      assert ( 1   =  =   CreateWindow  (t_id))
      assert ( SetWindowCaption  (t_id, caption))
       local  top, left, bottom, right  =   GetWindowRect  (t_id)
       local  totalWidth  =  right  -  left  +   10   -- Эмпирика | 
       local  frameHeight  =   60                        --"- | 
       local  rowHeight    =   20                        --"- | 
       for  i  =   1 , rowNum  do 
         local  row  =   InsertRow  (t_id,  -  1 )
        assert (row  =  =  i)
        assert ( SetCell  (t_id, row,  1 ,  "row"  ..  i))
         for  j  =   2 ,  # cols  do 
           local  val  =  i  *   10   +  j
          assert ( SetCell  (t_id, row, j, tostring(val), val))
         end 
       end 
      assert ( SetWindowPos  (t_id, left, top
        ,totalWidth, frameHeight  +  rowHeight  *  rowNum))
       return  t_id
     end   -- Cre ate () 
    
      function   main ()
       local  rowNum  =   2 
       local  cols  =  {
        {"Column1", QTABLE_STRING_TYPE,  10 ,}
       ,{"Column2", QTABLE_INT_TYPE,     10 ,}
       ,{"Column3", QTABLE_DOUBLE_TYPE,  10 ,}
      }
       local  t_id  =  Create ( "Caption" , rowNum, cols)
       while   not   IsWindowClosed  (t_id)  do 
         if  StopFlag  then 
           message  ( "Destroying "  ..  t_id)
           if   DestroyTable  (t_id)  then   -- Завершение! 
             message  ( "Destroying success "  ..  t_id)
           else 
             message  ( "Destroying failed "  ..  t_id)
           end 
           break 
         end 
         sleep  ( 10 )
       end   -- while 
     end   -- main() 
    
      
    ---


    не удалось повторить , скрипт закрывает окно.
    что не так?
    DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
     
    Цитата
    TGB написал:
    1.  
    Цитата
    nikolz написал:
    Полагаю, что не так.
        Зачем полагать, когда можно проверить. Переставьте DestroyTable в OnStop.

    2.  
    Цитата
    nikolz написал:
    Функция  DestroyTable  в данном примере вызывается в потоке Main.
       Вы точно знаете как устроена DestroyTable?
        Не точно, но скорее всего, это реализовано следующим образом.
        При том, что DestroyTable вызывается в main, она не лезет в таблицы QUIK, а создает коллбек закрытия таблицы, который обрабатывается  в потоке терминала, но он занят более интересным делом  :: : остановкой скрипта (удаляет поток main и перестает обрабатывать коллбеки, созданные в нем, так как исчезнет контекст их выполнения).
    Что-то у Вас не то.  Колбек не создается в процессе исполнения. Колбек - это код функции , он создан при загрузке программы.
    Если он вызывается в main то вызов это и есть исполнение.
    Не работает getDataSourceInfo в индикаторе
     
    Цитата
    Nikolay написал:
    Только учитывайте, что этот подход рассчитан на то, что будет вызван OnCalculate для индекса 1. Что в большинстве случаев верно, конечно. Но, судя по сему - не гарантировано. Но предпочитаю более надежный подход через инициализацию переменных в замыкании и проверке первого вызова для любого индекса.  
    Можете доказать, что i может не быть равным 1 ?
    Учитывая то, что при старте OnCallulate вызывается два раза. И i==1 будет обязательно.
    Как на графике накапливаются данные параметров инструмента?, Как на графике накапливаются данные параметров инструмента?
     
    Цитата
    Digit Service написал:
    Цитата
    Egor Zaytsev написал:

    На график должен быть добавлен соответствующий параметр, график должен быть открыт. Открыли график, данные начнут накапливаться локально.
    Странно. А еще есть какой либо способ накапливания истории параметров кроме как открыть график и активным его держать весь день?

    А если инструментов 10 или 50? Я правильно понял что нахождение всех этих 50 инструментов в Таблице торгов или Таблице параметров без открытого по каждому из них графика не приведет к обновлению и накоплению данных по необходимым параметрам инструментов? Я правильно понял что для того чтобы Квик сохранил параметры за день я должен в конце дня тапать и пройти по всем инструментам мышью и загрузить каждый инструмент на график то есть все руками прогрузить?

    Почему Квик в настройках не позволяет это сделать и обновлять нарезки параметров (не цены и объема, а именно добавленных в таблицу параметров - средневзвешенной цены, открытого интереса, общего спроса) по всем необходимым таймфреймам исходя из Таблицы торгов или таблицы параметров автоматически?

    Ну то есть я правильно понял, что сейчас если параметр не находится на активном графике но присутствует в Таблицах, то он вообще не обновляется и не накапливается таким образом?
    Историю свечей можно получаю с биржи .
    https://www.moex.com/a2193
    Считывал их  за период с 2015 по н в. На тайме 1 мин это чуть больше 1 млн. свечей на инструмент.
    Бесплатно данные в реальном времени придут с задержкой 15 минут  
    Не работает getDataSourceInfo в индикаторе
     
    Цитата
    Андрей написал:
    Пишу индикатор. Для целей его использования нужен sec_code.
    Для его получения использую getDataSourceInfo, но она возвращает все значения пустыми, кроме интервала. его возвращает корректно.
    Что делать? как получить sec_code?

    function Init()
    local info = getDataSourceInfo()
    for key, val in pairs(info) do
       message("Индикатор запущен для: " .. tostring(key).."/"..tostring(val))
    end
       return #Settings.line        -- Количество линий совпадает с числом элементов в массиве line
    end
    получаю его вот так уже ...надцать лет и без проблем:
    ---------------
    Код
    function OnCalculate(i)
    if i==1 then
        tinfo=getDataSourceInfo();
        clas=tinfo.class_code;
        sec=tinfo.sec_code; 
         interval=tinfo.interval;
    end
    --.....
    end
    
    
    Как на графике накапливаются данные параметров инструмента?, Как на графике накапливаются данные параметров инструмента?
     
    Все параметры, кроме истории свечей,  на компе существуют лишь для текущей торговой сессии.
    Свечи накапливаются в каталоге arhve.
    На сервере хранится лишь 3000 свечей
    На компе свечи накапливаются пока не перезагрузите данные.
    Чтобы параметры накапливались в течении сессии надо их указать в настройках .
    DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
     
    Цитата
    TGB написал:
    Цитата
    Ростислав Дм. Кудряшов написал:
    В каком потоке  управления выполняется вызов функции DestroyTable()
       Работа с таблицами QUIK выполняется в служебном потоке, отличном от main. В том же, в котором выполняется OnStop. И пока выполняется  OnStop никакие операции с таблицами QUIK не возможны (поток работы с таблицами занят OnStop ). OnStop в любом случае завершает скрипт, поэтому DestroyTable не выполнена и созданная в скрипте таблица существует после завершения скрипта.
      Если что то надо делать с таблицами по кнопке завершить, то это надо делать в функции OnStop.
    Полагаю, что не так.
    --------------------
    Поток, если не создается специально для функции, определяется местом вызова.
    ----------------------
    Все колбеки ( в том числе ОnStop ) вызываются в основном потоке VMLua (т е в потоке терминала).
    ---------------------------
    Функция  DestroyTable  в данном примере вызывается в потоке Main.
    Неккоректная работа CreateDataSourse
     
    Цитата
    Nikolay написал:
    Не думаю, что проблема в этом. Банально ошибка при вызове:

    CreateDataSource (STRING class_code, STRING sec_code, NUMBER interval, [, STRING param])

    Третий параметр - это число. "INTERVAL_H1" - это строка.

    INTERVAL_H1 (без кавычек) - это константа = 60

    Лучше использовать просто числа, а не константы из qlua.
    Согласен.
    слона то я и не приметил.
    Код
    while db==nil do db = CreateDataSource("TQBR", "SBER",INTERVAL_H1)  sleep(10); end
    
    
    
    Неккоректная работа CreateDataSourse
     
    Цитата
    Serchk написал:
    --Друзья, пишу функцию для рассчета ATR, возникли вопросы, подскажите пожалуйста.
    --Создаю DB
    local db = CreateDataSource("TQBR", "SBER", "INTERVAL_H1")
    local a = db:Size()
    --И переменная a при запуске постоянно возвращает nil значение
    можете сделать так:
    Код
    while db==nil do db = CreateDataSource("TQBR", "SBER", "INTERVAL_H1")  sleep(10); end
    
    
    OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
     
    Цитата
    Александр М написал:
    Цитата
    nikolz написал:
     Александр М  ,
    Если написать не можете, не важно по какой причине, верните человеку деньги и признайтесь, что не умеете.
    Я выше представил полный минимальный код, который воспроизводит проблему с барами, с картинками результата. Зачем тут спорить, если есть открытый код и картинки, причем тут конечный скрипт?
    Если вы так уверены в своем скрипте, то выложите или пришлите, я на нем проверю, воспроизводится проблема или нет.
    Я вообще-то про скрипт, который вы продали Роману и который не работает.
    -----------------------
    Бары это или нет из Вашего теста не ясно, так как нет кода скрипта.
    ----------------------
    Сделайте Роману работающий скрипт.
    OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
     
    Александр М,
    Если написать не можете, не важно по какой причине, верните человеку деньги и признайтесь, что не умеете.
    OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
     
    Александр М,
    Вы продали Роману не работающий скрипт. Вместо того, чтобы переписать его, Вы переводите стрелки на QUIK.
    --------------------
    Я написал Роману скрипт, который делает ровно тоже самое, что и Ваш и никуда не вываливается.
    ------------------------
    Из беседы с романом предположу,
    что Вы еще и ошибаетесь в самом алгоритме построения индикаторов с большим периодом на меньших интервалах.  
    OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
     
    Цитата
    Александр М написал:
    Цитата
    nikolz написал:
       
    Цитата
    Александр М  написал:
     
    Цитата
     nikolz   написал:
     
    теперь добавим открытый интерес

     
    ничего не ломается
      Проблема НЕ в индикаторе, который рисует линию с графика бОльшего таймфрейма. Вы неправильно поняли Романа.

    Индикатору. у которого проблема не нужен другой график, он на текущем ТФ рассчитывает бары бОльшего ТФ и по ним считает МА. А сама проблема в функции SetValue, которая перерисовывает крайний час (с его начала) в текущем времени при любом изменении текущей цены, т.к. какого .... при обновлении ОИ видимо идет пересчет всего графика и подставляется номер бара начала часа из прошлого и дальше не обновляется. В коде ошибки нет, там все прозрачно, час сменился - номер бара запомнился. При нажатии ПРИМЕНИТЬ в настройках индикатора, все сразу становится нормально.
     Я все понzл.
    Написал индикатор ровно  такой же, которому  не нужен другой график, он на текущем ТФ рассчитывает бары бОльшего ТФ и по ним считает МА.
    и ничего не ломает.
    Свой скрипт отправил Роману.  
    Скрипт ничего не ломает, это ОИ ломает нумерацию баров в функции OnCalculate и это не лечится. у меня такие же красивые картинки, как у вас, достаточно нажать 1 раз ПРИМЕНИТЬ.

    Вот картинки с номерами баров ДО ПРИМЕНИТЬ и ПОСЛЕ ПРИМЕНИТЬ. Там где 2 числа - это день сменился на графике.

    Т.е. в данном примере OnCalculate вызвался на баре 3194, а потом сразу на 3449
    Есл у вас скрипт не ломается то в чем проблема.
    У Романа ваш скрипт не работает когда он добавляет график открытого интереса.
    ------------------------
    Я ничего не понял из вашего рассказа про нумерацию.  У меня такой проблемы нет и не было.
    -------------------
    Так как проблема лишь у Вас то причина не в КВИКЕ, а в Вашем написании скрипта.  
    Multiframe MA, Добавьте индикатор
     
    Добавил параметры дня( открытие закрытие, локальные максимум и минимум дня)

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 82 След.
    Наверх