Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
{
string Objectname=NULL;
for(int x=0;x<9;x++)
{
for(int y=0;y<3;y++)
{
StringConcatenate(Objectname,"signal",IntegerToString(x),IntegerToString(y));
ObjectCreate(0,Objectname,OBJ_LABEL,0,0,0,0,0);
// создаем очередную метку. Обратите внимание, что название метки
// создается "на лету" и зависит от счетчиков "x" и "y"
ObjectSetString(0,Objectname,OBJPROP_FONT,"Wingdings");
// меняем шрифт на Wingdingsб чтобы получить доступ к символам
ObjectSetInteger(0,Objectname,OBJPROP_COLOR,Blue);
// меняем цвет на синий
ObjectSetString(0,Objectname,OBJPROP_TEXT,CharToString(110));
//делаем квадратики
ObjectSetInteger(0,Objectname,OBJPROP_XDISTANCE,x*20);
// изменяем координату Х.
// x*20 - каждая метка создается с интервалом в 20 пикселей по
// горизонтали и напрямую зависит от счетчика "x"
ObjectSetInteger(0,Objectname,OBJPROP_YDISTANCE,y*20);
// изменяем координату Y.
// y*20 - каждая метка создается с интервалом в 20 пикселей по
// вертикали и напрямую зависит от счетчика "y"
}
}
return(INIT_SUCCEEDED);
А вы не могли бы подсказать, каким образом можно записать следующее условие на iRSI:
По текущему бару мы не смотрим, смотрим по последнему закрытому (чтобы сигнал был четким, не прыгал туда сюда)
Если RSI на баре, который шел перед последним закрытым (как я понимаю, его порядковый номер будет 2), меньше 20, а RSI на баре, который закрылся (как я понимаю, его порядковый номер будет 1), больше 20 (выход из зоны перепроданности), то квадратик окрашивается зеленым
Если речь о MQL4, то так:
{
// меняем цвет
}
Если речь о MQL4, то так:
{
// меняем цвет
}
в mql5 нет в iRSI такого параметра как Индекс получаемого значения из индикаторного буфера, что ж делать?...
в mql5 нет в iRSI такого параметра как Индекс получаемого значения из индикаторного буфера, что ж делать?...
Да, тут немного по другому. Вначале создается хэндл индикатора для работы, обычно в OnInit()
if(handleRSI_M5 < 0)
{
Print("Объект iRSI не создан: handleRSI_M5= ",INVALID_HANDLE);
Print("Ошибка исполнения = ",GetLastError());
return(INIT_FAILED);
}
Предварительно нужен массив для значений индикатора, потом используете функцию CopyBuffer(), для того чтобы поместить три значения в этот массив. Три значения - это значения для 0-го, 1-го, 2-го баров. Потом работаете с эти массивом.
Только не забудьте еще задать направление таймсерии.
Да, тут немного по другому. Вначале создается хэндл индикатора для работы, обычно в OnInit()
if(handleRSI_M5 < 0)
{
Print("Объект iRSI не создан: handleRSI_M5= ",INVALID_HANDLE);
Print("Ошибка исполнения = ",GetLastError());
return(INIT_FAILED);
}
Предварительно нужен массив для значений индикатора, потом используете функцию CopyBuffer(), для того чтобы поместить три значения в этот массив. Три значения - это значения для 0-го, 1-го, 2-го баров. Потом работаете с эти массивом.
Только не забудьте еще задать направление таймсерии.
А если нам необходимо получать по всем таймфреймам сигналы, нам, получается, нужно создавать для каждого таймфрейма отдельный хэндл?
да для каждого тф свой хендл индикатора
а можно ли с помощью массива каким-то образом задать хендл индикатора для каждого таймфрейма?
//| test_graf.mq5 |
//| Sergey Gritsay |
//| https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link "https://www.mql5.com/ru/users/sergey1294"
#property version "1.00"
input int RSI_period = 14;
input ENUM_APPLIED_PRICE RSI_applied_price= PRICE_CLOSE;
input int RSI_shift = 0;
input int RSI_UPlevel = 70;
input int RSI_DOWNlevel = 30;
string Objectname=NULL;
int ind_handle[3][9];// здесь храним хендл индикатора
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
for(int y=0;y<3;y++)
{
for(int x=0;x<9;x++)
{
ind_handle[y][x]=INVALID_HANDLE;
if(y==0)ind_handle[y][x]=iRSI(_Symbol,tf(x),RSI_period,RSI_applied_price);// создадим хендл индикатора
StringConcatenate(Objectname,"signal",IntegerToString(x),IntegerToString(y));
if(ObjectFind(0,Objectname)<0)//если объект не существует создадим его
ObjectCreate(0,Objectname,OBJ_LABEL,0,0,0,0,0);
// создаем очередную метку. Обратите внимание, что название метки
// создается "на лету" и зависит от счетчиков "x" и "y"
ObjectSetString(0,Objectname,OBJPROP_FONT,"Wingdings");
// меняем шрифт на Wingdingsб чтобы получить доступ к символам
ObjectSetInteger(0,Objectname,OBJPROP_COLOR,clrGreen);
// меняем цвет на синий
ObjectSetString(0,Objectname,OBJPROP_TEXT,CharToString(110));
//делаем квадратики
ObjectSetInteger(0,Objectname,OBJPROP_XDISTANCE,x*20);
// изменяем координату Х.
// x*20 - каждая метка создается с интервалом в 20 пикселей по
// горизонтали и напрямую зависит от счетчика "x"
ObjectSetInteger(0,Objectname,OBJPROP_YDISTANCE,y*20);
// изменяем координату Y.
// y*20 - каждая метка создается с интервалом в 20 пикселей по
// вертикали и напрямую зависит от счетчика "y"
}
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
for(int y=0;y<3;y++)
{
for(int x=0;x<9;x++)
{
StringConcatenate(Objectname,"signal",IntegerToString(x),IntegerToString(y));
if(ObjectFind(0,Objectname)>=0)//если объект существует удалим его
ObjectDelete(0,Objectname);
}
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
for(int y=0;y<3;y++)
{
for(int x=0;x<9;x++)
{
StringConcatenate(Objectname,"signal",IntegerToString(x),IntegerToString(y));
if(ObjectFind(0,Objectname)>=0)//если объект существует изменим его свойства
{
if(y==0)ObjectSetInteger(0,Objectname,OBJPROP_COLOR,rsi(ind_handle[y][x],tf(x)));
}
}
}
}
//+------------------------------------------------------------------+
// функция возвращает период таймфрейма в зависимости от индекса
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES tf(int index)
{
switch(index)
{
case 0:return(PERIOD_M1);
case 1:return(PERIOD_M5);
case 2:return(PERIOD_M15);
case 3:return(PERIOD_M30);
case 4:return(PERIOD_H1);
case 5:return(PERIOD_H4);
case 6:return(PERIOD_D1);
case 7:return(PERIOD_W1);
case 8:return(PERIOD_MN1);
}
return(PERIOD_CURRENT);
}
//+------------------------------------------------------------------+
// функция возвращает цвет согласно сигналу индикатора RSI
//+------------------------------------------------------------------+
color rsi(int handle,ENUM_TIMEFRAMES timeframes)
{
double buffer[];
if(handle==INVALID_HANDLE || handle==0)
{
handle=iRSI(_Symbol,timeframes,RSI_period,RSI_applied_price);
return(clrGreen);
}
else
{
if(CopyBuffer(handle,0,RSI_shift,2,buffer)<2) return(clrGreen);
if(!ArraySetAsSeries(buffer,true)) return(clrGreen);
if(buffer[0]>=RSI_DOWNlevel && buffer[1]<=RSI_DOWNlevel)return(clrBlue);
if(buffer[0]<=RSI_UPlevel && buffer[1]>=RSI_UPlevel)return(clrRed);
}
return(clrGreen);
}
//+------------------------------------------------------------------+
вот набросал вам примерчик.
//| test_graf.mq5 |
//| Sergey Gritsay |
//| https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link "https://www.mql5.com/ru/users/sergey1294"
#property version "1.00"
input int RSI_period = 14;
input ENUM_APPLIED_PRICE RSI_applied_price= PRICE_CLOSE;
input int RSI_shift = 0;
input int RSI_UPlevel = 70;
input int RSI_DOWNlevel = 30;
string Objectname=NULL;
int ind_handle[3][9];// здесь храним хендл индикатора
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
for(int y=0;y<3;y++)
{
for(int x=0;x<9;x++)
{
ind_handle[y][x]=INVALID_HANDLE;
if(y==0)ind_handle[y][x]=iRSI(_Symbol,tf(x),RSI_period,RSI_applied_price);// создадим хендл индикатора
StringConcatenate(Objectname,"signal",IntegerToString(x),IntegerToString(y));
if(ObjectFind(0,Objectname)<0)//если объект не существует создадим его
ObjectCreate(0,Objectname,OBJ_LABEL,0,0,0,0,0);
// создаем очередную метку. Обратите внимание, что название метки
// создается "на лету" и зависит от счетчиков "x" и "y"
ObjectSetString(0,Objectname,OBJPROP_FONT,"Wingdings");
// меняем шрифт на Wingdingsб чтобы получить доступ к символам
ObjectSetInteger(0,Objectname,OBJPROP_COLOR,clrGreen);
// меняем цвет на синий
ObjectSetString(0,Objectname,OBJPROP_TEXT,CharToString(110));
//делаем квадратики
ObjectSetInteger(0,Objectname,OBJPROP_XDISTANCE,x*20);
// изменяем координату Х.
// x*20 - каждая метка создается с интервалом в 20 пикселей по
// горизонтали и напрямую зависит от счетчика "x"
ObjectSetInteger(0,Objectname,OBJPROP_YDISTANCE,y*20);
// изменяем координату Y.
// y*20 - каждая метка создается с интервалом в 20 пикселей по
// вертикали и напрямую зависит от счетчика "y"
}
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
for(int y=0;y<3;y++)
{
for(int x=0;x<9;x++)
{
StringConcatenate(Objectname,"signal",IntegerToString(x),IntegerToString(y));
if(ObjectFind(0,Objectname)>=0)//если объект существует удалим его
ObjectDelete(0,Objectname);
}
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
for(int y=0;y<3;y++)
{
for(int x=0;x<9;x++)
{
StringConcatenate(Objectname,"signal",IntegerToString(x),IntegerToString(y));
if(ObjectFind(0,Objectname)>=0)//если объект существует изменим его свойства
{
if(y==0)ObjectSetInteger(0,Objectname,OBJPROP_COLOR,rsi(ind_handle[y][x],tf(x)));
}
}
}
}
//+------------------------------------------------------------------+
// функция возвращает период таймфрейма в зависимости от индекса
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES tf(int index)
{
switch(index)
{
case 0:return(PERIOD_M1);
case 1:return(PERIOD_M5);
case 2:return(PERIOD_M15);
case 3:return(PERIOD_M30);
case 4:return(PERIOD_H1);
case 5:return(PERIOD_H4);
case 6:return(PERIOD_D1);
case 7:return(PERIOD_W1);
case 8:return(PERIOD_MN1);
}
return(PERIOD_CURRENT);
}
//+------------------------------------------------------------------+
// функция возвращает цвет согласно сигналу индикатора RSI
//+------------------------------------------------------------------+
color rsi(int handle,ENUM_TIMEFRAMES timeframes)
{
double buffer[];
if(handle==INVALID_HANDLE || handle==0)
{
handle=iRSI(_Symbol,timeframes,RSI_period,RSI_applied_price);
return(clrGreen);
}
else
{
if(CopyBuffer(handle,0,RSI_shift,2,buffer)<2) return(clrGreen);
if(!ArraySetAsSeries(buffer,true)) return(clrGreen);
if(buffer[0]>=RSI_DOWNlevel && buffer[1]<=RSI_DOWNlevel)return(clrBlue);
if(buffer[0]<=RSI_UPlevel && buffer[1]>=RSI_UPlevel)return(clrRed);
}
return(clrGreen);
}
//+------------------------------------------------------------------+
Вообще потрясает ваш ход мысли! Если вы при каждом чихе проверяете хэндл, и если что, загружаете индикатор, то зачем в начале загружать индикатор?
Надо только в ините загружать индикаторы.