Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 133

 
Aliaksandr Kryvanos:

¡Hola!

¿Puede alguien sugerir un análogo de la sustitución de MaxLotCheck() de MT5 para MT4, gracias

No hay ninguna función en sí misma. Tienes que escribir el tuyo propio. Con todas las comprobaciones debería caber en 10-20 líneas.

 
Ihor Herasko:

No hay ninguna función en sí misma. Tienes que escribir el tuyo propio. Con todas las comprobaciones, debería caber en 10-20 líneas.

De acuerdo, ¿pero la fórmula en sí?

 
Aliaksandr Kryvanos:

Bien, pero aquí está la fórmula en sí...

Veamos la fuente:

//+------------------------------------------------------------------+
//| Access functions OrderCalcMargin(...).                           |
//| INPUT:  name            - symbol name,                           |
//|         trade_operation - trade operation,                       |
//|         price           - price of the opening position,         |
//|         percent         - percent of available margin [1-100%].   |
//+------------------------------------------------------------------+
double CAccountInfo::MaxLotCheck(const string symbol,const ENUM_ORDER_TYPE trade_operation,
                                 const double price,const double percent) const
  {
   double margin=0.0;
//--- checks
   if(symbol=="" || price<=0.0 || percent<1 || percent>100)
     {
      Print("CAccountInfo::MaxLotCheck invalid parameters");
      return(0.0);
     }
//--- calculate margin requirements for 1 lot
   if(!OrderCalcMargin(trade_operation,symbol,1.0,price,margin) || margin<0.0)
     {
      Print("CAccountInfo::MaxLotCheck margin calculation failed");
      return(0.0);
     }
//---
   if(margin==0.0) // for pending orders
      return(SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX));
//--- calculate maximum volume
   double volume=NormalizeDouble(FreeMargin()*percent/100.0/margin,2);
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP);
   if(stepvol>0.0)
      volume=stepvol*MathFloor(volume/stepvol);
//---
   double minvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN);
   if(volume<minvol)
      volume=0.0;
//---
   double maxvol=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX);
   if(volume>maxvol)
      volume=maxvol;
//--- return volume
   return(volume);
  }
ENUM_ORDER_TYPE y OrderCalcMargin deben ser reemplazados aquí.
 
Yum) la fuente... gracias
 

Todavía no está claro....

margin = MarketInfo(Symbol(), MODE_MARGINREQUIRED)

и

double margin;

OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1.0,SymbolInfoDouble(Symbol(),SYMBOL_ASK),margin);


devolver diferentes números de margen para abrir 1 lote

 
Aliaksandr Kryvanos:

Todavía no está claro....

margin = MarketInfo(Symbol(), MODE_MARGINREQUIRED)

и

double margin;

OrderCalcMargin(ORDER_TYPE_BUY,Symbol(),1.0,SymbolInfoDouble(Symbol(),SYMBOL_ASK),margin);


devolver diferentes números de margen para la apertura de 1 lote

Es evidente que estáis comparando en terminales diferentes )) Arriba es MT4, abajo es MT5. Así que los servidores son diferentes, las condiciones comerciales son diferentes. Lo más sencillo es un apalancamiento diferente.

¿Qué es lo que realmente obtuviste, cuáles fueron los valores?

 

Sí, así es, el apalancamiento es diferente, en uno 1/300, en el otro 1/2000

gracias

 

Hola a todos.

Mi EA utiliza una búsqueda de varios pasos para un punto de entrada, para ello primero comprueba el historial en busca de señales desde el principio, luego trabaja en tiempo real. Así que en el probador de estrategias, todo funciona bien con el historial, pero cuando lo ejecuto en tiempo real, no escanea correctamente el historial y se pierde las señales, ¿cuál podría ser el problema?

Tal vez haya una respuesta obvia, porque el fragmento de código es bastante grande para publicarlo aquí, así que no voy a dar el código todavía.

 
ArturR:

Hola a todos.

Mi EA utiliza una búsqueda de varios pasos para un punto de entrada, para ello primero comprueba el historial en busca de señales desde el principio, luego trabaja en tiempo real. Así que en el probador de estrategias, todo funciona bien con el historial, pero cuando lo ejecuto en tiempo real, no escanea correctamente el historial y se pierde las señales, ¿cuál podría ser el problema?

Tal vez haya una respuesta obvia, porque el fragmento de código es bastante grande para publicarlo aquí, así que no voy a dar el código todavía.

Haz la depuración pieza por pieza. Separe la exploración de la historia en el guión. La salida de información detallada con Alert(): primero el número de barras en el historial, la fecha de inicio y de finalización, ... y luego el proceso de escaneo. Puede ser más conveniente escribirlo todo en un archivo
 
STARIJ:
Haga la depuración paso a paso. Separe la exploración del historial en un guión. Emitir mediante Alert() la información detallada: en primer lugar, el número de barras en el historial, la fecha de inicio y de finalización, ... y luego el proceso de escaneo. Puede ser más conveniente escribirlo todo en un archivo

Gracias por el consejo, voy a leer cómo hacerlo.

Tengo una pregunta más, cuando ejecuto la depuración en tiempo real, Metatrader4 siempre la ejecuta en CHF, ¿alguien sabe qué ajustar para que se ejecute en el par que necesito?

Fueron los valores del indicador para otros plazos los que aparentemente no se consideran en el probador. Gracias por tu participación )