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

  • обсудить на форуме:
  • Quik Lua
★1
ВНИМАНИЕ! КОММЕНТАРИИ ПЕРВОГО УРОВНЯ В ВОПРОСАХ УПОРЯДОЧИВАЮТСЯ ПО ЧИСЛУ ПЛЮСИКОВ, А НЕ ПО ВРЕМЕНИ ПУБЛИКАЦИИ.
 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
avatar
не понятен твой вопрос. уточни.
avatar
Eldar Shaymardanov, вот по первому бару посчитал х=4, по второму х=5, по третьему х=8… по 145 бару х=12. Как построить в квике график х/номер бара?
avatar
 это код линейного индикатора
avatar
Eldar Shaymardanov, большое спасибо

avatar
kvazar, а как сделать, чтобы график строился в новом окне?
avatar
kvazar, всмысле в новом? добавляешь индикатор в то окно, куда нужно.
avatar
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
avatar
kvazar, Init — инициализирует индикатор.
Визуальная составляющая строится по возвращаемым значениям функции OnCalculate.
Никакого main() тут не надо.
Что такое tPrice1[0].close???
avatar
Eldar Shaymardanov, это цена первого проиндексированного бара
avatar
Eldar Shaymardanov, и в теле функции тоже не срабатывает. видимо нужно отправлять 

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

avatar


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

avatar
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/
avatar
Расчет должен быть корректным.
И функция расчета должна вызываться из функции OnCalculate.
avatar

 Теперь вызывается вычисление из  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

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

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

Зарегистрироваться

теги блога Трейдер Вася

....все тэги



UPDONW
Новый дизайн