Из 286 запутанных линий он превратился в 151 четкую линию, а также может делать больше.
Теперь это очень простой индикатор, который имеет потенциал в сочетании, например, с EMA 50 (линия покупки/продажи Стивена Примо) и подходящим выходом.
С 286 запутанных линий я сократил до 151 четкой линии и могу делать больше.
Теперь это очень простой индикатор, который в сочетании с EMA 50 (линия покупки/продажи Стивена Примо) и подходящим выходом, например, определенно имеет потенциал.
Этот индикатор - хороший кандидат для моей домашней страницы, которая появится в Интернете в начале следующего года.
Очень мило с вашей стороны! Я сразу же опробовал его, и он отлично работает. Большое спасибо!
есть ошибки при компиляции в мета-редакторе. пожалуйста, исправьте, если это возможно. спасибо за бесплатное предложение такой потенциально отличной концепции индикатора
Joseph Kisakye #: есть ошибки при компиляции в мета-редакторе. пожалуйста, исправьте, если возможно. спасибо за бесплатное предложение такой потенциально отличной концепции индикатора
это код, измененный для отсутствия ошибок.
//+------------------------------------------------------------------+//|Индикатор: разворот.mq5 |//||//||//+------------------------------------------------------------------+#property copyright"Sergey Vradiy"#property version"1.00"#property description""//--- настройки индикатора#property indicator_chart_window#property indicator_buffers2#property indicator_plots2#property indicator_type1DRAW_ARROW#property indicator_width13#property indicator_color10x0000FF#property indicator_label1"Sell"#property indicator_type2DRAW_ARROW#property indicator_width23#property indicator_color20xFFAA00#property indicator_label2"Buy"//--- индикаторные буферыdouble Buffer1[];
double Buffer2[];
inputint Interval=10;
datetime time_alert; //используется при отправке оповещенияinputbool Send_Email=true;
double myPoint; //инициализируется в OnInit//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+void myAlert(string type,string message)
{
if(type=="print")
Print(message);
elseif(type=="error")
{
Print(type+" | reversal @ "+Symbol()+","+(string)Period()+" | "+message);
}
elseif(type=="indicator")
{
if(Send_Email)
SendMail("reversal",type+" | reversal @ "+Symbol()+","+(string)Period()+" | "+message);
}
}
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+void DrawLine(string objname,double price,int count,int start_index) //создает или изменяет существующий объект, если это необходимо
{
if((price<0) && ObjectFind(0,objname)>=0)
{
ObjectDelete(0,objname);
}
elseif(ObjectFind(0,objname)>=0 && ObjectGetInteger(0,objname,OBJPROP_TYPE)==OBJ_TREND)
{
datetime Time[];
ArraySetAsSeries(Time,true);
CopyTime(Symbol(),Period(),0,start_index+count,Time);
ObjectSetInteger(0,objname,OBJPROP_TIME,Time[start_index]);
ObjectSetDouble(0,objname,OBJPROP_PRICE,price);
ObjectSetInteger(0,objname,OBJPROP_TIME,1,Time[start_index+count-1]);
ObjectSetDouble(0,objname,OBJPROP_PRICE,1,price);
}
else
{
datetime Time[];
ArraySetAsSeries(Time,true);
CopyTime(Symbol(),Period(),0,start_index+count,Time);
ObjectCreate(0,objname,OBJ_TREND,0,Time[start_index],price,Time[start_index+count-1],price);
ObjectSetInteger(0,objname,OBJPROP_RAY_LEFT,0);
ObjectSetInteger(0,objname,OBJPROP_RAY_RIGHT,0);
ObjectSetInteger(0,objname,OBJPROP_COLOR,C'0x00,0x00,0xFF');
ObjectSetInteger(0,objname,OBJPROP_STYLE,STYLE_SOLID);
ObjectSetInteger(0,objname,OBJPROP_WIDTH,2);
}
}
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+double Support(int time_interval,bool fixed_tod,int hh,int mm,bool draw,int shift)
{
int start_index=shift;
int count=time_interval/PeriodSeconds();
if(fixed_tod)
{
datetime start_time;
datetime Time[];
ArraySetAsSeries(Time,true);
CopyTime(Symbol(),Period(),0,Bars(Symbol(),Period())-count,Time);
if(shift==0)
start_time=TimeCurrent();
else
start_time=Time[shift-1];
datetime dt=StringToTime(TimeToString(start_time,TIME_DATE)+" "+(string)hh+":"+(string)mm); //ближайшее время чч:ммif(dt>start_time)
dt-=86400; //вернуться на 24 часа назадint dt_index = iBarShift(Symbol(), Period(), dt, true);
datetime dt2 = dt;
while(dt_index<0 && dt>Time[Bars(Symbol(),Period())-1-count]) //бар не найден => смотреть несколько дней назад
{
dt-=86400; //вернуться на 24 часа назад
dt_index=iBarShift(Symbol(),Period(),dt,true);
}
if(dt_index<0) //По-прежнему не найдено => найдите ближайший бар
dt_index =iBarShift(Symbol(), Period(), dt2, false);
start_index=dt_index+1; //бар после открытия S/R в dt
}
double _Low[];
ArraySetAsSeries(_Low,true);
CopyLow(Symbol(),Period(),start_index,count,_Low);
double ret=_Low[ArrayMinimum(_Low,0,count)];
if(draw) DrawLine("Support",ret,count,start_index);
return(ret);
}
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+double Resistance(int time_interval,bool fixed_tod,int hh,int mm,bool draw,int shift)
{
int start_index=shift;
int count=time_interval/PeriodSeconds();
if(fixed_tod)
{
datetime start_time;
datetime Time[];
ArraySetAsSeries(Time,true);
CopyTime(Symbol(),Period(),0,Bars(Symbol(),Period())-count,Time);
if(shift==0)
start_time=TimeCurrent();
else
start_time=Time[shift-1];
datetime dt=StringToTime(TimeToString(start_time,TIME_DATE)+" "+(string)hh+":"+(string)mm); //ближайшее время чч:ммif(dt>start_time)
dt-=86400; //вернуться на 24 часа назадint dt_index = iBarShift(Symbol(), Period(), dt, true);
datetime dt2 = dt;
while(dt_index<0 && dt>Time[Bars(Symbol(),Period())-1-count]) //бар не найден => смотреть несколько дней назад
{
dt-=86400; //вернуться на 24 часа назад
dt_index=iBarShift(Symbol(),Period(),dt,true);
}
if(dt_index<0) //По-прежнему не найдено => найдите ближайший бар
dt_index =iBarShift(Symbol(), Period(), dt2, false);
start_index=dt_index+1; //бар после открытия S/R в dt
}
double _High[];
ArraySetAsSeries(_High,true);
CopyHigh(Symbol(),Period(),start_index,count,_High);
double ret=_High[ArrayMaximum(_High,0,count)];
if(draw) DrawLine("Resistance",ret,count,start_index);
return(ret);
}
//+------------------------------------------------------------------+//| Пользовательская функция инициализации индикатора |//+------------------------------------------------------------------+intOnInit()
{
SetIndexBuffer(0,Buffer1);
PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
PlotIndexSetInteger(0,PLOT_ARROW,242);
SetIndexBuffer(1,Buffer2);
PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
PlotIndexSetInteger(1,PLOT_ARROW,241);
//инициализация myPoint
myPoint=Point();
if(Digits()==5 || Digits()==3)
{
myPoint*=10;
}
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Пользовательская функция итерации индикатора|//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
int limit=rates_total-prev_calculated;
if(limit<=0) return(rates_total);
//--- подсчет от 0 до rates_totalArraySetAsSeries(Buffer1,true);
ArraySetAsSeries(Buffer2,true);
//--- начальный нольif(prev_calculated<1)
{
ArrayInitialize(Buffer1,0);
ArrayInitialize(Buffer2,0);
}
else
limit++;
//--- главный циклfor(int i=limit-1; i>=0; i--)
{
if(i>=MathMin(5000-1,rates_total-1-50)) continue; //удалить старые тарифы//Индикаторный буфер 1 (продажа)if(high[i]==Resistance(Interval*PeriodSeconds(),false,00,00,false,i)
&& close[i]<open[i]) //Состояние для продажи
{
Buffer1[i]=high[i]; //Установка значения индикатора по максимуму свечиif(i==1 && time[1]!=time_alert)
myAlert("indicator","Sell"); //Оповещение о следующем открытии бара
time_alert=time[1];
}
else
{
Buffer1[i]=0;
}
//Индикаторный буфер 2 (Купить)if(low[i]==Support(Interval*PeriodSeconds(),false,00,00,false,i)
&& close[i]>open[i]) //Условия для покупки
{
Buffer2[i]=low[i]; //Установка значения индикатора на нижней границе свечиif(i==1 && time[1]!=time_alert)
myAlert("indicator","Buy"); //Оповещение о следующем открытии бара
time_alert=time[1];
}
else
{
Buffer2[i]=0;
}
}
return(rates_total);
}
//+------------------------------------------------------------------+
Спасибо, Разак, обновленный код успешно скомпилировался. Позвольте мне протестировать его и посмотреть, работает ли он так, как объясняется в вашем вступлении.
Я протестировал индикатор, используя настройки по умолчанию, но не вижу стрелок покупки и продажи на графике. Пожалуйста, пересмотрите код, если эта ошибка подтвердится. Спасибо
Здесь царит разведение и порядок! :-)
...это было мягкое масло с предрождественским очарованием... по крайней мере, мне так показалось.
Я взял этот Indi и перепрограммировал его.
Из 286 запутанных линий он превратился в 151 четкую линию, а также может делать больше.
Теперь это очень простой индикатор, который имеет потенциал в сочетании, например, с EMA 50 (линия покупки/продажи Стивена Примо) и подходящим выходом.
Этот индикатор - хороший кандидат для моей домашней страницы, которая появится в Интернете в начале следующего года.
Я взял этот Indi и перепрограммировал его.
С 286 запутанных линий я сократил до 151 четкой линии и могу делать больше.
Теперь это очень простой индикатор, который в сочетании с EMA 50 (линия покупки/продажи Стивена Примо) и подходящим выходом, например, определенно имеет потенциал.
Этот индикатор - хороший кандидат для моей домашней страницы, которая появится в Интернете в начале следующего года.
Очень мило с вашей стороны! Я сразу же опробовал его, и он отлично работает. Большое спасибо!
есть ошибки при компиляции в мета-редакторе. пожалуйста, исправьте, если возможно. спасибо за бесплатное предложение такой потенциально отличной концепции индикатора
это код, измененный для отсутствия ошибок.
Это код, измененный для отсутствия ошибки.
Спасибо, Разак, обновленный код успешно скомпилировался. Позвольте мне протестировать его и посмотреть, работает ли он так, как объясняется в вашем вступлении.
Я протестировал индикатор, используя настройки по умолчанию, но не вижу стрелок покупки и продажи на графике. Пожалуйста, пересмотрите код, если эта ошибка подтвердится. Спасибо