Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1534

 
Eugen8519:

Вот так закрывает ордера

Сделай, как я написал выше...

или выложи код OnTick()

 
Eugen8519:

Вот так закрывает ордера

Такая структура должна быть

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(UseTimeLimit)
     {
       YesStop=true;
       MqlDateTime str1;
       TimeToStruct(TimeCurrent() , str1);
       if(str1.hour > startHour && str1.hour < stopHour)
          YesStop=false;
     }
   if(YesStop==false)
     {
      if(EMA0...)
        {
         .....
         OPENORDER("Sell");
        }
   
      if(EMA0...)
        {
         .....
         OPENORDER("Buy");
        }
     }
//---
   if(EMA0...)
     {
      .....
      CLOSEORDER("Sell");
     }

   if(EMA0...) 
     {
      .....
      CLOSEORDER("Buy");
     }
  }
//+------------------------------------------------------------------+
void CLOSEORDER(string ord)
  {
   .....
  }
//---
void OPENORDER(string ord)
  {
   .....
  }
 
Ну спасибо за совет, вечером проверю, потом отпишусь. 
 
MakarFX:

Такая структура должна быть

Если не ошибаюсь, то можно писать так

   if(UseTimeLimit)
     {
       YesStop=true;
       MqlDateTime str1;
       TimeCurrent(str1);
       if(str1.hour > startHour && str1.hour < stopHour)
          YesStop=false;
     }
 
Eugen8519:
Ну спасибо за совет, вечером проверю, потом отпишусь. 

если UseTimeLimit устанавливается в настройках при запуске сова, то

эту функцию лучше в OnInit() вместо OnTick()

 
Vitaly Muzichenko:

Если не ошибаюсь, то можно писать так

Я вообще пишу так

if(TimeHour(time[i])>=Time_Start&&TimeHour(time[i])<TimeFinish)

или еще проще

if(Hour()>=Time_Start&&Hour()<TimeFinish)
 

Добрый день! Подскажите, пожалуйста, как правильно усреднить линию индикатора? Основную кривую с периодом Per_1 рисует нормально (Buffer_1[]), пока не добавляю блок простого усреднения с буфером Buffer_2[] с периодом усреднения Per_2.

int OnCalculate(стандартные параметры)

  {

   int i, j, limit;

   if(rates_total <= Per_1)

      return(0);

//Будет пересчитан последний посчитанный бар

   limit = rates_total - prev_calculated - Per_1;

   if(prev_calculated > 0)

      limit++;

//Расчёт и заполнение буферов индикатора

   for(i=0; i < limit; i++)

     {

     //Расчёт основной линии индикатора

      Buffer_1[i] = Фрмула кривой

      double Sum = 0;                 

      for(j = i; j < Per_2 + i; j++)

        {

        //Расчёт линии усреднения

         Sum += Buffer_1[j];

         Buffer_2[i] = Sum / Per_2;

        }

     }

   return(rates_total);

  }

 
Eugen8519:
В том то и вся проблема, он и только открывает и закрывает ордера starthour->stophour
А открытые ордера не закрывает после stophour

Так как после stophour  нельзя торговать

Я давно пишу логику открытия до закрытия, трала и прочего сопровождения позиций. В большей степени оно и верно, прежде чем открыть ещё что-то, нужно проверить что есть уже открытое.

У вас верно прописано, нужно только сменить блоки местами:

MqlDateTime str;
void OnTick()
 {
 // Close Positions
 TrailingStop();

 if(условие_закрытия)
  {
   ClosePos();
  }

 // Open Positions
 if(UseTimeLimit)
  {
    TimeCurrent(str);
    if(str.hour > startHour && str.hour < stopHour)
     {
      OpesPos(...);
      ...
     }
  }
// end
}
 

Круто! Работает, спасибо!

Причина обращения: