CopyBuffer копирует массив не полностью

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

Пытаюсь создать мультивалютный индикатор.

Использую 

CopyBuffer(Fast1MAHandle,0,0,calculated1,Fast1MABuffer);

Расчет calculated1 делаю

BarsCalculated(MAHandle)

Соответственно Fast1MABuffer должно быть скопировано calculated1 элементов массива. Но на деле при проверке Fast1MABuffer через 

ArraySize(Fast1MABuffer)

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

И еще один вопрос параллельный, почему 

BarsCalculated(MAHandle)

для всех 

   Fast1MAHandle=iMA(Symbol1,PERIOD_CURRENT,12,0,MODE_SMA,PRICE_CLOSE);
   Slow1MAHandle=iMA(Symbol1,PERIOD_CURRENT,26,0,MODE_SMA,PRICE_CLOSE);
   Fast2MAHandle=iMA(Symbol2,PERIOD_CURRENT,12,0,MODE_SMA,PRICE_CLOSE);
   Slow2MAHandle=iMA(Symbol2,PERIOD_CURRENT,26,0,MODE_SMA,PRICE_CLOSE); 

то есть, для разных валютных пар, получается одно и тоже число?

и 

ArraySize(Fast1MABuffer);

для всех Fast1MABuffer, Slow1MABuffer, Fast2MABuffer, Slow2MABuffer. Тоже в итоге один размер.

Файлы:
3.mq5 9 kb
Konstantin Nikitin
8491
Konstantin Nikitin  
Может так будет правильней
   int values_to_copy=(calculated1<calculated2 && calculated1<calculated3 && calculated1<calculated4) ? calculated1 :
                      (calculated2<calculated1 && calculated2<calculated3 && calculated2<calculated4) ? calculated2 :
                      (calculated3<calculated1 && calculated3<calculated2 && calculated3<calculated4) ? calculated3 : calculated4;

   if(CopyBuffer(Fast1MAHandle,0,0,values_to_copy,Fast1MABuffer) != values_to_copy ||
      CopyBuffer(Slow1MAHandle,0,0,values_to_copy,Slow1MABuffer) != values_to_copy ||
      CopyBuffer(Fast2MAHandle,0,0,values_to_copy,Fast2MABuffer) != values_to_copy ||
      CopyBuffer(Slow2MAHandle,0,0,values_to_copy,Slow2MABuffer) != values_to_copy )
      return(rates_total);
savabaka
206
savabaka  
Konstantin Nikitin:
Может так будет правильней

Возможно по условиям и будет правильнее, но почему же все таки 

CopyBuffer(Fast1MAHandle,0,0,values_to_copy,Fast1MABuffer)

копирует не все количество values_to_copy?

Konstantin Nikitin
8491
Konstantin Nikitin  
savabaka:

Возможно по условиям и будет правильнее, но почему же все таки 

копирует не все количество values_to_copy?

Где-то меньше бар. Как видите я выбрал минимальное число и его запустил в CopyBuffer

Aleksey Lebedev
7458
Aleksey Lebedev  
savabaka:то есть, для разных валютных пар, получается одно и тоже число?

Для каждой валюты свой индикатор, соответственно и Handle.

savabaka
206
savabaka  
Konstantin Nikitin:

Где-то меньше бар. Как видите я выбрал минимальное число и его запустил в CopyBuffer

С этим то я согласен, что где то меньше бар. Поэтому я и считываю количество бар в каждом хэндле индикатора iMA через BarsCalculated().

Это же значение (calculated1,2,3,4) я и указываю, при копировании каждого индивидуально массива. Но смысл в том, что после обработки всех CopyBuffer, получается один и тот же размер массива.

savabaka
206
savabaka  
Aleksey Lebedev:

Для каждой валюты свой индикатор, соответственно и Handle.

Это тоже ясно, но опять же для двух разных инструментов, для четырех Handle, в итоге выход один размер массивов после CopyBuffer.

Aleksey Lebedev
7458
Aleksey Lebedev  

ArraySize(Fast1MABuffer);// размер буфера индикатора, все они равны rates_total.

как-то так проверить:

int copy1=CopyBuffer(Fast1MAHandle,0,0,calculated1,Fast1MABuffer);

Print("copy1=",copy1);

Artyom Trishkin
Модератор
52282
Artyom Trishkin  
savabaka:

Возможно по условиям и будет правильнее, но почему же все таки 

копирует не все количество values_to_copy?

Сравните скопированное количество со значением rates_total и попробуйте сделать выводы.

savabaka
206
savabaka  
Aleksey Lebedev:

ArraySize(Fast1MABuffer);// размер буфера индикатора, все они равны rates_total.

как-то так проверить:

int copy1=CopyBuffer(Fast1MAHandle,0,0,calculated1,Fast1MABuffer);

Print("copy1=",copy1);

Вот вот именно. А при работе с двумя инструментами у нас выходит, что изначально rates_total у двух инструментов разный, это можно увидеть через BarsCalculated().

Но именно после CopyBuffer с копированием разного количество баров (calculated1,2,3,4) в буффер, выходит что по обоим инструментам размер буфера становится одинаковым. 

Konstantin Nikitin
8491
Konstantin Nikitin  

Как-то так

//+------------------------------------------------------------------+
//|                                                            3.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2

#property indicator_label1  "Line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "Line2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

double         Line1Buffer[];
double         Fast1MABuffer[];
double         Slow1MABuffer[];

double         Line2Buffer[];
double         Fast2MABuffer[];
double         Slow2MABuffer[];

int            Fast1MAHandle;
int            Slow1MAHandle;
int            Fast2MAHandle;
int            Slow2MAHandle;

input string Symbol1="EURUSD";
input string Symbol2="GBPUSD";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,Line1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,Line2Buffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,(int)(SymbolInfoInteger(Symbol1,SYMBOL_DIGITS)<SymbolInfoInteger(Symbol2,SYMBOL_DIGITS) ?
                                                 SymbolInfoInteger(Symbol2,SYMBOL_DIGITS) : SymbolInfoInteger(Symbol1,SYMBOL_DIGITS)));
   ArraySetAsSeries(Line1Buffer,  true);
   ArraySetAsSeries(Line2Buffer,  true);
   ArraySetAsSeries(Fast1MABuffer,true);
   ArraySetAsSeries(Slow1MABuffer,true);
   ArraySetAsSeries(Fast2MABuffer,true);
   ArraySetAsSeries(Slow2MABuffer,true);

   Fast1MAHandle=iMA(Symbol1,PERIOD_CURRENT,12,0,MODE_SMA,PRICE_CLOSE);
   Slow1MAHandle=iMA(Symbol1,PERIOD_CURRENT,26,0,MODE_SMA,PRICE_CLOSE);
   Fast2MAHandle=iMA(Symbol2,PERIOD_CURRENT,12,0,MODE_SMA,PRICE_CLOSE);
   Slow2MAHandle=iMA(Symbol2,PERIOD_CURRENT,26,0,MODE_SMA,PRICE_CLOSE);

   IndicatorSetString(INDICATOR_SHORTNAME,"Индикатор №3: "+Symbol1+"/"+Symbol2);

   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=0;
   if(prev_calculated==0)
     {
      limit=BCalc(Fast1MAHandle);
      int _limit=BCalc(Slow1MAHandle);
      if(limit>_limit)
         limit=_limit;
      _limit=BCalc(Fast2MAHandle);
      if(limit>_limit)
         limit=_limit;
      _limit=BCalc(Slow2MAHandle);
      if(limit>_limit)
         limit=_limit;
     }
   else
      limit=rates_total-prev_calculated;
   if(limit<2)
      limit=2;

   ZeroMemory( Fast1MABuffer );
   ZeroMemory( Slow1MABuffer );
   ZeroMemory( Fast2MABuffer );
   ZeroMemory( Slow2MABuffer );
   if(CopyBuffer(Fast1MAHandle,0,0,limit,Fast1MABuffer) != limit ||
      CopyBuffer(Slow1MAHandle,0,0,limit,Slow1MABuffer) != limit ||
      CopyBuffer(Fast2MAHandle,0,0,limit,Fast2MABuffer) != limit ||
      CopyBuffer(Slow2MAHandle,0,0,limit,Slow2MABuffer) != limit )
      return(rates_total);
   for(int i=0;i<limit && !IsStopped();i++)
     {
      Line1Buffer[i]=Fast1MABuffer[i]-Slow1MABuffer[i];
      Line2Buffer[i]=Fast2MABuffer[i]-Slow2MABuffer[i];
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int BCalc(const int MAHandle)
  {
   int BCalc=BarsCalculated(MAHandle);
   if(BCalc<=0)
     {
      PrintFormat("BarsCalculated() вернул %d, код ошибки %d",BCalc,GetLastError());
      return(0);
     }
   return(BCalc);
  }
//+------------------------------------------------------------------+

Дальше сами ловите что не так.

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