Ваши вопросы по языку MQL4

ansol

Местный знаток
Большинство из них бесплатны.
То, что отдает легким оттенком полезности - платно.
Большинство там, или меньшиство - разбирать нет смысла.
Человек не смог заработать на форексе и зарабатывает другим способом.

Так, в РФ многие не смотгли заработать инженерами и сегодня имеем полную страну спекулянтов.
Причем, спекулянты утверждают, что у них есть мозги, а у бывших инженеров - нету.

Ну-ну!
 

st2050

Гуру форума
Лично я пользуюсь его советником, который закрывает все ордера по общему профиту - он бесплатный.
А разбирать большинство или меньшинство смысл есть. Для того, чтобы указать на Вашу предвзятость и злорадное отношение к другим.
 

Yurkov

Почетный гражданин
Эта ошибка выскакивает при обращении к несуществующей ячейке массива. Например, самая распространённая ошибка:
int Arr[5];
Arr[5]=23;
Здесь попытка записи в несуществующую ячейку массива.
Сначала подумал, что объявлено мало буферов indicator_buffers, но не в этом, видимо, проблемка. Перелопатил уже весь инет в поисках ответа, а программист, который мне писал этого индюка, куда-то пропал. Мне, как человеку не знакомому с программированием, проблематично найти ответ, но интересно ж:D
//+------------------------------------------------------------------+
//| MACDRetracement.mq4 |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
#property version "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots 3
#property indicator_color1 clrYellow
#property indicator_color2 clrYellow
#property indicator_color3 clrRed

input int macdFastEMA = 9;
input int macdSlowEMA = 17;
input int macdSignalPeriod = 9;
input ENUM_APPLIED_PRICE macdPrice = PRICE_CLOSE;
input bool useLevelFilter = true;
input double upperLevel = 0.001;
input double lowerLevel = -0.001;
input bool showFridaySignals = false;
input int slLevel = 100;
input int tpLevel = 200;
//input bool showSignalsMACD0Cross = false;
input int barLimit = 1000;

double signal[];
double macdHistogram[];
double macdSignal[];

int OnInit()
{
SetIndexBuffer(0,signal); SetIndexLabel(0,"Signal");
SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,108);
SetIndexBuffer(1,macdHistogram); SetIndexLabel(1,"MACD");
SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexBuffer(2,macdSignal); SetIndexLabel(2,"MACD Signal");
SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,1);
IndicatorDigits(6);

if(useLevelFilter)
{
SetLevelValue(0,0);
SetLevelValue(1,upperLevel);
SetLevelValue(2,lowerLevel);
SetLevelStyle(STYLE_DOT,1);
}

return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
string name;
for(int i=ObjectsTotal(0,0);i>=0;i--)
{
name = ObjectName(0,i,0);
if(StringFind(name,"Arrow",0)>=0) ObjectDelete(0,name);
if(StringFind(name,"Price",0)>=0) ObjectDelete(0,name);
if(StringFind(name,"SL",0)>=0) ObjectDelete(0,name);
if(StringFind(name,"TP",0)>=0) ObjectDelete(0,name);
}
}

int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
int limit;
int ind; double macd;
string obj_name;
bool fsignal;

if(prev_calculated == 0) limit = barLimit; else limit = rates_total-prev_calculated+1;
if(prev_calculated == rates_total) return(rates_total);

for(int i=limit;i>=0;i--)
{
macdHistogram = iMACD(_Symbol,_Period,macdFastEMA,macdSlowEMA,macdSignalPeriod,macdPrice,MODE_MAIN,i);
macdSignal = iMACD(_Symbol,_Period,macdFastEMA,macdSlowEMA,macdSignalPeriod,macdPrice,MODE_SIGNAL,i);

//--- Find last SELL signal
if(macdHistogram<0 && macdSignal<0)
{
if(macdHistogram>macdSignal && macdHistogram[i+1]<macdSignal[i+1])
{
ind = 0;
for(int j=i;j<limit;j++)
{
if(macdHistogram[j]<macdHistogram[j+1])
{
if((!useLevelFilter || (useLevelFilter && macdHistogram[j]<lowerLevel)) &&
(showFridaySignals || (!showFridaySignals && TimeDayOfWeek(Time[j])!=5)))
{
ind = j; macd = macdHistogram[j];
}
break;
}
}
}

if(ind>0 && signal[ind]==EMPTY_VALUE)
{
signal[ind]=macd;
obj_name = "ArrowDN: "+TimeToString(Time[ind]);
//SetArrow(0,obj_name,Time[ind],Low[ind],clrYellow,1,108);
ObjectCreate(0,obj_name,OBJ_ARROW_LEFT_PRICE,0,Time[ind],Low[ind]);
ObjectSetInteger(0,obj_name,OBJPROP_COLOR,clrGray);
}
}

//--- Find last BUY signal
if(macdHistogram>0 && macdSignal>0)
{
if(macdHistogram<macdSignal && macdHistogram[i+1]>macdSignal[i+1])
{
ind = 0;
for(int j=i;j<limit;j++)
{
if(macdHistogram[j]>macdHistogram[j+1])
{
if((!useLevelFilter || (useLevelFilter && macdHistogram[j]>upperLevel)) &&
(showFridaySignals || (!showFridaySignals && TimeDayOfWeek(Time[j])!=5)))
{
ind = j; macd = macdHistogram[j];
}
break;
}
}
}

if(ind>0 && signal[ind]==EMPTY_VALUE)
{
signal[ind]=macd;
obj_name = "ArrowUP: "+TimeToString(Time[ind]);
//SetArrow(0,obj_name,Time[ind],High[ind],clrYellow,1,108);
ObjectCreate(0,obj_name,OBJ_ARROW_LEFT_PRICE,0,Time[ind],High[ind]);
ObjectSetInteger(0,obj_name,OBJPROP_COLOR,clrGray);
}
}

for(int j=i;j<limit;j++)
{
if(signal[j]!=EMPTY_VALUE)
{
if(signal[j]<0)
{
fsignal=false;
for(int k=j;k>=i;k--)
{
if(macdHistogram[k]>0)
{
for(int l=j;l>=i;l--)
{
obj_name = "Price: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
obj_name = "SL: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
obj_name = "TP: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
}
break;
}
if(!fsignal || (fsignal && Low[k]>=Low[j]))
{
obj_name = "Price: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],Low[j],clrGray,1,4);
obj_name = "SL: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],Low[j]+slLevel*_Point,clrRed,1,4);
obj_name = "TP: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],Low[j]-tpLevel*_Point,clrGreen,1,4);

if(!fsignal && macdHistogram[k]>macdSignal[k]) fsignal=true;
}
else break;
}
}
if(signal[j]>0)
{
fsignal=false;
for(int k=j;k>=i;k--)
{
if(macdHistogram[k]<0)
{
for(int l=j;l>=i;l--)
{
obj_name = "Price: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
obj_name = "SL: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
obj_name = "TP: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
}
break;
}
if(!fsignal || (fsignal && High[k]<=High[j]))
{
obj_name = "Price: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],High[j],clrGray,1,4);
obj_name = "SL: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],High[j]-slLevel*_Point,clrRed,1,4);
obj_name = "TP: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],High[j]+tpLevel*_Point,clrGreen,1,4);

if(!fsignal && macdHistogram[k]<macdSignal[k]) fsignal=true;
}
else break;
}
}

break;
}
}
}

return(rates_total);
}
//+------------------------------------------------------------------+
void SetArrow(long chart, string name, datetime t, double p, int c, int w, uchar ch)//, ENUM_ARROW_ANCHOR a)
{
if(ObjectCreate(chart,name,OBJ_ARROW,0,t,p))
{
ObjectSetInteger(chart,name,OBJPROP_ARROWCODE,ch);
ObjectSetInteger(chart,name,OBJPROP_COLOR,c);
ObjectSetInteger(chart,name,OBJPROP_WIDTH,w);
//ObjectSetInteger(chart,name,OBJPROP_ANCHOR,a);
}
}

 

mobidik

-----
Сначала подумал, что объявлено мало буферов indicator_buffers, но не в этом, видимо, проблемка. Перелопатил уже весь инет в поисках ответа, а программист, который мне писал этого индюка, куда-то пропал. Мне, как человеку не знакомому с программированием, проблематично найти ответ, но интересно ж:D
//+------------------------------------------------------------------+
//| MACDRetracement.mq4 |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
#property version "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots 3
#property indicator_color1 clrYellow
#property indicator_color2 clrYellow
#property indicator_color3 clrRed

input int macdFastEMA = 9;
input int macdSlowEMA = 17;
input int macdSignalPeriod = 9;
input ENUM_APPLIED_PRICE macdPrice = PRICE_CLOSE;
input bool useLevelFilter = true;
input double upperLevel = 0.001;
input double lowerLevel = -0.001;
input bool showFridaySignals = false;
input int slLevel = 100;
input int tpLevel = 200;
//input bool showSignalsMACD0Cross = false;
input int barLimit = 1000;

double signal[];
double macdHistogram[];
double macdSignal[];

int OnInit()
{
SetIndexBuffer(0,signal); SetIndexLabel(0,"Signal");
SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,108);
SetIndexBuffer(1,macdHistogram); SetIndexLabel(1,"MACD");
SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexBuffer(2,macdSignal); SetIndexLabel(2,"MACD Signal");
SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,1);
IndicatorDigits(6);

if(useLevelFilter)
{
SetLevelValue(0,0);
SetLevelValue(1,upperLevel);
SetLevelValue(2,lowerLevel);
SetLevelStyle(STYLE_DOT,1);
}

return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
string name;
for(int i=ObjectsTotal(0,0);i>=0;i--)
{
name = ObjectName(0,i,0);
if(StringFind(name,"Arrow",0)>=0) ObjectDelete(0,name);
if(StringFind(name,"Price",0)>=0) ObjectDelete(0,name);
if(StringFind(name,"SL",0)>=0) ObjectDelete(0,name);
if(StringFind(name,"TP",0)>=0) ObjectDelete(0,name);
}
}

int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
int limit;
int ind; double macd;
string obj_name;
bool fsignal;

if(prev_calculated == 0) limit = barLimit; else limit = rates_total-prev_calculated+1;
if(prev_calculated == rates_total) return(rates_total);

for(int i=limit;i>=0;i--)
{
macdHistogram = iMACD(_Symbol,_Period,macdFastEMA,macdSlowEMA,macdSignalPeriod,macdPrice,MODE_MAIN,i);
macdSignal = iMACD(_Symbol,_Period,macdFastEMA,macdSlowEMA,macdSignalPeriod,macdPrice,MODE_SIGNAL,i);

//--- Find last SELL signal
if(macdHistogram<0 && macdSignal<0)
{
if(macdHistogram>macdSignal && macdHistogram[i+1]<macdSignal[i+1])
{
ind = 0;
for(int j=i;j<limit;j++)
{
if(macdHistogram[j]<macdHistogram[j+1])
{
if((!useLevelFilter || (useLevelFilter && macdHistogram[j]<lowerLevel)) &&
(showFridaySignals || (!showFridaySignals && TimeDayOfWeek(Time[j])!=5)))
{
ind = j; macd = macdHistogram[j];
}
break;
}
}
}

if(ind>0 && signal[ind]==EMPTY_VALUE)
{
signal[ind]=macd;
obj_name = "ArrowDN: "+TimeToString(Time[ind]);
//SetArrow(0,obj_name,Time[ind],Low[ind],clrYellow,1,108);
ObjectCreate(0,obj_name,OBJ_ARROW_LEFT_PRICE,0,Time[ind],Low[ind]);
ObjectSetInteger(0,obj_name,OBJPROP_COLOR,clrGray);
}
}

//--- Find last BUY signal
if(macdHistogram>0 && macdSignal>0)
{
if(macdHistogram<macdSignal && macdHistogram[i+1]>macdSignal[i+1])
{
ind = 0;
for(int j=i;j<limit;j++)
{
if(macdHistogram[j]>macdHistogram[j+1])
{
if((!useLevelFilter || (useLevelFilter && macdHistogram[j]>upperLevel)) &&
(showFridaySignals || (!showFridaySignals && TimeDayOfWeek(Time[j])!=5)))
{
ind = j; macd = macdHistogram[j];
}
break;
}
}
}

if(ind>0 && signal[ind]==EMPTY_VALUE)
{
signal[ind]=macd;
obj_name = "ArrowUP: "+TimeToString(Time[ind]);
//SetArrow(0,obj_name,Time[ind],High[ind],clrYellow,1,108);
ObjectCreate(0,obj_name,OBJ_ARROW_LEFT_PRICE,0,Time[ind],High[ind]);
ObjectSetInteger(0,obj_name,OBJPROP_COLOR,clrGray);
}
}

for(int j=i;j<limit;j++)
{
if(signal[j]!=EMPTY_VALUE)
{
if(signal[j]<0)
{
fsignal=false;
for(int k=j;k>=i;k--)
{
if(macdHistogram[k]>0)
{
for(int l=j;l>=i;l--)
{
obj_name = "Price: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
obj_name = "SL: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
obj_name = "TP: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
}
break;
}
if(!fsignal || (fsignal && Low[k]>=Low[j]))
{
obj_name = "Price: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],Low[j],clrGray,1,4);
obj_name = "SL: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],Low[j]+slLevel*_Point,clrRed,1,4);
obj_name = "TP: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],Low[j]-tpLevel*_Point,clrGreen,1,4);

if(!fsignal && macdHistogram[k]>macdSignal[k]) fsignal=true;
}
else break;
}
}
if(signal[j]>0)
{
fsignal=false;
for(int k=j;k>=i;k--)
{
if(macdHistogram[k]<0)
{
for(int l=j;l>=i;l--)
{
obj_name = "Price: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
obj_name = "SL: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
obj_name = "TP: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
}
break;
}
if(!fsignal || (fsignal && High[k]<=High[j]))
{
obj_name = "Price: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],High[j],clrGray,1,4);
obj_name = "SL: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],High[j]-slLevel*_Point,clrRed,1,4);
obj_name = "TP: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],High[j]+tpLevel*_Point,clrGreen,1,4);

if(!fsignal && macdHistogram[k]<macdSignal[k]) fsignal=true;
}
else break;
}
}

break;
}
}
}

return(rates_total);
}
//+------------------------------------------------------------------+
void SetArrow(long chart, string name, datetime t, double p, int c, int w, uchar ch)//, ENUM_ARROW_ANCHOR a)
{
if(ObjectCreate(chart,name,OBJ_ARROW,0,t,p))
{
ObjectSetInteger(chart,name,OBJPROP_ARROWCODE,ch);
ObjectSetInteger(chart,name,OBJPROP_COLOR,c);
ObjectSetInteger(chart,name,OBJPROP_WIDTH,w);
//ObjectSetInteger(chart,name,OBJPROP_ANCHOR,a);
}
}



Ранее был ответ:
ошибка в массивах. добавь проверки на кол-во баров в истории, просмотри заполнение массивов

не хватает баров истории - измени в сторону уменьшения параметр barLimit или подкачай историю.
 

Yurkov

Почетный гражданин
Ранее был ответ:


не хватает баров истории - измени в сторону уменьшения параметр barLimit или подкачай историю.

Т.е. ошибка может возникать, если в истории, к примеру 500 баров, а в параметрах индикатора стоит просчет 1000 баров? А не из-за ошибки в коде?
 

Ugar

Гуру форума
Т.е. ошибка может возникать, если в истории, к примеру 500 баров, а в параметрах индикатора стоит просчет 1000 баров? А не из-за ошибки в коде?
Как это нет ошибки в коде? Если индикатор пытается считать бары которых нет в истории, это и есть ошибка. Надо предусматривать такую ситуацию и делать что бы индикатор считал не больше баров чем есть в истории.
 

Yurkov

Почетный гражданин
Как это нет ошибки в коде? Если индикатор пытается считать бары которых нет в истории, это и есть ошибка. Надо предусматривать такую ситуацию и делать что бы индикатор считал не больше баров чем есть в истории.

А как сделать это ограничение?o_o
 

CrazyDoc

Новичок форума
А эта строчка, получается, лишняя или неверная в коде?

if(prev_calculated == 0) limit = barLimit; else limit = rates_total-prev_calculated+1;

Не знаю, индикатор не смотрел. Общий вид проверки:
if("кол-во баров для подсчета >Bars) "кол-во баров для подсчета"=Bars;
 

Yurkov

Почетный гражданин
Короче понятно, что ничего не понятно :D
И на том спасибо)
 

AlexeyVik

Программист mql4 mql5
А эта строчка, получается, лишняя или неверная в коде?

if(prev_calculated == 0) limit = barLimit; else limit = rates_total-prev_calculated+1;
В этой строке большая проблема. Читается она так:
Если посчитано ноль баров, то limit (количество баров для пересчёта) равен количеству баров в окне минус количество посчитанных баров, тоесть минус 0 и плюс 1.
Когда посчитанных баров нет, то баров для расчёта получится на единицу больше чем всего баров в окне. Это и вызывает ошибку.
 

Yurkov

Почетный гражданин
В этой строке большая проблема. Читается она так:
Если посчитано ноль баров, то limit (количество баров для пересчёта) равен количеству баров в окне минус количество посчитанных баров, тоесть минус 0 и плюс 1.
Когда посчитанных баров нет, то баров для расчёта получится на единицу больше чем всего баров в окне. Это и вызывает ошибку.

Тогда было бы логично убрать "+1", чтоб для расчета использовалось столько баров, сколько в окне? Но это не помогает.
 

AlexeyVik

Программист mql4 mql5
Тогда было бы логично убрать "+1", чтоб для расчета использовалось столько баров, сколько в окне? Но это не помогает.
Но там ещё есть использование глубины истории от последнего бара в окне для расчёта MACD.
Код:
input int                  macdFastEMA       = 9;
input int                  macdSlowEMA       = 17;
input int                  macdSignalPeriod  = 9;
И когда начинается цикл
Код:
for(int i = limit; i >= 0; i--)
   {
то от limit для расчёта MACD нужны ещё как минимум 17 баров, что соответствует значению macdSlowEMA. Соответственно расчёт надо производить от бара рассчитанного по формуле баров_в_окне - посчитанные_бары и минус macdSlowEMA.
Но и это не панацея. Не исключён вариант когда найдётся такой умник который поставит значение macdFastEMA больше чем macdSlowEMA и соответственно опять будет вызвана ошибка обращения к несуществующей ячейке массива.
 

Yurkov

Почетный гражданин
Соответственно расчёт надо производить от бара рассчитанного по формуле баров_в_окне - посчитанные_бары и минус macdSlowEMA.
Это:

if(prev_calculated == 0) limit = barLimit; else limit = rates_total-prev_calculated+1;

Заменить на это:

if(prev_calculated == 0) limit = barLimit; else limit = rates_total-prev_calculated-macdSlowEMA;
?
Тогда появляется ошибка при компиляции 'macdSlowEMA' - undeclared identifier
 

AlexeyVik

Программист mql4 mql5
Это:

if(prev_calculated == 0) limit = barLimit; else limit = rates_total-prev_calculated+1;

Заменить на это:

if(prev_calculated == 0) limit = barLimit; else limit = rates_total-prev_calculated-macdSlowEMA;
?
Тогда появляется ошибка при компиляции 'macdSlowEMA' - undeclared identifier
Если мы говорим об одном и том-же индикаторе, то такого не должно быть. macdSlowEMA я взял из этого твоего сообщения.
Сначала подумал, что объявлено мало буферов indicator_buffers, но не в этом, видимо, проблемка. Перелопатил уже весь инет в поисках ответа, а программист, который мне писал этого индюка, куда-то пропал. Мне, как человеку не знакомому с программированием, проблематично найти ответ, но интересно ж:D
//+------------------------------------------------------------------+
//| MACDRetracement.mq4 |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
#property version "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots 3
#property indicator_color1 clrYellow
#property indicator_color2 clrYellow
#property indicator_color3 clrRed

input int macdFastEMA = 9;
input int macdSlowEMA = 17;
input int macdSignalPeriod = 9;
input ENUM_APPLIED_PRICE macdPrice = PRICE_CLOSE;
input bool useLevelFilter = true;
input double upperLevel = 0.001;
input double lowerLevel = -0.001;
input bool showFridaySignals = false;
input int slLevel = 100;
input int tpLevel = 200;
//input bool showSignalsMACD0Cross = false;
input int barLimit = 1000;

double signal[];
double macdHistogram[];
double macdSignal[];

int OnInit()
{
SetIndexBuffer(0,signal); SetIndexLabel(0,"Signal");
SetIndexStyle(0,DRAW_ARROW); SetIndexArrow(0,108);
SetIndexBuffer(1,macdHistogram); SetIndexLabel(1,"MACD");
SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexBuffer(2,macdSignal); SetIndexLabel(2,"MACD Signal");
SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,1);
IndicatorDigits(6);

if(useLevelFilter)
{
SetLevelValue(0,0);
SetLevelValue(1,upperLevel);
SetLevelValue(2,lowerLevel);
SetLevelStyle(STYLE_DOT,1);
}

return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
string name;
for(int i=ObjectsTotal(0,0);i>=0;i--)
{
name = ObjectName(0,i,0);
if(StringFind(name,"Arrow",0)>=0) ObjectDelete(0,name);
if(StringFind(name,"Price",0)>=0) ObjectDelete(0,name);
if(StringFind(name,"SL",0)>=0) ObjectDelete(0,name);
if(StringFind(name,"TP",0)>=0) ObjectDelete(0,name);
}
}

int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
int limit;
int ind; double macd;
string obj_name;
bool fsignal;

if(prev_calculated == 0) limit = barLimit; else limit = rates_total-prev_calculated+1;
if(prev_calculated == rates_total) return(rates_total);

for(int i=limit;i>=0;i--)
{
macdHistogram = iMACD(_Symbol,_Period,macdFastEMA,macdSlowEMA,macdSignalPeriod,macdPrice,MODE_MAIN,i);
macdSignal = iMACD(_Symbol,_Period,macdFastEMA,macdSlowEMA,macdSignalPeriod,macdPrice,MODE_SIGNAL,i);

//--- Find last SELL signal
if(macdHistogram<0 && macdSignal<0)
{
if(macdHistogram>macdSignal && macdHistogram[i+1]<macdSignal[i+1])
{
ind = 0;
for(int j=i;j<limit;j++)
{
if(macdHistogram[j]<macdHistogram[j+1])
{
if((!useLevelFilter || (useLevelFilter && macdHistogram[j]<lowerLevel)) &&
(showFridaySignals || (!showFridaySignals && TimeDayOfWeek(Time[j])!=5)))
{
ind = j; macd = macdHistogram[j];
}
break;
}
}
}

if(ind>0 && signal[ind]==EMPTY_VALUE)
{
signal[ind]=macd;
obj_name = "ArrowDN: "+TimeToString(Time[ind]);
//SetArrow(0,obj_name,Time[ind],Low[ind],clrYellow,1,108);
ObjectCreate(0,obj_name,OBJ_ARROW_LEFT_PRICE,0,Time[ind],Low[ind]);
ObjectSetInteger(0,obj_name,OBJPROP_COLOR,clrGray);
}
}

//--- Find last BUY signal
if(macdHistogram>0 && macdSignal>0)
{
if(macdHistogram<macdSignal && macdHistogram[i+1]>macdSignal[i+1])
{
ind = 0;
for(int j=i;j<limit;j++)
{
if(macdHistogram[j]>macdHistogram[j+1])
{
if((!useLevelFilter || (useLevelFilter && macdHistogram[j]>upperLevel)) &&
(showFridaySignals || (!showFridaySignals && TimeDayOfWeek(Time[j])!=5)))
{
ind = j; macd = macdHistogram[j];
}
break;
}
}
}

if(ind>0 && signal[ind]==EMPTY_VALUE)
{
signal[ind]=macd;
obj_name = "ArrowUP: "+TimeToString(Time[ind]);
//SetArrow(0,obj_name,Time[ind],High[ind],clrYellow,1,108);
ObjectCreate(0,obj_name,OBJ_ARROW_LEFT_PRICE,0,Time[ind],High[ind]);
ObjectSetInteger(0,obj_name,OBJPROP_COLOR,clrGray);
}
}

for(int j=i;j<limit;j++)
{
if(signal[j]!=EMPTY_VALUE)
{
if(signal[j]<0)
{
fsignal=false;
for(int k=j;k>=i;k--)
{
if(macdHistogram[k]>0)
{
for(int l=j;l>=i;l--)
{
obj_name = "Price: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
obj_name = "SL: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
obj_name = "TP: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
}
break;
}
if(!fsignal || (fsignal && Low[k]>=Low[j]))
{
obj_name = "Price: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],Low[j],clrGray,1,4);
obj_name = "SL: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],Low[j]+slLevel*_Point,clrRed,1,4);
obj_name = "TP: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],Low[j]-tpLevel*_Point,clrGreen,1,4);

if(!fsignal && macdHistogram[k]>macdSignal[k]) fsignal=true;
}
else break;
}
}
if(signal[j]>0)
{
fsignal=false;
for(int k=j;k>=i;k--)
{
if(macdHistogram[k]<0)
{
for(int l=j;l>=i;l--)
{
obj_name = "Price: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
obj_name = "SL: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
obj_name = "TP: "+TimeToString(Time[l]);
ObjectDelete(0,obj_name);
}
break;
}
if(!fsignal || (fsignal && High[k]<=High[j]))
{
obj_name = "Price: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],High[j],clrGray,1,4);
obj_name = "SL: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],High[j]-slLevel*_Point,clrRed,1,4);
obj_name = "TP: "+TimeToString(Time[k]);
SetArrow(0,obj_name,Time[k],High[j]+tpLevel*_Point,clrGreen,1,4);

if(!fsignal && macdHistogram[k]<macdSignal[k]) fsignal=true;
}
else break;
}
}

break;
}
}
}

return(rates_total);
}
//+------------------------------------------------------------------+
void SetArrow(long chart, string name, datetime t, double p, int c, int w, uchar ch)//, ENUM_ARROW_ANCHOR a)
{
if(ObjectCreate(chart,name,OBJ_ARROW,0,t,p))
{
ObjectSetInteger(chart,name,OBJPROP_ARROWCODE,ch);
ObjectSetInteger(chart,name,OBJPROP_COLOR,c);
ObjectSetInteger(chart,name,OBJPROP_WIDTH,w);
//ObjectSetInteger(chart,name,OBJPROP_ANCHOR,a);
}
}

 

Yurkov

Почетный гражданин
А если полностью удалить лимит баров, какие это строчки?
 
Верх