Давид Юсупов написал: Как узнать по какому алгоритму рассчитывать?
Здравствуйте, На самом деле индикатор Fractals не совсем рассчитывается. Ведь расчет это когда из одного значения получается другое, а Fractals выбирает максимумы и минимумы из того что есть. Алгоритм поиска описан в документации на терминал -Раздел 4. Работа с графиками --Методы технического анализа ---Fractals («Фракталы»)
И потом, в моем примере после CreateDataSource был sleep(100), а у Вас его нет. Его нужно добавить, иначе цикл может начать работать до того как прокачаются свечки
dwell dwell написал: Может быть, есть настройка сокрытия этого окна, чтобы квик в бэкграунде фейлился с соединением, меня не трогая?
Система - Настройки - Основные настройки - Сообщения, убрать галку "Показывать Окно сообщений"
Цитата
dwell dwell написал: Если я хочу, чтобы квик был запущен в то время, когда нет подключения к серверу, но при этом не хочу иметь постоянные выскакивающие окошки о том, что соединение установить не удалось...
Настройте время когда надо восстанавливать связь и когда не надо в Система - Соединения
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Здравствуйте, Попробуйте добавить обработку в функцию main function main() for class in string.gmatch(classes,"(%w+)") do local securities = getClassSecurities(class); for security in string.gmatch(securities,"(%w+)") do DataSource(class, security); end end end
Сергей Качурин написал: как тогда обратиться к значениям каждой конкретной свечи
первый параметр функции вернет значение для конкретной свечки ma_out=func(1, {Period = x, Metod = "EMA", VType="Close", round="off"}, ds) --первая свечка ma_out=func(2, {Period = x, Metod = "EMA", VType="Close", round="off"}, ds) --вторая и т.д.
Сергей Качурин написал: Sergey Gorokhov, a можно к созданному индикатору присвоить идентификатор через Lua (сразу при добавлении), чтобы потом обращаться к его значениям через getNumCandles и getCandlesByIndex?
К сожалению в текущей реализации в Lua индикаторы нельзя добавить идентификатор средствами Lua.
Цитата
Сергей Качурин написал: или вот такое обращение будет корректным: ma_out[i], ma_out[i-1]... ?
нет, так как функция возвращает значение рассчитанное для конкретной свечи, а не таблицу.
Sergey Denegin написал: Хотелось бы услышать более профессиональный ответ от разработчиков
профессиональный ответ, нужно скопировать info.log и нужные dat файлы Однако как уже было сказано, мы не рекомендуем так делать ввиду того что могут быть коллизии из за разных версий или настроек на самом терминале.
Зачем тратить свое время на писание этого ненужного поста, если сделки я вижу, даже без подключения к серверу?
Цитата
Лёня Голиков написал: Всю папку с квиком не пробовали копировать с сервера?
Странно, почему Вы не предложили образ винды сразу скопировать, а только папку квика предложили скопировать....
Это правильный совет, так как иначе придется следить за версиями, за списком инструментов и не факт что оно вообще заработает. Проще, быстрее, надежней, скопировать всю папку с терминалом.
Не приходят события OnAllTrade при закрытой Таблице обезличенных сделок, События OnAllTrade приходят только при открытой таблице, в настройках все заказал.
Здравствуйте, Все правильно, функция OnAllTrade возвращает данные поступающие в таблицу обезличенных сделок, но никак не заказывает данные. для заказа данных используйте CreateDataSource с тиковым интервалом.
Причина в том что в коде много ошибок, причем не синтаксических а логических вот Вы выводите сообщение
Код
message (tostring(Out1), 1)
однако сама переменная Out1 у Вас нигде не задана. далее
Код
if Out1~=nil and Out2~=nil
func = Out1- Out2
end
Этот текст вообще не понятен. Что такое func? Где задаются значения для Out1 и Out2?
далее
Код
return func1(Index, Settings) and func2(Index, Settings)
Здесь вообще не понятно чего Вы пытались добиться выводя boolean тип данных, когда надо выводить число. Зачем вообще надо было трогать переменные внутри функции?
Функция выводит результат, вот и работайте с результатом, а не с тем что внутри функции. То что внутри вообще трогать не надо.
Скрытый текст
Код
Settings = {
Name = "*BULLS-BEARS",
round = "off",
Period = 13,
Metod = "EMA", --SMA, EMA, VMA, SMMA, VMA
VType = "Close", --Open, High, Low, Close, Volume, Median, Typical, Weighted, Difference
line = {{
Name = "BULLS-BEARS",
Type = TYPE_HISTOGRAM,
Color = RGB(255, 0, 0)
},
{
Name = "line 0",
Type = TYPE_LINE,
Color = RGB(0, 255, 0)
}
}
}
function Init()
func1 = BULLS()
func2 = BEARS()
return #Settings.line
end
function OnCalculate(Index)
return func1(Index, Settings)-func2(Index, Settings)
end
function BULLS() --Bulls Power ("BULLS")
local Bulls_MA=MA()
return function (I, Fsettings, ds)
local Out = nil
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 13)
local M = (Fsettings.Metod or "EMA")
local VT = (Fsettings.VType or "Close")
local R = (Fsettings.round or "off")
local b_ma = Bulls_MA(I, {Period=P, Metod = M, VType=VT, round=R}, ds)
if I>=P and b_ma then
Out = Value(I, "High", ds)-b_ma
else Out = b_ma end
return rounding(Out, R),0
end
end
function BEARS() --Bears Power ("BEARS")
local Bears_MA=MA()
return function (I, Fsettings, ds)
local Out = nil
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 13)
local M = (Fsettings.Metod or "EMA")
local VT = (Fsettings.VType or "Close")
local R = (Fsettings.round or "off")
local b_ma = 0
b_ma=Bears_MA(I, {Period=P, Metod = M, VType=VT, round=R}, ds)
if I>=P and b_ma then
Out = Value(I, "Low", ds)-b_ma
else Out = b_ma end
return rounding(Out, R),0
end
end
function MA() --Moving Average ("MA")
local t_SMA = F_SMA()
local t_EMA = F_EMA()
local t_VMA = F_VMA()
local t_SMMA = F_SMMA()
local t_WMA = F_WMA()
return function(I, Fsettings, ds)
local Out = nil
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 9)
local M = (Fsettings.Metod or "EMA")
local VT = (Fsettings.VType or "Close")
local R = (Fsettings.round or "off")
if M == "SMA" then
Out = t_SMA(I, P, VT, ds, R)
elseif M == "EMA" then
Out = t_EMA(I, P, VT, ds, R)
elseif M == "VMA" then
Out = t_VMA(I, P, VT, ds, R)
elseif M == "SMMA" then
Out = t_SMMA(I, P, VT, ds, R)
elseif M == "WMA" then
Out = t_WMA(I, P, VT, ds, R)
else
Out = nil
end
return rounding(Out, R)
end
end
------------------------------------------------------------------
--Moving Average SMA, EMA, VMA, SMMA, VMA
------------------------------------------------------------------
--[[Simple Moving Average (SMA)
SMA = sum(Pi) / n
]]
function F_SMA()
return function (I, Period, VType, ds, round)
local Out = nil
if I >= Period then
local sum = 0
for i = I-Period+1, I do
sum = sum +Value(i, VType, ds)
end
Out = sum/Period
end
return rounding(Out,round)
end
end
--[[Exponential Moving Average (EMA)
EMAi = (EMAi-1*(n-1)+2*Pi) / (n+1)
]]
function F_EMA()
local EMA_TMP={}
return function(I, Period, VType, ds, round)
local Out = nil
if I == 1 then
EMA_TMP[I]=rounding(Value(I, VType, ds),round)
else
EMA_TMP[I]=rounding((EMA_TMP[I-1]*(Period-1)+2*Value(I, VType, ds)) / (Period+1),round)
EMA_TMP[I-2]=nil
end
if I >= Period then
Out = EMA_TMP[I]
end
return rounding(Out,round)
end
end
--[[
William Moving Average (WMA)
( Previous WILLMA * ( Period - 1 ) + Data ) / Period
]]
function F_WMA()
local WMA_TMP={}
return function(I, Period, VType, ds, round)
local Out = nil
if I == 1 then
WMA_TMP[I]=rounding(Value(I, VType, ds),round)
else
WMA_TMP[I]=rounding((WMA_TMP[I-1]*(Period-1)+Value(I, VType, ds)) / Period,round)
WMA_TMP[I-2]=nil
end
if I >= Period then
Out = WMA_TMP[I]
end
return rounding(Out,round)
end
end
--[[Volume Adjusted Moving Average (VMA)
VMA = sum(Pi*Vi) / sum(Vi)
]]
function F_VMA()
return function (I, Period, VType, ds, round)
local Out = nil
if I >= Period then
local sum = 0
local sumV = 0
for i = I-Period+1, I do
sum = sum +Value(i, VType, ds)*Value(i, "Volume", ds)
sumV = sumV +Value(i, "Volume", ds)
end
Out = sum/sumV
end
return rounding(Out,round)
end
end
--[[Smoothed Moving Average (SMMA)
SMMAi = (sum(Pi) - SMMAi-1 + Pi) / n
]]
function F_SMMA()
local SMMA_TMP={}
return function(I, Period, VType, ds, round)
local Out = nil
if I >= Period then
local sum = 0
for i = I-Period+1, I do
sum = sum +Value(i, VType, ds)
end
if I == Period then
SMMA_TMP[I]=rounding((sum-Value(I, VType, ds)+Value(I, VType, ds)) / Period, round)
else
SMMA_TMP[I]=rounding((sum-SMMA_TMP[I-1]+Value(I, VType, ds)) / Period, round)
end
SMMA_TMP[I-2]=nil
Out = SMMA_TMP[I]
end
return rounding(Out,round)
end
end
function rounding(num, round)
if round and string.upper(round)== "ON" then round=0 end
if num and tonumber(round) then
local mult = 10^round
if num >= 0 then return math.floor(num * mult + 0.5) / mult
else return math.ceil(num * mult - 0.5) / mult end
else return num end
end
function Value(I,VType,ds)
local Out = nil
VType=(VType and string.upper(string.sub(VType,1,1))) or "A"
if VType == "O" then --Open
Out = (O and O(I)) or (ds and ds:O(I))
elseif VType == "H" then --High
Out = (H and H(I)) or (ds and ds:H(I))
elseif VType == "L" then --Low
Out = (L and L(I)) or (ds and ds:L(I))
elseif VType == "C" then --Close
Out = (C and C(I)) or (ds and ds:C(I))
elseif VType == "V" then --Volume
Out = (V and V(I)) or (ds and ds:V(I))
elseif VType == "M" then --Median
Out = ((Value(I,"H",ds) + Value(I,"L",ds)) / 2)
elseif VType == "T" then --Typical
Out = ((Value(I,"M",ds) * 2 + Value(I,"C",ds))/3)
elseif VType == "W" then --Weighted
Out = ((Value(I,"T",ds) * 3 + Value(I,"O",ds))/4)
elseif VType == "D" then --Difference
Out = (Value(I,"H",ds) - Value(I,"L",ds))
elseif VType == "A" then --Any
if ds then Out = ds[I] end
end
return Out
end
йцу кен написал: В том же альфадиректе почему-то у разработчиков не возникает проблемы с сохранением цены покупку бумаг и с определением балансовой стоимости. Год как перешел в сбер и торгую через квик и год как плююсь. Когда у вас уже будет балансовая цена сохранятся а не превращаться в 0 на следующий день? Или я какую-то опцию найти не могу?
Цена сохраняется только если брокер захочет ее сохранять. Если у Вас не сохраняется вопрос к брокеру.
йцу кен написал: экспорт DDE нормально работает только с продуктами майкрософт, а если я пользуюсь опен офис? Или вообще на линуксе работаю, тогда что?
экспорт DDE нормально работает с любыми продуктами которые поддерживают DDE Люди даже используют самописные DDE сервера и все работает. То что OpenOffice не поддерживает эту технологию увы никак со стороны QUIK не исправить
Здравствуйте, В таблице текущих торгов транслируется то что приезжает с биржи. Если биржа транслирует указанные данные, мы можем их добавить, если нет то QUIK просто не от куда их взять. К слову в описании биржевого интерфейса мы не нашли такого параметра. Возможно следует уточнить на форуме биржи, а транслируют ли они вообще что то подобное
Сергей Качурин написал: Но был бы крайне признателен, если кто-нибудь хотя бы намекнул почему возможна ситуация, описанная выше...
По логам видно что сначала приходит ответ что стоп успешно снят а потом что его снять невозможно (так как он уже снят) Предполагаем что транзакция по каким-то причинам отправляется дважды. Но чтобы не было "предположений" (которых может быть еще с десяток) нужна полная версия кода
Космонавт написал: Сохранятся ли изменившиеся переменные в памяти при уходе в гибернацию?
Мы в этом месте исследований не проводили, так как подобного рода эксперименты пользователи могут провести самостоятельно. На вопросы типа "что будет если" куда эффективней получить ответ самостоятельно.
Vesa написал: 1) Значение предыдущей ЕМА. Т.к. значение предыдущей ЕМА в нашем случае является начальным значением, то EMAi-1 = 133,65 (значение цены закрытия в 18:15);
Скорее всего проблема именно в этом. Вы правильно говорите что для расчета EMA нужно его предыдущее значение. Но от куда Вы взяли что предыдущее EMA в 18:15 будет именно EMAi-1 = 133,65 (значение цены закрытия в 18:15)?? Ведь на 5 минутном таймфрейме сбербанка куда более чем 2 свечки. Даже если у Вас отключена история на графике, в 18:20 Вы никак не получите 2 свечки.
Для расчета EMA нужно его предыдущее значение EMAi-1. А для расчета этого предыдущего значения нужно его предыдущее EMAi-2 и так далее пока график не кончится.
и только самое самое левое значения графика цены и будет тем самым EMA0=P0 на 5 минутном таймфрейме сбербанка, это примерно 19 мая 2016г, а когда торги начнутся это будет уже другая свечка.
Антон написал: Цену я указываю, но на какой тип заявки нужно изменить, что бы даже если в данный момент нету предложения, что бы заявка осталась висеть и не снималась? На лимитированную L ?
Антон написал: 1) Какие указать параметры, что бы заявка не снималась сама.
Для того чтобы ответить на этот вопрос, Вам нужно понять почему заявка приезжает снятой. Вы указываете ["TYPE"] = "M", (рыночная) и судя по косвенным признакам речь про ФОРТС Так вот, на ФОРТС не бывает "рыночных" заявок. Там есть похожая по типу заявка "Снять остаток" суть которой в том что не исполненное количество заявки снимается с торгов.
В QUIK ставя признак рыночной заявки на фортс, Вы тем самым отправляете заявку с типом "Снять остаток". Если цена не указана она подставляется автоматически как минимально возможная или максимально возможная. Если цена указана, то отправляется с ней. Если по цене нет ни одного предложения, заявка сразу приезжает снятой. Если есть, но не в полном объеме, то часть заявки исполняется а остаток также снимается.
Цитата
Антон написал: В квике не могу нигде найти причину автоматического снятия заявки.
Потому что ее снимает биржа.
Цитата
Антон написал: 2) Как сделать дубль снятой заявки, с теми же параметрами.(Покупка\продажа, цена, количество)
Просто отправить транзакцию еще раз. Ведь у Вас в памяти остается таблица Transaction которая содержит все нужные данные.
Как уже было сказано и еще раз повторим, что приведенные ошибки возникают из-за того что в ST_orderNum у Вас ничего нет, то есть nil. Если это утверждение не вызывает доверия, проверьте сами на простом примере кода:
Ошибка говорит о том что в ST_orderNum у Вас ничего нет, то есть nil Посмотрите что у Вас в этой переменной перед ее вызовом. Тот код что Вы привели не дает ответа. Например если у Вас переменная ST_orderNum является локальной то при вызове из другой функции она будет равна nil
Sergey Denegin написал: А если он завис в результате отладки, то состояние макросов опять будет забыто.
И это абсолютно правильное поведение и меняться оно категорически не будет Ибо иначе скрипт бы постоянно приводил к зависанию. И избавиться от этого было бы нельзя. То есть терминал стал бы просто неработоспособен.
Здравствуйте, Да Ctrl+Alt+Del найти там info.exe и завершить.
Следует понимать что Lua скрипты работают в основном потоке терминала (кроме функции main) а значит чтобы была возможность из терминала аварийно завершить зависший скрипт, требуется чтобы терминал отвечал на команды. А он не может ответить так как в его потоке завис скрипт. Получается замкнутый круг.
Иными словами, завершить зависшее приложение можно только из другого приложения. А в данном случае это не так.
Sergey Denegin написал: Можно хотя бы сделать запуск скриптов после загрузки параметров окон из файла *.wnd, потому что пока они не загрузились, нет ни стакана, ни графиков.
А чем не устраивает проверка подключения к серверу isConnected() или событие OnConnected? Конечно не совсем то, но в практике редко встретишь необходимость работы lua скрипта при отключенном терминале, разве что для отладки.
Цитата
Sergey Denegin написал: Речь о том, что сейчас, чтобы скрипт запускался автоматически при запуске квика, его нужно запустить, а потом выйти и войти в квик, чтобы квик запомнил его состояние
Это некорректная формулировка. На самом деле, чтобы скрипт запускался автоматически, достаточно его правильно написать и запустить. А вот увидеть (проверить) что он действительно запустился автоматически, можно только после перезапуска.
Цитата
Sergey Denegin написал: Это пожелание сочетается с Пожеланием 1, потому что когда мы поставим там галочки, хотелось бы, чтобы эти галочки не слетели в случае зависания квика.
Пожелание 1 это пожелание 1 и, как уже было сказано, мы его рассмотрим. Если говорить о пожелании 3 как дополнение для пожелания 1, то на наш взгляд и так понятно что состояние галки должно сохраняться, иначе от нее нет смысла.
Цитата
Sergey Denegin написал: А для этого в окне со списком скриптов нужна кнопка "сохранить".
Ну так она и сейчас есть в Система - Сохранить настройки в файл.
--------------------------------------- Пожелание 1 Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО. --------------------------------------- Пожелание 2 Нет так вопрос решается в коде. Раз роботу нужны данные, значит робот и должен проверять доступность нужных ему данных. И потом как уже много лет обсуждалось, нет такой точки которая обозначает момент когда загрузка данных закончена, вернее она есть - это окончание сессии. Можно проверить только актуальность поступающих данных, а это делается в коде робота. --------------------------------------- Пожелание 3 Это пожелание не понятно. О каких параметрах скриптов идет речь? И зачем выходить и входить чтобы сохранить свойства?
Sergey Denegin написал: А сегодня он пропал, и никакими методами возвращаться не хочет. Пробовал делать и "перезаказ данных" , все равно не появляется график Спроса и предложений за вчерашний день.
Это может означать что брокер не накапливает историю по спросу и предложению. Вам следует обратиться с вопросом к брокеру.
Здравствуйте, В текущей реализации при добавлении нового Lua индикатора на график происходит перерасчет всех ранеее добавленных Lua индикаторов. К сожалению простого способа решить проблему нет. Мы зарегистрировали пожелание на доработку. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.