Двумерный массив. Сложности с заполнением переменными(MQL4)

 

Разбиваю определенный диапазон на 10 частей. Вычисляю сколько закрытий в каждом диапазоне. 

Пробую заполнить массив в первом элементе количеством закрытий(Su1,Su2,Su3....) , во втором измерении заполнять константами(1,2,3...10). 

Выходит ошибка "constant expression required", то есть получается значения должны быть константами(постоянными). Потом, когда получится буду сортировать по первому измерению. Что делать, чтобы осуществить?

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
extern int       q         =150;//кол-во элементов для поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
int minbar=0,maxbar=0;  
double Minimum=0.0,Maximum=0.0,Dip10=0.0;
double d1=0.0, d2=0.0, d3=0.0, d4=0.0, d5=0.0, d6=0.0, d7=0.0, d8=0.0, d9=0.0, d10=0.0, d11=0.0;
double Su1=0,Su2=0,Su3=0,Su4=0,Su5=0,Su6=0,Su7=0,Su8=0,Su9=0,Su10=0;
double Low_[];
double High_[];
ArraySetAsSeries(Low_,true);
ArraySetAsSeries(High_,true);
CopyLow(_Symbol,_Period,0,q,Low_); // теперь в массиве Low "k" элементов 
CopyHigh(_Symbol,_Period,0,q,High_); // теперь в массиве Low "k" элементов 
minbar=ArrayMinimum(Low_);           // индекс бара с минимальным значением
maxbar=ArrayMaximum(High_);
Minimum=Low_[ArrayMinimum(Low_)];  // найдено значение Low минимального бара
Maximum=High_[ArrayMaximum(High_)];// найдено значение High минимального бара
Dip10=(Maximum-Minimum)/10.0;
d1 =Minimum;
d2 =d1+Dip10;
d3 =d2+Dip10;
d4 =d3+Dip10;
d5 =d4+Dip10;
d6 =d5+Dip10;
d7 =d6+Dip10;
d8 =d7+Dip10;
d9 =d8+Dip10;
d10=d9+Dip10;
d11=Maximum;  
for (int k=q;k>0;k--)
   {
   if (Close[k] > d1 && Close[k] < d2){Su1=Su1+1;}
   if (Close[k] > d2 && Close[k] < d3){Su2=Su2+1;}
   if (Close[k] > d3 && Close[k] < d4){Su3=Su3+1;}
   if (Close[k] > d4 && Close[k] < d5){Su4=Su4+1;}
   if (Close[k] > d5 && Close[k] < d6){Su5=Su5+1;}
   if (Close[k] > d6 && Close[k] < d7){Su6=Su6+1;}
   if (Close[k] > d7 && Close[k] < d8){Su7=Su7+1;}
   if (Close[k] > d8 && Close[k] < d9){Su8=Su8+1;}
   if (Close[k] > d9 && Close[k] <d10){Su9=Su9+1;}
   if (Close[k] >d10 && Close[k] <d11){Su10=Su10+1;}
   } 
double M[10][2]={{2,1},{3,2},{57,3},{12,4},{11,5},{7,6},{3,7},{57,8},{12,9},{11,10}}; 

  }
//+------------------------------------------------------------------+
 
Так никто не ответил. За это время придумал сам. Немного громоздко получилось, но работает.
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
extern int       q         =150;//кол-во элементов для поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
int minbar=0, maxbar=0, index=0;  
double Minimum=0.0,Maximum=0.0,Dip10=0.0;
double Low_[];
double High_[];
ArraySetAsSeries(Low_,true);
ArraySetAsSeries(High_,true);
CopyLow(_Symbol,_Period,0,q,Low_); // теперь в массиве Low "k" элементов 
CopyHigh(_Symbol,_Period,0,q,High_); // теперь в массиве Low "k" элементов 
minbar=ArrayMinimum(Low_);           // индекс бара с минимальным значением
maxbar=ArrayMaximum(High_);
Minimum=Low_[ArrayMinimum(Low_)];  // найдено значение Low минимального бара
Maximum=High_[ArrayMaximum(High_)];// найдено значение High минимального бара
Dip10=(Maximum-Minimum)/10.0;
double d[11]; 
ArrayInitialize(d,0);
d[0] =Minimum;
d[1] =d[0]+Dip10;
d[2] =d[1]+Dip10;
d[3] =d[2]+Dip10;
d[4] =d[3]+Dip10;
d[5] =d[4]+Dip10;
d[6] =d[5]+Dip10;
d[7] =d[6]+Dip10;
d[8] =d[7]+Dip10;
d[9]= d[8]+Dip10;
d[10]=Maximum;  
double M[10]; 
double Mn[10]; 
double Su[10];
double Mi[10];
ArrayInitialize(M,0);
ArrayInitialize(Su,0);
ArrayInitialize(Mn,0);
ArrayInitialize(Mi,0);
for (int k=q;k>1;k--)
   {
   if (Close[k] > d[0] && Close[k] < d[1]){Su[0]=Su[0]+1;}
   if (Close[k] > d[1] && Close[k] < d[2]){Su[1]=Su[1]+1;}
   if (Close[k] > d[2] && Close[k] < d[3]){Su[2]=Su[2]+1;}
   if (Close[k] > d[3] && Close[k] < d[4]){Su[3]=Su[3]+1;}
   if (Close[k] > d[4] && Close[k] < d[5]){Su[4]=Su[4]+1;}
   if (Close[k] > d[5] && Close[k] < d[6]){Su[5]=Su[5]+1;}
   if (Close[k] > d[6] && Close[k] < d[7]){Su[6]=Su[6]+1;}
   if (Close[k] > d[7] && Close[k] < d[8]){Su[7]=Su[7]+1;}
   if (Close[k] > d[8] && Close[k] < d[9]){Su[8]=Su[8]+1;}
   if (Close[k] > d[9] && Close[k] < d[10]){Su[9]=Su[9]+1;}
   } 
M[0]=Su[0];
M[1]=Su[1];
M[2]=Su[2];
M[3]=Su[3];
M[4]=Su[4];
M[5]=Su[5];
M[6]=Su[6];
M[7]=Su[7];
M[8]=Su[8];
M[9]=Su[9];
Mn[0]=Su[0];
Mn[1]=Su[1];
Mn[2]=Su[2];
Mn[3]=Su[3];
Mn[4]=Su[4];
Mn[5]=Su[5];
Mn[6]=Su[6];
Mn[7]=Su[7];
Mn[8]=Su[8];
Mn[9]=Su[9];
ArraySort(M,10,0,MODE_DESCEND); 
Print("M[0]=",M[0],"M[1]=",M[1],"M[2]=",M[2],"M[3]=",M[3],"M[4]=",M[4],"M[5]=",M[5],"M[6]=",M[6],"M[7]=",M[7],"M[8]=",M[8],"M[9]=",M[9]);
Print("Mn[0]=",Mn[0],"Mn[1]=",Mn[1],"Mn[2]=",Mn[2],"Mn[3]=",Mn[3],"Mn[4]=",Mn[4],"Mn[5]=",Mn[5],"Mn[6]=",Mn[6],"Mn[7]=",Mn[7],"Mn[8]=",Mn[8],"Mn[9]=",Mn[9]);
for (int x=9;x>=0;x--)
{
for (int y=9;y>=0;y--)
{
if (M[x]==Mn[y]){Mi[x]=y;break;}
}
}
Print("Mi[0]",Mi[0],"Mi[1]=",Mi[1],"Mi[2]=",Mi[2],"Mi[3]=",Mi[3],"Mi[4]=",Mi[4]);
Print("Mi[5]",Mi[5],"Mi[6]=",Mi[6],"Mi[7]=",Mi[7],"Mi[8]=",Mi[8],"Mi[9]=",Mi[9]);
if (Close[1] > d[0] && Close[1] < d[1]){index=0;}
if (Close[1] > d[1] && Close[1] < d[2]){index=1;}
if (Close[1] > d[2] && Close[1] < d[3]){index=2;}
if (Close[1] > d[3] && Close[1] < d[4]){index=3;}
if (Close[1] > d[4] && Close[1] < d[5]){index=4;}
if (Close[1] > d[5] && Close[1] < d[6]){index=5;}
if (Close[1] > d[6] && Close[1] < d[7]){index=6;}
if (Close[1] > d[7] && Close[1] < d[8]){index=7;}
if (Close[1] > d[8] && Close[1] < d[9]){index=8;}
if (Close[1] > d[9] && Close[1] < d[10]){index=9;}
Print("index=",index);
  }
//+------------------------------------------------------------------+
 

Никто не ответил, потому-что вопрос непонятен. Код из первого поста компилируется без ошибок. В чем проблема и в каком месте непонятно.

Не совсем по делу, вот это вот:

double d1=0.0, d2=0.0, d3=0.0, d4=0.0, d5=0.0, d6=0.0, d7=0.0, d8=0.0, d9=0.0, d10=0.0, d11=0.0;
double Su0=0,Su1=0,Su2=0,Su3=0,Su4=0,Su5=0,Su6=0,Su7=0,Su8=0,Su9=0;

 Замените на массивы.

--

Елси в двухмерном массиве надо масштабировать второй измерение, то надо использовать структуру. В структуре массив, потом массив структур. 

 
Dmitry Fedoseev:

Никто не ответил, потому-что вопрос непонятен. Код из первого поста компилируется без ошибок. В чем проблема и в каком месте непонятно.

Не совсем по делу, вот это вот:

 Замените на массивы.

--

Елси в двухмерном массиве надо масштабировать второй измерение, то надо использовать структуру. В структуре массив, потом массив структур. 

Подправил предыдущее сообщение. Заменил на массивы переменные, строк меньше стало.

Нужно было посчитать сколько было закрытий в каждом диапазоне, поместить значения в буфер и отсортировать его. Цель была задать значение в оптимизации от 0 до 9 индекса буфера. В нулевом индексе самое большое значение в 9 самое маленькое и попробовать фильтровать сделки на этой основе. 

Протестировал улучшений не нашел. Вероятно нет там в этом измерении рыбы. 

 
forexman77:

Подправил предыдущее сообщение. Заменил на массивы переменные, строк меньше стало.

Используйте циклы. Строк будет еще меньше...)
 
Alexey Kozitsyn:
Используйте циклы. Строк будет еще меньше...)
Ну, да в принципе массивы М[], Mn[], d[] можно циклом заполнить. 
 
forexman77:
Ну, да в принципе массивы М[], Mn[], d[] можно циклом заполнить. 
И не только...
 
Alexey Kozitsyn:
И не только...
Там вроде рыбы нет, можно не заморачиваться. Но, на будущее учту.
 
forexman77:
Там вроде рыбы нет, можно не заморачиваться. Но, на будущее учту.
Просто представьте, что диапазон нужно будет разбить не на 10 частей, а на 100... Только циклы.
 
Alexey Kozitsyn:
Просто представьте, что диапазон нужно будет разбить не на 10 частей, а на 100... Только циклы.
Ну, 100 это будет круто)