CopyBuffer - меняется направление считываемого массива

 

Добрый день.

Обратил внимание, что иногда  CopyBuffer получает в массив buffer данные указанного буфера указанного индикатора в другом направлении.

Иногда в [0] элементе находится последняя свеча. Иногда последняя свеча находится в [N] элементе. Команд для смены ориентации не было.

В чем может быть дело?

 
knodit:

Добрый день.

Обратил внимание, что иногда  CopyBuffer получает в массив buffer данные указанного буфера указанного индикатора в другом направлении.

Иногда в [0] элементе находится последняя свеча. Иногда последняя свеча находится в [N] элементе. Команд для смены ориентации не было.

В чем может быть дело?

на всякий случай, направление точно стоит перед копированием?

 
MQ можно много в чем обвинять, как зачем по умолчанию считается с начала, ведь реально это никто не использует
 
knodit:

Добрый день.

Обратил внимание, что иногда  CopyBuffer получает в массив buffer данные указанного буфера указанного индикатора в другом направлении.

Иногда в [0] элементе находится последняя свеча. Иногда последняя свеча находится в [N] элементе. Команд для смены ориентации не было.

В чем может быть дело?

хинт, овеянный в документации - если не уверены в какую сторону индексируется массив, выставьте принудительно, 

что в перевод с менеджерского на прикладной- до вызова стандартных функций 5-ки ,ткни ArraySetAsSeries(x,false), а потом как тебе надо

 
lynxntech #:

на всякий случай, направление точно стоит перед копированием?

Пардон. Фигню написал. Фигню удалил. Возникли вопросы по получению данных, буду разбираться.
 
Maxim Kuznetsov #:

хинт, овеянный в документации - если не уверены в какую сторону индексируется массив, выставьте принудительно, 

что в перевод с менеджерского на прикладной- до вызова стандартных функций 5-ки ,ткни ArraySetAsSeries(x,false), а потом как тебе надо

Спасибо! Еще не пробовал, но звучит многообещающе! ))
 
knodit:

Добрый день.

Обратил внимание, что иногда  CopyBuffer получает в массив buffer данные указанного буфера указанного индикатора в другом направлении.

Иногда в [0] элементе находится последняя свеча. Иногда последняя свеча находится в [N] элементе. Команд для смены ориентации не было.

В чем может быть дело?

Дело в вашей невнимательности. Просто так само по себе направление не может меняться.

 
Maxim Kuznetsov #:

хинт, овеянный в документации - если не уверены в какую сторону индексируется массив, выставьте принудительно, 

что в перевод с менеджерского на прикладной- до вызова стандартных функций 5-ки ,ткни ArraySetAsSeries(x,false), а потом как тебе надо

Очередная глупость. Это же каким надо  быть великим программистом, чтобы быть неуверенным в какую, сторону индексируется массив?

 

По всей документации, эти предложения идут вместе. Не пренебрегайте этим

MqlRates rates[];
ArraySetAsSeries(rates,true); // последние сначала
 
Просто не используйте ArraySetAsSeries() вообще, категорически, и будете избавлены от огромного количества заморочек. 
 

Исходный код и скрины с дебагера

К вопросу, что у настоящих кодеров "все всегда хорошо".

Код

//+------------------------------------------------------------------+
//|                                                     sov_test.mq5 |
//|                                  Copyright 2022, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//+------------------------------------------------------------------+
//|                            MACD                                  |
//+------------------------------------------------------------------+
input int                  fast_ema_period=12;        // MACD период быстрой средней 
input int                  slow_ema_period=26;        // MACD период медленной средней
input int                  signal_period=9;           // MACD период усреднения разности
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // MACD тип цены  
//--- индикаторные буферы
double        MACDBufferWork[];
double        MACDSignalBufferWork[];
//--- переменная для хранения хэндла индикатора iMACD
int   MACD_handleWork;


//+------------------------------------------------------------------+
//|                            MA                                    |
//+------------------------------------------------------------------+
input int                  ma_period=9;                 // MA период средней. //************** Можно поподбирать оптимальное значение
input int                  ma_shift=0;                   // MA смещение
input ENUM_MA_METHOD       ma_method=MODE_SMA;           // MA тип сглаживания
//--- индикаторный буфер
double        MABufferWork[];
//--- переменная для хранения хэндла индикатора iMA
int    MA_handleWork;

string   symbol;
ENUM_TIMEFRAMES periodWork;
//----------------------------- Буферы для чтения данных по индикаторам
//--- MACD
double MACDWork[3];
//--- MA
double MAWork[3];

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {     
     periodWork=PERIOD_M15; 
     symbol="GBPUSD";  
  
//-----------------------------------------------------------------------------------------------------------------------
//******************************************** MACD  **************************************************|   
//-----------------------------------------------------------------------------------------------------------------------     
                SetIndexBuffer(0,MACDBufferWork,INDICATOR_CALCULATIONS);               
                SetIndexBuffer(1,MACDSignalBufferWork,INDICATOR_CALCULATIONS);              
  
                MACD_handleWork=iMACD(symbol,periodWork,fast_ema_period,slow_ema_period,signal_period,applied_price);   
                if(MACD_handleWork==INVALID_HANDLE)
                     {      
                      PrintFormat("Не удалось создать хэндл индикатора iMACD для пары %s/%s, код ошибки %d",
                                   symbol,
                                   EnumToString(periodWork),
                                   GetLastError());      
                      return(INIT_FAILED);
                     }
//-----------------------------------------------------------------------------------------------------------------------
//******************************************** MA  ****************************************************|   
//-----------------------------------------------------------------------------------------------------------------------
               SetIndexBuffer(2,MABufferWork,INDICATOR_DATA);               
               MA_handleWork=iMA(symbol,periodWork,ma_period,ma_shift,ma_method,applied_price);
               if (MA_handleWork==INVALID_HANDLE)
                   { 
                     PrintFormat("Не удалось создать хэндл индикатора iMA для пары %s/%s, код ошибки %d",
                                  symbol,
                                  EnumToString(periodWork),
                                  GetLastError());      
                     return(INIT_FAILED);
                   }                   
               
               CopyBuffer(MA_handleWork,0,0,3,MAWork);
               CopyBuffer(MACD_handleWork,0,0,3,MACDWork); 
 


   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    CopyBuffer(MA_handleWork,0,0,3,MAWork);
    CopyBuffer(MACD_handleWork,0,0,3,MACDWork);
  }


Скрины

MA


MACD


Как несложно убедиться, после CopyBuffer в [0] совсем не значение с текущей свечи.