Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 824

 
lil_lil:

Gracias, ¿cómo escribo un bucle para encontrar el número de la barra que cruza las dos MAs cuando se cumplen los dos primeros puntos del algoritmo y hay valores de las dos MAs en la primera barra?

/

.


Aha, después de todo no lo resolviste mediante arrays.

Nota: La solución a través de arrays (copia de los TRES últimos valores de los indicadores en los arrays Primero[], Segundo[] y Tercero[]) es elcruce de dos iMAs- OnTick():

//--- We look for crossing of two indicators
   double   First[];
   double   Second[];
   double   Third[];
   ArraySetAsSeries(First,true);    // index [0] - the most right bar on a charts
   ArraySetAsSeries(Second,true);   // index [0] - the most right bar on a charts
   ArraySetAsSeries(Third,true);    // index [0] - the most right bar on a charts
   int      buffer_num=0;           // indicator buffer number 
   int      start_pos=0;            // start position 
   int      count=3;                // amount to copy 
   if(!iMAGet(handle_iMA_First,buffer_num,start_pos,count,First))
      return;
   if(!iMAGet(handle_iMA_Second,buffer_num,start_pos,count,Second))
      return;
   if(InpFilterMA)
      if(!iMAGet(handle_iMA_Third,buffer_num,start_pos,count,Third))
         return;
//--- step 1: check in the arrays bars [0] and [1]
   if(First[0]>Second[0] && First[1]<Second[1]) // buy
     {
      if(InpFilterMA)
         if(Third[0]>=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[0] && First[1]>Second[1]) // sell
     {
      if(InpFilterMA)
         if(Third[0]<=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }
//--- step 2: on a step of 1 crossing haven't found. check in the arrays bars [0] and [2]
   if(First[0]>Second[0] && First[2]<Second[2]) // buy
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[2] && First[1]>Second[2]) // sell
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }


En tu caso (un valor a la vez), el bucle tendrá este aspecto:

   int      signal=0;                                 // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
   double   MA1_curr=iMAGet(handle_iMA_1,0);          // the value of the 1st MA on i bar
   double   MA2_curr=iMAGet(handle_iMA_2,0);          // the value of the 1st MA on i bar
   for(int i=0;i<100;i++)
     {
      double   MA1_prev=iMAGet(handle_iMA_1,i+1);     // the value of the 1st MA on i+1 th bar
      double   MA2_prev=iMAGet(handle_iMA_2,i+1);     // the value of the 1st MA on i+1 th bar
      //---
      signal=0;                                       // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
      if(MA1_prev<MA2_prev && MA1_curr>MA2_curr)
         signal=1;
      else if(MA1_prev>MA2_prev && MA1_curr<MA2_curr)
         signal=-1;
      //---
      MA1_curr=MA1_prev;
      MA2_curr=MA2_prev;
     }

MA1_curr - el valor del indicador MA1 en la barra #i, MA1_prev - el valor del indicador MA1 en la barra #i+1
MA2_curr - el valor del indicador MA2 en la barra #i, MA2_prev - el valor del indicador MA2 en la barra #i+1

Cuando se produce un cruce (la señal de la variable es "-1" o "1"), el valor de i será el número de la barra en la que se produjo el cruce.

Este es el algoritmo más sencillo para encontrar el cruce, pero no es el más preciso.

 
Vladimir Karputov:

Sí, después de todo decidiste no usar arrays...


Gracias, su otroMA Cross EA fue utilizado como ejemplo

Quiero entrar en él en la tercera o quinta o...n barras después de cruzar

Vladimir Karputov:

En tu caso (obteniendo un valor) el ciclo se verá así

¿Por qué no hay salida del bucle cuando se encuentra un cruce?

¿Pueden ponerse estas condiciones fuera del bucle?

 if(signal==-1)num_bar_b=i;
 if(signal==1)num_bar_s=i;

.

 

Buenas tardes. ¿Podría decirme en qué formato descargar los datos históricos del servidor de Finam o MFD.ru para importar el historial de cotizaciones? No puedo hacerlo en absoluto. Sólo puedo guardarlo de txt a csv y ya está.

 
Eol:

Buenas tardes. ¿Podría decirme en qué formato descargar los datos históricos del servidor de Finam o MFD.ru para importar el historial de cotizaciones? No puedo hacerlo en absoluto. Sólo puedo guardarlo de txt a csv y ya está.


No tienes que descargar nada en MetaTrader 5 :) - En cuanto te conectas a un servidor de operaciones, tienes a tu disposición el historial de ticks reales. Mira haciaCopyTicks

 
Vladimir Karputov:

En MetaTrader 5 no necesitas descargar nada :) - En cuanto te conectes al servidor de operaciones, tendrás a tu disposición el historial de ticks reales. Mira haciaCopyTicks


Sólo necesito 10 años de existencias rusas. Mi corredor no me da tanto y es poco probable que encuentre uno.

 
5.0 Build 1755

Descripción del problema

Buenas noches, tengo una pregunta sobre MQL5 si puede ayudar.
Todavía no tengo ningún libro de texto del 5.
La pregunta es.


#property indicator_level1 30 - He definido el parámetro. Cuando cargo el indicador en el gráfico. Lo entiendo.
Cambio la línea por la función ColorBuffer[], si la línea desciende por debajo de este parámetro.

Tengo un problema aquí. Si abro el indicador y cambio el parámetro por otro, incluso después de cargar el indicador la línea de nivel se coloca ahí, pero el indicador la calcula utilizando el parámetro que estaba puesto antes, es decir, #propiedadnivel_del_indicador1 30

¿Cómo debo abordar este nivel para poder modificarlo en tiempo de ejecución?

- Ya he intentado comprobar el parámetro. Y volver a calcular toda la cadena de indicadores.
Pero sigue sin redibujarla como yo quiero.

¡Ayuda!
:)

Secuencia de operaciones

RSI.mqh

#property indicator_level1 30

#property indicator_level2 70


En el código de descripción de la Calculaita. Al final de la línea donde la línea pasa por For, he añadido la función para cambiar el color de la línea si está por debajo de este nivel.
ExtColorsBuffer [i] =0;
if (ExtRSIBuffer [i]> indicator_level2& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =1;
}
if (ExtRSIBuffer [i]< indicator_level1& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =2;

Resultado esperado


Veo lo mismo que en la imagen, pero cuando abro la configuración y cambio el nivel indicator_level1 / 2 en el proceso de utilizar el indicador me da un redraw. El indicador se redibuja de manera que si la línea cruza un nivel cambia de color. Pero para mí está al mismo nivel que antes :)

Más información

...

Archivos adjuntos:
rrgpusgf5g.png  69 kb
 
Ivan Stepanenko:
5.0 Build 1755

Descripción del problema

Buenas noches, tengo una pregunta sobre MQL5 si puede ayudar.
Todavía no tengo ningún libro de texto del 5.
La pregunta es.


#property indicator_level1 30 - He definido el parámetro. Cuando cargo el indicador en el gráfico. Lo entiendo.
Cambio la línea por la función ColorBuffer[], si la línea desciende por debajo de este parámetro.

Tengo un problema aquí. Si abro el indicador y cambio el parámetro por otro, incluso después de cargar el indicador la línea de nivel se coloca ahí, pero el indicador la calcula usando el parámetro que estaba puesto antes, es decir, #property indicator_level1 30

¿Cómo debo abordar este nivel para poder modificarlo en tiempo de ejecución?

- Ya he intentado comprobar el parámetro. Y volver a calcular toda la cadena de indicadores.
Pero sigue sin redibujarla como yo quiero.

¡Ayuda!
:)

Secuencia de operaciones

RSI.mqh

#property indicator_level1 30

#property indicator_level2 70


En el código de descripción de la Calculaita. Al final de la línea donde la línea pasa por For, he añadido la función para cambiar el color de la línea si está por debajo de este nivel.
ExtColorsBuffer [i] =0;
if (ExtRSIBuffer [i]> indicator_level2& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =1;
}
if (ExtRSIBuffer [i]< indicator_level1& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =2;

Resultado esperado


Veo lo mismo que en la imagen, pero cuando abro la configuración y cambio el nivel indicator_level1 / 2 en el proceso de utilizar el indicador me da un redraw. El indicador se redibuja de modo que si la línea cruza un nivel, cambia de color. Pero para mí está al mismo nivel que antes :)

Más información

...

IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrCrimson);      // Поменяет цвет самого первого по счёту уровня на цвет Crimson
IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrDeepSkyBlue);  // Поменяет цвет второго по счёту уровня на цвет DeepSkyBlue
 
Ivan Stepanenko:
5.0 Build 1755

Descripción del problema

Buenas noches, tengo una pregunta sobre MQL5 si puede ayudar.
Todavía no tengo ningún libro de texto del 5.
La pregunta es.

Me gustaría saber por qué no me gusta la respuesta en un tema aparte.

Este es el foro para el comercio, los sistemas de comercio automatizados y las pruebas de estrategia.

Necesito ayuda en MQL5 #property indicator_level

Alexey Viktorov, 2018.01.31 09:06

Igor, ambos estamos equivocados. No entendí inmediatamente la tarea...

Además de la directiva #property se puede establecer el nivel del indicador con la función

IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);

En consecuencia, este nivel debe fijarse en los parámetros del indicador de entrada. En este caso, el nivel será dibujado por el valor especificado y deberá ser cambiado por este valor.

Caso de prueba

#property indicator_separate_window
#property indicator_buffers     1
#property indicator_type1       DRAW_LINE
#property indicator_plots       1
#property indicator_color1      clrGreenYellow
#property indicator_level1      0
#property indicator_levelcolor  clrPurple

input double level = 0.6;
double buf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, buf, INDICATOR_DATA);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, level);
//---
   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[])
  {
//---
   int i = 0, limit = prev_calculated == 0 ? 0 : rates_total-1;
    for(i = limit; i < rates_total; i++)
     {
      buf[i] = i%2;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Espero que no sea difícil cambiar el color según el nivel definido en los parámetros de entrada.
 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

Aleksey Rodionov, 2018.02.06 16:31

Aquí hay una interesante:

Print("Баланс на счёте = ",AccountInfoDouble(ACCOUNT_BALANCE));
printf("ACCOUNT_BALANCE =  %G",AccountInfoDouble(ACCOUNT_BALANCE));


Si elimina %G en pintf, el valor no se mostrará, pero en Print se muestra sin %G

También en Print se muestra el valor del balance 10000.0, pero en printf sólo el entero 10000

Me interesa más saber cuál es la diferencia entre Print y Printf y, sobre todo, por qué no se muestra sin %G. No entendí nada del libro de referencia.


 

Hola compañeros, tengo una duda, estoy intentando insertar un widget de mi señal en la firma en el foro "forex money", pero tienen desactivado o bloqueado el HTML, ¿hay alguna forma de volver a hacerlo en la URL? porque normalmente se insertan y se muestran.

Este es el código <iframe frameborder="0" width="220" height="140" src="https://www.mql5.com/ru/signals/widget/signal/328l?t=green"></iframe>

Razón de la queja: