Рассчитать стандартное отклонение в MQL из пользовательского массива - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь рассчитать более низкий 2SD и более высокий 2SD для соотношения цены для двух инструментов, однако он дает мне 0 результатов.Ожидаемые результаты выглядят так. введите описание изображения здесь

Я попытался создать массив, объявив массив в глобальной области видимости, а затем добавив к нему значения, однако он дает мне ноль в качестве значения, я также пытался добавитьзначения вручную, чтобы проверить, работает ли он, но функция StdDev также дает мне те же результаты.Буду очень признателен за любую помощь, которая поможет мне понять, где я неправ.Это коды, которые я попробовал, но не дал мне никакого результата.

d [z] = iClose (sym1,0, z) / iClose (sym2,0, z);

c = iStdDevOnArray (iClose (sym1,0, z), 0, z, 0,0, z);

Код, который я развертываю, приведен ниже.

#property indicator_separate_window
#property indicator_buffers 4
extern string sym1    = "AUDUSD";
extern string sym2    = "NZDUSD";
extern int barcount     = 500;

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];

//Global Variables
int ArrayIndex;
double ArraySum;
double a = 0;
double b=0;
double c=0;
double lowersd=0;
double highersd=0;


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,EMPTY,2,clrYellow);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE,EMPTY,2,clrRed);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexStyle(2,DRAW_LINE,EMPTY,2,clrGreen);
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexStyle(3,DRAW_LINE,EMPTY,2,clrPink);
   SetIndexBuffer(3,ExtMapBuffer4);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()


  {

//----
   for(int z=0;z<barcount;z++)
  {
  // To calculate the average of the ratio
   a=iClose(sym1,0,z)+a; 
   // Alert(d[0]);
   b=iClose(sym2,0,z)+b;
  // Below are the dummy data to create the chart
   lowersd =  1.04;
   highersd = 1.115;

   }

   for(int i=0;i<barcount;i++)
  {

   ExtMapBuffer1[i] = iClose(sym1,0,i)/iClose(sym2,0,i);
   ExtMapBuffer2[i] = (a/b);
   ExtMapBuffer3[i] = lowersd; // these are dummy values i am trying to populate this dynamically using the non working code above.
   ExtMapBuffer4[i] = highersd;

   }

//----
   return(0);

  }

1 Ответ

0 голосов
/ 15 декабря 2018

Вы можете использовать это, чтобы сначала инициализировать массив

  double arr[];
  ArrayResize(arr, barcount);
  arr[z] = iClose(sym1,0,z)/iClose(sym2,0,z);
  c=iStdDevOnArray(arr,barcount,barcount,0,MODE_EMA,0);

Затем вы можете поместить это значение в ExtBuffer

   ExtMapBuffer3[i] = (a/b)-(c*2);
   ExtMapBuffer4[i] = (a/b)+(c*2);
...