Что наступило раньше HIGH или LOW - страница 2

 
Сергей Таболин:

Включите мозг и просто представьте КАК формируется свеча. 

Впрочем, возможно это кому-то да надо... Всё-равно, представьте как формируется свеча, и Вы поймёте как определить... ))) Задача то, в принципе, элементарная.

Мозг давно включен.

А решения элементарного до сих пор нет. В том числе от вас

Исправил код.

Что выдают принты не соответствует действительности(сравнивал в реале и тестере одновременно)

void Test(void)
  {
   datetime time_0=iTime(Symbol(),Period(),0);
   datetime time_1=iTime(Symbol(),Period(),1);
   ulong T0 = ulong(time_0 * 1000);//преобразованные в миллисекунды и затем приведенные к ulong:
   ulong T1 = ulong(time_1 * 1000);//преобразованные в миллисекунды и затем приведенные к ulong:
   MqlTick ticks_array[];
   ArraySetAsSeries(ticks_array,true);
   int total=CopyTicksRange(_Symbol,ticks_array,COPY_TICKS_INFO,T1,T0);
   if(total==-1 || total==0)
     {
      Print("ERROR ,CopyTicksRange = ",total);
      Print("GetLastError CODE = ",GetLastError());
      ResetLastError();// Обнуляем содержимое GetLastError
      return;//Выход если ошибка
     }
   if(total>0)
     {
      //Print("total = ",total);
      double bid[];
      ArrayResize(bid,total);
      for(int i=0; i<total; i++)
         bid[i]=ticks_array[i].bid;
      //Print((ArrayMaximum(bid)>ArrayMinimum(bid) ? "High" : "Low")," наступил раньше");
        if(ArrayMaximum(bid)>ArrayMinimum(bid))
           {
            Print( "High наступил раньше");
           }
        if(ArrayMaximum(bid)<ArrayMinimum(bid)) 
           {
            Print("Low наступил раньше");
           }  
     }
  }
 
erotin:

Мозг давно включен.

А решения элементарного до сих пор нет. В том числе от вас

Исправил код.

Что выдают принты не соответствует действительности(сравнивал в реале и тестере одновременно)

Вы пытаетесь решить не решаемую задачу. Код удивил. 

 
Алексей Тарабанов:

Вы пытаетесь решить не решаемую задачу. Код удивил. 

Тогда получается тестер решает не решаемую задачу в режиме м1.

Если код не верен - подскажите как

 
erotin:

Тогда получается тестер решает не решаемую задачу в режиме м1.

Если код не верен - подскажите как

Задача решается только на реале и, может быть, в тестере на основе реальных тиков.

 
Сергей Таболин:

Задача решается только на реале и, может быть, в тестере на основе реальных тиков.

Да о чем вы говорите.

Включите в тестере режим м1 на минутках и посмотрите внимательно.

Идут 4 тика максимум, из них строятся вариации OHLC, OLHC итд.

Тестер решает эту задачу , а вы демагогию как все просто на две страницы развели.

Один человек только примером поделился, я от этого примера и оттолкнулся т.к других идей нет

 
А если не тестер? Там не 4 тика, а 4000. 
 

Код использует настоящую функцию CopyTime (а не какую-то там подделку iTime) и CopyTicksRange.

Код избыточный - работает на каждом тике, хотя в этом нет необходимости - весь код нужно вынести в отдельную функцию и вызывать только по требованию.

Если запускать в тестере, ТО ТОЛЬКО В РЕЖИМЕ "Каждый тик на основе реальных тиков".

//+------------------------------------------------------------------+
//|                                                  High OR Low.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   datetime time[];
   ArraySetAsSeries(time,true);
   int start_pos=0,count=2;
   if(CopyTime(Symbol(),Period(),start_pos,count,time)!=count)
      return;

   MqlTick  ticks_array[];                   // tick receiving array 
   ArraySetAsSeries(ticks_array,true);
   uint     flags=COPY_TICKS_ALL;            // flag that defines the type of the ticks that are received 
   ulong    from_msc=(ulong)(time[1]*1000);  // date, starting from which ticks are requested 
   ulong    to_msc=(ulong)(time[0]*1000);    // date, up to which ticks are requested 

   int result=CopyTicksRange(Symbol(),ticks_array,flags,from_msc,to_msc);
   if(result<2)
      return;

   datetime dt_high=0;
   datetime dt_low=0;
   double high=DBL_MIN;
   double low=DBL_MAX;
   for(int i=0;i<result;i++)
     {
      if(ticks_array[i].bid>high)
        {
         high=ticks_array[i].bid;
         dt_high=ticks_array[i].time;
        }
      if(ticks_array[i].bid<low)
        {
         low=ticks_array[i].bid;
         dt_low=ticks_array[i].time;
        }
     }

   if(dt_high<dt_low)
      Comment("High");
   else if(dt_high>dt_low)
      Comment("Low");
   else
      Comment("");
  }
//+------------------------------------------------------------------+
Файлы:
 
erotin:

Мозг давно включен.

А решения элементарного до сих пор нет. В том числе от вас

Исправил код.

Что выдают принты не соответствует действительности(сравнивал в реале и тестере одновременно)

void Test(void)
  {
   datetime time_0=iTime(Symbol(),Period(),0);
   datetime time_1=iTime(Symbol(),Period(),1);
   ulong T0=ulong(time_0*1000-1);//преобразованные в миллисекунды и затем приведенные к ulong:
   ulong T1=ulong(time_1*1000);//преобразованные в миллисекунды и затем приведенные к ulong:
   MqlTick ticks_array[];

   int total=CopyTicksRange(_Symbol,ticks_array,COPY_TICKS_ALL,T1,T0);
   if(total==-1 || total==0)
     {
      Print("ERROR ,CopyTicksRange = ",total);
      Print("GetLastError CODE = ",GetLastError());
      ResetLastError();// Обнуляем содержимое GetLastError
      return;//Выход если ошибка
     }
   if(total>0)
     {
      int high=0,low=0;
      double max=DBL_MIN, min=DBL_MAX;
      for(int i=0; i<total; i++)
        {
         if (ticks_array[i].bid>max) {max=ticks_array[i].bid; high=i;}
         if (ticks_array[i].bid<min) {min=ticks_array[i].bid; low=i;}
        }
      if(high<low)
        {
         Print("High наступил раньше");
        }
      else
        {
         Print("Low наступил раньше");
        }
     }
  }

подправил ваш код, это вариант для форекса, для биржевых инструментов надо брать ticks_array[i].last

 
erotin:
Пытаюсь в МТ5 узнать какое событие наступило раньше по времени внутри предыдущего бара 

опубликовал свой старый индикатор под МТ4, он отображает время и значения High & Low на младшем ТФ (настройка), побарно не сложно время определить, с тиками как то не было необходимости - не делал, может быть позже займусь если под МТ5 буду переделывать такой индикатор

 
erotin:

Да о чем вы говорите.

Включите в тестере режим м1 на минутках и посмотрите внимательно.

Идут 4 тика максимум, из них строятся вариации OHLC, OLHC итд.

Тестер решает эту задачу , а вы демагогию как все просто на две страницы развели.

Один человек только примером поделился, я от этого примера и оттолкнулся т.к других идей нет

Вы читать умеете? Русским языком написал - "Каждый тик на основе реальных тиков" ! При чём тут ваша хотелка на OHLC ???

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