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

 

Для размышления

double MaxCloseHourPrice, MinCloseHourPrice;

void OnTick()
{
     // Определение максимальной и минимальной цены закрытия бара текущего периода за нужный период времени, в текущем примере предыдущие сутки //
     int i = 0;
     MaxCloseHourPrice = 0;
     MinCloseHourPrice = DBL_MAX;
     datetime startTime = TimeCurrent()-48*60*60, stopTime = TimeCurrent()-24*60*60;
     
     while(true)
     {
          if( stopTime > iTime(NULL, PERIOD_CURRENT, i) )
          {
               if (iClose(NULL,PERIOD_CURRENT,i)>MaxCloseHourPrice) MaxCloseHourPrice=iClose(NULL,PERIOD_CURRENT,i);
               if (iClose(NULL,PERIOD_CURRENT,i)<MinCloseHourPrice) MinCloseHourPrice=iClose(NULL,PERIOD_CURRENT,i);
          }
          i++;
          if( startTime > iTime(NULL, PERIOD_CURRENT, i) ) break;
     }
}
 

Переделал советника и вместо объектов сделал индикатор для АТР. Чтобы рисовать объектами в подокне нужно вызывать шаблон, а для меня это мало знакомо.

Модифицировать ордера пока не будем сначала разберитесь с основами.

if(max<ATR)max=ATR;

if(min>ATR)min=ATR;

исправил на 

if(ATR>max)max=ATR;
if(ATR<min)min=ATR;
На реальную торговлю не ставить, это так для проверки идей. Для реальной торговли нужны проверки на ошибки и много чего, плюс код можно оптимизировать.
Файлы:
ATR2.mq4  5 kb
test.mq4  7 kb
 

Переделал советник и индикатор, теперь данные атр берутся из индикатора и плюсуются пункты к min и max.

Вообще все затратные функции лучше помещать в тело более легких операторов. Это делается для более быстрого расчета.

К примеру вызов индикатора я бы спрятал в

if(OrdersTotal()<1)
{
if(ClosePrice>MaxCloseHourPrice)
     {
      ATR=iCustom(NULL,0,"ATR2",InpAtrPeriod,HistAtr,point,0,0);
      atr=iCustom(NULL,0,"ATR2",InpAtrPeriod,HistAtr,point,1,0);
      if(atr>ATR)
       {
         SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
         TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
         ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,Slippage,SL,TP,"",Magic,0,Green);
         if(ticket>0)
           {
            Alert("Открыт ордер Buy ",ticket);
            return;
            }
            else{Alert("Ордер Buy не открылся ",ticket);}
        }
     }

}

Файлы:
test.mq4  7 kb
ATR2.mq4  5 kb
 
Konstantin Nikitin:

Для размышления

А так не проще?

void OnTick()
{
     // Определение максимальной и минимальной цены закрытия бара периода H1 за предыдущие сутки //
 double maxCloseHourPrice, minCloseHourPrice,  arrayClose[];
 datetime timeClose[2];
 int copyTime = CopyTime(_Symbol, PERIOD_D1, 0, 2, timeClose);
 int copyClose = CopyClose(_Symbol, PERIOD_H1, timeClose[0], timeClose[1], arrayClose);
 maxCloseHourPrice = arrayClose[ArrayMaximum(arrayClose)];
 minCloseHourPrice = arrayClose[ArrayMinimum(arrayClose)];
}

Проверки ошибок выполнения остаются для размышлений...

 
Alexey Viktorov:

А так не проще?

Проверки ошибок выполнения остаются для размышлений...


тогда уж так)

int    bar=iBarShift(_Symbol,PERIOD_H1, StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)))+1;
double maxCloseHourPrice =iClose(_Symbol,PERIOD_H1,iHighest(_Symbol,PERIOD_H1,MODE_CLOSE,24,bar));
double minCloseHourPrice =iClose(_Symbol,PERIOD_H1,iLowest(_Symbol,PERIOD_H1,MODE_CLOSE,24,bar));
 
Taras Slobodyanik:

тогда уж так)

Это не кроссплатформенный код.
 
Artyom Trishkin:
Это не кроссплатформенный код.

зато демонстрирует как в четверке всё легко и просто, без лишних буферов и циклов

пс. и эти функции вполне реализуемы на пятерке, можно использовать такой же синтаксис

 

А Вы что не заметили сделал советника и индикатор. Вопрос вроде уже исчерпан)

 
Taras Slobodyanik:

тогда уж так)

И чем это лучше? Или оптимальнее? Или ещё какие-то преимущества???

Может это просто нежелание разобраться в новых возможностях языка программирования???

 
double maxCloseHourPrice, minCloseHourPrice,  arrayClose[];
int copyTime = CopyClose( NULL, PERIOD_CURRENT, (TimeCurrent()-24*60*60), TimeCurrent(), close_array );
maxCloseHourPrice = close_array[ArrayMaximum( close_array,  0, copyTime )];
minCloseHourPrice = close_array[ArrayMinimum( close_array,  0, copyTime )];

Можно взять чисто временной отрезок и по текущему периоду тогда уж.