Разделение открытых позиций на группы - страница 5

 
Alexey Viktorov:

При большом количестве чего? Элементов массива которые заполняются даже не на каждом тике? Чем будет заметно?

Глаз режет этот код, как будто специально сделано хуже.

Ну если разницы нету, давайте сделаем так:

for(int i = 0; i < 10; i++)
   {
    ArrayResize(arrTest, i+1);
    arrTest[i][0] = iOpen(_Symbol, PERIOD_CURRENT, i);
    arrTest[i][1] = iClose(_Symbol, PERIOD_CURRENT, i);

    for(int j=0;j<100;j++)
    Sleep(1);
   }

Почему не так?

ArrayResize(arrTest, 10);
for(int i = 0; i < 10; i++)
  {
    arrTest[i][0] = iOpen(_Symbol, PERIOD_CURRENT, i);
    arrTest[i][1] = iClose(_Symbol, PERIOD_CURRENT, i);
  }
 
Aliaksandr Hryshyn:

Глаз режет этот код, как будто специально сделано хуже.

Ну если разницы нету, давайте сделаем так:

Зачем?

ps; Ааа, тогда понятно. Ну, это-же пример. Когда будет заполнение рабочего массива, наверняка будет заполнение по одному индексу. Не тот вариант где надо обращать внимание на такие тонкости.
 
Alexey Viktorov:

Зачем?

Наверное по той причине, почему у вас изменение массива внутри цикла при заранее известном размере.

А какая точно причина я не знаю :).

Вы ведь фрилансите! Ужас :).

 
Aliaksandr Hryshyn:

Наверное по той причине, почему у вас изменение массива внутри цикла при заранее известном размере.

А какая точно причина я не знаю :).

Вы ведь фрилансите! Ужас :).

И что из этого?

 
Alexey Viktorov:

Чушь какая-то. Я пользовался этой функцией не вчитываясь в справочник. ...

Таки получилось, огромное Вам спасибо !!! То что я писал действительно было чушью, функция удаления ArrayRemove  отлично работает на массивах любой размерности.

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

Работающую версию выложу ниже и в приложенном файле. Тонкие моменты выделил цветом.

//+------------------------------------------------------------------+
int Array_Caste_Positions_Creating(){
   int  n           = 0;
   long ticket      = 0;
   bool new_pos     = true;
//---Запись новых тикетов в массив позиций        
   int All_Position = PositionsTotal();
   int Array_Size   = ArrayRange(Arr_Position,0);
//---  
   for(int i = 0; i < All_Position; i++){
      if(m_position.SelectByIndex(i)){
         ticket  = PositionGetInteger(POSITION_TICKET);
         new_pos = true;}
      for(int e = 0; e < Array_Size; e++){
         if(Arr_Position[e][0]==ticket){
            new_pos = false;
            n++;
            break;}}
      if(new_pos){
         int New_Size = Array_Size+1;
         ArrayResize(Arr_Position,New_Size,0);
            Arr_Position[Array_Size][0] = (int)ticket;//Ticket
            Arr_Position[Array_Size][1] = 0;//Number_Caste (0 = начальные позиции)
            n++;}}                       
//---Удаление из массива мёртвых тикетов 
      Array_Size   = ArrayRange(Arr_Position,0);
      All_Position = PositionsTotal();
//---      
      for(int e = 0; e < Array_Size; e++){
         int  ticket_dead = Arr_Position[e][0];
         bool dead_pos    = true;
         for(int i = 0; i < All_Position; i++){
            if(m_position.SelectByIndex(i)){
                  if(ticket_dead == PositionGetInteger(POSITION_TICKET)){
                        dead_pos = false;
                        n++;
                        break;}}}
         if(dead_pos){
            ArrayRemove(Arr_Position,e,1);
            Array_Size   = ArrayRange(Arr_Position,0);}}
//---     
return(n);}
//+------------------------------------------------------------------+
Файлы:
Sower_1_6.mq5  19 kb
 

Чувствую себя нашкодившим студентом, невольно присутствующим при споре двух преподавателей, в котором каждый из них настаивает на правильности своей методики преподавания.

Позвольте вставить свои делитантские три копейки. 

Несмотря на мелкую НЕидеальность кода примера, который выложил Alexey Viktorov,  мысли он выложил верные, именно они помогли разобраться. А если фрилансер готов и помогает бесплатно, не пытаясь вымутить лишнюю копейку - то честь ему и хвала, реально зауважал. Спасибо.

Aliaksandr Hryshyn - Вам тоже большое спасибо, вы тоже небыли равнодушны и искренне хотели помочь и Вам это удалось. Кто знает как бы разворачивались события без Вашей критики ?

 
Sergey Voytsekhovsky:

Таки получилось, огромное Вам спасибо !!! То что я писал действительно было чушью, функция удаления ArrayRemove  отлично работает на массивах любой размерности.

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

Работающую версию выложу ниже и в приложенном файле. Тонкие моменты выделил цветом.

Маленький ликбез.

Вот это

      if(m_position.SelectByIndex(i)){
         ticket  = PositionGetInteger(POSITION_TICKET);

можно заменить на 

      ticket = PositionGetTicket(i);
 
Alexey Viktorov:

Маленький ликбез.

Вот это

можно заменить на 

Великолепно, если еще какие-либо места кода вызывают отторжение - покажите плиз, я кодер доморощенный, то что сам нарыл, то и моё, знания не системны и отрывочны. Буду крайне благодарен за наставления на путь истинный.

Исправил, теперь так:

//---Запись новых тикетов в массив позиций        
   int All_Position = PositionsTotal();
   int Array_Size   = ArrayRange(Arr_Position,0);
//---  
   for(int i = 0; i < All_Position; i++){
      ticket = (int)PositionGetTicket(i);
      new_pos = true;
      for(int e = 0; e < Array_Size; e++){
         if(Arr_Position[e][0]==ticket){
            new_pos = false;
            n++;
            break;}}
      if(new_pos){
         int New_Size = Array_Size+1;
         ArrayResize(Arr_Position,New_Size,0);
            Arr_Position[Array_Size][0] = (int)ticket;//Ticket
            Arr_Position[Array_Size][1] = 0;//Number_Caste (0 = начальные позиции)
            n++;}}                       
 
Sergey Voytsekhovsky:

Великолепно, если еще какие-либо места кода вызывают отторжение - покажите плиз, я кодер доморощенный, то что сам нарыл, то и моё, знания не системны и отрывочны. Буду крайне благодарен за наставления на путь истинный.

Только при случае. Следить-то я не буду. А вообще, я тоже самоучка и к тому-же старый самоучка.

Тикеты в mql5 имеют тип ulong

Тогда меньше придётся приводить к типу

 
Alexey Viktorov:

Только при случае. Следить-то я не буду. А вообще, я тоже самоучка и к тому-же старый самоучка.

Тикеты в mql5 имеют тип ulong

Тогда меньше придётся приводить к типу

Спасибо, учту, и здесь позже переделаю.

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