Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 588

 
lil_lil:

Estoy cerrando 4 posiciones a la vez, ¿cómo puedo contarlas como una sola en la función de recuento de pérdidas?

Pueden cerrar, debido a los deslizamientos, no al mismo precio y la hora puede ser diferente

Juicio:

Si el broker permite el contracierre, debemos abrir una contraorden con un volumen igual al de las órdenes cerradas acumulativamente para fijar el precio de cierre. Entonces se fija el precio de cierre y se pueden ejecutar tranquilamente 4 operaciones para cerrar las órdenes contrarias.

 

¿Pueden decirme cómo se calcula el margen?

Algunos corredores cobran un margen por cada posición. Y algunos corredores, sólo en la diferencia de los volúmenes en la compra y la venta. (Es decir, si la cuenta está totalmente bloqueada, el margen es cero)


¿Cómo puedo determinar el método de cálculo del margen mediante programación?

 

Hola. Estoy buscando un fractal por encima de la MA.

Buscando un fractal por encima de la MA, memorizo una barra, luego busco un fractal de esta barra y si es menor que el primero que encuentro, entonces verdadero

Constantemente falso en los comentarios

Comment(f_ma(Symbol(),0,i));
//+----------------------------------------------------------------------------+

bool f_ma(string sy="0",int tf=0,int nf=0) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0,MA=0,fr1,fr2;
   int    d=MarketInfo(sy,MODE_DIGITS),s;
   if(d==0) if(StringFind(sy,"JPY")<0) d=4; else d=2;
   int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=0) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);continue;}
         
        }
     }
     //
      for(i=nf+ num_bar; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1) return(true);
        }
     }
     
     
   return(false);
  }
 
Ghabo:

Hola. Estoy buscando un fractal por encima de la MA.

Buscando un fractal por encima de la MA, memorizo una barra, luego busco un fractal de esta barra y si es menor que el primero que encuentro, entonces verdadero

Constantemente falso en los comentarios

El problema está en esta línea

         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);continue;}


Si se encuentra un fractal y está por encima de la MA, debemos interrumpir el ciclo en lugar de continuarlo. Después de encontrar el primer fractal habrá otro y un tercero y así hasta ...

 
Alexey Viktorov:

El problema está en esta línea


Si se encuentra un fractal y está por encima de la MA, debemos interrumpir el ciclo en lugar de continuarlo. Después de encontrar el primer fractal habrá otro y un tercero y así hasta ...

Gracias. Sustituido por break;Ahora siempre es verdadero. pero la condiciónif(fr2<fr1) no se cumple.
 
Ghabo:
Gracias. Sustituido por break;Ahora siempre es verdadero. pero la condiciónif(fr2<fr1) no se cumple.

Así que tenemos que añadir esta condición antes de mostrar el resultado de la función. ¿Qué tiene de difícil?

 
Alexey Viktorov:

Por lo tanto, hay que añadir esta condición antes de que la función emita el resultado. ¿Qué tiene de difícil?

¿No debería la función devolver false si no se cumple la condición?

#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
if(rates_total<100) return(0);
int limit=rates_total-prev_calculated;
if(limit>200)limit=200;
   for(int i=limit; i>0; i--)
     {
     
     
     Comment(f_ma(Symbol(),0,i));
     }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
  //-------------------
  bool f_ma(string sy="0",int tf=0,int nf=0) 
  {
   if(sy=="" || sy=="0") sy=Symbol();
   double f=0,MA=0,fr1,fr2;
   int    d=MarketInfo(sy,MODE_DIGITS),s;
   if(d==0) if(StringFind(sy,"JPY")<0) d=4; else d=2;
   int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=0) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);break;}
         
        }
     }
     //
      for(i=nf+ num_bar; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1) return(true);
        }
     }
     
     
   return(false);
  }
  
 
Ghabo:

¿No debería la función devolver false si no se cumple la condición?

Comprueba que iFractals devuelve cero o un valor vacío.

 
Alexey Viktorov:

Comprueba que iFractals devuelve cero o un valor vacío.

Hay un valor vacío en la ventana de datos. Sustituidoif(f!=0) por if(f!=EMPTY_VALUE), no hay cambios en el resultado.
 
Ghabo:
Hay un valor vacío en la ventana de datos. Sustituidoif(f!=0) por if(f!=EMPTY_VALUE), el resultado no cambia.

1. He dicho comprobar, no sustituir. iFractals devuelve 0 si no hay ningún fractal. No lo uso regularmente y, naturalmente, no atasco los restos no secos de la memoria con tales trivialidades.

2. La función, aunque terriblemente escrita, sigue funcionando bien.

3. El último valor se muestra en Comentario. Sustitúyalo por

     Print("************ ", f_ma(Symbol(), 0, 0));
Y ver cuántas veces se imprime
2018.07.30 21:02:43.656 00 EURUSD.e,H1: ************ true
Razón de la queja: