Вопрос. Есть ли какие-то особенности при вызове этой функции на реальном счете? Скрипт выдаёт ошибку, мол, attempt to index a nil value Вызов такой: sizeDS=getFuturesLimit(Settings.FIRM_ID,Settings.ACCOUNT,0,"SUR").cbplimit;
В Firm_ID и Account соответственно хранятся фирма и торговый счет. При подстановке данных с тестового счета всё чудно работает, на реальном - фиг.
День добрый. Привожу часть кода. Заранее определенная глобальная переменная NP="Price" - хранит в себе название индикатора для свечей. И только для них. У всех остальных индикаторов свои названия. Переменная разумеется нигде не меняется.
Однако следующая связка N1=getNumCandles(NP); --количество свечей c=getCandlesByIndex(NP,0,N1-1,1)[0]; --последняя цена закрытия
выводит 0. Методом проб и ошибок пришел к выводу, что чтобы получить последнюю цену закрытия, надо от N1-1 отнять максимальный сдвиг аллигатора, т.е. получается, что в N1 хранится не количество свечей, а количество значений аллигатора! ЧЯДНТ?
P.s. индикатор аллигатора назван Alligator, т.е. не должно быть такого
Собственно, им я получаю значение АС текущей свечи и трёх предыдущих. Но вот в определенный момент эти числа получаются... из ниоткуда? Привожу пример (месседжами вывожу значения АС)
Скрытый текст
Относительно свечи N (числа примерные, всё ок): ac1=69 - у свечи N ac2=440 - у свечи N-1 ac3=508 - N-2 ac4=535 - N-3
Скрытый текст
Относительно свечи N-1 (числа примерные, всё ок): ac1=440 - у свечи N-1 ac2=508 - у свечи N-2 ac3=535 - N-3 ac4=446 - N-4
Скрытый текст
Относительно свечи N-2 (числа примерные, всё ок): ac1=508 - у свечи N-2 ac2=535 - у свечи N-3 ac3=446 - N-4 ac4=533 - N-5
Скрытый текст
Относительно свечи N-3 (числа примерные, всё ок): ac1=535 - у свечи N-3 ac2=446 - у свечи N-4 ac3=533 - N-5 ac4=753 - N-6
А вот дальше произошла какая-то магия...Относительно свечи N-4 (числа примерные, всё ок): ac1=-319 - у свечи N-4 ac2=-363 - у свечи N-5 ac3= 70 - N-6 ac4=418 - N-7
С чего вдруг пошли такие разительные изменения?
Как обойти невозможность получения данных?
Пользователь
Сообщений: Регистрация: 19.10.2016
14.08.2017 17:40:43
Добрый день. Такой вопрос - есть скрипт, обрабатывающий множество инструментов из файла, который является списком кодов класса и бумаг. Однако, в зависимости от запуска на тех или иных компьютерах, в зависимости от сервера, брокер предоставляет доступ к разному набору инструментов.
Вопрос - можно ли каким-либо образом устроить обработчик, который не будет вылетать с ошибкой на инструментах, которые брокер не предоставляет?
Здесь написана функция получения данных по инструменту, однако, к примеру, дойдя до класса SPBXM, данные о котором мне не предоставляются, вылетает с ошибкой "attempt to index global 'DS' (a nil value)". Как можно поправить код, чтобы в таком случае инструмент просто пропустился?
Код
function get_data() --получает базу данных
DS, strMessage = CreateDataSource( cur_class, cur_sec, INTERVAL_D1 )
tmTac = os.time()
repeat
sleep( 1000 )
until ( DS:Size() == nil ) or ( os.difftime( os.time(), tmTac ) <= 15 )
end;
Исчезли инструменты
Пользователь
Сообщений: Регистрация: 19.10.2016
08.08.2017 09:59:52
Здравствуйте. На прошлой неделе запускал Quik - мог спокойно создать таблицу сделок или график по таким инструментам, как Валюта, Облигации, Акции и прочее (т.е. был полный доступ ко всем инструментам). Сегодня же, запустив Quk, я обнаружил, что у меня в списке только Опционы и Фьючерсы Forts.
Куда делись остальные инструменты? Как их вернуть?
Откуда берутся начальные параметры
Пользователь
Сообщений: Регистрация: 19.10.2016
27.06.2017 08:10:34
В руководстве по созданию индикаторов теханализа есть пример по написанию функции EMA
Сколько ни смотрю,не могу понять какие ИМЕННО параметры передаются в подпрограмму функции. Выше нигде нет определений переменных _p, v_t и kk, внутри функции они тоже не определяются. Так что это за параметры?
Код
function EMA()
local cache={}
return function(ind,_p,v_t,kk)
local n=0
local p=0
local period=_p
local v_type=v_t
local index=ind
local k=kk or 2/(period+1)
if index==1 then cache={} end
if index<period then
cache[index]=Average(1,index,v_type)
return nil
end
p=cache[index-1] or dValue(index,v_type)
n=k*dValue(index,v_type)+(1-k)*p
cache[index]=n
return n
end
end
Получение данных индикатора со множества инструментов
Пользователь
Сообщений: Регистрация: 19.10.2016
02.06.2017 05:32:31
Всем добрый день.
Пытаюсь написать скрипт, задачей которого является получение значения индикаторов с большого числа инструментов. Делать свыше 70-80 таблиц и называть в них индикаторы смысла не имеет.
Разобрался, что через CreateDataSource можно получить данные со свечей любого инструмента... но можно ли это применить для индикаторов? Для аллигатора или хотя бы обычной скользящей средней? Или есть какие-то другие альтернативы для решения данной задачи?
Как узнать текущие чистые позиции?
Пользователь
Сообщений: Регистрация: 19.10.2016
10.04.2017 16:46:07
Всем добрый день. У меня есть задача - вытащить из терминала текущие чистые позиции.
Однако, выдаёт ошибку, мол: attempt to index a nil value
Не понимаю, что делаю не так. Подскажите пожалуйста. Все значения FIRM_ID, ACCOUNT и SECCODE соответствуют полям "Фирма", "Торговый счет" и "Код класса" таблицы "Позиции по клиентским счетам".
Получить номер свечи-фрактала
Пользователь
Сообщений: Регистрация: 19.10.2016
27.03.2017 19:05:14
Здравствуйте! Использую следующий индикатор фрактала.
Но не могу понять, как мне вытащить с графика номер свечи... f=getCandlesByIndex("Fractal",v,N-1,1)[0]; if f.Type==TYPE_TRIANGLE_DOWN then message("Fractal Down "..tostring(v)); end; if f.Type==TYPE_TRIANGLE_UP then message("Fractal UP "..tostring(v)); end;
Пробовал и f.Setting.line.Type - не понимаю, как мне программно узнать, какой фрактал у свечи и есть ли он в принципе... Подскажите пожалуйста
Код
Settings = {
Name = "*FRACTALS (Fractals)",
Period = 5,
line = {{
Name = "FRACTALS - Down",
Type = TYPE_TRIANGLE_DOWN,
Color = RGB(255, 0, 0)
},
{
Name = "FRACTALS - Up",
Type = TYPE_TRIANGLE_UP,
Color = RGB(0, 255, 0)
}
}
}
function Init()
func = FRACTALS()
return #Settings.line
end
function OnCalculate(Index)
return func(Index, Settings)
end
function FRACTALS() --Fractals ("FRACTALS")
local H_tmp={}
local L_tmp={}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 5)
P = math.floor(P/2)*2+1
H_tmp[I]=Value(I,"High",ds)
L_tmp[I]=Value(I,"Low",ds)
if I>=P then
local S = I-P+1+math.floor(P/2)
local val_h=math.max(unpack(H_tmp,I-P+1,I))
local val_l=math.min(unpack(L_tmp,I-P+1,I))
local L = Value(S,"Low",ds)
local H = Value(S,"High",ds)
if (val_h == H) and (val_h >0)
and (val_l == L) and (val_l > 0) then
if ds then return S,S else
SetValue(S, 1, val_l)
SetValue(S, 2, val_h)
end
else
if (val_h == H) and (val_h >0) then
if ds then return S,nil else
SetValue(S, 1, nil)
SetValue(S, 2, val_h)
end
end
if (val_l == L) and (val_l > 0) then
if ds then return nil,S else
SetValue(S, 1, val_l)
SetValue(S, 2, nil)
end
end
end
end
return nil,nil
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
Получение данных с графика
Пользователь
Сообщений: Регистрация: 19.10.2016
17.03.2017 20:24:28
Всем доброго времени суток. Задаю простой вопрос, понимаю, но уже всю голову сломал себе.
Если NS - скользящая средняя, то .close означает, что берется её предпоследнее (N1-1) значение, построенное по ценам закрытия, верно?
Момент появления свечи
Пользователь
Сообщений: Регистрация: 19.10.2016
03.03.2017 17:36:35
Всем доброго времени суток. Пишу робота, столкнулся с таким нюансом. Изначально спроектировал его так, чтобы проверка на выполнение условий выставления заявки была по времени (допустим, раз в минуту, путём pause(X) ).
Дело в том, что таким образом если я запускаю робота на 46-ой секунде на сервере, то первая проверка будет осуществляться на 46-ой секунде; следующая на 1 минуте 46; потом 2 минуты 46 и т.д.
Надо сделать так, чтобы проверка отрабатывала всегда на моменте открытия новой свечи. И не могу найти инфу, как программно выцепить именно момент открытия. Могу конечно время подогнать, но это не то. Подскажите, может есть какая-то встроенная функция... из справки в разделе "функции обратного вызова" вроде нет ничего подходящего, либо я не понял это(
Не указано значение поля "К/П"
Пользователь
Сообщений: Регистрация: 19.10.2016
13.02.2017 18:33:41
Здравствуйте! Пишу торгового робота. При запуске появляется ошибка в терминале:
"TransOpenPos(): Error: Не указано значение поля "К/П" "
Что такое это неизвестное "К/П"?
Создание собственных индикаторов
Пользователь
Сообщений: Регистрация: 19.10.2016
12.12.2016 22:17:44
Здравствуйте! Решил попрактиковаться в самостоятельном написании индикаторов технического анализа, но понял, что плохо себе представляю как работает функция OnCalculate. Как я понял, именно она отвечает за установку значений на индикатор. Пытаюсь сделать так, чтобы индикатор ставил точки в зависимости от определенных условий (например, пересечения скользящих средних)
График типа TYPE_POINT. Однако, количество точек четко совпадает с количеством свечей (и их координаты Х соответстенно), а по ординате все точки принимают одно и то же значение.
Где я фундаментально заблуждаюсь?
Код
function OnCalculate()
local short_pos=false;
local long_pos=false;
N1=getNumCandles("MVAs")
for v=2,N1,1 do
t=getCandlesByIndex("MVAs",0,v,1)[0];
t1=getCandlesByIndex("MVAs",0, v-1, 1)[0].close;
t2=getCandlesByIndex("MVAl",0, v-1, 1)[0].close;
t11=getCandlesByIndex("MVAs",0, v-2, 1)[0].close;
t22=getCandlesByIndex("MVAl",0, v-2, 1)[0].close;
if (t1>t2) and (t11<t22) then --короткая пересекает длинную снизу вверх
if (short_pos==false) then --если не в позиции то
long_pos=true; --открываем длинную позицию (покупка)
return t.open;
else --иначе
short_pos=false; --закрываем короткую позицию
return t.open;
end
else
if (t1<t2) and (t11>t22) then --короткая пересекает длинную сверху вниз
if (long_pos==false) then --если не в позиции то открываем короткую
short_pos=true;
return t.open;
else --иначе
long_pos=false; --закрывается длинная позиция
return t.open; --производим продажу; длинна позиция закрыта.
end
end
end
end
end
В Excel выводится только 26 строк
Пользователь
Сообщений: Регистрация: 19.10.2016
08.11.2016 21:35:52
Здравствуйте! Создаю файл .csv
CSV=io.open(getScriptPath().."/Trades.csv","a+"); local Position = CSV:seek("end",0); if Position==0 then
и далее начинаю через CSV:Write() указывать строки для вывода. Так выходит, что мне надо вывести около 40 строк, которые я и заполняю. Но вот незадача: когда после запуска скрипта я открываю файл Excel, у меня оказывается 26 первых строк, перечисленных в скрипте. В чем дело? Как вывести все нужные мне строки? Я бы хотел именно это сделать именно строками, а не столбцами - так наглядней.
Лимит открытых позиций - nil
Пользователь
Сообщений: Регистрация: 19.10.2016
08.11.2016 09:02:27
Здравствуйте! Сделал следующую функцию для выцепления лимита открытых позиций из таблицы "Лимиты по фьючерсам" (допустим, для инструмента RIZ6)
function getMoney() for i = 0,getNumberOf("FUTURES_CLIENT_LIMITS") - 1 do if getItem("FUTURES_CLIENT_LIMITS",i).sec_code == "RIZ6" then money=get_Item("FUTURES_CLIENT_LIMITS").cbplimit; end end message(tostring(money)); end
Однако, она выводит результат nil. В чем может быть проблема?
Установка отметок на графике через скрипт
Пользователь
Сообщений: Регистрация: 19.10.2016
24.10.2016 19:28:35
Здравствуйте. Хочу для удобства визуализации сделать так, чтобы скрипт QLUA отмечал на графике точки по нужным мне параметрам. Т.е. например если произошло пересечение средних - чтобы на графиках появилась соответствующая отметка.
Вопрос - как это можно сделать и можно ли вообще? Или где можно почитать об этом поподробнее?
Не могу получить данные с графика, не могу получить данные с графика
Пользователь
Сообщений: Регистрация: 19.10.2016
19.10.2016 10:23:32
Добрый день! Простой код, пытаюсь получить данные о цене закрытия свечи по одной из скользящих средних.
Скрытый текст
Скрытый текст
N1=getNumCandles(MVAs)
Скрытый текст
if N1==0 or N1==nil then
Скрытый текст
message("POTRACHENO MVAs")
Скрытый текст
end
Скрытый текст
N2=getNumCandles(MVAl)
Скрытый текст
Скрытый текст
if N2==0 or N2==nil then
Скрытый текст
message("POTRACHENO MVAl")
Скрытый текст
end
Соответственно, если ничего со свечи не получаю, то выводу соответствующее сообщение
Но вот незадача - я не получаю данных не с одного графика, ни с другого... В чем проблема? Идентификаторы графиков верные.