Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1134

 
Alexandr Nevadovschi:

Уважаемые программисты прошу помочь новичку в этом деле.

с‌оветник последовательно через определенное время открывает ордера как на покупку так на продажу. Мне нужно чтоб он после открытия последнего ордера модифицировал все предыдущие,(ну если уже конкретно,то чтоб у всех предыдущих закрытие осуществлялось по тейкпрофиту последнего. Т.е.  если последний бай а предыдущий селл, то у предыдущего стоп лос ставится на уровень тейкпрофита последнего,

если предыдущий бай то его тейпрофит ставится на уровень последнего тейкпрофита. ну и т.д. Смысл в том, что при наступлении тейкпрофита последнего ордера должны закрыться все ордера.).

Надеюсь объяснил понятно, хотя трудно понимаю как это реализовать. Заранее спасибо.

Я‌ понимаю что можно перебрать  все открытые ордера и модифицировать но как пропустить последний?

Самое главное во всём этом, это понимание того, что должно происходить.

Что такое "последний ордер"? Последний по времени открытия? Или по уровню цены открытия?

А если посчитать "последним" ордер BUY а цена пойдёт на йух? Или наоборот, последний будет SELL а цена прёт на север? Тогда какой надо считать последним? Вот именно это и надо понять для реализации задуманного.‌

 

Здравствуйте. Если за ране не знать сколько элементов будет в массиве, как объявлять массив, чтобы увеличивался массив с каждым новым элементом?

Пример для того чтобы понятнее было:

double HighA[]; // ??????????????????

for(int i=0; i<1000; i++)
{
if(A[i]<B[i])
HighA[i]=A[i];
}
Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

 
Nauris Zukas:

Здравствуйте. Если за ране не знать сколько элементов будет в массиве, как объявлять массив, чтобы увеличивался массив с каждым новым элементом?

Пример для того чтобы понятнее было:

double HighA[]; // ??????????????????

for(int i=0; i<1000; i++)
{
if(A[i]<B[i])
HighA[i]=A[i];
}
Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

Чаще надо читать документацию.
ArrayResize - Операции с массивами - Справочник MQL4
ArrayResize - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArrayResize - Операции с массивами - Справочник MQL4
 
Alexey Viktorov:
Чаще надо читать документацию.

Я читал и пробовал но получал ошибку "array out of range". На примере это выглядела так:

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[i]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Nauris Zukas:

Я читал и пробовал но получал ошибку "array out of range". На примере это выглядела так:

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[i]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

‌Когда не выполняется условие A[i] < B[i] размер массива остаётся неизменным, а счётчик цикла увеличивается. Потому и выход за пределы...

Так попробуй

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            int size = ArraySize(HighA);
            ArrayResize(HighA, size+1);
            HighA[size]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


 
Alexey Viktorov:

‌Когда не выполняется условие A[i] < B[i] размер массива остаётся неизменным, а счётчик цикла увеличивается. Потому и выход за пределы...

Так попробуй

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            int size = ArraySize(HighA);
            ArrayResize(HighA, size+1);
            HighA[size]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


Спасибо! Теперь все работает!
 
Nauris Zukas:

Я читал и пробовал но получал ошибку "array out of range". На примере это выглядела так:

      double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[i]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));

Ну так будет работать быстрее

  int countHlines=0;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[countHlines-1]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


// Вариант №2
  int countHlines=-1;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines+1);
            HighA[countHlines]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
 
Vitaly Muzichenko:

Ну так будет работать быстрее

  int countHlines=0;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines);
            HighA[countHlines-1]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));


// Вариант №2
  int countHlines=-1;
  double HighA[];
      for(int i=0; i<1000; i++)
        {
         if(A[i]<B[i])
           {
            countHlines++;
            ArrayResize(HighA,countHlines+1);
            HighA[countHlines]=A[i];
           }
        }
      Print(">>>>>>>>>>>..ArraySize(HighA)= ",ArraySize(HighA));
Спасибо, ясно! Будет работать быстрее из за ArraySize, это как-то замедляет?
 
Nauris Zukas:
Спасибо, ясно! Будет работать быстрее из за ArraySize, это как-то замедляет?
Незначительно, но зато понятно и застрахован от ошибки.
 
Alexey Viktorov:
Незначительно, но зато понятно и застрахован от ошибки.
Спасибо!