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
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;
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;
kvazar, что ты хочешь показать на графике?
из твоего кода получается так, что ты расчет робота бахнул в код индикатора.
во-первых тут другая логика работы.
во-вторых часть функций недоступна в скрипте индикатора.
Теперь вызывается вычисление из 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;
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;
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
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
в функции мэйн вызываю OnCalculate(index)end
Но ничего не происходит. Скажи пожалуйста что я упускаю, и что нужно сделать, что бы построился график по переменной Line
Визуальная составляющая строится по возвращаемым значениям функции OnCalculate.
Никакого main() тут не надо.
Что такое tPrice1[0].close???
Settings = {
Name = 'test',
line = {
{
Name = 'Line',
Color = RGB(0, 255, 0),
Type = TYPE_LINE,
Width = 1
}
}
}
терминалу квик. но как?
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;
из твоего кода получается так, что ты расчет робота бахнул в код индикатора.
во-первых тут другая логика работы.
во-вторых часть функций недоступна в скрипте индикатора.
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;
Только зарегистрированные и авторизованные пользователи могут оставлять ответы.
Залогиниться
Зарегистрироваться