Especialistas: Expert Ichimoku - página 2

 
Vladimir Karputov #:

Ative a depuração de código e teste passo a passo.

Obrigado por sua resposta.

Fiz a depuração e descobri que o SL incorreto devido à alta propagação causou esse problema.

 
amin ghanbari # :

Obrigado por sua resposta.

Fiz a depuração e descobri que o SL incorreto devido à alta propagação causou esse problema.

O código dentro do Expert Advisor está correto - mas se, no momento da colocação, o preço fizer um movimento forte, a POSIÇÃO não será aberta.

 
Vladimir Karputov #:

O código dentro do Expert Advisor está correto, mas se, no momento da colocação, o preço fizer um movimento forte, a POSIÇÃO não será aberta.

Acho que essa seção deve ser modificada para o crypo:


//--- sintonia para 3 ou 5 dígitos
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;

   ExtStopLoss    = InpStopLoss     * m_adjusted_point;
   ExtTakeProfit  = InpTakeProfit   * m_adjusted_point;
   ExtTrailingStop= InpTrailingStop * m_adjusted_point;
   ExtTrailingStep= InpTrailingStep * m_adjusted_point;


Quando uso RISK para determinar o lote, vejo o erro getpointer e tenho de usar fix LOT:

//+------------------------------------------------------------------+
//| Lotes ou risco em porcentagem para um negócio a partir de uma margem livre
//+------------------------------------------------------------------+
bool LotsOrRisk(const double lots,const double risk,const int digits_adjust)
  {
   if(lots<0.0 && risk<0.0)
     {
      Print(__FUNCTION__,", ERROR: Parameter (\"lots\" or \"risk\") can't be less than zero");
      return(false);
     }
   if(lots==0.0 && risk==0.0)
     {
      Print(__FUNCTION__,", ERROR: Trade is impossible: You have set \"lots\" == 0.0 and \"risk\" == 0.0");
      return(false);
     }
   if(lots>0.0 && risk>0.0)
     {
      Print(__FUNCTION__,", ERROR: Trade is impossible: You have set \"lots\" > 0.0 and \"risk\" > 0.0");
      return(false);
     }
   if(lots>0.0)
     {
      string err_text="";
      if(!CheckVolumeValue(lots,err_text))
        {
         Print(__FUNCTION__,", ERROR: ",err_text);
         return(false);
        }
     }
   else
      if(risk>0.0)
        {
         if(m_money!=NULL)
            delete m_money;
         m_money=new CMoneyFixedMargin;
         if(m_money!=NULL)
           {
            if(!m_money.Init(GetPointer(m_symbol),Period(),m_symbol.Point()*digits_adjust))
               return(false);
            m_money.Percent(risk);
           }
         else
           {
            Print(__FUNCTION__,", ERROR: Object CMoneyFixedMargin is NULL");
            return(false);
           }
        }
//---
   return(true);
  }
//+------------------------------------------------------------------+
 
amin ghanbari # :

***

Quando uso o RISK para determinar o lote, vejo o erro getpointer e tenho que usar o fix LOT:

Você vê seu erro - pense: qual valor de risco você está definindo?

 

Observação: se estiver usando instrumentos com um spread ENORME, é preciso definir um Stop Loss adequado.

Lembre-se sempre: há DOIS preços: Ask e Bid.

 
Vladimir Karputov #:

Você vê o seu erro - pense: que valor de risco você está estabelecendo?

Obrigado por sua resposta. Tudo está correto no expert. Os problemas se devem ao saldo insuficiente e aoSL incorreto devido ao spread enorme.

Defino 1% de risco para um saldo de US$ 500. Alavancagem definida como 100. Esses erros aparecem:

OpenBuy, ERRO: método CheckOpenLong

OpenSell, ERRO: método CheckOpenShort

isso significa que esse saldo não é suficiente para abrir uma posição com o tamanho mínimo de lote em BTC?

Isso é verdade?

 
amin ghanbari # :

Obrigado por sua resposta. Tudo está correto no expert. Os problemas se devem ao saldo insuficiente e ao SL incorreto devido ao spread do abraço.

Eu defini 1% de risco para um saldo de US$ 500. A alavancagem foi definida como 100. Esses erros aparecem:

OpenBuy, ERRO: método CheckOpenLong

OpenSell, ERRO: método CheckOpenShort

isso significa que esse saldo não é suficiente para abrir uma posição com o tamanho mínimo de lote em BTC?

Isso é verdade?

Você encontrou seu erro. Agora pense em como corrigir seu erro.

 

Olá, Vladimir

Obrigado por compartilhar o especialista, estou tentando adicionar uma condição para fechar a posição quando o fechamento da barra passa a nuvem, esse é o código que adicionei, pode me ajudar, por favor, sou muito novo no mql5


 
Mahmoud Ahmed Mahmoud Fahmy # :

Olá, Vladimir

Obrigado por compartilhar o especialista, estou tentando adicionar uma condição para fechar a posição quando o fechamento da barra passa a nuvem, esse é o código que adicionei, pode me ajudar, por favor, sou muito novo no mql5


Por favor, insira o código corretamente: PRIMEIRO, pressione o botão Código e, EM SEGUIDA, cole o código na janela pop-up.

 
Vladimir Karputov #:

Insira o código corretamente: PRIMEIRO, pressione o botão e, EM SEGUIDA, cole o código na janela pop-up.

Olá, novamente

Muito obrigado por responder e peço desculpas pela bagunça que fiz. Alterei um pouco o código da minha última postagem e ele ainda não fecha a posição, e eu defini stoploss = 0

   double Kij2=iIchimokuGet(KIJUNSEN_LINE,3);
   double SpanA2=iIchimokuGet(SENKOUSPANA_LINE,3);
   double SpanB2=iIchimokuGet(SENKOUSPANB_LINE,3);
   double Chinkou2=iIchimokuGet(CHIKOUSPAN_LINE,3);
   
   
   //encerramento de ordens
   
  
   
   
  // m_trade.PositionClose(m_symbol.Name());
   //comprar pedidos
  // {
      
     // se (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY )
     // {
        // se(iClose(_Symbol,Period(),1) < SpanB)
       // {
            //m_trade.PositionClose(_Symbol);
          // }
            
     // } 
     // }
      
      //SELL ORDERS
      
     // se(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
     // {
         
       // se(iClose(_Symbol,Period(),1) > SpanB)
        // {
         // m_trade.PositionClose(_Symbol);
         //}
      // }
            
          // if(m_trade.ResultRetcode()==10008 || m_trade.ResultRetcode()==10009) /A solicitação foi concluída ou a ordem foi colocada
             // {
             // Print("Regras de saída: Uma ordem de fechamento foi colocada com sucesso com o Ticket#: ",m_trade.ResultOrder());
             // }
            //caso contrário
              // {
              // Imprimir("Regras de saída: A solicitação de ordem de fechamento não pôde ser concluída: ",GetLastError());
             // ResetLastError();
               //retorno;
              // }
            
        // }
    // }
  // }
   
   
//--- verificar BUY
      if (iClose(_Symbol,PERIOD_D1,1) < iClose(_Symbol,PERIOD_D1,2) && iHigh(_Symbol,PERIOD_H4,2) - iLow(_Symbol,PERIOD_H4,2) > iHigh(_Symbol,PERIOD_H4,1)- iLow(_Symbol,PERIOD_H4,2) )
      {  

      if (iOpen(m_symbol.Name(),Period(),0) > Kij && iOpen(m_symbol.Name(),Period(),0) > SpanA)
  // se(Ten1<=Kij1 && Ten>Kij &&
   //&& m_symbol.Ask()>SpanA1 
   //&& m_symbol.Ask()>SpanB1 && 
     // iOpen(m_symbol.Name(),Period(),1)<iClose(m_symbol.Name(),Period(),1)) //|| 
      //(Chinkou1<=iClose(m_symbol.Name(),Period(),11) && Chinkou>iClose(m_symbol.Name(),Period(),10) && 
     // m_symbol.Ask()>SpanA1 && m_symbol.Ask()>SpanB1 && 
     // iOpen(m_symbol.Name(),Period(),1)<iClose(m_symbol.Name(),Period(),1))
     {
      double sl=(InpStopLoss==0)?0.0:m_symbol.Ask()-ExtStopLoss;
      if(sl>=m_symbol.Bid()) // incidente: a posição ainda não está aberta e já deve estar fechada
        {
         PrevBars=0;
         return;
        }
      double tp=(InpTakeProfit==0)?0.0:m_symbol.Ask()+ExtTakeProfit;
           if(iClose(_Symbol,Period(),1) < SpanB)
   {
      if(m_position.Select(_Symbol))                     //se a posição para esse símbolo já existir
        {
         if(m_position.PositionType()==POSITION_TYPE_BUY) m_trade.PositionClose(_Symbol);   //e essa é uma posição de compra, então feche-a
        // se (m_Position.PositionType()==POSITION_TYPE_SELL) retornar;
         }
   }
      
      OpenBuy(sl,tp);
     }
     }
     
//--- verificar SELL
         
     if (iClose(_Symbol,PERIOD_D1,1) > iClose(_Symbol,PERIOD_D1,2) && iHigh(_Symbol,PERIOD_D1,2) - iLow(_Symbol,PERIOD_H4,2) > iHigh(_Symbol,PERIOD_H4,1)- iLow(_Symbol,PERIOD_H4,2) )
      {
 
      if(iOpen(m_symbol.Name(),Period(),0) < Kij && iOpen(m_symbol.Name(),Period(),0) < SpanB)
        
         
        
  // se(Ten1>Kij1 && Ten<Kij &&
   //&& m_symbol.Bid()<SpanA1 && m_symbol.Bid()<SpanB1 && 
     // iOpen(m_symbol.Name(),Period(),1)>iClose(m_symbol.Name(),Period(),1)) //|| 
      //(Chinkou1>=iOpen(m_symbol.Name(),Period(),11) && Chinkou<iOpen(m_symbol.Name(),Period(),10) && 
      //m_symbol.Bid()<SpanA1 && m_symbol.Bid()<SpanB1 && 
      //iOpen(m_symbol.Name(),Period(),1)>iClose(m_symbol.Name(),Period(),1)))
     {
      double sl=(InpStopLoss==0)?0.0:m_symbol.Bid()+ExtStopLoss;
      if(sl<=m_symbol.Ask()) // incidente: a posição ainda não está aberta e já deve estar fechada
        {
         PrevBars=0;
         return;
        }
      double tp=(InpTakeProfit==0)?0.0:m_symbol.Bid()-ExtTakeProfit;
      
         if(iClose(_Symbol,Period(),1) > SpanB)
         {
            if(m_position.Select(_Symbol))                     //se a posição para esse símbolo já existir
            {
               if(m_position.PositionType()==POSITION_TYPE_SELL) m_trade.PositionClose(_Symbol);   //e essa é uma posição de compra, então feche-a
        // se (m_Position.PositionType()==POSITION_TYPE_SELL) retornar;
            }
         }
      
      OpenSell(sl,tp);
     }
    } 
    // m_trade.PositionClose(_Symbol);
  }