Перебор полученных значений в цикле

 

Индикатор
Есть полученные значения в цикле для  ProfitBuy и ProfitSell
Если смотреть Print() внутри этого цикла, то видно  в журнале все эти полученные значения перебором за весь период
А если  Print() за пределами этого цикла, то видно только последнее полученное значение

Подскажите, как сделать перебор всех полученных значений за пределами этого цикла?
Требуется вытащить все полученные значения ProfitBuy и ProfitSell

int ProfitBuy,ProfitSell;
double PriceBuy,PriceSell;

void start()
{
   for(i=limit-1; i>=0; i--) 
   {
   double ArrowBuy=iCustom(Symbol(),0,"Indicator", 0,i);
   double ArrowSell=iCustom(Symbol(),0,"Indicator", 1,i);

      if(ArrowBuy!=0.0 && PriceBuy==0.0) PriceBuy=Open[i];
      if(ArrowSell!=0.0 && PriceSell==0.0) PriceSell=Open[i];

        if(PriceBuy!=0.0 && PriceSell!=0.0)
          {
        if(PriceSell>PriceBuy) ProfitBuy++;
        if(PriceBuy>PriceSell) ProfitSell++;
           PriceBuy=0.0;
           PriceSell=0.0;
          }
   }//limit END
}//start END
 

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

int ProfitBuy[],ProfitSell[];
double PriceBuy,PriceSell;

void start()
{
   int nTotal = iBars(NULL, PERIOD_CURRENT);
   if (ArraySize(ProfitBuy) != nTotal || ArraySize(ProfitSell) != nTotal)
      if (ArrayResize(ProfitBuy, nTotal, ARRAY_RESERVE_SIZE) != nTotal || ArrayResize(ProfitSell, nTotal, ARRAY_RESERVE_SIZE) != nTotal)
      {
          Print("Fail");
          return;
      }

   for(i=limit-1; i>=0; i--) 
   {
   double ArrowBuy=iCustom(Symbol(),0,"Indicator", 0,i);
   double ArrowSell=iCustom(Symbol(),0,"Indicator", 1,i);

      if(ArrowBuy!=0.0 && PriceBuy==0.0) PriceBuy=Open[i];
      if(ArrowSell!=0.0 && PriceSell==0.0) PriceSell=Open[i];

        if(PriceBuy!=0.0 && PriceSell!=0.0)
          {
        if(PriceSell>PriceBuy) ProfitBuy[i] = ProfitBuy[i + 1] + 1;
        if(PriceBuy>PriceSell) ProfitSell[i] = ProfitSell[i + 1] + 1;
           PriceBuy=0.0;
           PriceSell=0.0;
          }
   }//limit END
}//start END

Не проверял. Вполне возможно, что будут выходы за пределы массива, т. е. нужно добавить соответствующие проверки. Также при регистрации нового бара переместить значения элементов массивов вверх.

 
Ihor Herasko:

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

С этим не сложно разобраться

Ihor Herasko:

Не проверял.

Тоже пока не проверял, но как я буду получать весь перечень полученных значений за циклом, вот в чём вопрос?

        if(PriceSell>PriceBuy) ProfitBuy[i] = ProfitBuy[i + 1] + 1;
        if(PriceBuy>PriceSell) ProfitSell[i] = ProfitSell[i + 1] + 1;

   }//limit END
Далее здесь требуется получать все данные по истории
для
ProfitBuy[i] 
и
ProfitSell[i]
 
Ihor Herasko:

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

Сделал по другому, теперь за циклом "limit" в журнале я вижу все полученные значения

И появилась новая проблема, получаю не окончательное значение а все подряд до итога, т.е. (1,2,3,4,5,6...итог 250)
Как забирать только максимальное полученное значение (250, 332, 180, 460....)?
Эти максимальные значения получаются после подмены параметров индикатора на каждом тике (типа тестер сигналов)

//ИНДИКАТОР СИГНАЛ СТРЕЛКИ
#property indicator_chart_window
#property indicator_buffers 2

int n,b,s;
double ProfitBuy[],ProfitSell[];
double PriceBuy,PriceSell;

void init()
{
   SetIndexBuffer(0,ProfitBuy);  SetIndexStyle(0,DRAW_NONE);
   SetIndexBuffer(1,ProfitSell); SetIndexStyle(1,DRAW_NONE);
}//init END
   
void start()
{
   for(i=limit-1; i>=0; i--) 
   {
   double ArrowBuy=iCustom(Symbol(),0,"Indicator", 0,i);
   double ArrowSell=iCustom(Symbol(),0,"Indicator", 1,i);

      if(ArrowBuy!=0.0 && PriceBuy==0.0) PriceBuy=Open[i];
      if(ArrowSell!=0.0 && PriceSell==0.0) PriceSell=Open[i];

        if(PriceBuy!=0.0 && PriceSell!=0.0)
          {
           n++;
        if(PriceSell>PriceBuy) {b++; ProfitBuy[n]=b;}
        if(PriceBuy>PriceSell) {s++; ProfitSell[n]=s;}
           PriceBuy=0.0;
           PriceSell=0.0;
          }
   }//limit END
   
   int ProfitB=0,ProfitS=0;
   for(int j=0; j<n; j++) 
      {
      if(ProfitBuy[j]!=EMPTY_VALUE) ProfitB=int(ProfitBuy[j]);
      if(ProfitSell[j]!=EMPTY_VALUE) ProfitS=int(ProfitSell[j]);
      
         Print("Профитных BUY = " +ProfitB+
            " / Профитных SELL = "+ProfitS);
      }
}//start END
 
forex2030:

Как забирать только максимальное полученное значение (250, 332, 180, 460....)?

Отсортировать полученный массив. Даже функция есть - ArraySort().

 
Ihor Herasko:

Отсортировать полученный массив. Даже функция есть - ArraySort().

Непонятное значение в итоге: 

ArraySort(ProfitBuy) = 17194 (должно быть 198)
ProfitB = 198

 if(ProfitBuy[j]!=EMPTY_VALUE) Print("ПРОВЕРКА == "+ArraySort(ProfitBuy)+" == "+ProfitB);


 
forex2030:

Непонятное значение в итоге: 

ArraySort(ProfitBuy) = 17194 (должно быть 198)
ProfitB = 198


Вы смотрели в документации, что возвращает ArraySort?

 
Ihor Herasko:

Вы смотрели в документации, что возвращает ArraySort?

Зачем смотреть доку, когда можно спросить на форуме!

 
Evgeny Belyaev:

Зачем смотреть доку, когда можно спросить на форуме!

На форуме понятней где копать чем в документации))

Ihor Herasko:

Вы смотрели в документации, что возвращает ArraySort?

Сортирует многомерный числовой массив по возрастанию значений в первом измерении.
Мне это ни о чём не говорит))
 
forex2030:

На форуме понятней где копать чем в документации))

Сортирует многомерный числовой массив по возрастанию значений в первом измерении.
Мне это ни о чём не говорит))

Ну как же Вы тогда тользуетесь функцией, если ее описание ни о чем не говорит? ))

Подсказка: смотреть нужно сигнатуру функции и описание возвращаемого значения, там все ответы, а не в общем описании. 

 
Ihor Herasko:

Подсказка: смотреть нужно сигнатуру функции и описание возвращаемого значения, там все ответы, а не в общем описании. 

А примером можно помочь?))
Если не понятна суть функции, то и описание не прояснит ситуацию.

Причина обращения: