Asesores Expertos: Expert Ichimoku - página 2

 
Vladimir Karputov #:

Habilite la depuración de código y realice pruebas paso a paso.

Gracias por su respuesta.

Hago depuración y encontró que SL incorrecta debido a la alta propagación causado este problema.

 
amin ghanbari # :

Gracias por su respuesta.

Hago depuración y encontró que SL incorrecta debido a la alta propagación causado este problema.

El código dentro del Asesor Experto es correcto - pero si en el momento de colocar el precio hace un movimiento fuerte, no se abrirá la POSICIÓN.

 
Vladimir Karputov #:

El código dentro del Asesor Experto es correcto - pero si en el momento de colocar el precio hace un movimiento fuerte, la POSICIÓN no se abrirá.

Creo que esta sección debe ser modificada para crypo:


//--- sintonización para 3 o 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;


Cuando utilizo RISK para determinar el lote veo un error getpointer y tengo que utilizar fix LOT:

//+------------------------------------------------------------------+
//| Lotes o riesgo en porcentaje para un acuerdo de un margen libre |
//+------------------------------------------------------------------+
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 # :

***

Cuando utilizo RISK para determinar el lote me aparece un error getpointer y tengo que utilizar fix LOT:

Ves tu error - piensa: ¿qué valor de riesgo estás poniendo?

 

Observación: si utiliza instrumentos con un spread ENORME, debe establecer un Stop Loss adecuado.

Recuerde siempre que hay DOS precios: Demanda y Oferta.

 
Vladimir Karputov #:

Si ves tu error, piensa: ¿qué valor de riesgo estás fijando?

Gracias por su respuesta. todo es correcto en el experto. los problemas se deben a la insuficiencia de equilibrio ySL incorrecta debido a la propagación abrazo.

Me puse 1% de riesgo para 500 $ de saldo. apalancamiento fijado en 100. estos errores apears:

OpenBuy, ERROR: method CheckOpenLong

OpenSell, ERROR: método CheckOpenShort

¿significa que este saldo no es suficiente para abrir una posición con un tamaño de lote mínimo en BTC?

¿es cierto?

 
amin ghanbari # :

Gracias por su respuesta. todo es correcto en el experto. los problemas se deben a la insuficiencia de saldo y SL incorrecta debido a la propagación abrazo.

Me puse 1% de riesgo para 500 $ Balance. apalancamiento establecido en 100. estos errores apears:

OpenBuy, ERROR: método CheckOpenLong

OpenSell, ERROR: método CheckOpenShort

¿significa que este saldo no es suficiente para abrir una posición con un tamaño de lote mínimo en BTC?

¿es cierto?

Has encontrado tu error. Ahora piensa en cómo puedes corregir tu error.

 

Hola Vladimir

Gracias por compartir el experto, estoy tratando de añadir una condición para el cierre de la posición cuando el cierre de la barra de pasar la nube , que es el código que he añadido, me puede ayudar, por favor, soy muy nuevo en mql5


 
Mahmoud Ahmed Mahmoud Fahmy # :

Hola, Vladimir

Gracias por compartir el experto, estoy tratando de añadir una condición para el cierre de la posición cuando el cierre de la barra de pasar la nube , que es el código que he añadido, me puede ayudar, por favor, soy muy nuevo en mql5


Por favor inserte el código correctamente: PRIMERO presione el botón Código, y DESPUÉS pegue el código en la ventana emergente.

 
Vladimir Karputov #:

Por favor, inserte el código correctamente: PRIMERO pulse el botón , y DESPUÉS pegue el código en la ventana emergente.

Hola de nuevo

Muchas gracias por responder , y siento mucho el lio que hice , cambie un poco el codigo de mi ultimo post , y sigue sin cerrar posicion , y puse 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);
   
   
   //órdenes de cierre
   
  
   
   
  // m_trade.PositionClose(m_symbol.Name());
   //comprar pedidos
  // {
      
     // if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY )
     // {
        // if(iClose(_Symbol,Period(),1) < SpanB)
       // {
            //m_trade.PositionClose(_Symbol);
          // }
            
     // } 
     // }
      
      //ÓRDENES DE VENTA
      
     // if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
     // {
         
       // if(iClose(_Symbol,Period(),1) > SpanB)
        // {
         // m_trade.PositionClose(_Symbol);
         //}
      // }
            
          // if(m_trade.ResultRetcode()==10008 || m_trade.ResultRetcode()==10009) //Se completa la solicitud o se realiza la orden
             // {
             // Print("Reglas de salida: Se ha colocado correctamente una orden de cierre con Ticket#: ",m_trade.ResultOrder());
             // }
            //si no
              // {
              // Print("Reglas de salida: No se ha podido completar la solicitud de orden de cierre.Error: ",GetLastError());
             // RestablecerÚltimoError();
               //retorno;
              // }
            
        // }
    // }
  // }
   
   
//--- check 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)
  // if(Ten1<=Kij1 && Ten>Kij &&
   //&& m_symbol.Ask()>SpanA1 
   //&& m_symbol.Ask()>SpanB1 && 
     // iOpen(m_símbolo.Nombre(),Periodo(),1)<iClose(m_símbolo.Nombre(),Periodo(),1)) //|| 
      //(Chinkou1<=iClose(m_símbolo.Nombre(),Periodo(),11) && Chinkou>iClose(m_símbolo.Nombre(),Periodo(),10) && 
     // m_symbol.Ask()>SpanA1 && m_symbol.Ask()>SpanB1 && 
     // iOpen(m_símbolo.Nombre(),Periodo(),1)<iClose(m_símbolo.Nombre(),Periodo(),1))
     {
      double sl=(InpStopLoss==0)?0.0:m_symbol.Ask()-ExtStopLoss;
      if(sl>=m_symbol.Bid()) // incidencia: la posición aún no está abierta, y debe estar ya cerrada
        {
         PrevBars=0;
         return;
        }
      double tp=(InpTakeProfit==0)?0.0:m_symbol.Ask()+ExtTakeProfit;
           if(iClose(_Symbol,Period(),1) < SpanB)
   {
      if(m_position.Select(_Symbol))                     //si la posición para este símbolo ya existe
        {
         if(m_position.PositionType()==POSITION_TYPE_BUY) m_trade.PositionClose(_Symbol);   //y esta es una posición de Compra, entonces ciérrala
        // if(m_Position.PositionType()==POSITION_TYPE_SELL) return;
         }
   }
      
      OpenBuy(sl,tp);
     }
     }
     
//--- comprobar VENDER
         
     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)
        
         
        
  // if(Ten1>Kij1 && Ten<Kij &&
   //&& m_symbol.Bid()<SpanA1 && m_symbol.Bid()<SpanB1 && 
     // iOpen(m_símbolo.Nombre(),Periodo(),1)>iClose(m_símbolo.Nombre(),Periodo(),1)) //|| 
      //(Chinkou1>=iOpen(m_símbolo.Nombre(),Periodo(),11) && Chinkou<iOpen(m_símbolo.Nombre(),Periodo(),10) && 
      //m_símbolo.Oferta()<SpanA1 && m_símbolo.Oferta()<SpanB1 && 
      //iOpen(m_símbolo.Nombre(),Periodo(),1)>iClose(m_símbolo.Nombre(),Periodo(),1)))
     {
      double sl=(InpStopLoss==0)?0.0:m_symbol.Bid()+ExtStopLoss;
      if(sl<=m_symbol.Ask()) // incidencia: la posición aún no está abierta, y debe estar ya cerrada
        {
         PrevBars=0;
         return;
        }
      double tp=(InpTakeProfit==0)?0.0:m_symbol.Bid()-ExtTakeProfit;
      
         if(iClose(_Symbol,Period(),1) > SpanB)
         {
            if(m_position.Select(_Symbol))                     //si la posición para este símbolo ya existe
            {
               if(m_position.PositionType()==POSITION_TYPE_SELL) m_trade.PositionClose(_Symbol);   //y esta es una posición de Compra, entonces ciérrala
        // if(m_Position.PositionType()==POSITION_TYPE_SELL) return;
            }
         }
      
      OpenSell(sl,tp);
     }
    } 
    // m_trade.PositionClose(_Symbol);
  }