Ответить
25.06.2015, 04:11
Аватар для ansol
ansol ansol на форуме Местный знаток
За призовое место в конкурсе 

Регистрация: 22.04.2010 / Сообщений: 2,039
Поблагодарили 873 раз(а) / Репутация: 859
Цитата:
Большинство из них бесплатны.
То, что отдает легким оттенком полезности - платно.
Большинство там, или меньшиство - разбирать нет смысла.
Человек не смог заработать на форексе и зарабатывает другим способом.

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

Ну-ну!
25.06.2015, 06:32
Аватар для st2050
st2050 st2050 на форуме Местный знаток
Регистрация: 08.09.2012 / Сообщений: 335
Поблагодарили 624 раз(а) / Репутация: 625
Лично я пользуюсь его советником, который закрывает все ордера по общему профиту - он бесплатный.
А разбирать большинство или меньшинство смысл есть. Для того, чтобы указать на Вашу предвзятость и злорадное отношение к другим.
25.06.2015, 07:33
Аватар для Yurkov
Yurkov Yurkov вне форума Почётный гражданин
Регистрация: 19.01.2011 / Сообщений: 659
Поблагодарили 365 раз(а) / Репутация: 368
Эта ошибка выскакивает при обращении к несуществующей ячейке массива. Например, самая распространённая ошибка:
int Arr[5];
Arr[5]=23;
Здесь попытка записи в несуществующую ячейку массива.
Сначала подумал, что объявлено мало буферов indicator_buffers, но не в этом, видимо, проблемка. Перелопатил уже весь инет в поисках ответа, а программист, который мне писал этого индюка, куда-то пропал. Мне, как человеку не знакомому с программированием, проблематично найти ответ, но интересно ж

Скрытый текст


//+------------------------------------------------------------------+
//| 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[i] = iMACD(_Symbol,_Period,macdFastEMA,macdSlowEMA,macdSignalPeriod,macdPrice,MODE_MAIN,i);
macdSignal[i] = iMACD(_Symbol,_Period,macdFastEMA,macdSlowEMA,macdSignalPeriod,macdPrice,MODE_SIGNAL,i);

//--- Find last SELL signal
if(macdHistogram[i]<0 && macdSignal[i]<0)
{
if(macdHistogram[i]>macdSignal[i] && 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[i]>0 && macdSignal[i]>0)
{
if(macdHistogram[i]<macdSignal[i] && 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);
}
}

[свернуть]
Подписка на сигналы:
https://www.mql5.com/ru/signals/240803
25.06.2015, 09:02
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 1,850
Поблагодарили 9,510 раз(а) / Репутация: 9515
Сначала подумал, что объявлено мало буферов indicator_buffers, но не в этом, видимо, проблемка. Перелопатил уже весь инет в поисках ответа, а программист, который мне писал этого индюка, куда-то пропал. Мне, как человеку не знакомому с программированием, проблематично найти ответ, но интересно ж

Скрытый текст


//+------------------------------------------------------------------+
//| 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[i] = iMACD(_Symbol,_Period,macdFastEMA,macdSlowEMA,macdSignalPeriod,macdPrice,MODE_MAIN,i);
macdSignal[i] = iMACD(_Symbol,_Period,macdFastEMA,macdSlowEMA,macdSignalPeriod,macdPrice,MODE_SIGNAL,i);

//--- Find last SELL signal
if(macdHistogram[i]<0 && macdSignal[i]<0)
{
if(macdHistogram[i]>macdSignal[i] && 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[i]>0 && macdSignal[i]>0)
{
if(macdHistogram[i]<macdSignal[i] && 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 
25.06.2015, 09:17
Аватар для Yurkov
Yurkov Yurkov вне форума Почётный гражданин
Регистрация: 19.01.2011 / Сообщений: 659
Поблагодарили 365 раз(а) / Репутация: 368
Ранее был ответ:


не хватает баров истории - измени в сторону уменьшения параметр barLimit или подкачай историю.
Т.е. ошибка может возникать, если в истории, к примеру 500 баров, а в параметрах индикатора стоит просчет 1000 баров? А не из-за ошибки в коде?
25.06.2015, 09:20
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 1,850
Поблагодарили 9,510 раз(а) / Репутация: 9515
Т.е. ошибка может возникать, если в истории, к примеру 500 баров, а в параметрах индикатора стоит просчет 1000 баров? А не из-за ошибки в коде?
Именно так, сам проверь.
Yurkov 
25.06.2015, 09:26
Аватар для Yurkov
Yurkov Yurkov вне форума Почётный гражданин
Регистрация: 19.01.2011 / Сообщений: 659
Поблагодарили 365 раз(а) / Репутация: 368
Именно так, сам проверь.
Вон как просто, оказывается. Подгрузил историю и ошибка пропала. Благодарю!!
25.06.2015, 09:45
Регистрация: 13.03.2009 / Сообщений: 2,362
Поблагодарили 1,968 раз(а) / Репутация: 2045
Т.е. ошибка может возникать, если в истории, к примеру 500 баров, а в параметрах индикатора стоит просчет 1000 баров? А не из-за ошибки в коде?
Как это нет ошибки в коде? Если индикатор пытается считать бары которых нет в истории, это и есть ошибка. Надо предусматривать такую ситуацию и делать что бы индикатор считал не больше баров чем есть в истории.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
25.06.2015, 10:05
Аватар для Yurkov
Yurkov Yurkov вне форума Почётный гражданин
Регистрация: 19.01.2011 / Сообщений: 659
Поблагодарили 365 раз(а) / Репутация: 368
Как это нет ошибки в коде? Если индикатор пытается считать бары которых нет в истории, это и есть ошибка. Надо предусматривать такую ситуацию и делать что бы индикатор считал не больше баров чем есть в истории.
А как сделать это ограничение?
25.06.2015, 10:36
Аватар для CrazyDoc
CrazyDoc CrazyDoc вне форума Новичок форума
Регистрация: 02.05.2015 / Адрес: Ступино / Сообщений: 28
Поблагодарили 11 раз(а) / Репутация: 12
А как сделать это ограничение?
http://docs.mql4.com/ru/predefined/bars
Yurkov 
25.06.2015, 11:36
Аватар для Yurkov
Yurkov Yurkov вне форума Почётный гражданин
Регистрация: 19.01.2011 / Сообщений: 659
Поблагодарили 365 раз(а) / Репутация: 368
http://docs.mql4.com/ru/predefined/bars
А эта строчка, получается, лишняя или неверная в коде?

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

Последний раз редактировалось Yurkov; 25.06.2015 в 11:44.
25.06.2015, 12:45
Аватар для CrazyDoc
CrazyDoc CrazyDoc вне форума Новичок форума
Регистрация: 02.05.2015 / Адрес: Ступино / Сообщений: 28
Поблагодарили 11 раз(а) / Репутация: 12
А эта строчка, получается, лишняя или неверная в коде?

if(prev_calculated == 0) limit = barLimit; else limit = rates_total-prev_calculated+1;
Не знаю, индикатор не смотрел. Общий вид проверки:
if("кол-во баров для подсчета >Bars) "кол-во баров для подсчета"=Bars;
25.06.2015, 13:08
Аватар для Yurkov
Yurkov Yurkov вне форума Почётный гражданин
Регистрация: 19.01.2011 / Сообщений: 659
Поблагодарили 365 раз(а) / Репутация: 368
Короче понятно, что ничего не понятно
И на том спасибо)
25.06.2015, 14:49
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,715 раз(а) / Репутация: 3711
А эта строчка, получается, лишняя или неверная в коде?

if(prev_calculated == 0) limit = barLimit; else limit = rates_total-prev_calculated+1;
В этой строке большая проблема. Читается она так:
Если посчитано ноль баров, то limit (количество баров для пересчёта) равен количеству баров в окне минус количество посчитанных баров, тоесть минус 0 и плюс 1.
Когда посчитанных баров нет, то баров для расчёта получится на единицу больше чем всего баров в окне. Это и вызывает ошибку.
25.06.2015, 16:43
Аватар для Yurkov
Yurkov Yurkov вне форума Почётный гражданин
Регистрация: 19.01.2011 / Сообщений: 659
Поблагодарили 365 раз(а) / Репутация: 368
В этой строке большая проблема. Читается она так:
Если посчитано ноль баров, то limit (количество баров для пересчёта) равен количеству баров в окне минус количество посчитанных баров, тоесть минус 0 и плюс 1.
Когда посчитанных баров нет, то баров для расчёта получится на единицу больше чем всего баров в окне. Это и вызывает ошибку.
Тогда было бы логично убрать "+1", чтоб для расчета использовалось столько баров, сколько в окне? Но это не помогает.
25.06.2015, 18:09
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,715 раз(а) / Репутация: 3711
Тогда было бы логично убрать "+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 и соответственно опять будет вызвана ошибка обращения к несуществующей ячейке массива.
25.06.2015, 18:46
Аватар для Yurkov
Yurkov Yurkov вне форума Почётный гражданин
Регистрация: 19.01.2011 / Сообщений: 659
Поблагодарили 365 раз(а) / Репутация: 368
Соответственно расчёт надо производить от бара рассчитанного по формуле баров_в_окне - посчитанные_бары и минус 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
25.06.2015, 19:25
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,715 раз(а) / Репутация: 3711
Это:

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, но не в этом, видимо, проблемка. Перелопатил уже весь инет в поисках ответа, а программист, который мне писал этого индюка, куда-то пропал. Мне, как человеку не знакомому с программированием, проблематично найти ответ, но интересно ж

Скрытый текст


//+------------------------------------------------------------------+
//| 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[i] = iMACD(_Symbol,_Period,macdFastEMA,macdSlowEMA,macdSignalPeriod,macdPrice,MODE_MAIN,i);
macdSignal[i] = iMACD(_Symbol,_Period,macdFastEMA,macdSlowEMA,macdSignalPeriod,macdPrice,MODE_SIGNAL,i);

//--- Find last SELL signal
if(macdHistogram[i]<0 && macdSignal[i]<0)
{
if(macdHistogram[i]>macdSignal[i] && 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[i]>0 && macdSignal[i]>0)
{
if(macdHistogram[i]<macdSignal[i] && 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);
}
}

[свернуть]
25.06.2015, 19:33
Аватар для Yurkov
Yurkov Yurkov вне форума Почётный гражданин
Регистрация: 19.01.2011 / Сообщений: 659
Поблагодарили 365 раз(а) / Репутация: 368
Если мы говорим об одном и том-же индикаторе, то такого не должно быть. macdSlowEMA я взял из этого твоего сообщения.
Мой косяк. Да, ошибок нет, но как и результата
26.06.2015, 04:43
Аватар для Yurkov
Yurkov Yurkov вне форума Почётный гражданин
Регистрация: 19.01.2011 / Сообщений: 659
Поблагодарили 365 раз(а) / Репутация: 368
А если полностью удалить лимит баров, какие это строчки?
Ответить

Метки
mql4, mql4 помощь, вопросы mql4


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 13:45. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO