Дыры во времени

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
aksakal
80
aksakal  
Люди, объясните, пожалуйста почему при наличии в эксперте выражения

dValueBig = iCustom(NULL,cBigTimeFrame,"i_PTI_3_10",cPTICoBig,cStochCoBig,cIndicatorTFBig,0,1);


появляются дыры во времени при тестировании?

2006.03.11 17:06:37 2006.03.08 15:58 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 15:58:00;
2006.03.11 17:06:37 2006.03.08 15:57 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 15:57:00;
2006.03.11 17:06:37 2006.03.08 15:56 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 15:56:00;
2006.03.11 17:06:36 2006.03.08 09:42 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 09:42:00;
2006.03.11 17:06:36 2006.03.08 09:41 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 09:41:00;
2006.03.11 17:06:36 2006.03.08 09:40 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 09:40:00;
2006.03.11 17:06:36 2006.03.08 09:39 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 09:39:00;
2006.03.11 17:06:36 2006.03.08 09:38 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 09:38:00;

Если выражение закомментировать, то как и ожидается, выводится информация за каждую минуту.

История на задействованных таймфреймах есть.
Моделирование по ценам открытия или по контрольным точкам.
MetaTrader 4 build 191.
MetaQuotes
Админ
27705
Renat Fatkhullin  
Приведите полный код, пожалуйста. Без него очень сложно дать ответ.
aksakal
80
aksakal  
Оказалось, что на другом компе дыры появляюся даже если закомментировать оба iCustom в эксперте.
Похоже, я что-то недопонимаю о работе с таймфреймами.

Сомневаюсь, что будет намного понятней :)

Индикатор
#property copyright "Copyright © 2006" #property link "https://www.metaquotes.net/" #property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Red //---- input parameters extern double cPTICo=23; extern double cStochCo=17; extern int cTimeFrame=15; //---- buffers double ExtMapBuffer1[]; int limit = 0; int iTrend = 0; // Направление тренда (1 - вверх, -1 - низ, 0 - не известно) double curExtremum = 0; //+------------------------------------------------------------------+ //| Вспомагательные функции | //+------------------------------------------------------------------+ int loc_Sign(double value) // 1 при Value>0 // -1 при Value<0 // 0 при Value=0 { if (value > 0){return(1);} else{if (value < 0){return(-1);} else{return(0);} } } double loc_calcAdd(double stochVal, double Coef) // return value > 0 if ShochVal > 50 // return value < 0 if ShochVal < 50 { return(MathSqrt(MathAbs(2*(0.5 - stochVal/100))) * Coef * loc_Sign(stochVal - 50)); } //+------------------------------------------------------------------+ //| Мой индикатор | //| //| prevValue - значение индикатора на предыдущем баре //| curExtremum - максимальное(минимальное) значение цены //+------------------------------------------------------------------+ double konkop_PTI1Stoch1(int CurBar) { double stochAdd = 0; // сумма поправки вносимой по стохастику double value; // промежуточная переменная с результатом double prevValue = 0; stochAdd = loc_calcAdd(iStochastic(NULL,cTimeFrame,5,3,3,MODE_SMA,0,MODE_MAIN,iBarShift( NULL, cTimeFrame, Time[CurBar])+1), cStochCo); prevValue = ExtMapBuffer1[CurBar]; if ((prevValue < Close[CurBar]) || (prevValue == Close[CurBar] && iTrend == 1)) { // UpTrend iTrend = 1; if (curExtremum < Close[CurBar]) { curExtremum = Close[CurBar]; } value = curExtremum*(1-(cPTICo/100)); if (stochAdd < 0) { value = value + stochAdd; } return (value); } if ((prevValue > Close[CurBar]) || (prevValue == Close[CurBar] && iTrend == -1)) { // DownTrend iTrend = -1; if (curExtremum > Close[CurBar]) { curExtremum = Close[CurBar]; } value = curExtremum*(1+(cPTICo/100)); if (stochAdd > 0) { value = value + stochAdd; } return (value); } } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); //---- IndicatorShortName("i_PTI_3_10("+cPTICo+","+cStochCo+")"); //---- cPTICo=cPTICo/100; cStochCo=cStochCo/10000; //---- return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- if(counted_bars < 0) return(-1); limit = Bars - counted_bars; for(int i=limit; i>0; i--) { ExtMapBuffer1[i] = konkop_PTI1Stoch1(i+1); } //---- return(0); } //+------------------------------------------------------------------+


Эксперт

#property copyright "Copyright © 2006" #property link "https://www.metaquotes.net/" //---- input parameters extern double cBigTimeFrame = 15; // больший таймфрейм extern double cPTICoSmall = 23; extern double cStochCoSmall = 17; extern double cIndicatorTFSmall = 15; // таймфрейм на котором считается поправка cStochCoSmall extern double cPTICoBig = 57; extern double cStochCoBig = 40; extern double cIndicatorTFBig = 240; // таймфрейм на котором считается поправка cStochCoBig extern double cTakeProfit = 500; // начальный TakeProfit extern double cInitStopLoss = 50; // начальный StopLoss extern double cCheckInterval = 30; // кол-во секунд между выполнением алгоритма extern double cLots = 1; // кол-во лотов в одной сделке double dPoints; datetime tPrevtimeSmall = 0; // время образовагия нового бара datetime tPrevtimeBig = 0; // время образовагия нового бара double dValueSmall = 0; double dPrevValueSmall = 0; double dValueBig = 0; double dPrevValueBig = 0; bool bNoLoss = false; int iLastDirection = 0; // куда была открыта последняя позиция 1 - BUY, 0 - SELL int iLastOrderTicket = 0; int iCntTime = 1; // счетчик для цикла повторных проверок внутри бара //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- dPoints = MarketInfo (Symbol(), MODE_POINT); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int iCnt = 0; int iTotal = 0; double dPriceTmp = 0; datetime tDateTmp; //---- проверки --------------------- if(Bars<100) { Print("На графике менее 100 баров"); return(0); // на графике менее 100 баров } // Print("1: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; dValueSmall = ", dValueSmall, "; dValueBig = ", dValueBig); if(tPrevtimeSmall == Time[0]){ if((tPrevtimeSmall + cCheckInterval * iCntTime) >= CurTime()){ // если не прошло tCheckInterval секунд с прошлой проверки - выходим return(0); }else{ iCntTime++; } }else{ // образовался новый бар на малом таймфрейме tPrevtimeSmall = Time[0]; iCntTime = 1; dPrevValueSmall = dValueSmall; tDateTmp = iTime(NULL, cBigTimeFrame, 0); if(tPrevtimeBig != tDateTmp){ // образовался новый бар на большом таймфрейме tPrevtimeBig = tDateTmp; dPrevValueBig = dValueBig; Print("_: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; tDateTmp = ", TimeToStr(tDateTmp,TIME_DATE|TIME_SECONDS)); dValueBig = iCustom(NULL,cBigTimeFrame,"i_PTI_3_10",cPTICoBig,cStochCoBig,cIndicatorTFBig,0,1); } } Print("2: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; dValueSmall = ", dValueSmall, "; dValueBig = ", dValueBig); //---- dValueSmall = iCustom( NULL, 0, "i_PTI_3_10", cPTICoSmall, cStochCoSmall, cIndicatorTFSmall, 0, 1 ); //---- // Дальше пошло управление торгами //---- return(0); }
MetaQuotes
Админ
27705
Renat Fatkhullin  
Все дело в куске:
if(tPrevtimeSmall == Time[0]){ if((tPrevtimeSmall + cCheckInterval * iCntTime) >= CurTime()){ // если не прошло tCheckInterval секунд с прошлой проверки - выходим return(0);
Вы же сами не доходите до печати и выходите по return !
Раскомментируйте строку и проверьте еще раз, пожалуйста:
// Print("1: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; dValueSmall = ", dValueSmall, "; dValueBig = ", dValueBig);

Кстати, отсутствие правильного выравнивания и структурности фигурных скобок Вас часто будет подводить. Если так оформлять код, то даже собственных ошибок видно не будет :)
aksakal
80
aksakal  
Renat:

Раскомментируйте строку и проверьте еще раз, пожалуйста:
// Print("1: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; dValueSmall = ", dValueSmall, "; dValueBig = ", dValueBig);
Немного изменил изменил строку вывода и раскомментровал.
На разных данных - результаты разные, но дыры есть везде:

2006.03.14 19:33:30 2006.03.08 10:50 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.08 10:50:00; CurTime() = 2006.03.08 10:50:00
2006.03.14 19:33:30 2006.03.08 10:49 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 10:49:00; dValueSmall = 1.1876; dValueBig = 1.1938
2006.03.14 19:33:30 2006.03.08 10:49 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.08 10:49:00; CurTime() = 2006.03.08 10:49:00
2006.03.14 19:33:04 2006.03.08 07:03 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.08 07:03:00; CurTime() = 2006.03.08 07:03:00
2006.03.14 19:33:04 2006.03.08 07:02 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.08 07:02:00; dValueSmall = 1.1903; dValueBig = 1.1938
2006.03.14 19:33:04 2006.03.08 07:02 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.08 07:02:00; CurTime() = 2006.03.08 07:02:00

2006.03.14 19:48:38 2006.03.09 09:16 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.09 09:16:00; dValueSmall = 1.1901; dValueBig = 1.1955
2006.03.14 19:48:38 2006.03.09 09:16 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.09 09:16:00; CurTime() = 2006.03.09 09:16:00
2006.03.14 19:48:38 2006.03.09 09:15 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.09 09:15:00; dValueSmall = 1.1901; dValueBig = 1.1955
2006.03.14 19:48:31 2006.03.09 06:22 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.09 06:22:00; CurTime() = 2006.03.09 06:22:00
2006.03.14 19:48:31 2006.03.09 06:21 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.09 06:21:00; dValueSmall = 1.19; dValueBig = 1.1965
2006.03.14 19:48:31 2006.03.09 06:21 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.09 06:21:00; CurTime() = 2006.03.09 06:21:00

И уж совсем непонятное, когда второй вывод есть, а первого НЕТ =-O

2006.03.14 20:44:38 2006.03.10 21:09 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.10 21:09:00; dValueSmall = 1.1908; dValueBig = 1.1952
2006.03.14 20:44:38 2006.03.10 21:09 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.10 21:09:00; CurTime() = 2006.03.10 21:09:00
2006.03.14 20:44:38 2006.03.10 21:08 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.10 21:08:00; dValueSmall = 1.1908; dValueBig = 1.1952
2006.03.14 20:44:38 2006.03.10 19:55 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.10 19:55:00; dValueSmall = 1.1898; dValueBig = 1.195
2006.03.14 20:44:38 2006.03.10 19:55 e_PTI_3_10_4_00 EURUSD,M1: 1: Time = 2006. 03.10 19:55:00; CurTime() = 2006.03.10 19:55:00
2006.03.14 20:44:38 2006.03.10 19:54 e_PTI_3_10_4_00 EURUSD,M1: 2: Time = 2006. 03.10 19:54:00; dValueSmall = 1.1898; dValueBig = 1.195

А вот еще упростил эксперт

#property copyright "Copyright © 2006" #property link "https://www.metaquotes.net/" //---- input parameters extern double cBigTimeFrame = 15; // больший таймфрейм extern double cPTICoSmall = 23; extern double cStochCoSmall = 17; extern double cIndicatorTFSmall = 15; // таймфрейм на котором считается поправка cStochCoSmall extern double cPTICoBig = 57; extern double cStochCoBig = 40; extern double cIndicatorTFBig = 240; // таймфрейм на котором считается поправка cStochCoBig extern double cTakeProfit = 500; // начальный TakeProfit extern double cInitStopLoss = 50; // начальный StopLoss extern double cCheckInterval = 30; // кол-во секунд между выполнением алгоритма extern double cLots = 1; // кол-во лотов в одной сделке double dPoints; datetime tPrevtimeSmall = 0; // время образовагия нового бара datetime tPrevtimeBig = 0; // время образовагия нового бара double dValueSmall = 0; double dPrevValueSmall = 0; double dValueBig = 0; double dPrevValueBig = 0; bool bNoLoss = false; int iLastDirection = 0; // куда была открыта последняя позиция 1 - BUY, 0 - SELL int iLastOrderTicket = 0; int iCntTime = 1; // счетчик для цикла повторных проверок внутри бара //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- dPoints = MarketInfo (Symbol(), MODE_POINT); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int iCnt = 0; int iTotal = 0; double dPriceTmp = 0; datetime tDateTmp; //---- проверки --------------------- if(Bars<100) { Print("На графике менее 100 баров"); return(0); // на графике менее 100 баров } Print("1: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; CurTime() = ", TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS)); if(tPrevtimeSmall == Time[0]){ }else{ // образовался новый бар на малом таймфрейме tPrevtimeSmall = Time[0]; iCntTime = 1; dPrevValueSmall = dValueSmall; tDateTmp = iTime(NULL, cBigTimeFrame, 0); if(tPrevtimeBig != tDateTmp){ // образовался новый бар на большом таймфрейме tPrevtimeBig = tDateTmp; dPrevValueBig = dValueBig; Print("_: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; tDateTmp = ", TimeToStr(tDateTmp,TIME_DATE|TIME_SECONDS)); dValueBig = iCustom(NULL,cBigTimeFrame,"i_PTI_3_10",cPTICoBig,cStochCoBig,cIndicatorTFBig,0,1); } } Print("2: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; dValueSmall = ", dValueSmall, "; dValueBig = ", dValueBig); //---- dValueSmall = iCustom( NULL, 0, "i_PTI_3_10", cPTICoSmall, cStochCoSmall, cIndicatorTFSmall, 0, 1 ); //---- // return(0); }


Всеравно есть дыры.

Зато дыры пропадают, если закометить,

dValueBig = iCustom(NULL,cBigTimeFrame,"i_PTI_3_10",cPTICoBig,cStochCoBig, cIndicatorTFBig,0,1);

Похоже, что iCustom очень криво обрабатывает другие таймфреймы.

Renat:

Кстати, отсутствие правильного выравнивания и структурности фигурных скобок Вас часто будет подводить. Если так оформлять код, то даже собственных ошибок видно не будет :)
Где-то есть стандарт по форматированию кода MQL4? :)
Если серьезно, то когда человек работает не в команде он имеет полное право
использовать стиль кодирования, который его больше устраивает.
MetaQuotes
Админ
27705
Renat Fatkhullin  
Все таки Вам надо еще поискать - дыр не должно быть.

Где-то есть стандарт по форматированию кода MQL4? :)
Если серьезно, то когда человек работает не в команде он имеет полное право
использовать стиль кодирования, который его больше устраивает.
И тогда другие при прочтении имеют полное право указать на нечитаемость кода?
aksakal
80
aksakal  
Renat:
Все таки Вам надо еще поискать - дыр не должно быть.
Поискать где?

И тогда другие при прочтении имеют полное право указать на нечитаемость кода?
На нечитаемость - да. На неверность кода - нет.
Rashid Umarov
Админ
16852
Rashid Umarov  
Какая разница, aksakal , есть там ошибка или нет?
Главное, чтобы сам мог прочитать свой код, а остальные пусть идут цветок нюхают .
aksakal
80
aksakal  
Да простят меня разработчики, что я не поддерживаю их безоговорочную веру в программу, но работает она КРИВО.
Например: элементарный индикатор и эксперт, а дыры всеравно есть.
Причем замена в индикаторе
ExtMapBuffer1[i] = konkop_PTI1Stoch1(1);
на
ExtMapBuffer1[i] = 1;
дыры уберает.


Индикатор
#property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Indigo //---- input parameters extern int Param1=0; //---- buffers double ExtMapBuffer1[]; int limit = 0; double konkop_PTI1Stoch1(int CurBar) { return(1); } //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- if(counted_bars < 0){ return(-1); } limit = Bars - counted_bars; for(int i=limit; i>0; i--) { ExtMapBuffer1[i] = konkop_PTI1Stoch1(1); } //---- return(0); } //+------------------------------------------------------------------+


Эксперт
extern double cBigTimeFrame = 15; // больший таймфрейм double dPoints; datetime tPrevtimeSmall = 0; // время образовагия нового бара datetime tPrevtimeBig = 0; // время образовагия нового бара double dValueSmall = 0; double dValueBig = 0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- dPoints = MarketInfo (Symbol(), MODE_POINT); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { int iCnt = 0; int iTotal = 0; double dPriceTmp = 0; datetime tDateTmp; //---- проверки --------------------- if(Bars<100) { Print("На графике менее 100 баров"); return(0); // на графике менее 100 баров } Print("1: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; CurTime() = ", TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS)); if(tPrevtimeSmall != Time[0]){ // образовался новый бар на малом таймфрейме tPrevtimeSmall = Time[0]; tDateTmp = iTime(NULL, cBigTimeFrame, 0); if(tPrevtimeBig != tDateTmp){ // образовался новый бар на большом таймфрейме tPrevtimeBig = tDateTmp; Print("_: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; tDateTmp = ", TimeToStr(tDateTmp,TIME_DATE|TIME_SECONDS)); dValueBig = iCustom(NULL, cBigTimeFrame, "i_empty1", 0, 0, 1); } } Print("2: Time = ", TimeToStr(Time[0],TIME_DATE|TIME_SECONDS), "; dValueSmall = ", dValueSmall, "; dValueBig = ", dValueBig); //---- dValueSmall = iCustom(NULL, 0, "i_empty1", 0, 0, 1); //---- // return(0); }
Rashid Umarov
Админ
16852
Rashid Umarov  
Правильно, не верь никому, сам копай. Могу только сказать где - в коде индикатора.
aksakal
80
aksakal  
Rosh:
Правильно, не верь никому, сам копай. Могу только сказать где - в коде индикатора.
В индикаторе? Хи-хи. А если и такой код дыры возвращает? Все равно в индикаторе?

#property indicator_chart_window #property indicator_buffers 1 #property indicator_color1 Indigo //---- input parameters extern int Param1=0; //---- buffers double ExtMapBuffer1[]; int limit = 0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int counted_bars=IndicatorCounted(); //---- if(counted_bars < 0){ return(-1); } if(counted_bars > 0){ counted_bars--; } limit = Bars - counted_bars; for(int i=limit; i>=0; i--) { ExtMapBuffer1[i] = 1; } //---- return(0); } //+------------------------------------------------------------------+
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий