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

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

Страницы: Пред. 1 ... 48 49 50 51 52 53 54 55 56 57 58 ... 79 След.
for для значений свечей
 
Цитата
jonny1960 написал:
Подскажите, как правильно получить значения цены закрытия для N последних свечей и умножить на их порядковый номер по счету (P1 * 5) + (P2 * 4) + (P3 * 3)

И не совсем понимаю, что делает функция Squeeze и зачем она нужна?

if CandleExist(I,ds) then

if it.l >= P then
local MD = 0
for i = it.l-P+1, it.l do
    MD = MD + (GetValueEX(it[Squeeze(i,P)], VT, ds))  * i
end
return MD
end
end
http://www.kamynin.ru/
пример индикатора для произвольных параметров.
по его подобию можете сделать любой свой.
Кто как решил вопрос уведомления о сделках?
 
На самом деле посылать письма из квика на смартфон
или оповещать через приложение,  работающие через интернет,
которое установлено  на смартфоне - это какой-то мазохизм.
---------------------
У вас терминал квика в режиме торгов постоянно включен в интернет
и смартфон тоже в интернете.
Ну так что же вам мешает передать сообщение по схеме pоint to point, а не гонять письма и сообщения через сторонние сервера?
Скорость передачи будет раз в сто выше, а накладные расходы раз в сто меньше.
Делал такое, давно это было.
--------------------------
Подумайте на досуге.
Расчёт ГО
 
ГО  считает не квик, а программа от биржи.
См. ссылку выше.
Все правила и формулы биржевых торгов устанавливает биржа.
Базовый актив по фьючерсу, Базовый актив по фьючерсу можно ли получить
 
Цитата
Незнайка написал:
Для фьючерсного контракта на акцию есть конкретная ценная бумага, которая торгуется на бирже и поставляется при экспирации.
Как из квика получить код этой бумаги, например для GZU0?
начну с анекдота:
-----------------------
Мужик вечером что-то ищет у фонаря.
Прохожий спрашивает - что потерял?
Да вон там у забора 100 рублей.
А почему здесь ищешь?
Так тут светлее.
--------------------------------
Вы очевидно как этот мужик.
Вместо того, чтобы искать коды фьючерсов на бирже , которая их и придумала, задаете вопрос на форуме.
---------------------------
В будущем ищите там, где потеряли.
=====================
Ваш ответ на бирже называется:
-------------------
Спецификации коротких кодов фьючерсных и опционных контрактов на срочном рынке
---------------------
https://www.moex.com/a214

Параметр STARTTIME, ENDTIME, Вечерняя сессия на фондовой секции
 
Цитата
Nikolay написал:
Начались торги в вечернюю сессию на фондовой секции. Я уже задавал вопрос про трансляцию времени сессии, но вот сейчас она идет и можно посмотреть на реальный поток данных.

Что мы видим:

Вот утро. Начало торгов. По фьючерсу все ожидаемо и понятно. Есть и времена и статус.
По акции я вижу только статус, а время заполнилось только утренним аукционом.


[INFO  2020-06-23 09:16:58] : SRU0 STATUS {param_image = "приостановлена", param_type = "4", param_value = "2.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 CLSTATE {param_image = "Назначен пр.", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 MONSTARTTIME {param_image = "7:00:00", param_type = "5", param_value = "70000.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 MONENDTIME {param_image = "8:40:00", param_type = "5", param_value = "84000.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 STARTTIME {param_image = "10:00:00", param_type = "5", param_value = "100000.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 ENDTIME {param_image = "18:45:00", param_type = "5", param_value = "184500.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 EVNSTARTTIME {param_image = "19:00:00", param_type = "5", param_value = "190000.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SRU0 EVNENDTIME {param_image = "23:50:00", param_type = "5", param_value = "235000.000000", result = "1"}

[INFO  2020-06-23 09:16:58] : SBER STATUS {param_image = "торгуется", param_type = "4", param_value = "1.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SBER CLSTATE {param_image = "", param_type = "0", param_value = "0.000000", result = "0"}
[INFO  2020-06-23 09:16:58] : SBER TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SBER MONSTARTTIME {param_image = "", param_type = "0", param_value = "0.000000", result = "0"}
[INFO  2020-06-23 09:16:58] : SBER MONENDTIME {param_image = "", param_type = "0", param_value = "0.000000", result = "0"}
[INFO  2020-06-23 09:16:58] : SBER STARTTIME {param_image = "", param_type = "5", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SBER ENDTIME {param_image = "", param_type = "5", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:16:58] : SBER EVNSTARTTIME {param_image = "", param_type = "0", param_value = "0.000000", result = "0"}
[INFO  2020-06-23 09:16:58] : SBER EVNENDTIME {param_image = "", param_type = "0", param_value = "0.000000", result = "0"}

[INFO  2020-06-23 09:50:00] : SBER TRADINGSTATUS {param_image = "открытие", param_type = "4", param_value = "3.000000", result = "1"}
[INFO  2020-06-23 09:50:02] : SBER STARTTIME {param_image = "9:50:00", param_type = "5", param_value = "95000.000000", result = "1"}
[INFO  2020-06-23 09:59:33] : SBER TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 09:59:33] : SBER ENDTIME {param_image = "9:59:34", param_type = "5", param_value = "95934.000000", result = "1"}
[INFO  2020-06-23 10:00:00] : SRU0 STATUS {param_image = "торгуется", param_type = "4", param_value = "1.000000", result = "1"}
[INFO  2020-06-23 10:00:00] : SRU0 TRADINGSTATUS {param_image = "открыта", param_type = "4", param_value = "1.000000", result = "1"}
[INFO  2020-06-23 10:00:00] : SBER TRADINGSTATUS {param_image = "открыта", param_type = "4", param_value = "1.000000", result = "1"}

Вот данные пор акции внутри дня. Время утреннего акциона. Это как понимать? Уже сессия к концу идет, а время старое.
[INFO  2020-06-23 17:33:32] : SBER TRADINGSTATUS {param_image = "открыта", param_type = "4", param_value = "1.000000", result = "1"}
[INFO  2020-06-23 17:33:32] : SBER STARTTIME {param_image = "9:50:00", param_type = "5", param_value = "95000.000000", result = "1"}
[INFO  2020-06-23 17:33:32] : SBER ENDTIME {param_image = "9:59:34", param_type = "5", param_value = "95934.000000", result = "1"}


Вечер. По фьючерсам все адекватно, а вот по акциям:

[INFO  2020-06-23 18:40:00] : SBER TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 18:40:05] : SBER TRADINGSTATUS {param_image = "аукцион", param_type = "4", param_value = "4.000000", result = "1"}
[INFO  2020-06-23 18:40:16] : SBER STARTTIME {param_image = "18:40:01", param_type = "5", param_value = "184001.000000", result = "1"}
[INFO  2020-06-23 18:40:16] : SBER ENDTIME {param_image = "", param_type = "5", param_value = "0.000000", result = "1"}

[INFO  2020-06-23 18:45:15] : SBER TRADINGSTATUS {param_image = "ЦАЗ", param_type = "4", param_value = "5.000000", result = "1"}
[INFO  2020-06-23 18:45:16] : SBER STARTTIME {param_image = "18:45:14", param_type = "5", param_value = "184514.000000", result = "1"}

[INFO  2020-06-23 18:50:02] : SBER TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 18:50:04] : SBER ENDTIME {param_image = "18:50:00", param_type = "5", param_value = "185000.000000", result = "1"}
[INFO  2020-06-23 19:00:12] : SBER TRADINGSTATUS {param_image = "открытие", param_type = "4", param_value = "3.000000", result = "1"}
[INFO  2020-06-23 19:00:13] : SBER STARTTIME {param_image = "19:00:01", param_type = "5", param_value = "190001.000000", result = "1"}
[INFO  2020-06-23 19:00:13] : SBER ENDTIME {param_image = "", param_type = "5", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 19:04:54] : SBER TRADINGSTATUS {param_image = "закрыта", param_type = "4", param_value = "0.000000", result = "1"}
[INFO  2020-06-23 19:04:54] : SBER ENDTIME {param_image = "19:04:54", param_type = "5", param_value = "190454.000000", result = "1"}
[INFO  2020-06-23 19:05:00] : SBER TRADINGSTATUS {param_image = "открыта", param_type = "4", param_value = "1.000000", result = "1"}

[INFO  2020-06-23 19:21:34] : SBER STARTTIME {param_image = "19:00:01", param_type = "5", param_value = "190001.000000", result = "1"}
[INFO  2020-06-23 19:21:34] : SBER ENDTIME {param_image = "19:04:54", param_type = "5", param_value = "190454.000000", result = "1"}

Времена аукциона я еще могу понять. А вот что это такое при старте вечерней сессии уже с трудом. И опять - времена то где?
Почему нельзя заполнить времена прямо при подключению к серверу, как это делается для фьючерсов и менять их, если они меняются внутри дня? Поля же есть.

Часть акций торгуется, часть нет. А информации о времени сессии нет. Раньше можно было хотя бы определить константы, когда времена были фиксированными (хоть это было и спорное решение), но сейчас то как.
На первом этапе на вечерней сессии торгуются 25 ликвидных акций из списка индекса МосБиржи,
а до конца года в список торгуемых инструментов войдут все акции из индекса МосБиржи (38 акций),
а также 50 наиболее ликвидных иностранных акций из американского индекса S&P 500.
Ошибка скрипта Lua
 
Цитата
Николай написал:
В Lua загружаю библиотеку написанную мной на C++ (я предварительно переписал и скомпилировал C++ код под Lua5.3)require("luacdll")
Файлы luacdll.dll и файл lua положил в папку с quik. При загрузке dll выдает ошибку
error loading module 'luacdll' fr om file '.\luacdll.lua':
.\luacdll.lua:1: too many C levels (lim it is 200) in main function near '"luacdll"'
Компилировал библиотеку на C++ под Win64 Relise в Visual Studio 2017
регистрировал внешние функции так
extern "C" LUALIB_API int luaopen_luacdll(lua_State *L) {
// эта функция выполнится в момент вызова require() в Lua-коде
// регистрируем реализованные в dll функций, чтобы они стали дуступны для Lua
#if LUA_VERSION_NUM >= 502
lua_newtable(L);
luaL_setfuncs(L, ls_lib, 0);
lua_setglobal(L, "luacdll");
#else
luaL_openlib(L, "luacdll", ls_lib, 0);
#endif
return 0;
}
Если указать в коде Lua перед загрузкой модуля dll
package.cpath = "C:\\Open_Broker_QUIK_AGromazin\\luacdll.dll"
Ничего не меняется
Внимательно читаем сообщение об ошибке:
too many C levels (lim it is 200) in main function near '"luacdll"'
Усе понятно?
Медленное обновление значений таблицы в скрипте при sleep < 100
 
Цитата
Михаил В написал:
Если выставить sleep < 100 например 10 или 1, то обновление в таблице происходят очень медленно, раз в 10 секунд примерно или по нажатию мышкой в любую ячейку таблицы. Торговые операции при этом проходят нормально. Можно ли как-то побороть?
Пример:
function main()
  CreateTable()
  while IsRun do
     SetCell(t_id, 8, 1, tostring(math.random(1,9999)))
     sleep(10)
  end
end
1) вообще-то минимальный квант времени для задачи в винде без танцев с бубном составляет не менее 10 мс.
sleep останавливает вашу задачу и отдает оставшееся время ее кванта другой задачи.
если Вы установите 10 или меньше, то вы ничего не отдадите в реальности, т к это и есть минимум для вашей задачи.
В квике все еще хуже.
Поэтому ставить в sleep значения меньше 10 - не имеет смысла.
Надо ставить  больше.
-----------------------
2) в документации на QLUA указано, что если установлен sleep ,   нет обработки событий терминала в функции main.
-------------------------------------------
Поэтому не следует ждать чудо от QUIK,
подобно тому как не следует пытаться  на самокате выжать 100 км в час.
--------------------------------
Будьте реалистом.
Расчёт ГО
 
в документации указанной выше Вы узнаете что ГО зависит от направления сделки:
Эффекты:
• Асимметричное ГО на покупку и продажу
• Увеличение ГО по однонаправленным позициям из-за учета
процентного риска
• Снижение изменений из-за влияния IR с увеличением срока
• Снижение ГО по позициям в ММС и по «Календарным спредам»
---------------------
Как узнать, будут ли завтра или в другую дату торги по фъючерсу, Автоматическая замена кодов фъючерсов
 
Цитата
Евгений Петров написал:
Цитата
_sk_ написал:
Не ломай голову, в явном виде пропиши дату, когда надо переходить на новый фьючерс.
С календариком посмотреть когда какой фъючерс заканчивается и в какой день лучше менять с учетом праздников и выходных? Особенно это неудобно у нефти. Хотелось бы автоматизировать
ну так введите в начале года в программу календарь и считывайте автоматически.
в чем проблема?
Расчёт ГО
 
здесь руководство:
http://ftp.moex.com/pub/ClientsAPI/Spectra/SpectraIM/prod/doc/
здесь софт:
http://ftp.moex.com/pub/ClientsAPI/Spectra/SpectraIM/prod/
Расчёт ГО
 
Цитата
Незнайка написал:
Т.е., вас не смущает, что в окне ввода заявки указывается одно значение ГО, а резервируется под эту заявку совсем другая величина?
читайте первоисточники:
https://www.moex.com/s95
https://www.moex.com/s1573
Создание индикатора внутри скрипта
 
пример
http://www.kamynin.ru/
Индикатор для QUIK на LUA
 
пример
http://www.kamynin.ru/
Кто может написать простой скрипт на Lua для индивидуального графика-индикатора?, написать простой скрипт на Lua для индивидуального графика-индикатора
 
пример здесь:
http://www.kamynin.ru/
Кто может написать простой скрипт на Lua для индивидуального графика-индикатора?, написать простой скрипт на Lua для индивидуального графика-индикатора
 
Цитата
Дмитрий написал:
можете написать этот скрипт?
правильно понял :
вывести на экран  сумму=
"количество заявок на покупку" + "на продажу" + обьем (???)
------------------------
В таблице нет параметра "объем"
есть "оборот в деньгах"
---------------
что такое  "объем" и откуда его брать?
Соответствие Кодов клиента и Торговых счетов, Определение соответствия Кодов клиента и Торговых счетов
 
Цитата
Сергей написал:
Освежу темку.
1. Если фирма для брокера это группа счетов, то зачем в вызовах getDepoEx, getMoneyEx, getFuturesLimit, ... кроме номера счета указывать еще и фирму? Кажется, эта информация избыточна.
2. Практически всегда, номер счета фондового рынка МБ имеет код "L01~00000F00", получается это не счет клиента, и даже не брокера, а .... счет чего?
на бирже торгуют фирмы(брокеры) а не их клиенты
поэтому информация о фирме нужна бирже.  
кроме того в сделке на бирже есть и идентификатор клиента,
но идентификатор клиента(счет)  нужен реально лишь брокеру для разнесения сделок по клиентам во внутренней "амбарной книге"
Базовый актив по фьючерсу, Базовый актив по фьючерсу можно ли получить
 
Цитата
just написал:
Здравствуйте, подскажите, пожалуйста можно ли программно получить базовый актив по фьючерсу или наоборот найти есть ли фьючерсы к заданному активу.
Например, getParamEx("SPBFUT", "SiM0", "OPTIONBASE").param_image возвращает значение "Si", а актив, который, я так понял, лучше всего подходит в качестве базового я нахожу по коду USD000UTSTOM. Ну и по другим фьючерсам аналогично... Вычислить конкретный базовый актив, который можно использовать в коде я не вижу как...
Si - фьючерсный контракт на курс доллара США/ российского рубля, обращающийся на бирже РТС FORTS.
Для фьючерса Si базовым активом является официальный курс доллара и рос. рубля Центральным Банком РФ.
Участники сделки (покупатель и продавец) фьючерса торгуются только за цену, и несут ответственность перед РТС до момента исполнения (даты погашения).
Исполнение фьючерса происходит по расчетной цене, которая зафиксируется в день погашения.
Индикатор уровней совпадения цен
 
например:
Индикатор уровней совпадения цен
 
тип "4"
Получение параметров из таблиц в переменные
 
вместо:
if tblAsk==nil          then Ask=0          else Ask=tonumber(tblAsk.param_value)                   end  
--------------
пишите проще:
if tblAsk   then  Ask=tonumber(tblAsk.param_value)    end  
----------------------------------
где используете Ask
тоже пишите
if Ask then ....  end
-----------------
В итоге вы не будете тратить время на расчеты если Ask=nil ,
а в Вашем случает Вы тратите время на расчеты, если Ask=0,
либо ставите такое же условие для нуля
 
Расчёт ГО
 
Цитата
Незнайка написал:
т
возможно это что-то прояснит:
https://iwtkl.livejournal.com/21873.html
Индикатор для QUIK на LUA
 
Цитата
Владимир написал:
Добрый день.

Ищу специалиста, который напишет индикатор для QUIK на LUA.
Для обсуждения условий, прошу оставить контакты либо в личку, либо в этой теме.

Также буду благодарен, если кого то рекомендуете или напишите специализированный ресурс.
пришлите описание индикатора, если мне он  будет интересен и я его еще не писал, то напишу бесплатно.
Как отследить событие - перерыв в торгах на фортс
 
Простейший вариант:
Получаем точное время.
три варианта:
1) синхронизируем компьютер по серверу точного времени
2) читаем время сервера брокера из параметров соединения квик
3) читаем в скрипте время с сервера точного времени
-------------
сравниваем текущее точное время с ожидаемым (временем перерыва)
==================
достижимая погрешность 0.01 сек
точнее лишь в дата центре
Создание индикатора внутри скрипта
 
Цитата
Александр написал:
Спасибо. А если рассчитать значения в скрмпте, можно как-нибудь отрисовать их на графике?
например так
1) делаете индикатор (test.lua) на вывод содержимого из файла  (test.log)
-----------------
2) в скрипте считаете индикатор test и пишите в файл test.log
---------------------
пускаем скрипт пускаем индикатор
если файла нет то при пуске индикатора ничего отображаться не будет
--------------
таким образом можете считать и отображать любое количество индикаторов
------------------------------
например так создаю индикатор отношения числа заявок на покупку к числу заявок на продажу

 
Удаления всех комментариев из скрипта.lua
 
вот вариант учитывающий вроде бы ваши желания.
nk_com_v1.lua
-----------------
-- удаляем комментарии и лишние пробелы
--пример вызова для файла C:\NK\nk_bot.lua:
--lua  nk_com_v1.lua C:\NK\nk_bot
--------------------
if arg[1] then out=io.open(arg[1].."_.lua","w")
----------------
for s1 in io.lines(arg[1]..".lua") do
len=string.len(s1); s=""; x1=0;
m=1; while len>=m do x=string.byte(s1,m)
if x==59 then x=32 end
if x==32 and x==x1 then x1=x; x=0 else
if f==nil then
if n==nil then if x==34 or x==39 then n=x end
else if x==n then n=nil end end
end
if n==nil then z0=string.byte(s1,m+1);
if x==45 and z0==x then
z=string.byte(s1,m+2);   z1=string.byte(s1,m+3);
if f then
if f==1 then if z==93 and z==z1 then f=nil m=m+3; x=0; end end
else if z==91 and z==z1 then f=1 end break;end end
if f then x=0; end
end
x1=x;
end
if x and x>=32 then s=s..string.char(x);x=x1; end
m=m+1;
end
if s and s~="" then out:write(s.."\n") end
end
out:close();
end
--------------------------------------------
если что-то не учитывает то напишите
это тест:
Удаления всех комментариев из скрипта.lua
 
Цитата
Archie_ написал:
nikolz, А теперь обработайте все эти примеры вот этой функцией
Код
       local   function   DeleteAll_Comments (text);
         ---- 
        text  =  text .. '\n';
         local  t,t2,t3,one,two,cmt,x,Rem  =  {},{},{}, 0 , 0 , 0 , 1 , nil ;
         local  boxOpens,box Close ,RemStr  =   0 , 0 , nil ;
         local  SingleLine,boxActiv  =   nil , nil ;
         local  LineCom,LineComM,LineComRemove  =   0 , nil , nil ;
         ---- 
         for  val  in  text:gmatch( ".-\n" ) do ;
            t3[ # t3 +  1 ] = val:gsub( '\n' ,( ' ' ):rep( 2 ) .. '\n');
         end ;
        text  =   table.concat (t3);
         ---- 
         for  val  in  text:gmatch( "." )  do ;
            t[ # t +  1 ]  =  val;
         end ;
         ---- 
         for  i  =   1 , # t  do ;
             -------------------- 
             if  Rem  then ;
                 local  Cls  =  RemStr:match( '.' ,x);
                 if  Cls  =  =  t[i]  and  x  =  =   # RemStr  then  RemStr  =   nil  Rem  =   nil  Cls =  nil   end ;
                 if  Cls  =  =  t[i]  then  x  =  x  +   1   end ;
                 if  Cls ~ =  t[i]  then  x  =   1   end ;
                t[i]  =   "" ;
             end ;
             -------------------- 
             -------------------- 
             if  LineComRemove  then ;
                 if  t[i] ~ =   '\n'   then ;
                    t[i]  =   "" ;
                 else ;
                    LineComRemove  =   nil ;
                 end ;
             end ;
             -------------------- 
             if  LineCom  =  =   1   and  t[i] ~ =   "-"   then  LineCom  =   0   end ;
             if  one =  =  0   and  two =  =  0   and   not  boxActiv  and   not  Rem  and   not  LineComRemove  then ;
                 if  LineCom  >  =   3   then ; --4 simb>= 
                     if  t[i]  =  =   "["   or  t[i]  =  =   "="   and  LineComM  =  =   1   then ;
                         if  t[i]  =  =   "["   then ;
                            LineCom  =   0 ;
                            LineComM  =   nil ;
                         end ;
                     else ;
                        t[i -  0 ],t[i -  1 ],t[i -  2 ],t[i -  3 ]  =   '' ,'','','';
                        LineComRemove  =   true ;
                        LineCom,LineComM  =   0 , nil ;
                        boxOpens,box Close ,SingleLine,cmt,t2  =   0 , 0 , nil , 0 ,{};
                     end ;
                 end ;
                 if  LineCom  =  =   2   then ;
                    LineCom  =  LineCom +  1 ;
                     if  t[i]  =  =   "["   then  LineComM  =   1   end ;
                 end ;
                 if  t[i]  =  =   "-"   and  LineCom  <   2   and   not  LineComRemove  then ;
                    LineCom  =  LineCom +  1 ;
                 end ;
             end ; 
             if   not  LineComRemove  then ;
             -------------------------------------------------- 
                 -------------------------------------------------- 
                 if  t[i]  =  =   "'"   and  two  =  =   0   and   not  boxActiv  then ;
                     if  one  >   0   then  one  =   0   else  one  =   1   end ;
                 end ;
                 --- 
                 if  t[i]  =  =   '"'   and  one  =  =   0   and   not  boxActiv  then ;
                     if  two  >   0   then  two  =   0   else  two  =   1   end ;
                 end ;
                 --- 
                 if  t[i] ~ =   '['  then  boxOpens  =   0   end ;
                 if  t[i] ~ =   ']'  then  box Close   =   0   end ;
                 if  t[i] ~ =   "-"   then  cmt  =   0   end ;
                 --- 
                 if  t[i]  =  =   '['   and  one  =  =   0   and  two  =  =   0   and   not  boxActiv  and   # t2  <   2   then ;
                    boxOpens  =  boxOpens +  1 ;
                     if  boxOpens  >  =   2   then ;
                        boxOpens  =   0 ;
                        boxActiv  =   true ;
                     end ;
                 end ;
                 ---  
                 if  t[i]  =  =   ']'   and  one  =  =   0   and  two  =  =   0   and  boxActiv  then ;
                    box Close   =  box Close  +  1 ;
                     if  box Close   >  =   2   then ;
                         box Close   =   0 ;
                         boxActiv  =   nil ;
                     end ;
                 end ;
                 --- 
                 if  SingleLine  then  t2[ 1 ],t2[ 2 ]  =   '-' ,' - ' end ;
                
                 if  one  =  =   0   and  two  =  =   0   and   not  boxActiv  and  t[i]  =  =   '-'   then ;
                   cmt  =  cmt  +   1 ;
                    if  cmt  >  =   2   then ; SingleLine  =   true ; cmt =  0   end ;
                 end ;
                 --- 
                 if  SingleLine  and   # t2 >  =  2   then ;
                     if  (t[i]  =  =   '['   or  t[i]  =  =   '=' )  and   # t2  >  =   3   then ;
                        t2[ # t2 +  1 ]  =  t[i];
                     elseif  t[i] ~ =   '['   and  t[i] ~ =   '='   and   # t2  >  =   3   then ;
                       t2  =  {};
                       SingleLine  =   nil ;
                     end ;
                     --- 
                     if  t[i]  =  =   '['   and   # t2 =  =  2   then ;
                        t2[ 3 ]  =  t[i];
                     elseif   # t2  =  =   2   and  t[i] ~ =   '['   then ;
                        t2  =  {};
                        SingleLine  =   nil ;
                     end ;
                     --- 
                     if   # t2  >   3   and  t[i]  =  =   '['   then ;
                        Rem  =   true ;
                         for  ii  =   1 , # t2  do ;
                            t[i - (ii -  1 )]  =   '' ;
                         end ;
                        RemStr  =   table.concat (t2):gsub( '%s' ,''):gsub( '%-' ,''):gsub( '%[' ,']');
                        t2  =  {};
                        SingleLine  =   nil ;
                         if   not  RemStr  or  RemStr =  =  ''   then  Rem  =   nil   end ;
                     end ;
                 end ;
             ------- 
             end ; --LineComRemove 
         end ; --End for #t 
        text  =   table.concat (t);
         ---- 
        t3  =  {};
         for  val  in  text:gmatch( ".-\n" ) do ;
            t3[ # t3 +  1 ] = val:gsub( '%s%s\n' ,'\n');
         end ;
         ---- 
         return   table.concat (t3);
     end ;
     --=================================== 
    
    
    
     --filename = [[C:\\...]] 
    
     local  file  =   io.open (filename .. '.lua','r');
     if   not  file  then   return   end ;
     local  text  =  file:read( 'a' );
    file:close();
     ----- 
    text  =  DeleteAll_Comments(text);
     ----- 
    file  =   io.open (filename .. '_.lua','w');
    file:write(text)
    file:close();
     --===================================  
  
начнем по порядку
Зачем так агрессивно вести беседу?
Я Вам ничего не должен.
--------------------
теперь по существу.
Сравните размер кода вашего и моего.
------------------
Я написал его за 20 минут на основе своих привычек размещать коммент
--------------------------
Выше я привел как я ставлю многострочный
Ставить закрытие в конце строки как у Вас  по-моему мнению это не красиво и не наглядно. поэтому у меня даже мысли не возникало так  ставить
-------------------------
Но если такие чудики есть, то это легко исправить
Вариант с тестом, содержащим символы выделения, тоже решается просто,
Так как никогда не было такой надобности в таких кусках текста, то об этом не заморачивался
----------------
Удаления всех комментариев из скрипта.lua
 
одно замечание
я выделяю многострочные  коммент и так именно обрабатывается коммент в данной программе:
--[[  ......
.......
......
--]]
т е символы выделения всегда в начале строки
у Вас в первом примере завершающий символ в конце строки
Удаления всех комментариев из скрипта.lua
 
вот пример удаления
Удаления всех комментариев из скрипта.lua
 
могу выложить скрипт до и после
объем скрипта 1000 операторов
--------------------------
напишите конкретно что у вас не работает
или выложите свой файл я вам его обработаю и опубликую.
если  есть у вас потребность в таком скрипте.
---------------------
если не умеете запускать то могу выложить скомпилированный или exe файл например для Luajit.
Индикатор с уровнями для 3 таймфреймов
 
Цитата
Иван написал:
Цитата
Andrey Bezrukov написал:
Иван ,

Нет, такой возможности нет - MA привязан к текущему интервалу графика, который может быть только один для одного окна графика.

Наиболее вероятно, Вашу задачу можно решить пользовательским индикатором на LUA. Необходимую информацию и примеры для написания собственных индикаторов Вы можете найти по следующей   ссылке  .
Вопрос немного в другом.
1) Можно ли на принципах индикатора нарисовать линию и после двигать ее мышкой на графике.
2) Можно ли запомнить ее ID что бы не отрисовывать дважды?
двигать мышкой нельзя
запомнить можно  в массиве
Удаления всех комментариев из скрипта.lua
 
Цитата
Archie_ написал:
Привет всем!
Ребят подскажите пожалуйста, как удалить все комментарии из файла lua, может быть есть у кого уже написанная функция. Поиск  в Google не дал результатов.
Попытался написать сам, на первый взгляд вроде бы просто, но оказалось не все так просто, потому как в середине строки может встретится что то типа того ***   или еще чего и это оказалось выше моих сил.
Спасибо!

***
Код
   if  bla  then  bla  =   '--'   end   -  -  коммент
 if  bla  then  bla  =   'D --'   end   -  -  коммент


или

 --[[ bla bla bla bla bla --[==[ bla bla bla  
bla bla bla bla  -- bla bla bla  -- bla bla --]=] bla  
bla bla bla bla  --]] 

  
выкладываю скрипт (nk_com.lua):
Код
-- удаляем комментарии и лишние пробелы
--пример вызова для файла C:\NK\nk_bot.lua: nk_com.lua C:\NK\nk_bot
--результат в  C:\NK\nk_bot_.lua:
--------------------
if arg[1] then
out=io.open(arg[1].."_.lua","w")
----------------
for s1 in io.lines(arg[1]..".lua") do
   local len=string.len(s1);    local s="";
   for m=1,len do
      local x=string.byte(s1,m)
      if x==59 then x=32 end
      if x==32 then
         if s~="" and m~=len then
            if f==nil then s=s..string.char(x) f=1 end
         end
      else if x>=32 then s=s..string.char(x); f=nil; end  end
   end
   if  e then s=nil;end
   if s2=="--]]" then e=nil; else   if s2=="--[[" then e=1; s=nil; end end    --многострочный комментарий
   if s then
      local m=string.find(s,"%-%-")
      if m then
      if m==1 then s=nil else  s=string.sub(s,1,m-1)
      end  end
      if s and s~="" then out:write(s.."\n")    end
     end
end
out:close();
end
Список всех идентификаторов графиков на текущий момент в Quik
 
Цитата
Иван написал:
Цитата
Sergey Gorokhov написал:
Здравствуйте,
Такой возможности не предусмотрено.
А можно как-то проверить существует такой идентификатор или нет?
Можно сделать так:
перечень встроенных индикаторов не меняется.
поэтому его можно записать в текстовый файл
------------------------
все самопальные индикаторы размещаются в папке LuaIndicators.
Читаем имена файлов в этой папке.
 
очереди
 
На самом деле, правильный ответ такой
для айсберг заявки -поставит 1
для обычной 101
т е оба варианта верны.
всем спасибо
очереди
 
Разве айсберг заявка не реализует этот алгоритм?
очереди
 
Цитата
Andrey Bezrukov написал:
Здравствуйте, Николай Камынин.

Новая заявка встанет в очередь с номером 101.
просьба пояснить, Вы знаете алгоритм работы сервера или это ваше предположение?
----------------------------------
Я тоже так полагал,
Но, предлагаю вам посмотреть в стакан.
Там можно наблюдать как маркет-мейкер ставит заявки по одной акции.
Если поставить туда же  свои заявки то при исполнении
число заявок на этой позиции увеличится
и свои исполнятся не второй а гораздо позже.
----------------
Знаю, что такой прием раньше использовался на форексе.
Жизнеспособность идеи - 100 контрактов = 100 стоп-ордеров по 1 контракту каждый
 
Цитата
Иван написал:
Не совсем понял при чем здесь HFT роботы (высокочастотники как понимаю)?

Сейчас у меня стоп выставляется через функцию OnTrade().
Прошла сделка объемом 7 = выставился стоп объемом 7.

Сложность начинается тогда, когда мне нужно сделать закрытие частями.
К примеру хочу закрыть 30% сделки - это будет 3 контракта.

Соответственно сделка прошла и OnTrade() вижу что мне нужно изменить стоп на 7 контрактов. И здесь начинаются сложности - удали стоп 7, выставь стоп 4.
Это хорошо сработает если исполнится 3 контракта сразу. А если они исполнятся по 1, 1 и 1. Т.е. мне нужно удалить стоп 7, выставить стоп 6. Удалить стоп 6 (которого возможно еще нет в живых), поставить стоп 5, удалить стоп 5 (которого также еще нет), поставь стоп 4. Сложность в этом.
поясню
Проблема в скорости поступления в терминал(ваш комп)  информации с сервера биржи и в скорости исполнения сервером квика поручений с терминала
В HFT  задержки составят десятки микросекунд
а в квике сотни миллисекунд.
Поэтому пока вы снимаете старый стоп и выставляете новый - это все будет исполнять сервер квика, сервер биржи уже продаст следующую часть в вашей заявке.
-----------------
Поэтому для высоколиквидного инструмента квик не обеспечит нужной скорости исполнения
------------------
поэтому для конкретного ответа надо рассматривать конкретный алгоритм конкретный инструмент
иначе это лишь теория.
Программу можете написать, но реально это не всегда будет работать как хочется.
очереди
 
Добрый день,
вопрос к разработчикам.
----------------------
Рассмотрим такую ситуацию.
На сервере есть очередь заявок длинною 100
первой стоит заявка клиента1
в текущий момент этот клиент подает точно такую же заявку, но с другим количеством
-----------------------
Внимание вопросы:
1) как данную ситуацию обработает сервер квика
2) как данную ситуацию обработает сервер биржи
---------------------
Варианты ответов
1) поместит заявку в очередь с номером 101
2) добавит заявку в очередь с номером 1
------------
Спасибо
Какая кодировка используются в Lua?
 
Цитата
Anton написал:
Цитата
Николай Камынин написал:
текст в любой кодировке - это массив байт
Вообще все в компьютере это массив байт. Остальное все неверно. Ноль в конце это чисто сишная фишка, в паскале их нет например. Строка это не байты, а codepoints, каждая из которых может быть больше байта (до четырех например в utf8). Если вы разрежете строку посреди codepoint, обе половины уже не будут строками или, в лучшем случае, будут битыми строками. Отображение это вообще отдельная тема, там не только codepoints действуют, композиция включается, а еще куча параметров конкретного шрифта. Знание кодировки нужно для любых действий со строкой, отличных от простого копирования. Это если говорить о строках, а не о кучке мусора с приделанным ноликом. Прежде чем пояснять, стоит все же хоть немного тему изучить.
ну почитайте хотя бы документацию:
цитата:
------------------------------------
lua_tolstring[-0, +0, e]const char *lua_tolstring (lua_State *L,
                          int index,
                          size_t *len);Конвертирует Lua значение по заданному индексу в C строку. Если len не является NULL, она также устанавливает указатель *len с длиной строки. Lua значение должно быть строкой или числом; в противном случае функция возвращает NULL. Если значение является числом, то lua_tolstring также изменяет действительное значение в стеке на строку. (Такое изменение дезориентирует функцию lua_next, когда lua_tolstring применяется для ключей во время обхода таблицы.)

lua_tolstring возвращает полностью согласованный, внутри Lua состояния, указатель на строку.
В этой строке всегда имеется нуль ('\0'), после последнего символа (как в C).
Жизнеспособность идеи - 100 контрактов = 100 стоп-ордеров по 1 контракту каждый
 
Цитата
Иван написал:
Обычно выставление стоп-лосса затачивается на то какой объем был куплен или продан. Продали 100 контрактов = 1 стоп на 100 контрактов
Учитывая то что продажа 100 контрактов может происходить частями по 45 по 5 и по 50 контрактов, то соответственно можно и стопы также выставить по 45 по 5 и по 50. И здесь при закрытии позиции начинаются сложности - закрытие также может произойти частями по 30, по 20 и по 50. И сложно пересчитать каждый из ордеров.

Другое дело если каждый ордер это 1 контракт. Продалось 30 контрактов - сняли 30 стопов. Продалось еще 20 - сняли 20 и т.д.
Насколько вообще в принципе жизнеспособна идея купив к примеру 100 контрактов выставить не 1 стоп, а 100 стопов по 1 контракту.

При торговле на 10 контрактов по инструменту допускаю что все это допустимо 10 продано = 10 ордеров.
А вот когда число контрактов 100, 500?
теоретически можно сколько душе угодно.
практически - трудно придумать смысл этому.
----------------
Надо учитывать следующее:
-----------------
стопы хранятся в очереди стопов на сервере брокера и отсылаются им на биржу,
если условие true
------------------
ордер находится на бирже
-----------------
Если вы хотите выставить ордер на продажу на 100,  а стопы выставлять по мере исполнения ордера,
то надо делать HFT робот и ставить максимально близко к бирже.
---------------
на квике -  как на велосипеде обгонять самолет. Упаритесь.
Какая кодировка используются в Lua?
 
поясняю для тех кто в танке
--------------------------
текст в любой кодировке - это массив байт
конец массива обозначается нулевым байтом,
поэтому в массивах с текстом запрещен нулевой байт
но если в массиве байтов нет нуля то это может быть массив не текста
---------------------
знание кодировки требуется лишь генератору символов на устройстве отображения
------------------
поэтому если отображения нет , то кодировка не имеет значение, если все строки текста в программе имеют одинаковую кодировку
то с ними можно работать как с массивами байт
----------------------
оператору tostring  вообще не требуется знать кодировки так как его задача заменить хеш указателем на  массив байт с нулем в конце
Какая кодировка используются в Lua?
 
Цитата
Anton написал:
Цитата
Николай Камынин написал:
tostring работает со строками в коде ASCII (American Standart Code for Inmormation Interchange)  
вернее ASCIIZ
Абсолютно неверное утверждение. В случае автоматического преобразования числа в строку да, получается ASCIIZ (а можно сказать, что получается utf-8 или win-1251 или что угодно, т.к. первая страница у всех codepage одинаковая, если не учитывать экзотику), но в случае строки возвращается строка как она есть, ровно в том виде, в каком ее туда засунули, в том числе со внутренними нулями (что автоматически отвергает ASCIIZ и, кстати, позволяет при некоторой осторожности впихнуть даже utf-16).
Цитата
Николай Камынин написал:
tostring вообще-то  все  равно какая кодировка
Передача массива в функцию - теряется последовательность ключей
 
Цитата
Иван написал:
LogWrite("report", comment, {Trade=100, Code=Si, Q="-"..10, Price=10000, Pips=1});
В функции делаю чтение массива:Код
function LogWrite(name, log_type, log_array)

  local content = "";
  local i = 1;
  for key, value in pairs(log_array) do
     content = content.."\t"..value..";";
     content = string.gsub(content,"([.]+)",",");
     i = i + 1;
  end;
  message(tostring(content));
 
end;
function LogWrite(name, log_type,t)
  local content = "";
  local i = 1;
  for m=1,#t do
local value=tostring(t[m])
     content = content.."\t"..value..";";
     content = string.gsub(content,"([.]+)",",");
     i = i + 1;
  end;
  message(tostring(content));
end;
local Si=123
LogWrite("report", "", {100,Si,"-"..10,10000,1});
-------------------
100; 123; -10; 10000; 1;
>Exit code: 0
Удаление элементов в больших таблицах., Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц.
 
исправлено:
--------------------------
-Новая  реализация 2
tab1 = tabInit  (N)
numElement = #tab1
startElement = numElement - ElemToKeep
minus = numElement - ElemToKeep
start=hrt.clock()
for i=1, ElemToKeep do  tab1[i] = tab1[startElement+i]  end
tab1[ ElemToKeep+1] =nill
time=t_mcs(hrt.clock()-start)
ne1 = tabCount2 (tab1)
print ("Новая2="..time..";"..ne1)
--------------------------
Первая=1.566;5000
Вторая=0.783;5000
Новая1=0.756;5000
Новая2=0.718;5000
>Exit code: 0
Удаление элементов в больших таблицах., Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц.
 
в рассмотренных примерах для удаления данных требуется создание еще одной таблицы
можно уменьшить требуемый объем памяти если переписывать данные в туже таблицу а в конце ставить nil
при этом методе надо после записи последнего элемента записывать nil
например так:
--Новая  реализация 2
tab1 = tabInit  (N)
numElement = #tab1
startElement = numElement - ElemToKeep + 1
minus = numElement - ElemToKeep
start=hrt.clock()
for i=1, ElemToKeep do  tab1[i] = tab1[startElement+i]  end
tab1[ ElemToKeep+1] =nill
time=t_mcs(hrt.clock()-start)
ne1 = tabCount2 (tab1)
print ("Новая2="..time..";"..ne1)
--------------------------

для точного измерения времени исполнения надо отключать сборщик мусора
----------------
в итоге получим следующий результат время в  мс:
Первая=1.661;5000
Вторая=0.777;5000
Новая1=0.758;5000
Новая2=0.704;4999
>Exit code: 0
Какая кодировка используются в Lua?
 
tostring вообще-то  все  равно какая кодировка
Какая кодировка используются в Lua?
 
на самом деле переменная в которую записываем строку не содержит указатель на строку,
а содержит хэш  строки.
поэтому сравнение строк в луа делается быстро как и для числе,
так как сравниваются числа  хэш
Какая кодировка используются в Lua?
 
tostring работает со строками в коде ASCII (American Standart Code for Inmormation Interchange)  
вернее ASCIIZ
Получить только текущие данные
 
если не сложно то выложите историю
мне как раз надо большую
Получить только текущие данные
 
надо удалить историю в квике
это файлы в каталоге QUIK/archive
файлы с именем инструмента и расширением dat
Удаление элементов в больших таблицах., Крайне медленная работа table.remove и возможные обходные пути для быстрого удаления большого числа элементов крупных массивов/таблиц.
 
Цитата
Иван Ру написал:
Пока что вижу для себя такое решение -- формируем временную таблицу куда записываем только те элементы большой таблицы, которые нужно сохранить. Затем ставим знак равенства между большой нуждающейся в "обрезке" таблицей и временным вариантом (второй вариант, см. код ниже). Быстрее стандартного варианта в несколько сотен раз.


function tabInit (number)
local tab ={}
for i =1,number do
tab=i
end
return tab
end

function tabCount2 (Thetab)
local count = 0
for k,v in ipairs (Thetab) do
count = count+1
end
return count
end


-- ОЦЕНКА ПРОИЗВОДИТЕЛЬНОСТИ
local ElemToKeep = 5000
tab1 = tabInit  (10000)
tab2 = tabInit    (10000)

-- Первая реализация
local start = os.clock()
while #tab1 > ElemToKeep do
table.remove (tab1,1)
end
local ne1 = tabCount2 (tab1)
local finish1 = os.clock()
local time1 = finish1 - start
message (tostring(time1).."-"..tostring(ne1))

-- Вторая реализация
local tempTab = {}
local numElement = #tab2
local startElement = numElement - ElemToKeep + 1
local minus = numElement - ElemToKeep

for i=startElement, numElement do
tempTab[i-minus] = tab2
end
tab2 = tempTab
local ne2 = tabCount2 (tab2)
local finish2 = os.clock()
local time2 = finish2 - finish1
message (tostring(time2).."-"..tostring(ne2))

У меня на машине обрезка первым способом заняла 1,69 сек, а вторым - 0,002 сек.
У вас ошибка в подсчете времени
вы включили в него время подсчета числа элементов - local ne2 = tabCount2 (tab2)
кроме того вместо удаления одного элемента можно удалять например половину копированием в новый массив и переприсвоением
время будет таким же как во втором случае
local ElemToKeep = 5000
local N=10000
--Новая  реализация
tab1 = tabInit  (N)
local tempTab = {}
local numElement = #tab1
local startElement = numElement - ElemToKeep
start = os.clock()
for i=1, ElemToKeep do tempTab[i] = tab1[startElement+i] end
tab1 = tempTab
time1 = os.clock() - start
ne1 = tabCount2 (tab1)
print ("Новая="..tostring(time1)..";"..tostring(ne1))
------------------
Первая=1.682;5000
Вторая=0.00099999999999989;5000
Новая=0.0010000000000001;5000
Страницы: Пред. 1 ... 48 49 50 51 52 53 54 55 56 57 58 ... 79 След.
Наверх