[Arquivo!] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por ela. Não poderia ir a lugar algum sem você - 2. - página 294

 
CreAndr:
Eu tenho uma pergunta sobre a rede de arrasto, quem pode me dizer. Parece ser a rede de arrasto certa para se romper o gelo, mas não funciona.

Aqui está uma rede de arrasto: https://www.mql5.com/ru/forum/131859

Para inserir o código no texto, pressione o botão SRC acima do campo de entrada de texto.

 
DhP:

Aqui está uma rede de arrasto: https://www.mql5.com/ru/forum/131859

Para inserir o código no texto, pressione o botão SRC acima do campo de entrada de texto.


Obrigado.
 
CreAndr:
Tenho uma pergunta sobre a rede de arrasto, quem pode me dizer. Parece ser uma rede de arrasto correta para quebrar o equilíbrio, mas não funciona.


Lista de razões em ordem decrescente de importância:

1. O computador não está ligado

2. O Metatrader não está ligado.

3. o roteiro na tabela não está instalado

4. Conselheiros especializados não habilitados

5. Nada para arrasto.

6. Algo no código está errado.

 
Roger:


Listagem das razões em ordem decrescente de importância:

1. O computador não está ligado

2. O Metatrader não está ligado.

3. o roteiro na tabela não está instalado

4. Conselheiros especializados não habilitados

5. Nada para arrasto.

6. Algo no código está errado.

Grande resposta, Roger, mas o computador está ligado, assim como o Metatrader, o EA está anexado ao gráfico, os EAs estão habilitados, as negociações estão se abrindo e, portanto, há algo para arrasto! Mas o que há de errado com o código, essa era a questão.
 
artmedia70:
Use OrderOpenTime()
Para - por que precisamos dele então?


Portanto, sim, mas pelo número do pedido eu fiquei muito curto, mas com o OrderOpenTime não entendo o que fazer, preciso colocar o tempo aberto em algum lugar, comparar com o próximo pedido da lista, se o tempo for maior, reescrever a variável, etc. Eu ainda não entendo o algoritmo.


bool DeleteOrders()
{
   for(int i=0 ; i <=OrdersTotal() ; i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(Symbol()==OrderSymbol())
            {
            if(OrderType()!= OP_SELL)
               {
               int ticket=OrderTicket();
               OrderDelete(ticket);
               return(true);
               }
            }
         }
      }
return(false);
} 
 
CreAndr:
Grande resposta, Roger, mas o computador está habilitado, assim como o MetaTrader, a EA está anexada ao gráfico, as EAs estão habilitadas, as negociações estão abertas e, portanto, há algo para arrasto! Mas o que há de errado com o código, essa era a questão.


No início não havia código, você o anexou depois.

Provavelmente porque você colocou um rastro na função de abertura do pedido, ou seja, as condições para a abertura de um pedido vêm, o pedido é aberto, mas pode não chegar mais longe.

 
Pyro:

Portanto, sim, mas pelo número do pedido eu fiquei muito curto, mas com o OrderOpenTime não entendo o que fazer, preciso colocar o tempo aberto em algum lugar, comparar com o próximo pedido da lista, se o tempo for maior, reescrever a variável, etc. Eu ainda não entendo o algoritmo.


O número de série não é confiável, nada é garantido nesta numeração, apenas para o testador. Um par de páginas antes, eu tinha escrito o código para procurar a última ordem fechada. É muito simples, nós examinamos o bilhete, depois escolhemos a ordem ou posição de acordo com o bilhete, e pronto:

  int lastclosetime=-1;
  int lastcloseticket=-1;
  int lastdealtype=0;

  for (int i=0; i<OrdersHistoryTotal(); i++) 
  {
    if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue; 
    if (OrderSymbol()==symbol || OrderMagicNumber()==magic) 
    {
      if (lastclosetime<OrderCloseTime()) 
      {
        lastclosetime=OrderCloseTime();
        lastcloseticket=OrderTicket();
      }
    }
  }

  if (OrderSelect(lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY)) 
  {
    if (OrderType()==OP_BUY) lastdealtype=1;
    if (OrderType()==OP_SELL) lastdealtype=-1;   
  }
 
Figar0:


O número do pedido não é confiável, ninguém garante nada nesta numeração, apenas para o testador. Um par de páginas antes eu escrevi código para encontrar a última ordem fechada, o mesmo para as abertas. Tudo é simples, passamos por isso, lembramos do bilhete, depois escolhemos a ordem ou posição de acordo com o bilhete, e pronto:

Obrigado, é muito simples. Vou investigar isso.
 
Roger:


No início não havia código, você o acrescentou mais tarde.

Provavelmente porque você colocou um rastro na função de abertura do pedido, ou seja, as condições para a abertura do pedido ocorrem, o pedido é aberto, mas pode não chegar mais longe.

Estou vendo, obrigado.
 
Figar0:


O número do pedido não é confiável, ninguém garante nada nesta numeração, apenas para o testador. Um par de páginas antes eu escrevi código para encontrar a última ordem fechada, o mesmo para as abertas. É muito simples, nós examinamos o bilhete, depois escolhemos uma ordem ou uma posição pelo bilhete e pronto:

O código está errado.

Antes de mais nada, eis o seguinte:

if (OrderSymbol()==symbol || OrderMagicNumber()==magic) 

Se o símbolo de ordem for igual ao símbolo dado na variável símbolo ou , a magia da ordem é igual à magia... Portanto, se qualquer ordem com o símbolo for selecionada e o magik for diferente ou estiver faltando, a condição será satisfeita. Porque ou é isto ou aquilo. De forma correspondente, devemos substituir por ou, melhor ainda, separar as verificações em cadeias separadas - o laço será mais rápido, o que é crucial para a otimização.

Além disso... Escolha por bilhete: O parâmetro do pool é ignorado, ou seja, não há sentido em escrevê-lo aqui.

if (OrderSelect(lastcloseticket, SELECT_BY_TICKET, MODE_HISTORY)) 

Após a ordem ter sido selecionada com sucesso por bilhete, devemos verificar de qual lista de ordens foi selecionada - as do mercado ou as fechadas. Para isso, precisamos verificar o tempo de fechamento do pedido, e se for maior que zero, então o pedido foi definitivamente fechado. Este parâmetro é sempre igual a zero para posições abertas. IMHO, após a escolha do último pedido, devemos verificar seu tipo imediatamente e escrevê-lo na variável.

A função agora será parecida com esta:

int   GetTypeLastClosePos(int symbol, int magic)   // Функция возвращает 0 если последний закрытый Бай, 1 - если Селл и -1 при ошибке
{
int   i, lastclosetime=0, 
         lastdealtype=-1;

   for (i=0; i<OrdersHistoryTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если выбрали ордер в истории
         if (OrderSymbol()!=symbol)          continue;   // Если его символ не равен переданному в функцию - идём к следующему
         if (OrderMagicNumber()!=magic)      continue;   // Если его магик не равен переданному в функцию - идём к следующему
         if (OrderType()>1)                  continue;   // Если ищем только Бай и Селл, значит если больше единицы - к следующему
         // ... теперь выбранный ордер соответствует критериям поиска по символу, магику и типу
         if (lastclosetime<OrderCloseTime()) {           // Посмотрим время его закрытия и если оно больше предыдущего, то...
            lastclosetime=OrderCloseTime();              // ... запишем его как предыдущее
            lastdealtype=OrderType();                    // Тип текущего закрытого ордера: 0 для Бай, 1 для Селл
            }
         }
      else if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         Print ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",GetLastError());  // Посмотрим номер ошибки
         break;                                                // Выходим из цикла перебора ордеров
         }
      }
   return(lastdealtype);
}

Agora, se quisermos verificar apenas a compra ou venda do gráfico atual e qual deles foi o último fechado, devemos chamar esta função desta forma:

int LastPoseType=GetTypeLastClosePos(Symbol(), Magic);
if (LastPoseType==OP_BUY) {
   // ... код, если последний закрытый Buy ...
   }
if (LastPoseType==OP_SELL) {
   // ... код, если последний закрытый Sell ...
   }
else {// ... код обработки ошибки ... }

Para o tratamento de erros podemos, em princípio, criar uma variável global, por exemplo, int err; e no próprio corpo da função armazenar o número de erro nesta variável:

else if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Иначе, если не удалось выбрать ордер в истории
         err=GetLastError();                                                     // Посмотрим номер ошибки
         Print ("Func: GetTypeLastClosePos, Ошибка выбора ордера - ",err);       // Сообщим об ошибке и в какой ф-ции она произошла
         break;                                                                  // Выходим из цикла перебора ордеров
         }

Em seguida, para processar o erro após chamar a função ...

GetTypeLastClosePos(Symbol(), Magic);

... e ocorrer erro, seu número será armazenado em erro variável e no bloco de processamento este número será processado.

else {
   if (err==???) {
      // обработка этой ошибки
      }
   if (err==???) {
      // обработка этой ошибки
      }
// ... и т.д. ...
   }

Melhor ainda, use o interruptor