Dividir las posiciones abiertas en grupos - página 5

 
Alexey Viktorov:

¿Con un montón de qué? ¿Partes de la matriz que ni siquiera se llenan en cada tic? ¿Cómo se notará?

Este código escuece a la vista, como si se hiciera intencionadamente peor.

Bueno, si no hay diferencia, hagámoslo así:

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);
   }

¿Por qué no?

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:

Este código escuece a la vista, como si se hiciera intencionadamente peor.

Si no hay diferencia, hagámoslo así:

¿Por qué?

ps; Ahh, ya veo. Bueno, este es un ejemplo. Cuando el array de trabajo se llene, seguro que se llenará por un índice. No es la variante en la que hay que prestar atención a esas sutilezas.
 
Alexey Viktorov:

¿Por qué?

Probablemente por la razón de que tiene el cambio de matriz dentro del bucle cuando el tamaño se conoce de antemano.

No sé la razón exacta :).

Eres autónomo, ¿no? Terrible :).

 
Aliaksandr Hryshyn:

Probablemente por la razón de que tiene el cambio de matriz dentro del bucle cuando el tamaño se conoce de antemano.

No sé la razón exacta :).

Eres autónomo, ¿no? Terrible :).

¿Y qué?

 
Alexey Viktorov:

Eso es una tontería. He utilizado esta función sin leer el manual. ...

Ha funcionado, ¡¡¡muchas gracias!!! Lo que escribí era efectivamente una tontería, la función de borradoArrayRemove funciona bien en arrays de cualquier dimensión.

El error estaba en otra parte. Después de aplicar la función, tuve que redefinirla, esta vez a un array más pequeño, porque en el siguiente paso esta variable se volvió a utilizar en el bucle, y el array se salió del rango (puede que me equivoque en la terminología, pero espero haberme explicado).

Voy a publicar la versión de trabajo a continuación y en el archivo adjunto. Los puntos más sutiles están resaltados.

//+------------------------------------------------------------------+
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);}
//+------------------------------------------------------------------+
Archivos adjuntos:
Sower_1_6.mq5  19 kb
 

Me siento como un alumno maleducado, presente sin querer en una discusión entre dos profesores, cada uno de los cuales insiste en la corrección de su metodología de enseñanza.

Permítanme insertar mis delicados tres centavos.

A pesar de la ligera imperfección del código del ejemplo publicadopor Alexey Viktorov, las reflexiones que expuso eran correctas y nos ayudaron a entenderlo. Y si un autónomo está preparado y dispuesto a ayudar gratuitamente, sin intentar extorsionar un céntimo más, entonces hay que reconocerle el mérito, lo respeto de verdad. Gracias.

Aliaksandr Hryshyn- Muchas gracias, usted tampoco fue indiferente y quiso ayudar sinceramente y lo hizo. ¿Quién sabe cómo se habrían desarrollado los acontecimientos sin sus críticas?

 
Sergey Voytsekhovsky:

Ha funcionado, ¡¡¡muchas gracias!!! Lo que escribí es realmente una tontería, la función de borradoArrayRemove funciona bien en arrays de cualquier dimensión.

El error estaba en otra parte. Después de aplicar la función, tuve que redefinirla, esta vez a un array más pequeño, porque en el siguiente paso esta variable se volvió a utilizar en el bucle, y el array se salió del rango (puede que me equivoque en la terminología, pero espero haberme explicado).

Voy a publicar la versión de trabajo a continuación y en el archivo adjunto. Los puntos más sutiles están resaltados.

Un tutorial rápido.

Aquí está

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

puede ser sustituido por

      t icket = PositionGetTicket(i);
 
Alexey Viktorov:

Un poco de alfabetización.

Este

puede ser sustituido por.

Genial, si otros lugares en el código causan rechazo - por favor muéstrame, soy un codificador de homebrew, lo que cavé, eso es mío, el conocimiento no es sistemático y fragmentario. Estaré muy agradecido si me orientan en el camino correcto.

Corregido, ahora es así:

//---Запись новых тикетов в массив позиций        
   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:

Genial, si hay otros lugares en el código que causan rechazo - por favor muéstrame, soy un codificador de homebrew, lo que encontré es mío, el conocimiento no es sistemático y fragmentario. Estaría muy agradecido si me orientaran sobre el camino correcto.

Sólo en ocasiones. No voy a hacer un seguimiento. De hecho, soy autodidacta y también un viejo autodidacta.

Las entradas en mql5 son de tipo ulong

Entonces hay menos que aportar al tipo

 
Alexey Viktorov:

Sólo si hay una ocasión. No voy a mirar. Y en general, también soy autodidacta, y un viejo autodidacta.

Las entradas en mql5 son de tipo ulong

Entonces hay menos que aportar al tipo

Gracias, lo tendré en cuenta y lo reharé aquí más adelante.