<HELP> for explanation

Qlua. Как по значениям обработки переменных построить график в квике ?

  • обсудить на форуме:
  • Quik Lua
  • Ключевые слова:
  • Qlua
 

 Settings = {
    Name = «test»,
    line = {    
    {
        Name = «Line»,
        Color = RGB(0, 255, 0),
        Type = TYPE_LINE,
        Width = 1
    }
  }
}

function Init()    
    return 1
end



function OnCalculate(index)
    Line = --твой код расчета
    
    return Line
end
не понятен твой вопрос. уточни.
Eldar Shaymardanov, вот по первому бару посчитал х=4, по второму х=5, по третьему х=8… по 145 бару х=12. Как построить в квике график х/номер бара?
 это код линейного индикатора
Eldar Shaymardanov, большое спасибо

kvazar, а как сделать, чтобы график строился в новом окне?
kvazar, всмысле в новом? добавляешь индикатор в то окно, куда нужно.
Eldar Shaymardanov, скажи пожалуйста, я в начале скрипта, перед функцией мэйн,  написал так, 

Settings = {
Name = 'test',
line = {
{
Name = 'Line',
Color = RGB(0, 255, 0),
Type = TYPE_LINE,
Width = 1
}
}
}

function Init()
return 1
end

 

function OnCalculate(index)
Line = tPrice1[0].close +25--твой код расчета

return Line
end

в функции мэйн вызываю OnCalculate(index)
Но ничего не происходит. Скажи пожалуйста что я упускаю, и что нужно сделать, что бы построился график по переменной Line
Eldar Shaymardanov, и в теле функции тоже не срабатывает. видимо нужно отправлять 

Settings = {
Name = 'test',
line = {
{
Name = 'Line',
Color = RGB(0, 255, 0),
Type = TYPE_LINE,
Width = 1
}
}
}
терминалу квик. но как?

kvazar, Init — инициализирует индикатор.
Визуальная составляющая строится по возвращаемым значениям функции OnCalculate.
Никакого main() тут не надо.
Что такое tPrice1[0].close???


ACCOUNT = 'SPBFUT0025E'; — Идентификатор счета
CLASS_CODE = 'SPBFUT'; — Код класса
SEC_CODE = 'SiM7'; — Код бумаги

 


Price1=«PriceSim» --ссылка на график цены
INTERVAL = INTERVAL_M1; — Таймфрейм графика (для построения скользящих)
-------------------------------------------------------------------------------------------------------------------------------
--/*РАБОЧИЕ ПЕРЕМЕННЫЕ РОБОТА (менять не нужно)*/
SEC_PRICE_STEP = 0; — ШАГ ЦЕНЫ ИНСТРУМЕНТА
DS = nil; — Источник данных графика (DataSource)
LastOpenBarIndex = 0; — Индекс свечи, на которой была открыта последняя позиция (нужен для того, чтобы после закрытия по стопу тут же не открыть еще одну позицию)
Run = true; — Флаг поддержания работы бесконечного цикла в main
TabOtk=false --флаг открытия позиции из таблицы
Sost='Не работает' --флаг таблицы на вкл/выкл
--------------------------------------------------------------------------------------------------------------------------------


Settings = {
Name = 'test',
line = {
{
Name = 'Line',
Color = RGB(0, 255, 0),
Type = TYPE_LINE,
Width = 1
}
}
}

function Init()
return 1
end

 

function OnCalculate(index)
Line = tPrice1[0].close +25--твой код расчета

return Line
end

 

 


function VariacMorzhaTotal() --подсчет вариационной моржи
local q_total=0

for i = 0,getNumberOf('FUTURES_CLIENT_HOLDINGS')- 1 do
if getItem('FUTURES_CLIENT_HOLDINGS',i).sec_code == SEC_CODE then — ЕСЛИ строка по нужному инструменту
VariacMorzha = getItem('FUTURES_CLIENT_HOLDINGS',i).varmargin
if VariacMorzha== nil then
return 0
else
return VariacMorzha — возвращаем количество позиций
end
end;
end;
return 0
end

 

— Функция первичной инициализации скрипта (ВЫЗЫВАЕТСЯ ТЕРМИНАЛОМ QUIK в самом начале)
function OnInit()
— Получает доступ к свечам графика
local Error = '';
DS,Error = CreateDataSource(CLASS_CODE, SEC_CODE, INTERVAL);
— Проверка
if DS == nil then
message('Простой робот: ОШИБКА получения доступа к свечам! '..Error);
— Завершает выполнение скрипта
Run = false;
return;
end;

— Получает ШАГ ЦЕНЫ ИНСТРУМЕНТА
SEC_PRICE_STEP = getParamEx(CLASS_CODE, SEC_CODE, «SEC_PRICE_STEP»).param_value;
message('SEC_PRICE_STEP'..tostring(SEC_PRICE_STEP))

end;

function main()
— CreateTable();--создает таблицу
— SetTableNotificationCallback(t_id, TablObr); --обратный вызов кнопки таблицы
— Выводит сообщение

— «Бесконечный» цикл
while Run do

NumCandles1=getNumCandles(Price1)

tPrice1,n1,s1 = getCandlesByIndex (Price1, 0, NumCandles1-10, 10) --считывает данные с графика цены

if tPrice1[0]~=nil or tPrice1[1]~=nil --[[or tPrice2[0]~=nil or tPrice2[1]~=nil or tPrice3[0]~=nil or tPrice3[1]~=nil or tPrice4[0]~=nil or tPrice4[1]~=nil or tPrice5[0]~=nil or tPrice5[1]~=nil or tPrice6[0]~=nil or tPrice6[1]~=nil]] then
--if NOtk==0 then ROBOT_STATE='В ПОИСКЕ ТОЧКИ ВХОДА' end

OnCalculate(index)
end
sleep(1);--Пауза 10 мс, для того, чтобы не перегружать процессор компьютера
end;
end;

— Функция вызывается терминалом QUIK при получении ответа на транзакцию пользователя
function OnTransReply(trans_reply)
— Если поступила информация по текущей транзакции
if trans_reply.trans_id == trans_id then
— Передает статус в глобальную переменную
trans_Status = trans_reply.status;
— Передает сообщение в глобальную переменную
trans_result_msg = trans_reply.result_msg;
message('Робот: trans_Status '..tostring(trans_reply.status)..' trans_result_msg '..tostring(trans_result_msg));
SetCell(t_id,6--[[№строки]], 1--[[№ячейки]], tostring(VariacMorzhaTotal())) if VariacMorzhaTotal()<0 then Red(6,1) else Green(6,1) end
end;
end;

— Функция ВЫЗЫВАЕТСЯ ТЕРМИНАЛОМ QUIK при остановке скрипта
function OnStop()
Run = false;
end;

 

avatar

kvazar

Eldar Shaymardanov, это цена первого проиндексированного бара
Это работать не будет в таком виде.
Eldar Shaymardanov, скажите пожалуйста, как нужно подредактировать, что бы заработало?
kvazar, что ты хочешь показать на графике?
из твоего кода получается так, что ты расчет робота бахнул в код индикатора.
во-первых тут другая логика работы.
во-вторых часть функций недоступна в скрипте индикатора.
Eldar Shaymardanov, скажи пожалуйста какая тут логика? если в другой части кода будет выполнятся расчет, то будет рисовать график? 

kvazar, есть Init — инициализирует скрипт.
OnCalculate(index)- возвращает значения по которым отображается индикатор.
Логика такая index — номер свечи по какой формировать индикатор, то есть index указывает по какой свече считать.
Дальше — не все функции доступны. qlua.bitballoon.com/ch13_2_6
Не получишь OnTransReply например. Нет таблиц и т.д.
quikluacsharp.ru/quik-qlua/poluchenie-v-qlua-lua-dannyh-iz-grafikov-i-indikatorov/
Расчет должен быть корректным.
И функция расчета должна вызываться из функции OnCalculate.

 Теперь вызывается вычисление из  OnCalculate. Но все равно сделано мной не правильно. Скажите пожалуйста, что опять я понял не верно?

CLASS_CODE = 'SPBFUT'; — Код класса
SEC_CODE = 'SiM7'; — Код бумаги

 


Price1=«PriceSim» --ссылка на график цены
INTERVAL = INTERVAL_M1; — Таймфрейм графика (для построения скользящих)
-------------------------------------------------------------------------------------------------------------------------------
--/*РАБОЧИЕ ПЕРЕМЕННЫЕ РОБОТА (менять не нужно)*/
SEC_PRICE_STEP = 0; — ШАГ ЦЕНЫ ИНСТРУМЕНТА
DS = nil; — Источник данных графика (DataSource)
LastOpenBarIndex = 0; — Индекс свечи, на которой была открыта последняя позиция (нужен для того, чтобы после закрытия по стопу тут же не открыть еще одну позицию)
Run = true; — Флаг поддержания работы бесконечного цикла в main

--------------------------------------------------------------------------------------------------------------------------------


Settings = {
Name = 'test',
line = {
{
Name = 'Line',
Color = RGB(0, 255, 0),
Type = TYPE_LINE,
Width = 1
}
}
}

 

 

function VariacMorzhaTotal() --подсчет вариационной моржи
local q_total=0

for i = 0,getNumberOf('FUTURES_CLIENT_HOLDINGS')- 1 do
if getItem('FUTURES_CLIENT_HOLDINGS',i).sec_code == SEC_CODE then — ЕСЛИ строка по нужному инструменту
VariacMorzha = getItem('FUTURES_CLIENT_HOLDINGS',i).varmargin
if VariacMorzha== nil then
return 0
else
return VariacMorzha — возвращаем количество позиций
end
end;
end;
return 0
end

 

— Функция первичной инициализации скрипта (ВЫЗЫВАЕТСЯ ТЕРМИНАЛОМ QUIK в самом начале)
function OnInit()
— Получает доступ к свечам графика
local Error = '';
DS,Error = CreateDataSource(CLASS_CODE, SEC_CODE, INTERVAL);
— Проверка
if DS == nil then
message('Простой робот: ОШИБКА получения доступа к свечам! '..Error);
— Завершает выполнение скрипта
Run = false;
return;
end;

— Получает ШАГ ЦЕНЫ ИНСТРУМЕНТА
SEC_PRICE_STEP = getParamEx(CLASS_CODE, SEC_CODE, «SEC_PRICE_STEP»).param_value;
message('SEC_PRICE_STEP'..tostring(SEC_PRICE_STEP))

end;

function main()
— CreateTable();--создает таблицу
— SetTableNotificationCallback(t_id, TablObr); --обратный вызов кнопки таблицы
— Выводит сообщение

— «Бесконечный» цикл
while Run do

NumCandles1=getNumCandles(Price1)

tPrice1,n1,s1 = getCandlesByIndex (Price1, 0, NumCandles1-10, 10) --считывает данные с графика цены

if tPrice1[0]~=nil or tPrice1[1]~=nil --[[or tPrice2[0]~=nil or tPrice2[1]~=nil or tPrice3[0]~=nil or tPrice3[1]~=nil or tPrice4[0]~=nil or tPrice4[1]~=nil or tPrice5[0]~=nil or tPrice5[1]~=nil or tPrice6[0]~=nil or tPrice6[1]~=nil]] then
--if NOtk==0 then ROBOT_STATE='В ПОИСКЕ ТОЧКИ ВХОДА' end
function Init()
return 1
end

 

function OnCalculate(index)
index=DS:Size();
indicator()
Line = x1.Siting

return Line
end


function indicator()
x1 = tPrice1[0].close +25 --код расчета

return x1
end

 

end
sleep(1);--Пауза 10 мс, для того, чтобы не перегружать процессор компьютера
end;
end;

— Функция вызывается терминалом QUIK при получении ответа на транзакцию пользователя
function OnTransReply(trans_reply)
— Если поступила информация по текущей транзакции
if trans_reply.trans_id == trans_id then
— Передает статус в глобальную переменную
trans_Status = trans_reply.status;
— Передает сообщение в глобальную переменную
trans_result_msg = trans_reply.result_msg;
message('Робот: trans_Status '..tostring(trans_reply.status)..' trans_result_msg '..tostring(trans_result_msg));

end;
end;

— Функция ВЫЗЫВАЕТСЯ ТЕРМИНАЛОМ QUIK при остановке скрипта
function OnStop()
Run = false;
end;

 

avatar

kvazar


Только зарегистрированные и авторизованные пользователи могут оставлять ответы.

Залогиниться

Зарегистрироваться
....все тэги
Регистрация
UPDONW