Dividir as posições em aberto em grupos - página 5

 
Alexey Viktorov:

Com muito o quê? Os itens que nem sequer são preenchidos em cada carrapato? Como será perceptível?

Este código pica no olho, como se fosse intencionalmente piorado.

Bem, se não faz diferença, vamos fazer desta maneira:

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 que não?

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 pica no olho, como se fosse intencionalmente piorado.

Bem, se não faz diferença, vamos fazer desta maneira:

Por quê?

ps; Ahh, estou vendo. Bem, este é um exemplo. Quando a matriz de trabalho for preenchida, com certeza será preenchida por um índice. Não é a variante onde você tem que prestar atenção a tais sutilezas.
 
Alexey Viktorov:

Por quê?

Provavelmente pela razão pela qual você tem a mudança da matriz dentro do loop quando o tamanho é conhecido antecipadamente.

Não sei a razão exata :).

Você é freelancer, não é? Terrível :).

 
Aliaksandr Hryshyn:

Provavelmente pela razão pela qual você tem a mudança da matriz dentro do loop quando o tamanho é conhecido antecipadamente.

Não sei a razão exata :).

Você é freelancer, não é? Terrível :).

Então, o que é isso?

 
Alexey Viktorov:

Isso é uma bobagem. Usei esta função sem ler o manual. ...

Funcionou, muito obrigado!!! O que eu escrevi foi realmente um disparate, a função de apagarArrayRemove funciona bem em arrays de qualquer dimensão.

O erro foi em outro lugar. Depois de aplicar a função, tive que redefini-la, desta vez para um array menor, porque no passo seguinte esta variável foi usada no loop novamente, e o array caiu fora da faixa (posso estar errado em terminologia, mas espero ter sido claro).

Colocarei a versão de trabalho abaixo e no arquivo anexo. Os pontos sutis são destacados.

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

Sinto-me como um estudante mal comportado, involuntariamente presente em uma discussão entre dois professores, cada um insistindo na correção de sua metodologia de ensino.

Permita que eu insira meus delicados três centavos.

Apesar da ligeira imperfeição do código do exemplo postadopor Alexey Viktorov, os pensamentos que ele apresentou estavam corretos e nos ajudaram a compreendê-lo. E se um freelancer está pronto e disposto a ajudar gratuitamente, não tentando extorquir um centavo extra - então lhe dêem crédito, eu realmente o respeito. Obrigado.

Aliaksandr Hryshyn- Muito obrigado, você também não ficou indiferente e sinceramente quis ajudar e o fez. Quem sabe como os acontecimentos teriam se desenrolado sem suas críticas?

 
Sergey Voytsekhovsky:

Funcionou, muito obrigado!!! O que escrevi foi realmente um absurdo, a função de apagarArrayRemove funciona bem em arrays de qualquer dimensão.

O erro foi em outro lugar. Depois de aplicar a função, tive que redefini-la, desta vez para um array menor, porque no passo seguinte esta variável foi usada novamente no loop, e o array caiu fora da faixa (posso estar errado em terminologia, mas espero ter sido claro).

Colocarei a versão de trabalho abaixo e no arquivo anexo. Os pontos sutis são destacados.

Tutorial rápido.

Aqui está

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

pode ser substituído por

      t icket = PositionGetTicket(i);
 
Alexey Viktorov:

Um pouco de alfabetização.

Este aqui

pode ser substituído por.

Ótimo, se algum outro lugar em código causar rejeição - por favor, mostre-me, eu sou um codificador homebreu, o que eu cavei, isso é meu, o conhecimento não é sistemático e fragmentado. Serei muito grato pela orientação sobre o caminho certo.

Corrigido, agora é assim:

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

Ótimo, se houver algum outro lugar no código que cause rejeição - por favor, mostre-me, sou um codificador homebreu, o que encontrei é meu, o conhecimento não é sistemático e fragmentado. Eu ficaria muito grato pela orientação sobre o caminho certo.

Somente em certas ocasiões. Eu não vou ficar de olho nisso. Na verdade, sou autodidata e um velho autodidata, também.

Os bilhetes em mql5 são do tipo ulong

Então há menos a trazer para o tipo

 
Alexey Viktorov:

Somente se houver uma ocasião. Eu não estarei observando. E, em geral, também sou autodidata, e uma antiga autodidata.

Os bilhetes em mql5 são do tipo ulong

Então há menos a trazer para o tipo

Obrigado, vou levar isso em consideração, e vou refazê-lo aqui mais tarde.