Скачать MetaTrader 5

Вопрос по коду: индикатор SHI_Channel.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
markos
141
markos  

Для определения направления канала хочу использовать индикатор SHI_Channel.

Вопрос: как определить в программе направление канала используя этот индикатор при помощи iCustom()? Не могу понять какие параметры индикатора вставлять в этот оператор.

Прилагаю код индикатора.

//+------------------------------------------------------------------+
//| SHI_Channel.mq4 |
//| Copyright 2012, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
double ExtMapBuffer1[];
//---- input parameters
extern int AllBars=240;
extern int BarsForFract=0;
int CurrentBar=0;
double Step=0;
int B1=-1,B2=-1;
int UpDown=0;
double P1=0,P2=0,PP=0;
int i=0,AB=300,BFF=0;
int ishift=0;
double iprice=0;
datetime T1,T2;

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,164);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexEmptyValue(0,0.0);
//----


return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}

void DelObj()
{
ObjectDelete("TL1");
ObjectDelete("TL2");
ObjectDelete("MIDL");
}

//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int counted_bars=IndicatorCounted();
//----
if ((AllBars==0) || (Bars<AllBars)) AB=Bars; else AB=AllBars; //AB-количество обсчитываемых баров
if (BarsForFract>0)
BFF=BarsForFract;
else
{
switch (Period())
{
case 1: BFF=12; break;
case 5: BFF=48; break;
case 15: BFF=24; break;
case 30: BFF=24; break;
case 60: BFF=12; break;
case 240: BFF=15; break;
case 1440: BFF=10; break;
case 10080: BFF=6; break;
default: DelObj(); return(-1); break;
}
}
CurrentBar=2; //считаем с третьего бара, чтобы фрактал "закрепился
B1=-1; B2=-1; UpDown=0;
while(((B1==-1) || (B2==-1)) && (CurrentBar<AB))
{
//UpDown=1 значит первый фрактал найден сверху, UpDown=-1 значит первый фрактал
//найден снизу, UpDown=0 значит фрактал ещё не найден.
//В1 и В2 - номера баров с фракталами, через них строим опорную линию.
//Р1 и Р2 - соответственно цены через которые будем линию проводить

if((UpDown<1) && (CurrentBar==Lowest(Symbol(),Period(),MODE_LOW,BFF*2+1,CurrentBar-BFF)))
{
if(UpDown==0) { UpDown=-1; B1=CurrentBar; P1=Low[B1]; }
else { B2=CurrentBar; P2=Low[B2];}
}
if((UpDown>-1) && (CurrentBar==Highest(Symbol(),Period(),MODE_HIGH,BFF*2+1,CurrentBar-BFF)))
{
if(UpDown==0) { UpDown=1; B1=CurrentBar; P1=High[B1]; }
else { B2=CurrentBar; P2=High[B2]; }
}
CurrentBar++;
}
if((B1==-1) || (B2==-1)) {DelObj(); return(-1);} // Значит не нашли фракталов среди 300 баров 8-)
Step=(P2-P1)/(B2-B1);//Вычислили шаг, если он положительный, то канал нисходящий
P1=P1-B1*Step; B1=0;//переставляем цену и первый бар к нулю
//А теперь опорную точку противоположной линии канала.
ishift=0; iprice=0;
if(UpDown==1)
{
PP=Low[2]-2*Step;
for(i=3;i<=B2;i++)
{
if(Low[i]<PP+Step*i) { PP=Low[i]-i*Step; }
}
if(Low[0]<PP) {ishift=0; iprice=PP;}
if(Low[1]<PP+Step) {ishift=1; iprice=PP+Step;}
if(High[0]>P1) {ishift=0; iprice=P1;}
if(High[1]>P1+Step) {ishift=1; iprice=P1+Step;}
}
else
{
PP=High[2]-2*Step;
for(i=3;i<=B2;i++)
{
if(High[i]>PP+Step*i) { PP=High[i]-i*Step;}
}
if(Low[0]<P1) {ishift=0; iprice=P1;}
if(Low[1]<P1+Step) {ishift=1; iprice=P1+Step;}
if(High[0]>PP) {ishift=0; iprice=PP;}
if(High[1]>PP+Step) {ishift=1; iprice=PP+Step;}
}
//Теперь переставим конечную цену и бар на АВ, чтобы линии канала рисовались подлиннее
P2=P1+AB*Step;
T1=Time[B1]; T2=Time[AB];

//Если не было пересечения канала, то 0, иначе ставим псису.
if(iprice!=0) ExtMapBuffer1[ishift]=iprice;
DelObj();
ObjectCreate("TL1",OBJ_TREND,0,T2,PP+Step*AB,T1,PP);
ObjectSet("TL1",OBJPROP_COLOR,Lime);
ObjectSet("TL1",OBJPROP_WIDTH,2);
ObjectSet("TL1",OBJPROP_STYLE,STYLE_SOLID);
ObjectCreate("TL2",OBJ_TREND,0,T2,P2,T1,P1);
ObjectSet("TL2",OBJPROP_COLOR,Lime);
ObjectSet("TL2",OBJPROP_WIDTH,2);
ObjectSet("TL2",OBJPROP_STYLE,STYLE_SOLID);
ObjectCreate("MIDL",OBJ_TREND,0,T2,(P2+PP+Step*AB)/2,T1,(P1+PP)/2);
ObjectSet("MIDL",OBJPROP_COLOR,Lime);
ObjectSet("MIDL",OBJPROP_WIDTH,1);
ObjectSet("MIDL",OBJPROP_STYLE,STYLE_DOT);
//----
return(0);
}
//+------------------------------------------------------------------+

Файлы:
Vitalie Postolache
12429
Vitalie Postolache  
Буфер нет смысла читать, надо отслеживать обьекты-трендовые, которые индикатор рисует и по углу наклона уже принимать решение, вверх, вниз или горизонтально.
markos
141
markos  

Дайте пожалуйста ссылку по примерам определения угла наклона отрисованных объектов (линии).

Заранее благодарен.

Vitalie Postolache
12429
Vitalie Postolache  
Тут обсуждалось, ещё в кодобазе что-то валяется с дивергенциями, там тоже по наклону определяли, но искать сейчас некогда.
markos
141
markos  
evillive:
Тут обсуждалось, ещё в кодобазе что-то валяется с дивергенциями, там тоже по наклону определяли, но искать сейчас некогда.
По этой ссылке я нашел ответ. Спасибо.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий