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

 

Por favor, ayuda. No puedo entender el bucle for(), todo el tiempo después de la actualización, debido a la compensación(iMA(NULL,PERIOD_M1,1,1,MODE_SMA,PRICE_OPEN,i)) ¡El indicador se vuelve a dibujar!


//+------------------------------------------------------------------+
//|                                                         help.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+

#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property strict
#include <MovingAverages.mqh>
//--- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property   indicator_color1  clrSilver
#property   indicator_color2  clrRed
#property   indicator_width1  2

//--- indicator parameters
input int SignalSMA=8;            // Signal SMA Period
//--- indicator buffers
double    ExtBuffer[];
double    ExtSignalBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   IndicatorDigits(Digits+1);
//--- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexStyle(1,DRAW_LINE);
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer);
   SetIndexBuffer(1,ExtSignalBuffer);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
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[])
  {
   int i,limit;
//--- last counted bar will be recounted
   limit=rates_total-prev_calculated;
   if(prev_calculated>0)
      limit++;
//--- counted in the 1-st buffer
   for(i=0;i<limit;i++)
      ExtBuffer[i]=(
                    iMA(NULL,PERIOD_CURRENT,1,0,MODE_SMA,PRICE_HIGH,i)
                    +iMA(NULL,PERIOD_M1,1,1,MODE_SMA,PRICE_OPEN,i)
                    );
//--- signal line counted in the 2-nd buffer
   SimpleMAOnBuffer(rates_total,prev_calculated,0,SignalSMA,ExtBuffer,ExtSignalBuffer);
//--- done
   return(rates_total);
  }
//+------------------------------------------------------------------+

Muchas gracias de antemano.

 
Alexey Viktorov:

En mi opinión, el planteamiento no es nada lógico. ¿Por qué definir el día de la semana? ¿Qué más da el día que sea, si la condición debe decir "no abrir más de xxx órdenes hoy"?

Me parece más lógico contar las órdenes abiertas hoy y especificar la condición correspondiente.

no hay fecha de apertura de pedidos.


Si lo sabes, por favor escribe cómo hacerlo)
No entiendo cómo asegurar que en un día determinado no se abran más de n-ésimo número de órdenes durante todo el día.

 
cripple:

Por favor, ayuda. No puedo entender el bucle for(), todo el tiempo después de la actualización, debido a la compensación(iMA(NULL,PERIOD_M1,1,1,MODE_SMA,PRICE_OPEN,i)) ¡El indicador se vuelve a dibujar!


Se lo agradezco de antemano.

Las MAs tienen diferentes TFs. Necesitas encajar el marco de tiempo más alto en el M1 TF, es decir, contar las MAs dos veces con diferentes números de ticks. En este caso, un mismo valor del periodo más antiguo se sumará a diferentes valores del más joven.

Si miras a través de i obtienes, por ejemplo, 10 velas de periodo D1 y 10 M1. Lógicamente algo está mal....

Otra cosa, si el indicador se pone en M1, funcionará sin re-brisings más probable

 
Renat Akhtyamov:

las MAs tienen diferentes TFs. tienes que encajar el marco de tiempo más alto en el M1 TF, es decir, contar las MAs dos veces con diferentes números de ticks.

Al pasar por i ahora está tomando por ejemplo 10 velas del periodo D1 y 10 M1. Lógicamente algo está mal....

Sí, tienes razón, pero mi mente aún no es suficiente para entender cómo hacer que M1 cuente correctamente
 
cripple:
Sí, tienes razón, pero mi mente aún no es suficiente para averiguar cómo hacer que M1 cuente correctamente

Además, necesito sincronizar M1 con un timeframe superior, porque 1 barra de M5 no necesariamente corresponderá a 5 velas de M1, puede ser 4 o 1.

 
cripple:
Sí, tienes razón, pero mi mente aún no es suficiente para entender cómo hacer que M1 cuente correctamente

Prueba con

int  Bars(
   string           symbol_name,     // имя символа
   ENUM_TIMEFRAMES  timeframe,       // период
   datetime         start_time,      // с какой даты
   datetime         stop_time        // по какую дату
   );

de la barra i-ésima y poner el número de barra resultante en lugar de i.

 
¿Podría decirme si se puede utilizar el teclado para desplazarse por los pares abiertos en el terminal mt4?
 
LRA:
¡¡¡Estimado novikov433!!! Enseñarte a programar, o escribirte un Asesor Experto gratis o ambas cosas!!! A cambio, enséñame cómo se traducen las órdenes con pérdidas en sin pérdidas. Puede utilizar un ejemplo sencillo. Le doy a mi mujer una orden (encargo): comprar un cubo de patatas por la mañana temprano en el mercado, y a las 10 (análisis fundamental) el precio sube - vender. Pero a veces llega un camión de patatas a las 10:30 (noticias). Y el precio (en las noticias) baja instantáneamente y dura hasta el final del día, o incluso durante toda la semana. Pongo un Stop Loss - si el precio baja 10 rublos, vendo tan pronto como pueda (al precio de mercado). Cómo cambiar el orden, para evitar pérdidas. Si esta variante es interesante, envíeme su correo electrónico.
El problema es que el mercado se fue ligeramente hacia el lado requerido y luego retrocedió, por lo que hay que cerrar la operación en el punto de equilibrio y abrirla para una inversión. me he vuelto adicto a él nada más empezar. una vez más me he convencido de que es una mierda comerciar con las manos. ¿cómo puedo entender por qué tengo que escribir tantos componentes en mi código?
 
Alexey Viktorov:

Prueba con

la hora de la barra i-ésima y poner el número de barra resultante en lugar de i.


¿Has pensado en algo así?
//+------------------------------------------------------------------+
//|                                                         help.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+

#property copyright   "2005-2014, MetaQuotes Software Corp."
#property link        "http://www.mql4.com"
#property description "Moving Averages Convergence/Divergence"
#property strict
#include <MovingAverages.mqh>
//--- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 2
#property   indicator_color1  clrSilver
#property   indicator_color2  clrRed
#property   indicator_width1  2

//--- indicator parameters
input int SignalSMA=8;            // Signal SMA Period
//--- indicator buffers
double    ExtBuffer[];
double    ExtSignalBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
   IndicatorDigits(Digits+1);
//--- drawing settings
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexStyle(1,DRAW_LINE);
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtBuffer);
   SetIndexBuffer(1,ExtSignalBuffer);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
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[])
  {
   int i,limit;
//--- last counted bar will be recounted
   limit=rates_total-prev_calculated;
   if(prev_calculated>0)
      limit++;
//--- counted in the 1-st buffer
   for(i=0;i<limit;i++)
     {
      int bars=iBarShift(Symbol(),PERIOD_M1,iTime(Symbol(),PERIOD_CURRENT,i),false);
      ExtBuffer[i]=(
                    iMA(NULL,PERIOD_CURRENT,1,0,MODE_SMA,PRICE_HIGH,i)
                    +iMA(NULL,PERIOD_M1,1,1,MODE_SMA,PRICE_OPEN,bars)
                    );
      Print(bars);
     }
//--- signal line counted in the 2-nd buffer
   SimpleMAOnBuffer(rates_total,prev_calculated,0,SignalSMA,ExtBuffer,ExtSignalBuffer);
//--- done
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
ax00071:
Gracias por su atención )) Soy un pringado... ... al cierre tenía la condición de cerrar la operación a las 22:00 del viernes, sin ninguna condición adicional para comprobar el tipo de operación. El acuerdo en sí se cerró un par de horas antes. Pues bien, cuando llegaron las 22:00 horas, el Asesor Experto empezó a enviar órdenes para cerrar una orden que ya estaba cerrada ... .
Apenas deberías llamarte a ti mismo una planta. Si has conseguido localizar, entender y corregir un error de este tipo, ¡te estás acercando al nivel de un programador!