Определение максимальной и минимальной цены закрытия за предыдущий день часового бара

 
for(int i=24; i>0; i--)
      {
      if (iClose(NULL,PERIOD_H1,Hour()+i)>MaxCloseHourPrice)
      MaxCloseHourPrice=iClose(NULL,PERIOD_H1,Hour()+i);
      if (iClose(NULL,PERIOD_H1,Hour()+i)<MinCloseHourPrice)
      MinCloseHourPrice=iClose(NULL,PERIOD_H1,Hour()+i);
      }


Максимум показывает нормально, а вот минимум по нулям вечно, подскажите, пожалуйста

 
double MaxCloseHourPrice=0;
double MinCloseHourPrice=DBL_MAX;

for(int i=24; i>0; i--)
   {
   if (iClose(NULL,PERIOD_H1,Hour()+i)>MaxCloseHourPrice)
      MaxCloseHourPrice=iClose(NULL,PERIOD_H1,Hour()+i);
   if (iClose(NULL,PERIOD_H1,Hour()+i)<MinCloseHourPrice)
      MinCloseHourPrice=iClose(NULL,PERIOD_H1,Hour()+i);
   }
 
Taras Slobodyanik:

mrostrich:
for(int i=24; i>0; i--)
      {
      if (iClose(NULL,PERIOD_H1,Hour()+i)>MaxCloseHourPrice)
      MaxCloseHourPrice=iClose(NULL,PERIOD_H1,Hour()+i);
      if (iClose(NULL,PERIOD_H1,Hour()+i)<MinCloseHourPrice)
      MinCloseHourPrice=iClose(NULL,PERIOD_H1,Hour()+i);

      }


Максимум показывает нормально, а вот минимум по нулям вечно, подскажите, пожалуйста


Еще могу добавить, чтобы более понятно было. Дело в том, что MinCloseHourPrice изначально инициализируется нулем. То есть с учетом того, что цена всегда имеет положительное число, условие 

if (iClose(NULL,PERIOD_H1,Hour()+i)<MinCloseHourPrice)

никогда не сработает. Поэтому нужно инициализировать MinCloseHourPrice=DBL_MAX; максимальным числом, которого никогда не будет в ценовом ряде Close.

 
Taras Slobodyanik:

Показывать стал, но теперь график в тестере стоит на месте

 
mrostrich:

Показывать стал, но теперь график в тестере стоит на месте


Покажите весь код, так Вам сложно будет сказать в чем причина. И используйте кнопку "SRC" для выделения кода.


 
forexman77:

Покажите весь код, так Вам сложно будет сказать в чем причина. И используйте кнопку "SRC" для выделения кода.



//--- input parameter

input int InpAtrPeriod=14; // ATR Period



/////////////////////////////////////////////////////////////////////////////



extern double Lot = 0.5;

extern int StopLoss;

extern int TakeProfit;



double ClosePrice = iClose(Symbol(), PERIOD_H1, 0);



int Slippage = 3;

int Magic = 111;

int ticket;

double SL, TP, a, MaxCloseHourPrice = 0, MinCloseHourPrice = DBL_MAX;

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit(void)

{

   if(Digits == 3 || Digits == 5)

  {

   TakeProfit *= 10;

   StopLoss *= 10;

   Slippage *= 10;

  }

   return(INIT_SUCCEEDED);

}

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

  {

   

  }

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

  {

   // Определение максимальной и минимальной цены закрытия за предыдущий день часового бара //

   for(int i=24; i>0; i--)

      {

        if (iClose(NULL,PERIOD_H1,Hour()+i)>MaxCloseHourPrice)

        MaxCloseHourPrice=iClose(NULL,PERIOD_H1,Hour()+i);

        if (iClose(NULL,PERIOD_H1,Hour()+i)<MinCloseHourPrice)

        MinCloseHourPrice=iClose(NULL,PERIOD_H1,Hour()+i);

      }

   //////////////////////////////////////////////////////////////////////////////////

   // ATR // Среднее значение // 

   double ATR=iATR(NULL, 0, InpAtrPeriod, 0);

   double max=-10000, min=10000;

   for(int n=0; n<WindowFirstVisibleBar();n++)

   {

      ATR=iATR(NULL, 0, InpAtrPeriod, n);

      if(max<ATR)max=ATR;

      if(min>ATR)min=ATR;

   }

   min-=0.0001; max+=0.0001;

   a = (min + max) / 2;

   ObjectDelete(0,"MidLine");

   ObjectCreate(0,"MidLine",OBJ_HLINE,1,Time[1], a);

   //////////////////////////////////////////////////////////////////////////

   // Выполнение ордеров //

   if(ClosePrice > MaxCloseHourPrice && ATR > a && OrdersTotal() < 1)

   {

      ticket = OrderSend(Symbol(), OP_BUY, Lot, Ask, Slippage, 0, 0, "", Magic, 0, Green);

      if(ticket > 0)

      {

      SL = NormalizeDouble(Ask - StopLoss*Point, Digits);

      TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);

      }

      if(OrderSelect(ticket, SELECT_BY_TICKET))

         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

         Print("Ошибка модификации ордера на покупку");

   }

   

   if(ClosePrice < MinCloseHourPrice && ATR > a && OrdersTotal() < 1)

   {

      ticket = OrderSend(NULL, OP_SELL, Lot, Bid, Slippage, 0, 0, "", Magic, 0, Red);

      if(ticket > 0)

      {

      SL = NormalizeDouble(Bid + StopLoss*Point, Digits);

      TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);

      }

      if(OrderSelect(ticket, SELECT_BY_TICKET))

         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

         Print("Ошибка модификации ордера на продажу");

   }

   Comment("min = ", DoubleToStr(min,4), "    max = ", DoubleToString(max,4) + "\n" + 

   DoubleToStr(MaxCloseHourPrice) + "\n" +

   DoubleToStr(MinCloseHourPrice));

  }

//+------------------------------------------------------------------+

//////////////////////////////////////////////////////////////////////

 
Taras Slobodyanik:

Максимум показывает нормально, а вот минимум по нулям вечно, подскажите, пожалуйста

for(int i=23; i<48; i++)
{
   double price=iClose(NULL,PERIOD_H1,i);
   if (price>MaxCloseHourPrice) MaxCloseHourPrice=price;
   if (price<MinCloseHourPrice) MinCloseHourPrice=price;
}
 

Начнем сначала: "Определение максимальной и минимальной цены закрытия за предыдущий день часового бара".

Что Вы подразумеваете, нужно найти максимум и минимум в прошлом дне на такой же час, как в текущий?


 
forexman77:

Начнем сначала: "Определение максимальной и минимальной цены закрытия за предыдущий день часового бара".

Что Вы подразумеваете, нужно найти максимум и минимум в прошлом дне на такой же час, как в текущий?



В прошлом дне, но я использовал сдвиг на 24 свечи, там нужно будет додумать, чтобы робот независимо когда включался и находил всегда верный максимум и минимум закрытия, это уже потом. Имелось ввиду найти максимум и минимум закрытия часовой свечи за предыдущий день

 
Konstantin Nikitin:
for(int i=24; i>0; i--)

{

      double price = iClose(NULL,PERIOD_H1,Hour()+i);
      if (price>MaxCloseHourPrice) MaxCloseHourPrice=price;
      if (price<MinCloseHourPrice || MinCloseHourPrice==DBL_MAX) MinCloseHourPrice=price;

}

У вас минималька не совсем правильно определяется цена всегда выше 0, поэтому данную проверку нужно ставить.

P.S. Чтоб не проводить лишнюю проверку, проще сделать так

double SL, TP, a, MaxCloseHourPrice = MinCloseHourPrice = iClose(NULL,PERIOD_H1,0);

А дальше оставить ваш код, он вполне нормально пройдет.

Не подходит

 
mrostrich:

Не подходит

используйте свой первоначальный код, но поставьте инициализацию переменных в начале цикла

MaxCloseHourPrice=0;
MinCloseHourPrice=DBL_MAX;
но это не "последний день", а последние 24 свечи