Ответ
 
Опции темы
Старый 25.06.2015, 04:11   #4021 (permalink)
Местный знаток
За призовое место в конкурсе 

 
Аватар для ansol
 
Регистрация: 22.04.2010
Сообщений: 2,009
Репутация: 829
ansol - ansol - ansol - ansol - ansol - ansol - ansol -
Сказал(а) спасибо: 236
Поблагодарили 843 раз(а) в 554 сообщениях
Поинты: 1308
Цитата:
Большинство из них бесплатны.
То, что отдает легким оттенком полезности - платно.
Большинство там, или меньшиство - разбирать нет смысла.
Человек не смог заработать на форексе и зарабатывает другим способом.

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

Ну-ну!
ansol на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.06.2015, 06:32   #4022 (permalink)
Местный знаток
 
Аватар для st2050
 
Регистрация: 08.09.2012
Сообщений: 311
Репутация: 577
st2050 - st2050 - st2050 - st2050 - st2050 - st2050 -
Сказал(а) спасибо: 362
Поблагодарили 576 раз(а) в 141 сообщениях
Поинты: 399
Лично я пользуюсь его советником, который закрывает все ордера по общему профиту - он бесплатный.
А разбирать большинство или меньшинство смысл есть. Для того, чтобы указать на Вашу предвзятость и злорадное отношение к другим.
st2050 вне форума   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
vladradon (27.06.2015)
Старый 25.06.2015, 07:33   #4023 (permalink)
Почётный гражданин
 
Аватар для Yurkov
 
Регистрация: 19.01.2011
Сообщений: 643
Репутация: 359
Yurkov - Yurkov - Yurkov - Yurkov -
Сказал(а) спасибо: 163
Поблагодарили 356 раз(а) в 166 сообщениях
Поинты: 200
Сообщение от Ugar Посмотреть сообщение
Эта ошибка выскакивает при обращении к несуществующей ячейке массива. Например, самая распространённая ошибка:
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
Yurkov на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.06.2015, 09:02   #4024 (permalink)
 
Аватар для mobidik
 
Регистрация: 09.08.2012
Адрес: Ua_Khm
Сообщений: 1,650
Репутация: 8556
mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik
Сказал(а) спасибо: 633
Поблагодарили 8,552 раз(а) в 1,564 сообщениях
Поинты: 802
Сообщение от Yurkov Посмотреть сообщение
Сначала подумал, что объявлено мало буферов 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);
}
}

[свернуть]
Ранее был ответ:
Сообщение от CrazyDoc Посмотреть сообщение
ошибка в массивах. добавь проверки на кол-во баров в истории, просмотри заполнение массивов
не хватает баров истории - измени в сторону уменьшения параметр barLimit или подкачай историю.
mobidik на форуме   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
Yurkov (25.06.2015)
Старый 25.06.2015, 09:17   #4025 (permalink)
Почётный гражданин
 
Аватар для Yurkov
 
Регистрация: 19.01.2011
Сообщений: 643
Репутация: 359
Yurkov - Yurkov - Yurkov - Yurkov -
Сказал(а) спасибо: 163
Поблагодарили 356 раз(а) в 166 сообщениях
Поинты: 200
Сообщение от mobidik Посмотреть сообщение
Ранее был ответ:


не хватает баров истории - измени в сторону уменьшения параметр barLimit или подкачай историю.
Т.е. ошибка может возникать, если в истории, к примеру 500 баров, а в параметрах индикатора стоит просчет 1000 баров? А не из-за ошибки в коде?
Yurkov на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.06.2015, 09:20   #4026 (permalink)
 
Аватар для mobidik
 
Регистрация: 09.08.2012
Адрес: Ua_Khm
Сообщений: 1,650
Репутация: 8556
mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik mobidik
Сказал(а) спасибо: 633
Поблагодарили 8,552 раз(а) в 1,564 сообщениях
Поинты: 802
Сообщение от Yurkov Посмотреть сообщение
Т.е. ошибка может возникать, если в истории, к примеру 500 баров, а в параметрах индикатора стоит просчет 1000 баров? А не из-за ошибки в коде?
Именно так, сам проверь.
mobidik на форуме   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
Yurkov (25.06.2015)
Старый 25.06.2015, 09:26   #4027 (permalink)
Почётный гражданин
 
Аватар для Yurkov
 
Регистрация: 19.01.2011
Сообщений: 643
Репутация: 359
Yurkov - Yurkov - Yurkov - Yurkov -
Сказал(а) спасибо: 163
Поблагодарили 356 раз(а) в 166 сообщениях
Поинты: 200
Сообщение от mobidik Посмотреть сообщение
Именно так, сам проверь.
Вон как просто, оказывается. Подгрузил историю и ошибка пропала. Благодарю!!
Yurkov на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.06.2015, 09:45   #4028 (permalink)
Элитный участник
 
Аватар для Ugar
 
Регистрация: 13.03.2009
Сообщений: 2,255
Репутация: 1963
Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar Ugar
Сказал(а) спасибо: 349
Поблагодарили 1,892 раз(а) в 1,069 сообщениях
Поинты: 1276
Отправить сообщение для Ugar с помощью ICQ
Сообщение от Yurkov Посмотреть сообщение
Т.е. ошибка может возникать, если в истории, к примеру 500 баров, а в параметрах индикатора стоит просчет 1000 баров? А не из-за ошибки в коде?
Как это нет ошибки в коде? Если индикатор пытается считать бары которых нет в истории, это и есть ошибка. Надо предусматривать такую ситуацию и делать что бы индикатор считал не больше баров чем есть в истории.

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
Ugar на форуме   Ответить с цитированиемОтветить с цитированием  
2 пользователя(ей) сказали cпасибо:
mobidik (25.06.2015), Yurkov (25.06.2015)
Старый 25.06.2015, 10:05   #4029 (permalink)
Почётный гражданин
 
Аватар для Yurkov
 
Регистрация: 19.01.2011
Сообщений: 643
Репутация: 359
Yurkov - Yurkov - Yurkov - Yurkov -
Сказал(а) спасибо: 163
Поблагодарили 356 раз(а) в 166 сообщениях
Поинты: 200
Сообщение от Ugar Посмотреть сообщение
Как это нет ошибки в коде? Если индикатор пытается считать бары которых нет в истории, это и есть ошибка. Надо предусматривать такую ситуацию и делать что бы индикатор считал не больше баров чем есть в истории.
А как сделать это ограничение?
Yurkov на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.06.2015, 10:36   #4030 (permalink)
Новичок форума
 
Аватар для CrazyDoc
 
Регистрация: 02.05.2015
Адрес: Ступино
Сообщений: 28
Репутация: 12
CrazyDoc
Сказал(а) спасибо: 4
Поблагодарили 11 раз(а) в 7 сообщениях
Поинты: 20
Сообщение от Yurkov Посмотреть сообщение
А как сделать это ограничение?
http://docs.mql4.com/ru/predefined/bars
CrazyDoc вне форума   Ответить с цитированиемОтветить с цитированием  
Пользователь сказал cпасибо:
Yurkov (25.06.2015)
Старый 25.06.2015, 11:36   #4031 (permalink)
Почётный гражданин
 
Аватар для Yurkov
 
Регистрация: 19.01.2011
Сообщений: 643
Репутация: 359
Yurkov - Yurkov - Yurkov - Yurkov -
Сказал(а) спасибо: 163
Поблагодарили 356 раз(а) в 166 сообщениях
Поинты: 200
Сообщение от CrazyDoc Посмотреть сообщение
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.
Yurkov на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.06.2015, 12:45   #4032 (permalink)
Новичок форума
 
Аватар для CrazyDoc
 
Регистрация: 02.05.2015
Адрес: Ступино
Сообщений: 28
Репутация: 12
CrazyDoc
Сказал(а) спасибо: 4
Поблагодарили 11 раз(а) в 7 сообщениях
Поинты: 20
Сообщение от Yurkov Посмотреть сообщение
А эта строчка, получается, лишняя или неверная в коде?

if(prev_calculated == 0) limit = barLimit; else limit = rates_total-prev_calculated+1;
Не знаю, индикатор не смотрел. Общий вид проверки:
if("кол-во баров для подсчета >Bars) "кол-во баров для подсчета"=Bars;
CrazyDoc вне форума   Ответить с цитированиемОтветить с цитированием  
Старый 25.06.2015, 13:08   #4033 (permalink)
Почётный гражданин
 
Аватар для Yurkov
 
Регистрация: 19.01.2011
Сообщений: 643
Репутация: 359
Yurkov - Yurkov - Yurkov - Yurkov -
Сказал(а) спасибо: 163
Поблагодарили 356 раз(а) в 166 сообщениях
Поинты: 200
Короче понятно, что ничего не понятно
И на том спасибо)
Yurkov на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.06.2015, 14:49   #4034 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,525
Репутация: 3646
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,114
Поблагодарили 3,650 раз(а) в 1,470 сообщениях
Поинты: 2007
Сообщение от Yurkov Посмотреть сообщение
А эта строчка, получается, лишняя или неверная в коде?

if(prev_calculated == 0) limit = barLimit; else limit = rates_total-prev_calculated+1;
В этой строке большая проблема. Читается она так:
Если посчитано ноль баров, то limit (количество баров для пересчёта) равен количеству баров в окне минус количество посчитанных баров, тоесть минус 0 и плюс 1.
Когда посчитанных баров нет, то баров для расчёта получится на единицу больше чем всего баров в окне. Это и вызывает ошибку.
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.06.2015, 16:43   #4035 (permalink)
Почётный гражданин
 
Аватар для Yurkov
 
Регистрация: 19.01.2011
Сообщений: 643
Репутация: 359
Yurkov - Yurkov - Yurkov - Yurkov -
Сказал(а) спасибо: 163
Поблагодарили 356 раз(а) в 166 сообщениях
Поинты: 200
Сообщение от AlexeyVik Посмотреть сообщение
В этой строке большая проблема. Читается она так:
Если посчитано ноль баров, то limit (количество баров для пересчёта) равен количеству баров в окне минус количество посчитанных баров, тоесть минус 0 и плюс 1.
Когда посчитанных баров нет, то баров для расчёта получится на единицу больше чем всего баров в окне. Это и вызывает ошибку.
Тогда было бы логично убрать "+1", чтоб для расчета использовалось столько баров, сколько в окне? Но это не помогает.
Yurkov на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.06.2015, 18:09   #4036 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,525
Репутация: 3646
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,114
Поблагодарили 3,650 раз(а) в 1,470 сообщениях
Поинты: 2007
Сообщение от Yurkov Посмотреть сообщение
Тогда было бы логично убрать "+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 и соответственно опять будет вызвана ошибка обращения к несуществующей ячейке массива.
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.06.2015, 18:46   #4037 (permalink)
Почётный гражданин
 
Аватар для Yurkov
 
Регистрация: 19.01.2011
Сообщений: 643
Репутация: 359
Yurkov - Yurkov - Yurkov - Yurkov -
Сказал(а) спасибо: 163
Поблагодарили 356 раз(а) в 166 сообщениях
Поинты: 200
Сообщение от AlexeyVik Посмотреть сообщение
Соответственно расчёт надо производить от бара рассчитанного по формуле баров_в_окне - посчитанные_бары и минус 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
Yurkov на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.06.2015, 19:25   #4038 (permalink)
Программист mql4 mql5
 
Аватар для AlexeyVik
 
Регистрация: 19.11.2009
Сообщений: 2,525
Репутация: 3646
AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik AlexeyVik
Сказал(а) спасибо: 1,114
Поблагодарили 3,650 раз(а) в 1,470 сообщениях
Поинты: 2007
Сообщение от Yurkov Посмотреть сообщение
Это:

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 я взял из этого твоего сообщения.
Сообщение от Yurkov Посмотреть сообщение
Сначала подумал, что объявлено мало буферов 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);
}
}

[свернуть]
AlexeyVik на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 25.06.2015, 19:33   #4039 (permalink)
Почётный гражданин
 
Аватар для Yurkov
 
Регистрация: 19.01.2011
Сообщений: 643
Репутация: 359
Yurkov - Yurkov - Yurkov - Yurkov -
Сказал(а) спасибо: 163
Поблагодарили 356 раз(а) в 166 сообщениях
Поинты: 200
Сообщение от AlexeyVik Посмотреть сообщение
Если мы говорим об одном и том-же индикаторе, то такого не должно быть. macdSlowEMA я взял из этого твоего сообщения.
Мой косяк. Да, ошибок нет, но как и результата
Yurkov на форуме   Ответить с цитированиемОтветить с цитированием  
Старый 26.06.2015, 04:43   #4040 (permalink)
Почётный гражданин
 
Аватар для Yurkov
 
Регистрация: 19.01.2011
Сообщений: 643
Репутация: 359
Yurkov - Yurkov - Yurkov - Yurkov -
Сказал(а) спасибо: 163
Поблагодарили 356 раз(а) в 166 сообщениях
Поинты: 200
А если полностью удалить лимит баров, какие это строчки?
Yurkov на форуме   Ответить с цитированиемОтветить с цитированием  
Ответ

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


Опции темы

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

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



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


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