Егор Масалкин (Автор тем)

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

Страницы: 1
getFuturesLimit на реальном счете
 
Вопрос. Есть ли какие-то особенности при вызове этой функции на реальном счете? Скрипт выдаёт ошибку, мол, attempt to index a nil value
Вызов такой:
sizeDS=getFuturesLimit(Settings.FIRM_ID,Settings.ACCOUNT,0,"SUR").cbplimit;

В Firm_ID и Account соответственно хранятся фирма и торговый счет.
При подстановке данных с тестового счета всё чудно работает, на реальном - фиг.
getNumCandles возвращает максимальный сдвиг аллигатора
 
День добрый.
Привожу часть кода.
Заранее определенная глобальная переменная
NP="Price" - хранит в себе название индикатора для свечей. И только для них. У всех остальных индикаторов свои названия. Переменная разумеется нигде не меняется.

Однако следующая связка
N1=getNumCandles(NP); --количество свечей
c=getCandlesByIndex(NP,0,N1-1,1)[0]; --последняя цена закрытия

выводит 0.
Методом проб и ошибок пришел к выводу, что чтобы получить последнюю цену закрытия, надо от N1-1 отнять максимальный сдвиг аллигатора, т.е. получается, что в N1 хранится не количество свечей, а количество значений аллигатора!
ЧЯДНТ?

P.s. индикатор аллигатора назван Alligator, т.е. не должно быть такого
Индикатор АС - числа берутся из ниоткуда
 
День добрый.
Есть такой код:

ac1=getCandlesByIndex(NAC,0,i,1)[0].close;
ac2=getCandlesByIndex(NAC,0,i-1,1)[0].close;
ac3=getCandlesByIndex(NAC,0,i-2,1)[0].close;
ac4=getCandlesByIndex(NAC,0,i-3,1)[0].close;

Собственно, им я получаю значение АС текущей свечи и трёх предыдущих.
Но вот в определенный момент эти числа получаются... из ниоткуда?
Привожу пример (месседжами вывожу значения АС)
Скрытый текст
Скрытый текст

Скрытый текст
Скрытый текст

А вот дальше произошла какая-то магия...Относительно свечи N-4 (числа примерные, всё ок):
ac1=-319 - у свечи N-4
ac2=-363 - у свечи N-5
ac3= 70 - N-6
ac4=418 - N-7

С чего вдруг пошли такие разительные изменения?
Как обойти невозможность получения данных?
 
Добрый день. Такой вопрос - есть скрипт, обрабатывающий множество инструментов из файла, который является списком кодов класса и бумаг.
Однако, в зависимости от запуска на тех или иных компьютерах, в зависимости от сервера, брокер предоставляет доступ к разному набору инструментов.

Вопрос - можно ли каким-либо образом устроить обработчик, который не будет вылетать с ошибкой на инструментах, которые брокер не предоставляет?

Здесь написана функция получения данных по инструменту, однако, к примеру, дойдя до класса 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;
Исчезли инструменты
 
Здравствуйте. На прошлой неделе запускал Quik - мог спокойно создать таблицу сделок или график по таким инструментам, как Валюта, Облигации, Акции и прочее (т.е. был полный доступ ко всем инструментам).
Сегодня же, запустив Quk, я обнаружил, что у меня в списке только Опционы и Фьючерсы Forts.

Куда делись остальные инструменты? Как их вернуть?
Откуда берутся начальные параметры
 
В руководстве по созданию индикаторов теханализа есть пример по написанию функции 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
Получение данных индикатора со множества инструментов
 
Всем добрый день.

Пытаюсь написать скрипт, задачей которого является получение значения индикаторов с большого числа инструментов.
Делать свыше 70-80 таблиц и называть в них индикаторы смысла не имеет.

Разобрался, что через CreateDataSource можно получить данные со свечей любого инструмента... но можно ли это применить для индикаторов? Для аллигатора или хотя бы обычной скользящей средней?
Или есть какие-то другие альтернативы для решения данной задачи?
Как узнать текущие чистые позиции?
 
Всем добрый день. У меня есть задача - вытащить из терминала текущие чистые позиции.

Пытаюсь использовать следующий код:

first=getFuturesHolding(Settings.FIRM_ID,Settings.ACCOUNT,Settings.SECCODE, 0).totalnet;

Однако, выдаёт ошибку, мол: attempt to index a nil value

Не понимаю, что делаю не так. Подскажите пожалуйста.
Все значения FIRM_ID, ACCOUNT и SECCODE соответствуют полям "Фирма", "Торговый счет" и "Код класса" таблицы "Позиции по клиентским счетам".
Получить номер свечи-фрактала
 
Здравствуйте! Использую следующий индикатор фрактала.

Но не могу понять, как мне вытащить с графика номер свечи...
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
Получение данных с графика
 
Всем доброго времени суток.
Задаю простой вопрос, понимаю, но уже всю голову сломал себе.

N1=getNumCandles(NS)
t1=getCandlesByIndex(NS,0, N1-1, 1)[0].close;


Если NS - скользящая средняя, то .close означает, что берется её предпоследнее  (N1-1) значение, построенное по ценам закрытия, верно?
Момент появления свечи
 
Всем доброго времени суток.
Пишу робота, столкнулся с таким нюансом. Изначально спроектировал его так, чтобы проверка на выполнение условий выставления заявки была по времени (допустим, раз в минуту, путём pause(X) ).

Дело в том, что таким образом если я запускаю робота на 46-ой секунде на сервере, то первая проверка будет осуществляться на 46-ой секунде; следующая на 1 минуте 46; потом 2 минуты 46 и т.д.

Надо сделать так, чтобы проверка отрабатывала всегда на моменте открытия новой свечи. И не могу найти инфу, как программно выцепить именно момент открытия. Могу конечно время подогнать, но это не то. Подскажите, может есть какая-то встроенная функция... из справки в разделе "функции обратного вызова" вроде нет ничего подходящего, либо я не понял это(
Не указано значение поля "К/П"
 
Здравствуйте! Пишу торгового робота. При запуске появляется ошибка в терминале:

"TransOpenPos(): Error:  Не указано значение поля "К/П" "

Что такое это неизвестное "К/П"?
Создание собственных индикаторов
 
Здравствуйте!
Решил попрактиковаться в самостоятельном написании индикаторов технического анализа, но понял, что плохо себе представляю как работает функция 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 строк
 
Здравствуйте!
Создаю файл .csv

CSV=io.open(getScriptPath().."/Trades.csv","a+");
local Position = CSV:seek("end",0);
if Position==0 then

и далее начинаю через CSV:Write() указывать строки для вывода. Так выходит, что мне надо вывести около 40 строк, которые я и заполняю.
Но вот незадача: когда после запуска скрипта я открываю файл Excel, у меня оказывается 26 первых строк, перечисленных в скрипте.
В чем дело? Как вывести все нужные мне строки?
Я бы хотел именно это сделать именно строками, а не столбцами - так наглядней.
Лимит открытых позиций - nil
 
Здравствуйте!
Сделал следующую функцию для выцепления лимита открытых позиций из таблицы "Лимиты по фьючерсам" (допустим, для инструмента 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. В чем может быть проблема?
Установка отметок на графике через скрипт
 
Здравствуйте.
Хочу для удобства визуализации сделать так, чтобы скрипт QLUA отмечал на графике точки по нужным мне параметрам.
Т.е. например если произошло пересечение средних - чтобы на графиках появилась соответствующая отметка.

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

Соответственно, если ничего со свечи не получаю, то выводу соответствующее сообщение

Но вот незадача - я не получаю данных не с одного графика, ни с другого... В чем проблема? Идентификаторы графиков верные.
Страницы: 1
Наверх