Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 1134

 
Alexandr Nevadovschi:

Caros programadores, por favor, ajudem um novato neste negócio.

A EA está abrindo ordens de compra e venda seqüencialmente após um certo período de tempo. Quero que ele modifique todas as ordens anteriores (especificamente, todas as anteriores devem ser fechadas por Take Profit da última. Isto é, se a última ordem de compra e a ordem de venda anterior, então o stop loss da ordem anterior é definido para o nível de take profit da última,

Se a compra anterior for efetuada, então seu TakeProfit será fixado no nível do último TakeProfit. Bem, etc. A questão é que quando chega o takeprofit do último pedido, todos os pedidos devem ser fechados).

Espero ter explicado claramente, embora seja difícil entender como deve ser implementado. Agradecemos antecipadamente.

Entendo que podemos passar por todas as ordens abertas e modificá-las, mas como podemos pular a última?

O mais importante em tudo isso é entender o que deve acontecer.

Qual é a "última encomenda"? Será que é o último a ser aberto? Ou abrindo o nível de preços?

E se considerarmos "a última" encomenda como "COMPRAR", mas o preço vai foder? Ou vice versa, a última encomenda será VENDA, mas o preço vai para o norte? Então qual deles deve ser considerado o último? Isto é o que temos que realizar.

 

Olá. Se você não sabe antecipadamente quantos elementos estarão na matriz, como você declara a matriz para que a matriz aumente com cada novo elemento?

Um exemplo para torná-lo mais claro:

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:

Olá. Se você não sabe antecipadamente quantos elementos estarão na matriz, como você declara a matriz para que a matriz aumente com cada novo elemento?

Um exemplo para torná-lo mais claro:

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

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

Você deve ler a documentação com mais freqüência.
ArrayResize - Операции с массивами - Справочник MQL4
ArrayResize - Операции с массивами - Справочник MQL4
  • docs.mql4.com
ArrayResize - Операции с массивами - Справочник MQL4
 
Alexey Viktorov:
Você deve ler a documentação com mais freqüência.

Eu li e tentei, mas recebo um erro de "array fora de alcance". No exemplo, parecia assim:

      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:

Eu li e tentei, mas recebo um erro de "array fora de alcance". No exemplo, era o seguinte:

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

Quando a condição A[i] < B[i] não é cumprida, o tamanho da matriz permanece inalterado e o contador de laço é incrementado. É por isso que está fora de alcance.

Tente desta forma.

      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:

Quando a condição A[i] < B[i] não é satisfeita, o tamanho da matriz permanece inalterado e o contador de laço é incrementado. É por isso que está fora dos limites.

Tente desta forma.

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


Obrigado! Tudo isso funciona agora !
 
Nauris Zukas:

Eu li e tentei, mas recebo um erro de "array fora de alcance". No exemplo, parecia assim:

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

Bem, isso funcionaria mais rápido

  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:

Bem, funcionará mais rápido dessa forma

  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));
Obrigado, estou vendo! Será mais rápido por causa do ArraySize, será de alguma forma mais lento?
 
Nauris Zukas:
Obrigado, estou vendo! Será mais rápido por causa do tamanho do ArraySize, será que ele o torna mais lento de alguma forma?
Não muito, mas é claro e à prova de erros.
 
Alexey Viktorov:
Não muito, mas é claro e à prova de erros.
Obrigado!