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

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

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 86 След.
Cкорость обмена данными через файлы
 
Цитата
AndyWise написал:
Цитата
Самое смешное то ,
что задержка измеряется в мкс
и составляет в среднем не более  10 . т.е. 0.000001 сек.
-------------------------
Это медленно?  
Спасибо, очень интересно.  Получается, для человека 0,1 сек в общем то за глаза. Меня в свое время смутило в Квике в "Импорте динамических транзакций из файла" рекомендуемый интервал аж 5 секунд! Почему? Пожалуй все на 0,1 надо переделать. А функции типа getParamEx, getNumCandles, getFuturesHolding, getNumberOf не измеряли часом?
Импорте динамических транзакций из файла - это другое.
Полагаю, что 5 секунд связано с интервалом опроса терминалом файла транзакций, а не с минимальным временем чтения данных из файлов.
Терминал QUIK создан для подачи заявок брокеру как альтернатива звонка по телефону. Терминал не предназначен для высокоскоростной торговли роботами (HFT).
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
nikolz,  Да я умею читать справку. Речь идет о передаче из графика в луа? Есть график где исполняются в QUIK разные индикаторы и формируются свечи, но чтобы привести цену к необходимому формату нужны class_code и sec_code, а с графика получаем легенду графика, если б приходил sec_code, то все остальные торговые параметры можно было бы восстанавливать (получать)  по нему. А по факту задал tag графику получил все остальные метрики в том числе и торговые.
Не сомневаюсь что Вы умеете читать справку.  
Я лишь показал как сам получаю эти данные с графика.
Если это не то, то расскажите на примере, что Вы хотите.
 
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Определенное не удобство в этом подходе, вызывает от факт что нельзя вернуть с class_code и sec_code? То факт что возвращается легенда графика, мало чем помогает в автоматизации подхода.  
Вы ошибаетесь.
Вот так получаете  class_code и sec_code и интервал:
Код
   local t=getDataSourceInfo(); 
   int=t.interval; clas=t.class_code; sec=t.sec_code;
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Цитата
Nikolay написал:
Все же мне сложно понять зачем выбирать чтение с медленного графика, когда есть инструмент для получения данных без каких либо ручных манипуляций.
Все дело в компетенции.
Подход с запахом "нафталина", напомнил времена, когда информация передавалась на дискетах, а вместо монитора зачастую использовали телевизор.  А под DOS за несколько минут можно было собрать не большое приложение, да еще работающее.

Вот и это подход позволяет за не большой промежуток времени собрать целые стратегии. Да он отправляет к истокам самого QUIK, но мне представилось, что его не забросили разработчики и что то подкрутили. По крайней мере у меня такое чувство сложилось от применения. Если отбросить мой контур управления из луа кода в виде модулей, то подход с правилами описанными выше стоит 100 - 300 кБ. Но главное это время от идеи до воплощения в терминале!
Индикатор, который управляет стопом, например по fractals,  скрипт всего 4КБ.  
Получить номер свечи-фрактала
 
Пардон, ранее это уже написано, просто пояснил на примере
Получить номер свечи-фрактала
 
Если я правильно понял, то функция function FRACTALS  написана универсально для индикаторов и скриптов.
Код
 Out = (O and O(I)) or (ds and ds:O(I))
В данном случае она используется в индикаторе, поэтому будет работать левая  часть  относительно  or
Код
(O and O(I)) 
Если использовать ее в скрипте, то будет работать правая часть or т е ds
Код
(ds and ds:O(I))
 
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Оказывается, QUIK гарантирует,  если время последней свечи изменилось — свеча закрыта ! Тогда определяется ключевой элемент "детектор НОВОЙ СВЕЧИ".
Важно, торговые решения применяем, только после закрытия свечи, торговля внутри незакрытой свечи Запрещена!
Следящее правило, работать с 2–3 последними свечами, отсчет ведется от текущей не закрытой свечи.
getCandlesByIndex   имеет смысл использовать лишь в индикаторах.  
Ваш вариант не имеет практического смысла.
--------------------------
Например, скрипт скользящего стопа при реализации в индикаторе составляет примерно 100 строк.
если торгуем руками, то используем всегда график.
Тогда скрипт скользящего стопа просто бросается на график любого инструмента и автоматом управляет стопом.
---------------------
При этом закон изменения стопа задается любым желаемым индикатором на графике.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
for i = 0, 50000 do
           local _, n = getCandlesByIndex(o.tag, o.line, i, 1)
Правильно Вас понял, Вы здесь
Код
 for i = 0, 50000 do
            local _, n = getCandlesByIndex(o.tag, o.line, i, 1)

читаете 5000 раз по одной свечи?  и определяете конец по нулю свечей
и так делаете в цикле?
В таком случае можно сделать просто бесконечный цикл и выход по break
---------------------------
Но лучше читать лишь новые свечи и лишь тогда, когда они есть.  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Цитата
VPM написал:
Почему портфель причем. Этим же подходом, проходим по портфелю, переключаемся в терминале на режим связанных окон от таблицы "Состояния Портфеля", и проверяем идеи на портфеле.
Когда-то давно делал это в автомате на AutoIT.
Относительно не сложно написать скрипт на AutoIT (язык для автоматизации выполнения задач в Microsoft Windows) , который переключает инструменты в таблице ТТП -инструмент меняет график в связанном окне и скрипт на луа считает портфель .
И получаем любое число инструментов с одним графиком.   При этом QUIK сам делает подписку на нужные свечи инструментов.
-------------------------
Почему AutoIT.?
Потому что это язык специально созданный, чтобы лазить по окнам и автоматизировать ручное нажатие клавиш.  
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
 
Функцию getCandlesByIndex удобно использовать для построения робота на основе встроенных в QUIK индикаторов для торговли одним инструментом.
-------------------------------------
Скрипт такого робота самый простой в написании и самый быстрый в исполнении по сравнению со скриптами на самописных индикаторах.
-----------------------------
При этом не надо заморачиваться алгоритмами индикаторов.
------------------------------
Очень просто тестировать различные стратегии  на основе RSI,мувинг, и т д
----------------------------------
Начинающим писателям роботов  и не только можно рекомендовать такой подход.  
OnTrade отображает неверное количество акций, Изменения в состоянии счёта отображаются не мгновенно
 
Цитата
User12501 написал:
Предположим была заявка на покупку акции. В момент исполнения заявки вызывается OnTrade. Если из этой функции OnTrade напечатать текущий размер позиции с помощью getDepoEx, только что исполненная заявка там не будет учтена, т.е. напечатается неверное количество (которое было до исполнения заявки). Почему так происходит и как это исправить? Спустя несколько миллисекунд количество становится правильным, уже в следующих функциях. Но мне нужно в функции OnTrade использовать текущее количество акций. Как я могу его надёжно получить?
Все верно.
Сначала приходит информация с биржи о сделке. На бирже торгует брокер, а не клиенты.
Потом брокер записывает изменения позиции клиента в своем внутреннем  учете и сообщает об этом клиенту.
И эта инфа приходит клиенту после информации о совершении сделки.
Т е сначала инфа о сделке потом инфа об изменении портфеля.
Стоимость позиции на начало дня, Почему-то везде нулевая в T0
 
Цитата
Kilor написал:
Да, там на скрине как раз и был пример отображения (как-то криво вставился по Ctrl+V) - все позиции имеют равные значения в T1/Tx и нулевые - в T0 в окне позиций по инструментам.
А у Вас есть обязательства сроком расчётов по которым истекает «сегодня» (T0)?
Прошу разъяснить термины: объем в обращении, объем обращения и оборот
 
Средневзвешенная цена:
Отношение оборота текущей сессии в деньгах к бумагам во всех сделках, рублей
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Все на этом форуме - это бесплатные тестировщики QUIK.
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Сергей,
Вы ошибаетесь.
Вы и я и все на этом форуме не клиенты разработчиков, а клиенты брокеров.
Брокеры - клиенты разработчиков.
----------------
Нужна помощь по работе со вчерашней (не сохраняющейся) историей тиков
 
Цитата
Сергей Гусаков написал:
Цитата
nikolz написал:
==================  
Ну а дальше все совсем просто.
Все что вчера и раньше считаете по базе данных, а текущие торги по данным QUIK  
Спасибо. Я довольно далек от этого, профан тасскать, "Создаем базу данных" - имеется в виду файл с котировками (*.CSV?), которые может понять и обработать... Эксель?
А можно сделать так: в конце дня, когда торги закончились и все накопленные тики еще на графике Квика, кликнуть правой на легенде инструмента - сохранить данные в файл txt, будет так
Код
   < TICKER > , < PER > , < DATE > , < TIME > , < OPEN > , < HIGH > , < LOW > , < CLOSE > , < VOL > 
RMH6 [SPBFUT], 30 , 20250807 , 190000 , 1140.000000 , 1140.000000 , 1139.000000 , 1139.000000 , 3.000000   

затем открыть в Экселе как csv, у меня будет история тиков за предыдущий день, я смогу из них нарисовать индикатор, а потом настроить трансляцию из Квика в Эксель, чтобы история подхватывалась уже текущими котировками.
Это единственное, что приходит мне в голову, прошу прощения, если я совсем не в ту степь...
Набор файлов - это и есть один из вариантов базы данных
Сам делаю так как написал ранее.
--------------------
Если не собирать из интернета, то придется накапливать , чтобы получить историю.
На которой можно было бы проверять стратегии торговли и разрабатывать алгоритмы.
----------------------------
Чтобы не нажимать каждый день кнопку, которую можно забыть нажать, пишется скрипт,
который автоматом каждый день пишет тики в файл в желаемом формате.
-------------------------
Не по теме вопроса, но замечу, что QUIK не для торговли по тикам.  
Нужна помощь по работе со вчерашней (не сохраняющейся) историей тиков
 
Цитата
Сергей Гусаков написал:
Работаю на тиковых графиках, с началом нового торгового дня история предыдущего дня обнуляется и начинают генерироваться новые тики. Никакие индикаторы использовать невозможно, пока количество тиков не достигнет расчетного периода индикатора, в моем случае он довольно большой. Остаешься как без рук в начале нового торгового дня. Подскажите, пожалуйста, варианты решения этой проблемы средствами Квика или какой-нибудь другой программы/скрипта.
Проблема решается так и не только по тикам.
Создаем базу данных по предыдущим дням.
---------------------------
Историю с таймом  1 мин  можно взять с биржи бесплатно.
-------------------------------
Историю по тикам можно взять с биржи платно.
------------------
Про бесплатно можно прочитать здесь:
https://www.finam.ru/publications/item/kak-vybrat-servis-eksporta-kotirovok-20240416-1631/
==================  
Ну а дальше все совсем просто.
Все что вчера и раньше считаете по базе данных, а текущие торги по данным QUIK  
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Цитата
Сергей написал:
Ваше время :) не свое...  А Вам благодарен Буду искать обходные варианты
Если что-то придумаю, то напишу.
Если Вы сделаете иначе, то напишите.
Успехов
Полагаю что тема про OnDestroy()  закрыта  
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
А потом еще 30 минут объяснял Вам что и как.
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
В первом моем скрипте я удалял метку.
Но наложение происходит.
Поэтому я поставил стирание всех меток.
-------------------
Возможно есть иное решение, но я его не искал.
Я решал Вашу задачу 5 минут.  
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Цитата
Сергей написал:
Цитата
nikolz написал:
Поэтому, полагаю, что как Вы хотите не получится
Не совсем понимаю что вообще дает стирание метки и создание ее заново если можно менять ее параметры? Это сэкономит ресурсы или еще что то?
Когда сменится инструмент то все предыдущее должно быть удалено в принципе и инициализировано заново как с чистого листа чего как раз и не происходит, как это должно быть реализовано это не вопрос пользователя

Конечно если это решит сейчас проблему я так и сделаю, но это как мне кажется неправильно и просто как способ обойти проблемы функционирования самого терминала
В любом случае спасибо вам за подсказки и что потратили на меня время
Попробую объяснить.
Когда мы выводим метку то на экране рисуется текст метки по координатам метки в пикселях.
функцией Set можно менять текст метки и параметры этого текста или картинки. Все будет нормально, пока не произойдет движение экрана.
После сдвига экрана функция set установит новые координаты метки. А старая метка останется на экране.
Т е Вы увидите наложение меток .
-----------------
Решить эту проблему можно, если мы знаем новые координаты старой метки на изменившемся экране.  Но мы их незнаем.
Поэтому чтобы ее удалить я удаляю все старое и рисую новое.
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
поясняю:
SetLabelParams()  создаст новую метку, но если ее координаты изменятся,
то старая метка не затрется новой.
Вы это и получаете.
---------------
Т е если Вы изменяете положение метки на экране, то надо удалять старую.
---------------------
Выскажу свое субъективное мнение . Если ошибаюсь, пусть разработчики поправят и объяснят.
----------------------------------
Если экран динамически изменяется,
то удалить старую можно лишь удалив все метки,
так как координаты метки ( мое мнение являются статическими).
------------------------------
Это недоработка разработчиков.
Об этом надо указывать в документации или доработать функцию удаления метки.
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Цитата
Сергей написал:
Цитата
nikolz написал:
Я лишь показал Вам что проблема не QLua
Я имел ввиду что если не удалять метку в теле расчетов а корректировать ее положение то так и будет несколько меток после смены инструмента
А lua действительно не причем, это уже проблема самого рабочего места Quik
У вас в скрипте ( я повторил Ваш алгоритм)  метка выводится на новое место, когда график двигается.
Поэтому, полагаю, что как Вы хотите не получится.
Будет именно так, как у Вас и получалось.  
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Цитата
Сергей написал:
Но вообще говоря у меня как раз нет задачи на тиках удалять и создавать новую метку.  Удалять и создавать новую только нужно  только если сменился актив графика. Мептка будет нести информацию о позиции - цена входа, объем позиции и тд и обновляться раз в несколько секунд через SetLabelParams()
Я лишь показал Вам что проблема не QLua, а в написании скрипта.
---------------
А уж OnDestroy()  вообще ни при чем.
Не работает исправление отступов
 
Цитата
komka написал:
Sublime
Рекомендую взять редактор SciTe(Ru)  Там все на русском и настраивается. Кроме того, можете тестить ошибки.
Индикатор с метками
 
Код
Settings={ Name = "*nk_test", tag ="Metka"  }

params={R = 255, G = 255, B = 255, TRANSPARENCY = 0,FONT_HEIGHT = 10,TRANSPARENT_BACKGROUND = 1, FONT_FACE_NAME = 'Verdana' }

function OnCalculate(i)
   if i==1 then
   OnChangeSettings()
   elseif i== Size() then    -- последняя свеча
      if os.time() > LastSecond  then          -- раз в секунду (или больше)
           LastSecond = os.time();    -- потиковое обновление (с задержкой)
          DelAllLabels(Settings.tag);
            params.TEXT =tostring(C(i))
            params.HINT = tostring(i)
         local h=0   local  m=i;
         while 14>i-m  do if H(m) > h then h=H(m) end;m=m-1;   end
         local Ti=T(i-3)
         params.DATE=100*(100*Ti.year+Ti.month)+Ti.day;
         params.TIME=100*(100*Ti.hour+Ti.min)+Ti.sec;
         params.YVALUE =h;
         Label= AddLabel(Settings.tag, params)
        end -- every second
    end
end

function OnChangeSettings()
sec = getDataSourceInfo().sec_code; 
DelAllLabels(Settings.tag);
LastSecond=0  end
function OnDestroy() OnChangeSettings() end
function Init()  return 1 end
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Сергей ,

попробуйте этот:
Код
Settings={ Name = "*nk_test", tag ="Metka"  }

params={R = 255, G = 255, B = 255, TRANSPARENCY = 0,FONT_HEIGHT = 10,TRANSPARENT_BACKGROUND = 1, FONT_FACE_NAME = 'Verdana' }

function OnCalculate(i)
   if i==1 then
   OnChangeSettings()
   elseif i== Size() then    -- последняя свеча
      if os.time() > LastSecond  then          -- раз в секунду (или больше)
           LastSecond = os.time();    -- потиковое обновление (с задержкой)
          DelAllLabels(Settings.tag);
            params.TEXT =tostring(C(i))
            params.HINT = tostring(i)
         local h=0   local  m=i;
         while 14>i-m  do if H(m) > h then h=H(m) end;m=m-1;   end
         local Ti=T(i-3)
         params.DATE=100*(100*Ti.year+Ti.month)+Ti.day;
         params.TIME=100*(100*Ti.hour+Ti.min)+Ti.sec;
         params.YVALUE =h;
         Label= AddLabel(Settings.tag, params)
        end -- every second
    end
end

function OnChangeSettings()
sec = getDataSourceInfo().sec_code; 
DelAllLabels(Settings.tag);
LastSecond=0  end
function OnDestroy() OnChangeSettings() end
function Init()  return 1 end
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Цитата
Сергей написал:
Цитата
nikolz написал:
Мне не удалось получить наложение меток.
Попробовал Ваш скрипт в том виде как есть без каких либо изменений К сожалению метки дублируются
Чтобы увидеть это переключайтесь между двумя активами туда и обратно
Как только первый раз вернетесь на изначальный сместите метку и увидите что их две, потом еще раз на другой и обратно на исходный и будет уже три и тд
У меня не дублируются.
сделайте картинки с указанием инструмента и интервала
Я повторю у себя такое же переключение.
Индикатор с метками
 
По просьбе трудящихся, написал Пример ПРАВИЛЬНОГО индикатора, который  через секунду удаляет ранее выставленную метку и выводит новую.
--------------------------------
Пользуйтесь на здоровье.
----------------------------

Код
Settings={ Name = "*nk_test", tag ="Metka"  }

params={R = 255, G = 255, B = 255, TRANSPARENCY = 0,FONT_HEIGHT = 10,TRANSPARENT_BACKGROUND = 1, FONT_FACE_NAME = 'Verdana' }

function OnCalculate(i)
  if i==1 then
  OnChangeSettings()  
  elseif i== Size() then    -- последняя свеча
     if os.time() > LastSecond  then          -- раз в секунду (или больше)  
          LastSecond = os.time();    -- потиковое обновление (с задержкой)  
        if Label then DelLabel(Settings.tag,Label) end
           params.TEXT =tostring(C(i))
           params.HINT = tostring(i)
        local h=0   local  m=i;  
        while 14>i-m  do if H(m) > h then h=H(m) end;m=m-1;   end
        local Ti=T(i-3)
        params.DATE=100*(100*Ti.year+Ti.month)+Ti.day;
        params.TIME=100*(100*Ti.hour+Ti.min)+Ti.sec;  
        params.YVALUE =h;
        Label= AddLabel(Settings.tag, params)
       end -- every second
   end
end

function OnChangeSettings()
sec = getDataSourceInfo().sec_code; DelAllLabels(Settings.tag);
LastSecond=0  end
function OnDestroy() OnChangeSettings() end
function Init()  return 1 end




При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Сергей,
Написал для вас ПРАВИЛЬНЫЙ индикатор подобно Вашему, если правильно понял алгоритм.
------------------------------
Он работает нормально и при смене инструментов и при смене интервалов и ВООБЩЕ ВСЕГДА .
-------------------
Мой индикатор делает следующее:
--------------------------
Через секунду он удаляет ранее выставленную метку и выводит новую.
----------------------------
Если это не то, то скажите что не так, я исправлю.  
Код
Settings={ Name = "*nk_test", tag ="Metka"  }

 params={R = 255, G = 255, B = 255, TRANSPARENCY = 0,FONT_HEIGHT = 10,TRANSPARENT_BACKGROUND = 1, FONT_FACE_NAME = 'Verdana' }

function OnCalculate(i)
   if i==1 then
   OnChangeSettings()  
   elseif i== Size() then    -- последняя свеча
      if os.time() > LastSecond  then          -- раз в секунду (или больше)   
           LastSecond = os.time();    -- потиковое обновление (с задержкой)   
         if Label then DelLabel(Settings.tag,Label) end
            params.TEXT =tostring(C(i))
            params.HINT = tostring(i)
         local h=0   local  m=i;  
         while 14>i-m  do if H(m) > h then h=H(m) end;m=m-1;   end
         local Ti=T(i-3)
         params.DATE=100*(100*Ti.year+Ti.month)+Ti.day;
         params.TIME=100*(100*Ti.hour+Ti.min)+Ti.sec;   
         params.YVALUE =h;
         Label= AddLabel(Settings.tag, params) 
        end -- every second
    end 
end

function OnChangeSettings() 
sec = getDataSourceInfo().sec_code; DelAllLabels(Settings.tag); 
LastSecond=0  end
function OnDestroy() OnChangeSettings() end
function Init()  return 1 end




При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 

При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Сергей,
Я взял Ваш скрипт вот этот:
Код
Settings=
{
Name = "*test_Example-2",
chart_ID ="Metka"       -- идентификатор графика
}

n_init = 0         -- переменная для подсчета заходов в функцию Init
n_OnCalcCount = 0   -- переменная для подсчета OnCalculate
n_OnChange = 0      -- счетчик OnChangeSettings
bars_prev = 0       -- номер посл бара
TF_prev = -4;      -- таймфрейм
delay = 1.0;      -- задержка в цикле рассчетов параметров для метки (параметров счета)
LastSecond = 0;      -- время последнеих рассчетов 
chart_tag = '';      -- идентификатор графика
label_params = {};   -- параметры метки
Label_ID = nil;      -- идентификатор графика
Labels = {};         -- Массив номеров установленных меток - для контроля

function Init()
   n_init = n_init + 1
PrintDbgStr("Init() = "..n_init)
   n_OnCalcCount = 0
   n_OnChange = 0
   bar_prev = 0
   TF_prev = -4      -- контроль смены таймфрейма
   sec_code_prev = ''   -- контроль перекл на др актив
   
   return 1
end

function OnChangeSettings()
--   n_OnCalcCount = 0
   n_OnChange = n_OnChange + 1
   chart_tag = Settings.chart_ID
PrintDbgStr("OnChangeSettings() = "..n_OnChange..', n_OnCalcCount = '..n_OnCalcCount)
end

function OnDestroy()
PrintDbgStr("OnDestroy() #Labels Array "..#Labels);
   if #Labels > 0 then -- Удаляет ранее установленные метки
      for i=1,#Labels,1 do
         local del = DelLabel(chart_tag, Labels[i]);   
      if del then PrintDbgStr("OnDestroy() Del id "..tostring(Labels[i]));  end;
      end;
   end;
   -- стараемся найти и удалить потерянные метки 
   PrintDbgStr("OnDestroy() LbDelete_2() "..LbDelete_2() .. ' labels were removed');
 
end


function OnCalculate(index)


    -- Пропускаем первый проход между Init() и OnChangeSettings() при первичном  добавлении индикатора
    -- для исключения ошибки чтения параметра при первом запуске индикатора
    -- Init() > OnCalculate() > OnChangeSettings() > OnCalculate() 2 > OnCalculate() 3
   if n_OnChange == 0 then 
      while index <= Size()  do
         if index == Size() then PrintDbgStr('Пропускаем цикл до вызова OnChangeSettings() после Init(), index = ' .. index); end;
         return
      end;
   end
  
    -- предпоследний бар
   if index == Size() - 1 then
PrintDbgStr('---- Begin Cycle Number '..(n_OnCalcCount+1))
       
      DSInfo   = getDataSourceInfo();
      Sec_Code = DSInfo.sec_code;
            
      if chart_tag == '' then message('OnCalculate Chart ID не указан!!!'); end;
PrintDbgStr("Seccode " .. Sec_Code ..",  chart_ID = " .. chart_tag)
            
   else
       -- последняя свеча
      if index == Size() then
          -- раз в секунду (или больше)   
         if os.time() > LastSecond  then            -- if os.time() > LastSecond + 2*delay-1 then
            LastSecond = os.time();
         
             -- потиковое обновление (с задержкой)   
            label_params['TEXT'] = tostring(C(index))
            label_params['HINT'] = tostring(index)

            -- корректируем параметры метки   
            if Label_ID  ~= nil and TF_prev == DSInfo.interval then
               -- сохраняем прежнее положение метки если переместили в теч текущ бара)
                -- при смене таймфрейма метка будет удалена и создана заново
               local ly = GetLabelParams(chart_tag, Label_ID)   --table or nil
               if ly ~= nil then   -- and ly.yvalue ~= nil 
                  label_params['YVALUE'] = ly.yvalue
                  label_params['DATE']   = ly.date
                  label_params['TIME']   = ly.time         
               end;
--PrintDbgStr('index == Size() = ' .. Size() .. ', Label_ID  ' .. Label_ID .. ', C(index) ' .. tostring(C(index))   )   
               SetLabelParams(chart_tag, Label_ID, label_params);
--   PrintDbgStr('SetLabelParams Label_ID = '..Label_ID)
            end         
                           
            -- первый тик нового бара или первый проход и метка еще не создавалась или смена таймфрейма
            -- удаляем предыдущую и создаем новую метку с новыми координатами (метку можно смещать в удобное место...)
            if bars_prev < Size() or Label_ID == nil or TF_prev ~= DSInfo.interval then
               bars_prev = Size()
               -- удаляем метку если она уже была и создаем новую
               if Label_ID ~= nil then LbDelete() end;   
               Label_ID = labeldraw(chart_tag, index)
               TF_prev = DSInfo.interval
            
            end;


         end -- every second
         -- завершение цикла
         n_OnCalcCount = n_OnCalcCount+1
   --PrintDbgStr('END Cycle index == Size() ' .. Size()..', n_OnCalcCount = '..n_OnCalcCount)
      end -- index == Size()         
         
   end -- if index > 1 
   
   return nil
end

function labeldraw(tag, index)
 
   local highest = 0.0   
   for j = 0, 14 do
   local m=index-j;
      if m>0 and H(m) > highest then highest = H(m) end;
   end

   local _t =    T(index-3)
   --PrintDbgStr(_t.year.._t.month.._t.day..' '.._t.hour..':'.._t.min..':'.._t.sec)
   local Y = tostring(_t.year)
   local m = tostring(_t.month)   if #m  == 1 then  m = "0"..m  end;
   local d = tostring(_t.day)      if #d  == 1 then  d = "0"..d  end;
   local hh = tostring(_t.hour)   if #hh == 1 then hh = "0"..hh end;
   local mm = tostring(_t.min)      if #mm == 1 then mm = "0"..mm end;
   local ss = '00'; -- tostring(_t.sec) if #ss == 1 then ss = "0"..ss end;

   label_params['DATE'] = tonumber(Y..m..d);
   label_params['TIME'] = tonumber(hh..mm..ss);
   label_params['YVALUE'] = highest;
   label_params['R'] = 0; -- DOUBLE Красная компонента цвета в формате RGB. Число в интервале [0;255]
   label_params['G'] = 0; -- DOUBLE Зеленая компонента цвета в формате RGB. Число в интервале [0;255]
   label_params['B'] = 255; -- DOUBLE Синяя компонента цвета в формате RGB. Число в интервале [0;255]
   label_params['TRANSPARENCY'] = 0;
   label_params['TRANSPARENT_BACKGROUND'] = 1;
   label_params['FONT_FACE_NAME'] = 'Verdana';
   label_params['FONT_HEIGHT'] = 12;

   local label_id = AddLabel(tag, label_params) -- number
   if label_id  ~= nil then
       Labels[#Labels+1] = label_id
      PrintDbgStr('Create Label_id: '..tostring(label_id)) 
   else 
      message('Don\'t create label')
   end

   return label_id  -- number

end


----  удаление меток
-- ищем и удаляем все метки независимо как и кем установленные :) 
-- функцию используем полной очистки от меток и контроля 
function LbDelete_2()
--   local _labels = {}
    local n = 0;
   for _label_id = 1, 10000, 1 do
      local L = GetLabelParams(chart_tag, _label_id )--table or nil  Табл параметров метки - все значения имеют тип – STRING
      if L ~= nil  then
         local del = DelLabel(chart_tag, _label_id)
         if del == true then 
            n = n + 1;
PrintDbgStr('LbDelete_2() Label number '..tostring(_label_id).. ' deleted ')
         end; 
      end
   end
   Label_ID = nil;
   Labels = {}
   return n;
end
-- Удаляет ранее установленные метки сохраненые в массиве
function LbDelete()
   local n = 0
   if #Labels > 0 then 
      for j=1,#Labels,1 do          
         if DelLabel(chart_tag, tonumber(Labels[j])) then 
            n = n + 1
PrintDbgStr("LbDelete() id "..tostring(Labels[j]) .. ' deleted')
          end
      end;
      Labels = {};
      Label_ID = nil;
   end;
   return n;
end;
и запустил его на демо сервере.
Мне не удалось получить наложение меток.  Можете объяснить, что надо сделать, чтобы получить наложение?
вот картинки при переходе на различные инструменты.
Метка всегда одна и соответствует инструменту





Не соединяется с сервером, При попытке соединится с сервером( сбербанк ) не устанавливается связь
 
Цитата
Евгений 101 написал:
При попытке соединится с сервером( сбербанк ) не устанавливается связь, пишет такую ошибку ( Application error: Can't connect to host 194.54.14.224:15100. Error:)
У сбера это бывает и не редко, надо просто подождать.  
getNumberOf, getNumberOf
 
Цитата
andrey2185 написал:
Цитата
nikolz написал:
 
Цитата
andrey2185  написал:
Привет, иногда в таблицу сделок приходит несколько сделок по инструменту с совпадающими микросекундами, теоретически есть вероятность, что getNumberOf("all_trade") может попасть между этими сделками, или они добавляются атомарно? Спасибо.
 И в чем проблема?  
не хочу усложнять логику, чтобы не пропустить чей-нибудь заход по стакану
Стакан - это заявки, а all_trade- это сделки.
Если используете колбеки и очередь, то ничего не пропустите.
getNumberOf, getNumberOf
 
Цитата
andrey2185 написал:
Привет, иногда в таблицу сделок приходит несколько сделок по инструменту с совпадающими микросекундами, теоретически есть вероятность, что getNumberOf("all_trade") может попасть между этими сделками, или они добавляются атомарно? Спасибо.
И в чем проблема?  
Таблица алгоритмических заявок в QUIK для Windows, Не очищается таблица алгоритмических заявок
 
Цитата
SergeyCS написал:
В другой ветке на этом форуме меня отправили на официальный документ по обходу проблем программы. Там в документе написано, что надо делать, чтобы программа не запускалась дольше двух минут - надо удалить определенный файл логов. Я его удалил, но это не помогло. Поэтому я переустановил программу. Конечно, мне бы хотелось не удалять, а сохранять локально накапливаемую историю о котировках в программе, и я ожидаю, что разработчик понимает проблему долгого запуска как проблему программы. Но к слову говоря, иногда программа не висела по 40 минут, а оживала за минуту. В этом свете я, вообще, не понимаю зачем она тогда висит по 40 минут, если может и за минуту начать работать. Разработчик может поправить какую-то маленькую ошибочку, которая заводит программу в долгий запуск, и люди не будут страдать.
40 минут это долго.
Поставьте в настройках очищать при смене даты на ПК.  Это исключит загрузку терминала из архива до подключения к серверу брокера.
--------------------------
Сколько подписано  инструментов, графиков,стаканов , скриптов луа в терминале?
-----------------------
Иногда может висеть долго из-за медленного интернета.
Провайдеры могут обрезать скорость интернета по умолчанию.
 
Ускорение загрузки QUIK
 
Добрый день,
Предлагаю следующие решения :
------------------------------
1) Сделать возможным указывать начальную дату загрузки  сохраненной на ПК  истории при старте QUIK.
--------------------------
2) Сделать возможным сохранять слепок памяти для последующей загрузки.
Таблица алгоритмических заявок в QUIK для Windows, Не очищается таблица алгоритмических заявок
 
Цитата
SergeyCS написал:
потому что у меня уже есть опыт ожидания более 40 минут времени после соединения, чтобы дождаться чтобы программа ожила и ей стало возможно пользоваться. Но с этим можно бороться установкой новой программы без накопленной истории котировок за несколько месяцев.
Почему просто не сотрете историю вместо установки новой программы?
Можно историю стирать бат файлом автоматом при запуске программы.  
Утечка памяти при getQuoteLevel2, Утечка памяти при getQuoteLevel2
 
Цитата
andrey2185 написал:
Привет, при вызове getQuoteLevel2 в OnQuote
Пардон, из вашего сообщения следует что Вы читаете стакан в колбеке
Код
...при вызове getQuoteLevel2 в OnQuote ...
Можете выложить свой тест, который покажет, что утечка есть?
Утечка памяти при getQuoteLevel2, Утечка памяти при getQuoteLevel2
 
сделайте очередь и кидайте все из колбеков в нее
В main делаете цикл обработки очереди.
В результате все сигналы колбеков будут обработаны.
В документации есть пример .  
Как создать мост QLua-скрипта с другим C++ приложением? Вопрос концепта., Предлагаю такой подход, но есть вопросы.
 
Цитата
Бес Паники написал:
Цитата
nikolz написал:
Для обмена между скриптами т е потоками main  в разных скриптах QUIK , использую глобальные переменные.
Подскажите пожалуйста где посмотреть подробнее про такой обмен данными в Quik между разными скриптами, запущенными по отдельности.
для начала спросите у алисы:  обмен данными между потоками в одном приложении
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Судя по документации функция OnDestroy() не предназначена для решения указанной задачи.
Код
Функция вызывается при удалении индикатора с графика, либо при закрытии окна 
диаграммы и не является обязательной для индикатора. 
Формат вызова: 
OnDestroy () 
В данном случае индикатор не удаляется и окно не закрывается.
А при смене инструмента в окне это функция и не должна работать.
---------------------
Задача смены лог файла при смене инструмента решается другим способом.
При смене инструмента графика в Lua индикаторе OnDestroy() не вызывается
 
Информация к размышлению
Взял скрипт который приведен здесь

тест показал, что проблемы нет:





т е при смене инструмента старые матки удаляются.
Что не так?
Получить данные о сделках при срабатывании стоп-ордера, когда скрипт не работает?
 
Цитата
Сергей Че написал:
Цитата
nikolz написал:
Сергей Че,
Вы удивитесь, но покупает не QUIK и не Вы, а брокер, по вашему поручению, которое Вы в данном случае подаете через QUIK.
Все иное Вам только кажется.
А через Lua-скрипт?
QUIK предназначен для подачи поручений  в текущей сессии. Если включите QUIK  в торговый день когда совершилась сделка то увидите иначе нет .
Но документально покупка подтверждается лишь отчетом брокера.  
Все что видите в QUIK это как новости по ящику.  Может правда, а может нет. Реальность лишь в отчете брокера.
Получить данные о сделках при срабатывании стоп-ордера, когда скрипт не работает?
 
Сергей Че,
Вы удивитесь, но покупает не QUIK и не Вы, а брокер, по вашему поручению, которое Вы в данном случае подаете через QUIK.
Все иное Вам только кажется.
Получить данные о сделках при срабатывании стоп-ордера, когда скрипт не работает?
 
Цитата
Сергей Че написал:
Можно ли получить данные о сделках при срабатывании стоп-ордера, когда скрипт не работает?

Пример. Цена растёт, я открыл лонг, поставил стоп-ордер под точку входа. Потом закрыл квик, выключил компьтер, и включил его через неделю.
Как узнать, по какой цене произошла сделка (сделки), когда на следующий день после открытия позиции сработал стоп-ордер и закрыл мою позицию?
Можно ли узнать данные о произошедшей сделке (сделках), когда я снова включу компьютер и открою квик?
Смотрите отчет брокера.  
CreateDataSource
 
Цитата
Сергей Че написал:
Цитата
nikolz написал:
 Сергей Че  ,
Рекомендую почитать про потоки и не только:
Спасибо за рекомандацию, но всё-таки, что произойдёт с ИД второго скрипта, если в первом выполнить   data_source    :Сlose()  , учитывая, как было сказано выше, что хранилище свечей одно.
Если библиотека QLua написана правильно ( а сомнений в этом пока нет), то ничего существенного не произойдет.
-------------------
Обычно, если ресурс используется различными приложениями , например , библиотеки, то создается счетчик обращений к данному ресурсу. если подписались, то счетчик увеличивается, а если отписались то уменьшается.
Ресурс освобождается лишь при нулевом счетчике.  
CreateDataSource
 
Сергей Че,
Рекомендую почитать про потоки и не только:
CreateDataSource
 
Цитата
Сергей Че написал:
Цитата
TGB написал:
 
Цитата
Сергей Че  написал:
Сколько потоков создаст функция CreateDataSource()?
      Вы, наверное, хотели спросить: сколько хранилищ свечей создаст функция CreateDataSource()?
Ответ: одно.
И что будет, если в одном из скриптов вызвать   data_source:Close()  ?
Другой скрипт обломается?
Сергей Че, Вы что-то путаете
Функция reateDataSource()? никакие потоки не открывает. Я вам это уже давно сказал. Вы опять пошли по кругу.
Как получить sec_code по идентификатору графика?, Как получить sec_code по идентификатору графика?
 
Цитата
AndyWise написал:
Цитата
nikolz написал:
можно поставить таймер. или использовать тики и высокоточный счетчик.
В файл, тики,  тики плюс+счетчик - это понятно. А таймер это как? Я так понял, что если инструмент не в торгах и не в сделках, то график статичен и там нет событий вообще.
Таймер и высокоточный счетчик это API C for Lua.
---------------
Один из вариантов решения  проблемы с малыми движениями индикатора на инструменте.
Торгую вечным фьючерсом сбера. Он изменяется медленно. Открываю лучшее предложение/спрос на графике акции.  
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 86 След.
Наверх