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

 
Roman Shiredchenko #:

Коллеги предварительно спс за помощь на 2253,2254 стр. Это МТ5.

Надо с текущего года цены открытия баров изобразить со смещением на 1 год - т.е. 1.01.2023 - чтобы было на 01.01.2022 года.

Син линия - это индикатор за 2022 год. Надо чтобы текущий год отображался (цены открытия) на этом же периоде 2022 года.

в копилот (вместо гугла) запрос делал - он вернул:

код индикатора с отрисовкой индикатора в отдельном окне отрисовка индикатора в виде линии. Выполняет расчет цен открытий дневных свечей на дневном таймфрейме по ценам открытия с 01.01.2023 года по 19.09.2023 года.  Отображает со смещением в прошлое на 1 год  на дневном  таймфрейме с 01.01.2022 года по 19.09.2022 года. 


короче - нужно смещение данных цен открытий на один год - чтобы отображалось с 2022 года.

Надо чтобы цены открытий баров текущего года  - отображались где син линия -  т.е  на периоде с 01.01.2022 года. Чтобы было отображение со смещением на 1 год в прошлое.

вот участок кода индикатора который синюю рисует:

В общем-то совсем не понятно что должен отображать индикатор. Нужно, чтобы в окне индикатора рисовались свечи со смещением на один год? Чтобы была возможность воочию видеть что было на графике год назад?

Тип рисуемой линии можно сделать DRAW_COLOR_CANDLES и на текущем времени (по времени индекса цикла) рисовать данные бара, у которого год меньше текущего на один. Правда, дни недели же не совпадают, поэтому точной даты получить нет возможности, и в этом случае можно просто не рисовать свечу.

Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_COLOR_CANDLES
Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_COLOR_CANDLES
  • www.mql5.com
DRAW_COLOR_CANDLES - Стили индикаторов в примерах - Пользовательские индикаторы - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Добрый день! Подскажите, пожалуйста, где в МТ-5 можно увидеть результаты тестирования стратегий? Меня интересует, день, час, минута сделок. В МТ-4 это раздел "результаты". Есть что-то подобное в МТ-5?
 
Roman Shiredchenko #:

Коллеги предварительно спс за помощь на 2253,2254 стр. Это МТ5.

Надо с текущего года цены открытия баров изобразить со смещением на 1 год - т.е. 1.01.2023 - чтобы было на 01.01.2022 года.

Син линия - это индикатор за 2022 год. Надо чтобы текущий год отображался (цены открытия) на этом же периоде 2022 года.

в копилот (вместо гугла) запрос делал - он вернул:

код индикатора с отрисовкой индикатора в отдельном окне отрисовка индикатора в виде линии. Выполняет расчет цен открытий дневных свечей на дневном таймфрейме по ценам открытия с 01.01.2023 года по 19.09.2023 года.  Отображает со смещением в прошлое на 1 год  на дневном  таймфрейме с 01.01.2022 года по 19.09.2022 года. 


короче - нужно смещение данных цен открытий на один год - чтобы отображалось с 2022 года.

Надо чтобы цены открытий баров текущего года  - отображались где син линия -  т.е  на периоде с 01.01.2022 года. Чтобы было отображение со смещением на 1 год в прошлое.

вот участок кода индикатора который синюю рисует:

Вот принцип:

//+------------------------------------------------------------------+
//|                                                TestShiftYear.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_plots   1
//--- plot Candle
#property indicator_label1  "Candle"
#property indicator_type1   DRAW_COLOR_CANDLES
#property indicator_color1  clrDodgerBlue,clrOrangeRed,clrGray
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input uint     InpYearShift=1;
//--- indicator buffers
double         BufferOpen[];
double         BufferHigh[];
double         BufferLow[];
double         BufferClose[];
double         BufferColors[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferOpen,INDICATOR_DATA);
   SetIndexBuffer(1,BufferHigh,INDICATOR_DATA);
   SetIndexBuffer(2,BufferLow,INDICATOR_DATA);
   SetIndexBuffer(3,BufferClose,INDICATOR_DATA);
   SetIndexBuffer(4,BufferColors,INDICATOR_COLOR_INDEX);
//---
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,0);
//---
   PlotIndexSetString(0,PLOT_LABEL,"Open;High;Low;Close");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferOpen,0);
      ArrayInitialize(BufferHigh,0);
      ArrayInitialize(BufferLow,0);
      ArrayInitialize(BufferClose,0);
      ArrayInitialize(BufferColors,2);
     }

   if(prev_calculated>0 && rates_total-prev_calculated>1)
      return 0;
   int i=fmax(0,prev_calculated-1);
   for(;i<rates_total && !IsStopped();i++)
     {
      MqlRates rates=GetDataBar(Symbol(),Period(),time[i],InpYearShift);
      BufferOpen[i]=rates.open;
      BufferHigh[i]=rates.high;
      BufferLow[i]=rates.low;
      BufferClose[i]=rates.close;
      BufferColors[i]=(BufferOpen[i]<BufferClose[i] ? 0 : BufferOpen[i]>BufferClose[i] ? 1 : 2);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Данные бара по указанному времени                                |
//| со смещением на указанное количество лет                         |
//+------------------------------------------------------------------+
MqlRates GetDataBar(const string symbol,const ENUM_TIMEFRAMES timeframe,const datetime time,const uint year_shift)
  {
   MqlRates rates[1];
   ZeroMemory(rates);
   datetime tm=GetTimeYearShift(time,year_shift);
   if(tm==0)
      return rates[0];
   CopyRates(symbol,timeframe,tm,1,rates);
   return rates[0];
  }
//+------------------------------------------------------------------+
//| Время со смещением на указанное количество лет                   |
//+------------------------------------------------------------------+
datetime GetTimeYearShift(const datetime time,const uint year_shift)
  {
   MqlDateTime tm={0};
   if(!TimeToStruct(time,tm))
      return 0;
   tm.year-=(int)year_shift;
   return StructToTime(tm);
  }
//+------------------------------------------------------------------+

Просто принцип. Без проверки на то, если день недели выпадает на выходной

 
Artyom Trishkin #:

В общем-то совсем не понятно что должен отображать индикатор. Нужно, чтобы в окне индикатора рисовались свечи со смещением на один год? Чтобы была возможность воочию видеть что было на графике год назад?

Тип рисуемой линии можно сделать DRAW_COLOR_CANDLES и на текущем времени (по времени индекса цикла) рисовать данные бара, у которого год меньше текущего на один. Правда, дни недели же не совпадают, поэтому точной даты получить нет возможности, и в этом случае можно просто не рисовать свечу.

спс смотрю. Нет.

Надо чтобы рядом с син линией с 01.01.2022 г по тек дату отображались цены открытий свечей линией которые идут с 01.01.2023 г по тек дату.  Для простоты визуального восприятия что было год назад и сейчас...

Цены открытия за 2022 г по дням. Линией. И тут же рядом график кот цены с 2023 - по тек дату.

 

Artyom Trishkin #:

..
Просто принцип. Без проверки на то, если день недели выпадает на выходной

спс - буду смотреть и писать. У себя по этому принципу смещения....
 
Roman Shiredchenko #:

спс смотрю. Нет.

Надо чтобы рядом с син линией с 01.01.2022 г по тек дату отображались цены открытий свечей линией которые идут с 01.01.2023 г по тек дату.  Для простоты визуального восприятия что было год назад и сейчас...

Цены открытия за 2022 г по дням. Линией. И тут же рядом график кот цены с 2023 - по тек дату.

типа как здесь - серым цветом - текущий год


Тогда нужно делать простой буфер-линию. Буферов должно быть столько, сколько линий нужно отобразить. В них записывать не данные из структуры цен, а просто Open с той даты, которую возвращает функция.

Ну как-то так:

//+------------------------------------------------------------------+
//|                                            TestOpenShiftYear.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   4
//--- plot Current
#property indicator_label1  "Current"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGray
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Year1
#property indicator_label2  "Year1"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDodgerBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- plot Year2
#property indicator_label3  "Year2"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrOrangeRed
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
//--- plot Year3
#property indicator_label4  "Year3"
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrLimeGreen
#property indicator_style4  STYLE_SOLID
#property indicator_width4  1
//--- input parameters
//input uint     InpYearShift1=1;
//input uint     InpYearShift2=2;
//input uint     InpYearShift3=3;
//--- indicator buffers
double         BufferCurrent[];
double         BufferYear1[];
double         BufferYear2[];
double         BufferYear3[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferCurrent,INDICATOR_DATA);
   SetIndexBuffer(1,BufferYear1,INDICATOR_DATA);
   SetIndexBuffer(2,BufferYear2,INDICATOR_DATA);
   SetIndexBuffer(3,BufferYear3,INDICATOR_DATA);
//---
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---
   PlotIndexSetString(0,PLOT_LABEL,"Текущий год");
   PlotIndexSetString(1,PLOT_LABEL,"1 год назад");
   PlotIndexSetString(2,PLOT_LABEL,"2 года назад");
   PlotIndexSetString(3,PLOT_LABEL,"3 года назад");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferCurrent,EMPTY_VALUE);
      ArrayInitialize(BufferYear1,EMPTY_VALUE);
      ArrayInitialize(BufferYear2,EMPTY_VALUE);
      ArrayInitialize(BufferYear3,EMPTY_VALUE);
     }

   if(prev_calculated>0 && rates_total-prev_calculated>1)
      return 0;
   int i=fmax(0,prev_calculated-1);
   for(;i<rates_total && !IsStopped();i++)
     {
      BufferCurrent[i]=open[i];
      BufferYear1[i]=GetDataOpen(Symbol(),Period(),time[i],1);
      BufferYear2[i]=GetDataOpen(Symbol(),Period(),time[i],2);
      BufferYear3[i]=GetDataOpen(Symbol(),Period(),time[i],3);
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Данные бара по указанному времени                                |
//| со смещением на указанное количество лет                         |
//+------------------------------------------------------------------+
double GetDataOpen(const string symbol,const ENUM_TIMEFRAMES timeframe,const datetime time,const uint year_shift)
  {
   double array[1]={EMPTY_VALUE};
   datetime tm=GetTimeYearShift(time,year_shift);
   if(tm==0)
      return array[0];
   return(CopyOpen(symbol,timeframe,tm,1,array)==1 ? array[0] : EMPTY_VALUE);
  }
//+------------------------------------------------------------------+
//| Время со смещением на указанное количество лет                   |
//+------------------------------------------------------------------+
datetime GetTimeYearShift(const datetime time,const uint year_shift)
  {
   MqlDateTime tm={0};
   if(!TimeToStruct(time,tm))
      return 0;
   tm.year-=(int)year_shift;
   return StructToTime(tm);
  }
//+------------------------------------------------------------------+
 

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

Ну а так вот:

Но данные рисует на графике любого периода:


 
Artyom Trishkin #:
сывать не данные из структуры цен, а
cпс - я понял.
 
Artyom Trishkin #:

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

Ну а так вот:

Но данные рисует на графике любого периода:


спс - я понял. Буду смотреть и делать....
 
Добрый день, так что-то никто и не ответил. Подскажите, пожалуйста, где в МТ-5 можно увидеть результаты тестирования стратегий? Меня интересует, день, час, минута сделок. В МТ-4 это раздел "результаты". Есть что-то подобное в МТ-5?
Причина обращения: