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

 
Vitalie Postolache:


Se você comparar com o equilíbrio, é assim que é:

Obrigado.

 
trader781:

OK, então, como eu entendo, temos três funções personalizadas diferentes com o retorno da função certa (se procurarmos três parâmetros diferentes)

ArraySort

então

ArrayBsearch pelo número certo

e então como lidar com isso?

Exatamente a transição de uma matriz para um elemento de estrutura

Você não entende.

Você precisa fazer uma única função que irá povoar e classificar a matriz declarada globalmente. A matriz terá que ser passada para a função por referência.

E você precisa de funções adicionais que retirarão os dados de que precisa desta matriz.

 
Artyom Trishkin:

Você não entende.

Você precisa fazer uma única função que preencha e ordene uma matriz declarada globalmente. A matriz terá que ser passada para a função por referência.

E você precisa de funções adicionais que tirem os dados de que precisa desta matriz.

ok, você pode demonstrar como tirar algo de uma série de estruturas? digamos preenchidas e classificadas

como transferir por referência e escrever.

 

Favor informar como deve ser a condição. Se um stop loss é acionado, então o lote é multiplicado por 2, e se a próxima ordem aciona um take profit, o lote retornaria ao lote original, que era antes do stop loss.

Eu entendo assim, mas não sei como continuar...

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

 

outra pergunta, o que eu escrevi errado no bloco de ordens de exclusão? nem sempre as ordens de exclusão, no registro diz

OrderDelete error 4108
market order #1 cannot be deleted

if (Hour()==23 && Minute()==59)            
         {
         for(int n=OrdersTotal()-1;n>=0;n--)
            {
            if(OrderSelect(n,SELECT_BY_POS))
               {
               if(OrderMagicNumber()==magic)
                  {
                  bool del=OrderDelete(OrderTicket());
                  if (del==true)
                     {
                     otl_b=0; otl_s=0; //обнуляем переменные отложек
                     }
                  
                  }  
               }  
            }
         }
 
wishmast:

Outra pergunta, o que escrevi errado no bloco para apagar ordens? Nem sempre as ordens são apagadas, no registro diz

OrderDelete error 4108
market order #1 cannot be deleted

if (Hour()==23 && Minute()==59)            
         {
         for(int n=OrdersTotal()-1;n>=0;n--)
            {
            if(OrderSelect(n,SELECT_BY_POS))
               {
               if(OrderMagicNumber()==magic)
                  {
                  bool del=OrderDelete(OrderTicket());
                  if (del==true)
                     {
                     otl_b=0; otl_s=0; //обнуляем переменные отложек
                     }
                  
                  }  
               }  
            }
         }


Você está tentando excluir uma ordem de mercado, eles não são excluídos, são fechados usando a função OrderClose(). Para que o laço seja apagado ou fechado corretamente, temos que distinguir o pedido por seu tipo.

if(OrderType()<=OP_SELL) - para ordens de mercado, if(OrderType()>OP_SELL) - para ordens pendentes.

 

Há uma coisa chamadaCHARTEVENT_MOUSE_MOVE

Pergunta: isto funciona em dispositivos móveis onde não há mouse?

 
wishmast:

Favor informar como deve ser a condição. Se um stop loss é acionado, então o lote é multiplicado por 2, e se a próxima ordem aciona um take profit, o lote retornaria ao lote original, que era antes do stop loss.

Eu entendo assim, mas não sei como continuar...

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

Se você fez isso rapidamente, o último pedido perdido aparecerá, o que fazer com ele e que parâmetros corrigir, acho que você entenderá.
Arquivos anexados:
last1.mq4  4 kb
 
wishmast:

Favor informar como deve ser a condição. Se um stop loss é acionado, então o lote é multiplicado por 2, e se a próxima ordem aciona um take profit, o lote retornaria ao lote original, que era antes do stop loss.

Eu entendo assim, mas não sei como continuar...

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
   {
   if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)
      {
      if (OrderMagicNumber()==magic)
         {
         if (OrderStopLoss()==OrderClosePrice())
            {
            lot=lot*4;
            }
         }
      }

   } 

A solução para este problema depende da lógica completa do Expert Advisor, você pode rastrear o acionamento do stoploss ou takeprofit através de seu comentário.

  if(StringFind(OrderComment(),"sl")>=0)// сработал стоплосс
  if(StringFind(OrderComment(),"tp")>=0)// сработал тейкпрофит

...

 
Artyom Trishkin:

Você não entende.

Você precisa fazer uma única função que preencha e classifique o conjunto declarado a nível global. A matriz terá que ser passada para a função por referência.

E você precisa de funções adicionais que retirarão os dados de que precisa desta matriz.

Artem, você está errado. A matriz, declarada em nível global, é visível em todas as partes do programa, e você não precisa passá-la em algum lugar de algum lugar. É apenas preenchido em um lugar do programa, classificado em outro, e lido no terceiro, não importa.
Razão: