сделал прикольный тест на оценку быстродействия корутин.
Код
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 раз медленнее условного оператора.
[INFO 2025-10-22 11:35:41] : OnConnected flag true
Все же возникает вопрос - зачем в середине торговой сессии вызывать OnCleanUp?
При этом данные после такой чистки загружаются минуты.
Можете показать пример перемешивания? А то что-то не врублюсь, где это даст ошибку.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
24.10.2025 18:01:32
Цитата
Nikolay написал: Не важно какой подход используется - важно как он работает и работает ли он надежно. Если Вы делаете решение для себя и готовы постоянно заниматься отладкой пограничных ситуаций, то делайте как угодно. Хотя уже здесь корутины начинают привносить излишнюю сложность. Те же замыкания прекрасно справляются с запоминанием окружения и позволяют решать ту же задачу. Далее, что самое важное - это воспроизводимость результатов, обработка ошибок. И здесь колбеки - это не лучшее решение, т.к. они не гарантированы, приходят в случайном порядке. Для задач реального времени - это приговор.
Представьте, что датчик выдает данные. Вы решаете использовать "модную" библиотеку с колбеками. Но начиная использовать её, получаете данные с пропусками, данные могут приходить из прошлого. Во многих отраслях - это просто недопустимое поведение.
Так что нет, я уж как нибудь сам организую чтение данных, как эти делали последние лет 50.
Я понимаю, что есть соблазн использовать подход со слугой - сказал ему, что делать, он сообщит когда будет результат. Но такой подход всегда требует надсмотрщика, проверки. Так что самому подойти к кастрюле и проверить как там каша - надежней.
Еще надежнее вообще без функций на луа. И замыкания оказываются ненужными. Какой смысл запоминать окружение? Например , портфель из 100 бумаг. Что будете запоминать для каждой бумаги в замыкании?
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
24.10.2025 09:45:44
, Но это просто написание функций которые обращаются к вложенным функциям и т д. можно сделать еще более обобщенную функцию для вашего примера, так: пишем файл 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
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
23.10.2025 19:01:25
пардон, ссылка попала ошибочно, но удалить ее невозможно.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
23.10.2025 18:59:24
, Вы правильно назвали свой восторг по поводу скрипта HackTrade сказкой. Ваш восторг сильно преувеличен. ----------------------- Все возможности, которые вы описали можно реализовать проще, так как не вычисляются параллельно, а исполняются в бесконечном цикле main, то в более простом решении можно выиграть и в быстродействии и в затратах памяти. ==================== Поясняю упрощенно: ------------------------ Если какая-то функция вызывается в скрипте робота лишь в одном операторе , то ее реализация является избыточной. Эту функцию можно заменить на условный оператор. Нет никаких передаваемых параметров вообще, значит и время на вызов равно нулю. При такой реализации не только быстрее исполняется скрипт, но и существенно меньше затраты памяти.
Система принятия решений и/или Нечеткая логика(FuzzyLogic), Нечеткая логика или Система принятия решений в трейдинге
Пользователь
Сообщений: Регистрация: 30.01.2015
22.10.2025 14:18:06
До кучи... 'trans_id'" и "'order_num'" - это идентификаторы для разных серверов (биржи и брокера) и разных источников их генерации (биржа и клиент брокера) Поэтому их два и они не зависимые друг от друга.
MOVE_ORDER на фондовом рынке мос.биржи?
Пользователь
Сообщений: Регистрация: 30.01.2015
22.10.2025 11:22:40
Цитата
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_CODE
20-ти символьное составное поле, может содержать код клиента и текстовый комментарий (поручение) с тем же разделителем, что и при вводе заявки вручную. Необязательный параметр
TYPE
Тип заявки, необязательный параметр. Значения: «L» – лимитированная (по умолчанию), «M» – рыночная
MARKET_MAKER_ORDER
Признак того, является ли заявка заявкой Маркет-Мейкера. Возможные значения: «YES» или «NO». Значение по умолчанию (если параметр отсутствует): «NO»
Условие исполнения заявки, необязательный параметр. Возможные значения:
«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
Режим корректировки ограничения по фьючерсным счетам. Возможные значения:
«N» - выключен (по умолчанию), установкой лимита задается новое значение
Команды снятия группы заявок по условию («KILL_ALL_ORDERS», «KILL_ALL_STOP_ORDERS», «KILL_ALL_NEG_DEALS», «KILL_ALL_FUTURES_ORDERS») обрабатываются следующим образом:
Параметры «CLASSCODE», «TRANS_ID», «ACTION», «ACCOUNT» являются обязательными.
Возможные дополнительные параметры для команд снятия заявок по условию:
Снятию подлежат заявки, соответствующие всем указанным в транзакции параметрам (логическое «И»).
Перестановка заявок на рынке 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 на резервную связь , без переподключения. Пробовал роутер с автопереключением wan и 4g, но QUIK замечает переключение и обрывает связь. Такое вообще возможно реализовать?
Это невозможно, так как в Вашем варианте у Вас два IP адреса Сервер брокера не даст подключится по второму пока не разорвет соединение по первому.
Кто меняет разрешение системного таймера?
Пользователь
Сообщений: Регистрация: 30.01.2015
20.10.2025 11:36:33
посмотреть квант таймера можно прогой ClockRes
Правильно вывести время и дату последней сделки, Как правильно выводить в поля таблицы окна интерфейса скрипта дату и время сделки?
Пользователь
Сообщений: Регистрация: 30.01.2015
19.10.2025 09:54:25
Цитата
Olnikchur написал: Здравствуйте все! Помогите разобраться где у меня в скрипте поворот не туда? Получаю параметры последней сделки, выбираю нужные мне, вывожу их для контроля в лог-файл. В лог-файл всё выводится,а в таблицу нет.
Покажите скрипт
Совершить сделку по цене открытия бара, Как выставить заявку, не зная цену?
написал: нажимаете мышкой на открытие свечи . открывается окно выставления заявки с ценой открытия. с количеством по умолчанию.
Внимательно перечитайте вопрос прежде, чем отвечать.
Нет желания вам отвечать.
Совершить сделку по цене открытия бара, Как выставить заявку, не зная цену?
Пользователь
Сообщений: Регистрация: 30.01.2015
17.10.2025 08:18:43
нажимаете мышкой на открытие свечи . открывается окно выставления заявки с ценой открытия. с количеством по умолчанию.
MoveOrder - цену меняет, а объем не меняет. Что это., Пытаюсь использовать стандартные возможности функции. Не меняется объем. На новую позицию заявка переезжает.
DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
Пользователь
Сообщений: Регистрация: 30.01.2015
16.10.2025 11:44:03
Код
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) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
Пользователь
Сообщений: Регистрация: 30.01.2015
16.10.2025 11:40:15
Рекомендую сделать так:
Код
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) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
Пользователь
Сообщений: Регистрация: 30.01.2015
16.10.2025 11:09:01
пардон, еще исправление:
Код
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) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
Пользователь
Сообщений: Регистрация: 30.01.2015
16.10.2025 11:06:58
Разобрался Исправил скрипт так:
Код
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) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
Зачем полагать, когда можно проверить. Переставьте DestroyTable в OnStop.
2.
Цитата
написал: Функция DestroyTable в данном примере вызывается в потоке Main.
Вы точно знаете как устроена DestroyTable? Не точно, но скорее всего, это реализовано следующим образом. При том, что DestroyTable вызывается в main, она не лезет в таблицы QUIK, а создает коллбек закрытия таблицы, который обрабатывается в потоке терминала, но он занят более интересным делом :: : остановкой скрипта (удаляет поток main и перестает обрабатывать коллбеки, созданные в нем, так как исчезнет контекст их выполнения).
Что-то у Вас не то. Колбек не создается в процессе исполнения. Колбек - это код функции , он создан при загрузке программы. Если он вызывается в main то вызов это и есть исполнение.
Не работает getDataSourceInfo в индикаторе
Пользователь
Сообщений: Регистрация: 30.01.2015
13.10.2025 15:15:37
Цитата
Nikolay написал: Только учитывайте, что этот подход рассчитан на то, что будет вызван OnCalculate для индекса 1. Что в большинстве случаев верно, конечно. Но, судя по сему - не гарантировано. Но предпочитаю более надежный подход через инициализацию переменных в замыкании и проверке первого вызова для любого индекса.
Можете доказать, что i может не быть равным 1 ? Учитывая то, что при старте OnCallulate вызывается два раза. И i==1 будет обязательно.
Как на графике накапливаются данные параметров инструмента?, Как на графике накапливаются данные параметров инструмента?
На график должен быть добавлен соответствующий параметр, график должен быть открыт. Открыли график, данные начнут накапливаться локально.
Странно. А еще есть какой либо способ накапливания истории параметров кроме как открыть график и активным его держать весь день?
А если инструментов 10 или 50? Я правильно понял что нахождение всех этих 50 инструментов в Таблице торгов или Таблице параметров без открытого по каждому из них графика не приведет к обновлению и накоплению данных по необходимым параметрам инструментов? Я правильно понял что для того чтобы Квик сохранил параметры за день я должен в конце дня тапать и пройти по всем инструментам мышью и загрузить каждый инструмент на график то есть все руками прогрузить?
Почему Квик в настройках не позволяет это сделать и обновлять нарезки параметров (не цены и объема, а именно добавленных в таблицу параметров - средневзвешенной цены, открытого интереса, общего спроса) по всем необходимым таймфреймам исходя из Таблицы торгов или таблицы параметров автоматически?
Ну то есть я правильно понял, что сейчас если параметр не находится на активном графике но присутствует в Таблицах, то он вообще не обновляется и не накапливается таким образом?
Историю свечей можно получаю с биржи .
Считывал их за период с 2015 по н в. На тайме 1 мин это чуть больше 1 млн. свечей на инструмент. Бесплатно данные в реальном времени придут с задержкой 15 минут
Не работает getDataSourceInfo в индикаторе
Пользователь
Сообщений: Регистрация: 30.01.2015
13.10.2025 05:39:09
Цитата
Андрей написал: Пишу индикатор. Для целей его использования нужен 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
Как на графике накапливаются данные параметров инструмента?, Как на графике накапливаются данные параметров инструмента?
Пользователь
Сообщений: Регистрация: 30.01.2015
12.10.2025 06:09:56
Все параметры, кроме истории свечей, на компе существуют лишь для текущей торговой сессии. Свечи накапливаются в каталоге arhve. На сервере хранится лишь 3000 свечей На компе свечи накапливаются пока не перезагрузите данные. Чтобы параметры накапливались в течении сессии надо их указать в настройках .
DestroyTable (и Clear) закрывает скрипт вместо таблицы, Тема описана в Названии и в Тексте сообщения
написал: В каком потоке управления выполняется вызов функции DestroyTable()
Работа с таблицами QUIK выполняется в служебном потоке, отличном от main. В том же, в котором выполняется OnStop. И пока выполняется OnStop никакие операции с таблицами QUIK не возможны (поток работы с таблицами занят OnStop ). OnStop в любом случае завершает скрипт, поэтому DestroyTable не выполнена и созданная в скрипте таблица существует после завершения скрипта. Если что то надо делать с таблицами по кнопке завершить, то это надо делать в функции OnStop.
Полагаю, что не так. -------------------- Поток, если не создается специально для функции, определяется местом вызова. ---------------------- Все колбеки ( в том числе ОnStop ) вызываются в основном потоке VMLua (т е в потоке терминала). --------------------------- Функция DestroyTable в данном примере вызывается в потоке Main.
Неккоректная работа CreateDataSourse
Пользователь
Сообщений: Регистрация: 30.01.2015
11.10.2025 14:23:50
Цитата
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
Пользователь
Сообщений: Регистрация: 30.01.2015
11.10.2025 11:50:24
Цитата
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 ломает данные индикатора
написал: , Если написать не можете, не важно по какой причине, верните человеку деньги и признайтесь, что не умеете.
Я выше представил полный минимальный код, который воспроизводит проблему с барами, с картинками результата. Зачем тут спорить, если есть открытый код и картинки, причем тут конечный скрипт? Если вы так уверены в своем скрипте, то выложите или пришлите, я на нем проверю, воспроизводится проблема или нет.
Я вообще-то про скрипт, который вы продали Роману и который не работает. ----------------------- Бары это или нет из Вашего теста не ясно, так как нет кода скрипта. ---------------------- Сделайте Роману работающий скрипт.
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
07.10.2025 13:26:58
, Если написать не можете, не важно по какой причине, верните человеку деньги и признайтесь, что не умеете.
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
07.10.2025 13:24:40
, Вы продали Роману не работающий скрипт. Вместо того, чтобы переписать его, Вы переводите стрелки на QUIK. -------------------- Я написал Роману скрипт, который делает ровно тоже самое, что и Ваш и никуда не вываливается. ------------------------ Из беседы с романом предположу, что Вы еще и ошибаетесь в самом алгоритме построения индикаторов с большим периодом на меньших интервалах.
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Проблема НЕ в индикаторе, который рисует линию с графика бОльшего таймфрейма. Вы неправильно поняли Романа.
Индикатору. у которого проблема не нужен другой график, он на текущем ТФ рассчитывает бары бОльшего ТФ и по ним считает МА. А сама проблема в функции SetValue, которая перерисовывает крайний час (с его начала) в текущем времени при любом изменении текущей цены, т.к. какого .... при обновлении ОИ видимо идет пересчет всего графика и подставляется номер бара начала часа из прошлого и дальше не обновляется. В коде ошибки нет, там все прозрачно, час сменился - номер бара запомнился. При нажатии ПРИМЕНИТЬ в настройках индикатора, все сразу становится нормально.
Я все понzл. Написал индикатор ровно такой же, которому не нужен другой график, он на текущем ТФ рассчитывает бары бОльшего ТФ и по ним считает МА. и ничего не ломает. Свой скрипт отправил Роману.
Скрипт ничего не ломает, это ОИ ломает нумерацию баров в функции OnCalculate и это не лечится. у меня такие же красивые картинки, как у вас, достаточно нажать 1 раз ПРИМЕНИТЬ.
Вот картинки с номерами баров ДО ПРИМЕНИТЬ и ПОСЛЕ ПРИМЕНИТЬ. Там где 2 числа - это день сменился на графике.
Т.е. в данном примере OnCalculate вызвался на баре 3194, а потом сразу на 3449
Есл у вас скрипт не ломается то в чем проблема. У Романа ваш скрипт не работает когда он добавляет график открытого интереса. ------------------------ Я ничего не понял из вашего рассказа про нумерацию. У меня такой проблемы нет и не было. ------------------- Так как проблема лишь у Вас то причина не в КВИКЕ, а в Вашем написании скрипта.
Multiframe MA, Добавьте индикатор
Пользователь
Сообщений: Регистрация: 30.01.2015
06.10.2025 15:11:19
Добавил параметры дня( открытие закрытие, локальные максимум и минимум дня)
Два варианта использования графического пакета IUP (Lua 5.4) в QUIKе
Пользователь
Сообщений: Регистрация: 30.01.2015
06.10.2025 13:44:54
Корутина в луа - это функция, для которой создается отдельный state. Поэтому при выходе из корутины стейт не занимается другими функциями, а следовательно состояние корутины сохраняется и ее выполнение можно продолжить там, где вышли. --------------------- Но так как корутина выполняется в потоке VMLua, то она выполняется последовательно как и обычные функции луа.
Multiframe MA, Добавьте индикатор
Пользователь
Сообщений: Регистрация: 30.01.2015
06.10.2025 13:36:40
Индикатор на Lua отображает на графике с интервалом 1 мин три графика с интервалами 60,30 и 10 минут. (интервалы можно настроить)
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
06.10.2025 11:50:42
OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
06.10.2025 11:49:26
Написал ровно такой же , но который ничего не ломает.
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Проблема НЕ в индикаторе, который рисует линию с графика бОльшего таймфрейма. Вы неправильно поняли Романа.
Индикатору. у которого проблема не нужен другой график, он на текущем ТФ рассчитывает бары бОльшего ТФ и по ним считает МА. А сама проблема в функции SetValue, которая перерисовывает крайний час (с его начала) в текущем времени при любом изменении текущей цены, т.к. какого .... при обновлении ОИ видимо идет пересчет всего графика и подставляется номер бара начала часа из прошлого и дальше не обновляется. В коде ошибки нет, там все прозрачно, час сменился - номер бара запомнился. При нажатии ПРИМЕНИТЬ в настройках индикатора, все сразу становится нормально.
Я все понzл. Написал индикатор ровно такой же, которому не нужен другой график, он на текущем ТФ рассчитывает бары бОльшего ТФ и по ним считает МА. и ничего не ломает. Свой скрипт отправил Роману.
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
05.10.2025 11:40:22
теперь добавим открытый интерес
ничего не ломается
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
04.10.2025 17:48:44
Вот результат тестового скрипта. Индикатор может быть любой из встроенных в QUIK.
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
04.10.2025 13:53:03
Возможно напишу скрипт, который позволяет любой индикатор с большим интервалом отобразить на графике цены с меньшим интервалом.
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
04.10.2025 13:43:22
Цитата
Roman Koledin написал: ПРОСТО напишите бабки заплочу - дайте отрытый код
Будет время , напишу , покажу здесь результат.
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
04.10.2025 08:33:30
пардон, не правильно понял. На меньшем интервале рисуется индикатор с большего интервала. Верно?
OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора, OI ломает данные индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
04.10.2025 08:10:12
Сомневаюсь, что виноват QUIK. Но без текста индикатора сложно сказать где ошибка автора. Правильно понимаю, что Вы хотите на графике с интервалом 1 час отобразить мувинг с интервалом 1 минута? Потом добавляете график OI с интервалом 1 минута на этот же график с интервалом 1 час?
индикатор на Lua
Пользователь
Сообщений: Регистрация: 30.01.2015
23.09.2025 18:58:02
Индикатор определяет максимум и минимум на заданном периоде и отображает среднее значение. Алгоритм оптимизировал для ускорения вычислений. Выкладываю для всех желающих:
Код
Settings = {Name = "*Kijun-sen",kijun_period = 6,}
function OnCalculate(i)
Hi=H(i) or H1; Li=L(i) or L1; x1=x;
if i1>i then
ma=Hi; mi=Li; jma=i; jmi=i;
end
if Hi and Li then
local j=i-Settings.kijun_period; if j<1 then j=1; end
if j>jma or j>jmi then
ma=Hi; mi=Li; jma=i; jmi=i;
while i>j do
Hi,Li=H(j),L(j)
if Hi and Hi>ma then ma = Hi jma=j; end
if Li and Li<mi then mi =Li jmi=j;end
j=j+1
end
else
if Hi>ma then ma=Hi; jma=i; end
if mi>Li then mi=Li; jmi=i; end
end
x=(ma + mi)/2; H1,L1,i1=Hi,Li,i;
end
return x1
end
function OnChangeSettings()
i1=0;jma=0; jmi=0; H1=0; L1=0;ma=0;mi=0;
end
function Init()
OnChangeSettings()
Settings.line = {{ Name=Settings.Name, Color=RGB(32,255,128), Type=TYPE_LINE, Width = 2,}}
return #Settings.line end
это мой вариант модификации этого алгоритма .
Код
Settings = {Name = "*ind_nk",period = 6,}
function OnCalculate(i)
Hi=H(i) or H1; Li=L(i) or L1;
Oi=O(i) or O1; Ci=C(i) or C1;
if i1>i then
ma=Hi; mi=Li; jma=i; jmi=i;
end
if Hi and Li and i1~=i then
local j=i-Settings.period; if j<1 then j=1; end
if j>jma or j>jmi then
ma=Hi; mi=Li; jma=i; jmi=i;
while i>j do
Hi,Li=H(j),L(j)
if Hi and Hi>ma then ma = Hi jma=j; end
if Li and Li<mi then mi =Li jmi=j;end
j=j+1
end
else
if Hi>ma then ma=Hi; jma=i; end
if mi>Li then mi=Li; jmi=i;
end
if x then
local z=2*Li-Hi; if Li>x and Ci>Oi then mi=z; jmi=i; end
z=2*Hi-Li; if x>Hi and Oi>Ci then ma=z; jma=i; end
end
end
if ma and mi then x=(ma + mi)/2; end
H1,L1,O1,C1,i1=Hi,Li,Oi,Ci,i;
end
return x
end
function OnChangeSettings()
i1=0;jma=0; jmi=0; H1=0; L1=0;ma=0;mi=0;
end
function Init()
OnChangeSettings()
Settings.line = {{ Name=Settings.Name, Color=RGB(255,255,255), Type=TYPE_LINE, Width = 2,}}
return #Settings.line end
Если нравится, можете сказать "спасибо".
Ошибка при поиске пиков\впадин кастом индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
23.09.2025 18:45:39
Оптимизировал алгоритм вычислений, чтобы считал быстрее. Выкладываю для всех желающих:
Код
Settings = {Name = "*Kijun-sen",kijun_period = 6,}
function OnCalculate(i)
Hi=H(i) or H1; Li=L(i) or L1; x1=x;
if i1>i then
ma=Hi; mi=Li; jma=i; jmi=i;
end
if Hi and Li then
local j=i-Settings.kijun_period; if j<1 then j=1; end
if j>jma or j>jmi then
ma=Hi; mi=Li; jma=i; jmi=i;
while i>j do
Hi,Li=H(j),L(j)
if Hi and Hi>ma then ma = Hi jma=j; end
if Li and Li<mi then mi =Li jmi=j;end
j=j+1
end
else
if Hi>ma then ma=Hi; jma=i; end
if mi>Li then mi=Li; jmi=i; end
end
x=(ma + mi)/2; H1,L1,i1=Hi,Li,i;
end
return x1
end
function OnChangeSettings()
i1=0;jma=0; jmi=0; H1=0; L1=0;ma=0;mi=0;
end
function Init()
OnChangeSettings()
Settings.line = {{ Name=Settings.Name, Color=RGB(32,255,128), Type=TYPE_LINE, Width = 2,}}
return #Settings.line end
Если нравится, можете сказать "спасибо".
Ошибка при поиске пиков\впадин кастом индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
22.09.2025 12:42:45
пардон, последний вариант считает иначе, поэтому остается этот:
Код
Settings = {
Name = "*Kijun-sen",
kijun_period = 15,
line = {{
Name = "Kijun-sen",
Color = RGB(255,255,255),
Type = TYPE_LINE,
Width = 2,
}}
}
function Init() return 1 end
function OnCalculate(i)
local Hi,Li=H(i),L(i);
if Hi and Li then
local j=i-Settings.kijun_period; if j<1 then j=1; end
max=Hi; min=Li;
while i>j do
Hi,Li=H(j),L(j)
if Hi and Hi>max then max = Hi end
if Li and Li<min then min =Li end
j=j+1 end
x=(max + min)/2;
end
return x
end
Ошибка при поиске пиков\впадин кастом индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
22.09.2025 12:34:07
Оптимизированный вариант обычный, считает тоже самое, но быстрее:
Код
Settings = {
Name = "*Kijun-sen",
kijun_period = 15,
line = {{
Name = "Kijun-sen",
Color = RGB(255,255,255),
Type = TYPE_LINE,
Width = 2,
}}
}
function Init() return 1 end
function OnCalculate(i)
local Hi,Li=H(i),L(i);
if Hi and Li then
if max==nil then max=Hi end
if min==nil then min=Li end
if Hi>max or min>Li then
local j=i-Settings.kijun_period; if j<1 then j=1; end
max=Hi; min=Li;
while i>j do
local Hj,Lj=H(j),L(j)
if Hj and Hj>max then max = Hj end
if Lj and Lj<min then min =Lj end
j=j+1 end
end
x=(max + min)/2;
end
return x;
end
Ошибка при поиске пиков\впадин кастом индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
22.09.2025 11:42:59
Это вариант как в задании:
Код
Settings = {
Name = "*Kijun-sen",
kijun_period = 26, -- Период Kijun-sen (можно изменить)
line = {{
Name = "Kijun-sen",
Color = RGB(0,255,255),
Type = TYPE_LINE,
Width = 2,
}}
}
function Init() return 1 end
function OnCalculate(i)
if H(i) and L(i) then
local j=i-Settings.kijun_period; if j<1 then j=1; end
max=H(i); min=L(i);
while i>j do
local H,L=H(j),L(j)
if H and H>max then max = H end
if L and L<min then min =L end
j=j+1 end
return (max + min)/2;
end
end
Ошибка при поиске пиков\впадин кастом индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
22.09.2025 11:17:26
попробуйте так (проверил)
Код
Settings = {
Name = "*Kijun-sen",
kijun_period = 26, -- Период Kijun-sen (можно изменить)
line = {{
Name = "Kijun-sen",
Color = RGB(0, 0, 255),
Type = TYPE_LINE,
Width = 2,
}}
}
function Init() return 1 end
function OnCalculate(i)
high = H(i) low = L(i)
if high and low then
if i==1 then
max = H(1) min = L(1)
else
if i%Settings.kijun_period==0 then max = high; min =low end
if high > max then max = high end
if low < min then min = low end
return (max + min)/2;
end
end
end
Ошибка при поиске пиков\впадин кастом индикатора
Пользователь
Сообщений: Регистрация: 30.01.2015
22.09.2025 11:02:00
исправит ошибку надо так:
Код
Settings = {
Name = "*Kijun-sen",
kijun_period = 26, -- Период Kijun-sen (можно изменить)
line = {{
Name = "Kijun-sen",
Color = RGB(0, 0, 255),
Type = TYPE_LINE,
Width = 2,
}}
}