Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1689

 
MakarFX #:

Se você não gosta de "-1", você pode fazer isso.

Não, você não pode - o programa irá falhar se você acessar sua matriz dessa forma.

Na melhor das hipóteses, se você acessar suas arrays internas, perderá os dados necessários ou simplesmente não os alcançará no loop.

 
Nikolay Ivanov #:

Basicamente é simples, seu exclusivo resume todas as ordens desencontradas entre diferentes mágicos...

Por exemplo, existem 3 pedidos

A primeira iteração de magic=1 unique=0, no final da iteração unique será=2.

A segunda iteração magik=2unique=2, no final da iteraçãounique será=3

Desde 3>=número de todos os pedidos, o loop while irá quebrar... E magia =3 nunca foi verificada... Tão mágico =2 novamente e assim por diante com todos...

A primeira ordem é dada como mágica =1 por padrão. Então o laço entra em ação:

Início da mágica de iteração = 1 único = 0, no final (quando já existe uma ordem com mágica = 1) mágica = 1 ainda é 1 e único = 0
Segunda mágica de iteração = 2 único = 0, no final mágica = 2 e único = 1 (não há correspondência) e o retorno é dado à mágica de segunda ordem = 2.
A terceira deve ser a mesma...

Eu queria imprimir todo o processo, mas algo deu errado:

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique)
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}

-----------------------------------

'endless cycle.mq4'     endless cycle.mq4       1       1
'}' - semicolon expected        endless cycle.mq4       49      7
'else' - 'while' expected       endless cycle.mq4       50      5
'else' - illegal 'else' without matching 'if'   endless cycle.mq4       50      5
'OnTick' - function declarations are allowed on global, namespace or class scope only   endless cycle.mq4       60      6
'OnTick' - function already defined and has body        endless cycle.mq4       60      6
   see previous declaration of function 'OnTick'        endless cycle.mq4       60      6
'}' - unexpected end of program endless cycle.mq4       63      1
6 errors, 0 warnings            7       1
 
Nerd Trader #:

A primeira ordem é dada magia = 1 por padrão. Então um loop é iniciado:

Início da mágica de iteração = 1 único = 0, no final (quando já existe uma ordem com mágica = 1 ) mágica ainda é 1 e único = 0
Segunda mágica de iteração = 2 único = 0, no final, mágica = 2 e único = 1 (não há correspondência) e o retorno é atribuído à mágica de segunda ordem = 2.
A terceira deve ser a mesma...

Eu queria imprimir todo o processo, mas algo deu errado:

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique); // <---
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}


 
Artyom Trishkin #:

Aponte paramais- TODAS as linguagens de programação.

É simples - em linguagens de programação, a contagem começa em zero. A primeira célula de um array terá um índice de 0. Portanto, você tem que fazer um loop inverso ANTES de zero, INCLUINDO-o. Isto é, >=0

EncomendasTotal() sai, por exemplo, 10. E você inicia um loop a partir de 10, enquanto o último índice da matriz é 9 (lembre-se, estamos começando de zero?). E o que acontecerá quando você acessar uma célula de array inexistente? Isso mesmo - o programa se chocará com um erro crítico, porque você entrou em uma área de memória não alocada, além dos limites da matriz.

Estas são muletas sólidas, com certeza. Leia, aprenda e tudo virá até você.

Obrigado. Não era isso que eu queria dizer. Qualquer coisa poderia ser perdoada por mql se estivesse em uma licença aberta. Caso contrário, estou implicando com você. Bem, parece-me, por exemplo, que poderíamos ter colocado uma bandeira na função NormalizeDouble e usado aparas ou arredondamento aritmético do local. Ou, por exemplo, poderíamos expandir as funções de manipulação de posições, por exemplo, devolver o número de posições em aberto somente para venda ou compra. Além disso, uma ajuda mais detalhada poderia ser escrita. Mas esta é apenas a opinião de um amador. Além disso, por favor, perdoe-me se a declaração anterior pareceu dura.
 

Há toneladas de cursos gratuitos e bons em C/C++.

Mql está próximo a eles e você pode aprender livremente. Felizmente, não é necessário um conhecimento profundo. Mas pelo menos a sintaxe da linguagem e os fundamentos básicos dos algoritmos.

De outra forma, obtemos disparates no tópico, ao invés de consultas sobre a plataforma e algoritmos, diálogos de nível de escolas primárias - onde colocar; o que é um loop e por que os índices são 0.

Por exemplo, há um site intuit.ru - há cursos sobre C e algoritmos, leve seu tempo, algumas semanas no máximo. Ao mesmo tempo, você pode obter um papel :-)

 
Maxim Kuznetsov a sintaxe da linguagem e os fundamentos básicos dos algoritmos.

De outra forma, obtemos disparates no tópico, ao invés de consultas sobre a plataforma e algoritmos, diálogos de nível de escolas primárias - onde colocar; o que é um loop e por que os índices são 0.

Por exemplo, há um site intuit.ru - há cursos sobre C e algoritmos, leve seu tempo, algumas semanas no máximo. Ao mesmo tempo, você pode receber um papel:-)

Assim?


 
Artyom Trishkin #:

OrderTotal() dá por exemplo 10. E você começa o loop a partir de 10. Mas o último índice da matriz é 9 (lembre-se, estamos contando a partir de zero?). E o que acontecerá quando você acessar uma célula de array inexistente? Isso mesmo - o programa se chocará com um erro crítico, porque você entrou em uma área de memória não alocada, além dos limites da matriz.

Eu estou corrigido... Não haverá um erro crítico, apenas a OrderSelect boolean retornará falsa... e isso é tudo... Mas, claro, é melhor evitar... Pois se você usar recursos de código incorretos, é difícil prever possíveis erros...


Nerd Trader#:

A primeira ordem é dada magia = 1 por padrão. Então um loop é iniciado:

Iniciar mágica de iteração = 1 único = 0, no final (quando já existe uma ordem com mágica = 1 ) mágica = 1 e único = 0
Segunda mágica de iteração = 2 único = 0, no final mágica = 2 e único = 1 (não há correspondência) e o retorno é atribuído à mágica de segunda ordem = 2.
A terceira deve ser a mesma...

Vejo apenas que o enchimento do único vai muito rápido e atinge o limite, e a magia mal cresce... Geralmente, era errado usar a mesma variável tanto para o controle do loop como para a lógica dentro do loop onde esta variável inflaciona...

Imprimir para encontrar uma solução neste contexto, mas sugiro apenas reformular o problema... Por exemplo, encontrar o magik máximo em pedidos pelo laço e devolvê-lo com +1, essa seria a solução simples correta.

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2021.10.19
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 

Você pode fazer isso desta forma, o código é chamado conforme necessário, portanto seu peso não é um problema.

Para o teste que eu usei Comprar/Vender

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  Print(GetMagic());
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetMagic()
{
//Если должен быть открыт стопордер и если есть уже открытые или отложенные
//ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать
//для нашего ордера уникальный маджик
  int arr[];
  int n=-1;
  int OT=OrdersTotal();
  for(int i=0; i<OT; i++) {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
      if(OrderType() == OP_SELL || OrderType() == OP_BUY) {
        if(ArraySearchInt(arr, OrderMagicNumber())==-1) {
          n++;
          ArrayResize(arr,n+1);
          arr[n]=OrderMagicNumber();
        }
      }
    }
  }
  ArraySort(arr);
  OT=ArraySize(arr);
  for(int i=0; i<OT; i++)
    if(arr[i]!=i) return i;
  return OT;
}
//-- удаляет копии с массива
int ArraySearchInt(int& m[], int e)
{
  for(int i=0; i<ArraySize(m); i++) {
    if(m[i]==e) return(i);
  }
  return(-1);
}
 

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Qualquer pergunta de novatos sobre MQL4 e MQL5, dicas e discussão sobre algoritmos e códigos

Vitaly Muzichenko, 2021.10.19 23:08

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique); // <---
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}


Semiônimo Semiônimo.
Nikolay Ivanov #:

Vou corrigi-lo um pouco. Não haverá erro crítico, apenas a Ordem booleanaSelect retornará falsa ... e isso é tudo... Mas é claro que é melhor evitar... Pois se os recursos do código não forem usados corretamente, é difícil prever as possíveis armadilhas...


Vejo um enchimento único a um ritmo muito rápido e alcançando seu limite, enquanto a magia mal cresce... Geralmente era errado usar a mesma variável tanto para o controle do loop como para a lógica dentro do loop, onde esta variável inflaciona...

Imprimir para encontrar uma solução neste contexto, mas sugiro apenas reformular o problema... Por exemplo, encontrar o magik máximo em pedidos pelo laço e devolvê-lo com +1, essa seria a solução simples correta.

É um último recurso, caso esta opção não funcione. Enquanto isso, foi o que a impressão veio à tona.

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber()){
              unique ++;
              Print (" MAGIC ", magic, " | UNIQUE ", unique);
            }
          }
        }
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}
------------------------------------------------

2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #10  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 9
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #9  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #8  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #7  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #6  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #5  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #4  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #3  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #2  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #1  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.827 2021.01.04 00:00:00  endless cycle test started

 
Vitaly Muzichenko #:

Você pode fazer isso desta forma, o código é chamado conforme necessário, portanto seu peso não é um problema.

Para o teste que eu usei Comprar/Vender

Amanhã eu vou olhar para ele, não tenho energia para entrar nele agora.
Razão: