Скачать MetaTrader 5

Помогите сделать.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Dmitiry Ananiev
8953
Dmitiry Ananiev  

Советник считает канал по экстремумам

      int bhm=iHighest(NULL,0,MODE_HIGH,50,0);
      if(bhm>=0) bh=High[bhm];
      else return;
      int blm=iLowest(NULL,0,MODE_LOW,50,0);
      if(bhm>=0) bl=Low[blm];

 как сделать чтоб он пропускал бары которые выпадают по времени с 21:50 до 22:10? . Т.е будто их вообще нет ? 

Yury Kirillov
4646
Yury Kirillov  

Что-то вроде этого:

   Tabu31=((Month()==12)&&(Day()==31)&&(Hour()>=9)&&(Minute()>=0));       //Запрет на торговлю после 09:00 31 декабря

Alexey Volchanskiy
23916
Alexey Volchanskiy  
dimeon:

Советник считает канал по экстремумам

 как сделать чтоб он пропускал бары которые выпадают по времени с 21:50 до 22:10? . Т.е будто их вообще нет ? 

У меня вот так сделано для определения допустимого диапазона. Если в StringToTime подавать только время без даты, добавляется текущая дата, самое то, что надо.

input string    StartTimeOpen   = "01:00";
input string    StopTimeOpen    = "21:30";

    // функция проверяет вхождение серверного времени в заданный диапазон
    // если есть вхождение есть, возвращает true, иначе false
    bool CheskForWorkTime(string startT, string stopT)
    {
        if (TimeCurrent() > StringToTime(startT) && TimeCurrent() < StrToTime(stopT))
            return(true);
        return (false);
    }

    // функция проверяет вхождение серверного времени в заданный диапазон
    // если есть вхождение есть, возвращает true, иначе false
    bool CheskForWorkTime(datetime startT, datetime stopT)
    {
        if (TimeCurrent() > startT && TimeCurrent() < stopT)
            return(true);
        return (false);
    }
Andy
568
Andy  

Если происходит в реалтайме. перед установкой ордера, то можно так :

bool IsTradingTime(const string shours = "0:30-23:30", const string sdays = "0-6")
{
    string days[];
    string hours[];
    
    StringSplit(sdays, '-', days);
    StringSplit(shours, '-', hours);

    MqlDateTime o = {0};
    datetime now = TimeCurrent(o);
    
    string day = 
        string(o.year) + "." + 
        string(o.mon) + "." + 
        string(o.day);

    datetime H1 = StringToTime(day + " " + hours[0]);
    datetime H2 = StringToTime(day + " " + hours[ArraySize(hours) - 1]);
    
    int D1 = int(days[0]);
    int D2 = int(days[ArraySize(hours) - 1]);

    if (now >= H1 && 
        now <= H2 && 
        o.day_of_week >= D1 && 
        o.day_of_week <= D2) 
            return true;

    return false;
}

...

IsTradingTime("00:05-06:00") || IsTradingTime("22:00-23:30") // set orders only at night
IsTradingTime("15:00-18:00", "1-4") // set orders on Monday, Tuesday, Wednesday, Thursday in American session only

Если надо пройтись по истории баров, то наверное только в цикле и на каждой итерации проверять время бара :

datetime times[];
int bars = CopyTime(..., times);

for (int k = 0; k < bars; k++)
{
   MqlDateTime now = {0};   
   TimeToStruct(times[k], now)

   if (now.hour > 21 && now.minute > 50 && now.hour < 22 && now.minute < 10) continue;
   
   // here goes your code with extremes
}
Dmitiry Ananiev
8953
Dmitiry Ananiev  

Вообщем сделал так  

int iTimes_Highest(int Count_Bars,int Start_Bar)
  {
   MqlDateTime t ={0};
   int i=Start_Bar;
   if (i==0) i = 1;
   int HBar=0;
   int y=0;
   double Hmax=0.0;

   while(true)
     {
      datetime tBar=iTime(_Symbol,0,i+y);
      TimeToStruct(tBar,t);
      if((t.hour==21 && t.min>=57) || (t.hour==22 && t.min<=15))
        {
         y++;
         continue;
        }

      if (iHigh(_Symbol,0,i+y)>Hmax)
        {
         HBar=i+y;
         Hmax= High[HBar];
        }
      i++;
      if(i>=Start_Bar+Count_Bars) break;
     }
     
   if (Start_Bar==0 && ((Hour()<=21 && Minute()<=57) ||  (Hour()>22 && Minute()>15)))
   {
      if (High[0]>=Hmax) HBar=0;
      
   }
  
   return (HBar);
  }

 Только ресурсы жрет - капец! Подскажите как сделать чтоб быстрей работало ? 

Andy
568
Andy  

Вообще надо профилировать, но так, на первый взгляд, можно получать все бары за пределами цикла, а внутри цикла проверять только их Time / High, тогда от использования обращения к серверу функциями iTime / iHigh можно избавиться

Для получения полной информации о всех барах за раз - CopyRates, ниже - импровизация, возможно где-то опечатался :)

MqlRates rates[];
int bars = CopyRates(symbol, 0, Start_Bar, Count_Bar, rates);

while (bars-- >= 0)
{
   datetime tBar = rates[bars].time; // replace iTime with just single item from rates array
   TimeToStruct(tBar, t);

   if((t.hour == 21 && t.min >= 57) || (t.hour == 22 && t.min <= 15))
   {
      continue;
   }

   if (rates[bars].high > Hmax) // change iHigh to rates[bars].high too
   {
      HBar = bars;
      Hmax = High[HBar];
   }
}

...
Dmitiry Ananiev
8953
Dmitiry Ananiev  

смысл понятен. Но ты в своем коде логику изменил. Количество баров для расчета должно остаться одинаковым для всех отрезков времени. ТЫ просто решил не считать бары в указанном временном промежутке. 

 

Профилировщик показывает, что самые большие затраты на

TimeToStruct(tBar,t); 

 

Как от этого уйти ?  

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий