Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 116

 
novichok2018:

Obrigado. A pausa parece ter ajudado. Vamos ver o que acontece a seguir.

Não, isso não tem ajudado muito. Só funciona se um tipo de posição for aberto. Se, por exemplo, uma posição de Venda é aberta e ainda não está fechada, e simultaneamente uma posição de Compra é aberta e fechada, a posição de Venda não pode ver condições para seu próprio fechamento até que outra posição de Venda abra e feche (de acordo com suas próprias condições). E se a BAY abre e fecha novamente, ela novamente perde suas condições de fechamento. Tentei determinar a presença deposições em aberto após o fechamento da BAY usando a função ExistPositions() da I.Kim, mas não entendo onde inseri-la e onde colocar a impressão para controlar a execução. Qualquer pista.

 
novichok2018:

Não, isso não tem ajudado muito. Só funciona se o mesmo tipo de posição for aberto. Se, por exemplo, primeiro uma posição de Venda é aberta e ainda não fechada, e ao mesmo tempo uma posição de Compra é aberta e fechada, então a posição de Venda não vê suas condições de fechamento até que outra posição de Venda abra e feche (de acordo com suas condições). E se a BAY abre e fecha novamente, ela novamente perde suas condições de fechamento. Tentei determinar a presença deposições em aberto após o fechamento da BAY usando a função ExistPositions() da I.Kim, mas não entendo onde inseri-la e onde colocar a impressão para controlar a execução. Você pode me dar uma dica?

Ninguém conhece a solução? Eu não tenho.

 
novichok2018: Ninguém conhece a solução? Eu não tenho.

Entrei no fórum - vejo que você está falando sozinho... Onde está o início de sua conversa e do que se trata - difícil de entender. Para depurar um programa, é muito mais conveniente usar Alerta ao invés de Imprimir - ele aparece na tela de uma só vez. Estes Alertas são colocados antes de se verificar a condição. Outro método de depuração com um lápis - passar pelo programa como ele deve ser executado, e anotar os valores das variáveis. Quando mudar - riscar o valor antigo e escrever o novo. Era assim que era feito antes. Agora o MetaEditor tem um depurador, onde você pode rastrear os valores das variáveis. As construções mais simples devem ser verificadas separadamente, escrevendo um roteiro

 
novichok2018:

Ninguém conhece a solução? Eu não tenho.

Tente desta forma:

//+------------------------------------------------------------------+
void OnTick()
  {
   int total=OrdersTotal();
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(TimeCurrent()>OrderOpenTime()+100)
           {
            switch(OrderType())
              {
               //_______________________________________________________________________
               case OP_BUY:
                 {
                  if(OrderMagicNumber()==101 && MathAbs(WPR1)<5)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==111 && MathAbs(WPR1)<20)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
               //_______________________________________________________________________                 
               case OP_SELL:
                 {
                  if(OrderMagicNumber()==222 && MathAbs(WPR1)>97.55)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  if(OrderMagicNumber()==201 && MathAbs(WPR1)>96)
                    {
                     ClosePosBySelect(slippage,Yellow);
                     break;
                    }
                  break;
                 }
              }
           }
        }
     }
  }
//_______________________________________________________________________
void ClosePosBySelect(int slip,color col) 
  {
   RefreshRates();
   if(OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), slip, col);
   if(OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), slip, col);
  }
//_______________________________________________________________________
 
de onde o iCustom obtém seus dados?
 
Igor Makanu:

tente desta forma:

Obrigado, experimentei - não fecha nenhuma posição mesmo após algum ajuste para que o compilador não jure.

 
STARIJ:

Entrei no fórum - vejo você falando sozinho... É difícil entender onde você começou e do que você está falando. Para a depuração do programa é mais conveniente usar Alerta ao invés de Imprimir - ele aparece na tela de uma só vez. Estes Alertas são colocados antes de se verificar a condição. Outro método de depuração com um lápis - passar pelo programa como ele deve ser executado, e anotar os valores das variáveis. Quando mudar - riscar o valor antigo e escrever o novo. Era assim que era feito antes. Agora o MetaEditor tem um depurador, onde você pode monitorar os valores das variáveis. As construções mais simples têm de ser verificadas separadamente, escrevendo um roteiro

Obrigado pelas recomendações, mas pela minha situação elas não são muito corretas. Apenas para esclarecer, abaixo está o código de uma função de fechamento personalizada

 

Não funciona corretamente - ofechamento das posiçõesacontece sob condições da primeira posição aberta. Ou seja, se primeiro uma posição de Compra ou Venda foi aberta com a Condição 1 e depois uma segunda posição foi aberta com a Condição 2, a condição de fechamento é ignorada e a segunda posição também é fechada com a Condição 1 apesar de um número mágico diferente.

Apliquei uma pausa após o fechamento do pedido, mas a solução foi meio acirrada:somente se uma posição do mesmo tipo for aberta. Se, por exemplo, uma posição BAY tiver sido aberta primeiro e ainda não tiver sido fechada, enquanto uma posição BAY estiver sendo aberta e fechada, a posição BAY não vê nenhuma condição para ser fechada enquanto outra posição BAY abrir e fechar (de acordo com suas condições). E se a BAY abre e fecha novamente, ela novamente perde suas condições de fechamento. Então, o que fazer?

void ClosePoz()
  { RefreshRates();
         double WPR0 = iWPR(NULL,0,bars,0);
         double WPR1 = iWPR(NULL,0,bars,1);
         bool rez = false;
           
  int total=OrdersTotal();
      for(int i=OrdersTotal()-1;i>=0;i--)
      {
        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
              if(TimeCurrent()>OrderOpenTime()+300)
               {
               if(OrderMagicNumber==101 || OrderMagicNumber==102 || OrderMagicNumber==103 || OrderMagicNumber==104)
                 {
                 if(MathAbs(WPR1)<5)
                 rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                 break; 
                 }
               if(OrderMagicNumber==111)
                 {
                  if(MathAbs(WPR1)<17) 
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==222)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break; 
                 }
               if(OrderMagicNumber==201)
                 {
                  if(MathAbs(WPR1)>97)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
               if(OrderMagicNumber==202)
                 {
                  if(MathAbs(WPR1)>96)
                  rez =  OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),int(MarketInfo(OrderSymbol(),MODE_DIGITS))),slippage,Yellow);
                  break;
                 }
                
                } 
              }
       break;  
      }
  }
 
Mickey Moose:
de onde o iCustom obtém seus dados?

dos amortecedores do indicador personalizado, prática, por exemplo, no MA

novichok2018:

Apliquei uma pausa após fechar um pedido, mas a solução é a meio caminho:somente se uma posição do mesmo tipo for aberta. Se, por exemplo, uma posição BAY for aberta e ainda não tiver sido fechada, enquanto uma posição BAY estiver sendo aberta e fechada, a posição BAY não vê nenhuma condição para ser fechada até que outra posição BAY seja aberta e fechada (em suas próprias condições). E se a BAY abre e fecha novamente, ela novamente perde suas condições de fechamento. Então, o que fazer?

tente substituir a pausa por continuar

é estranho que meu exemplo de código não feche nada, talvez seja sobre normalização de preços

 
Igor Makanu:


tente substituir a pausa por continuar


Substituído. Erro amaldiçoado 138(requotes). Então eu dei uma pausa, e é 138 novamente. Estranho, talvez eu não tenha notado isso antes.

 
Igor Makanu:

dos amortecedores do indicador personalizado, praticar com o MA, por exemplo


Isto é do campo que aparece na janela de dados do terminal?