[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 326

 

No soy un fanático de los indicadores, pero decidí comprobar una cosa. El Asesor Experto debe comprar al precio del indicador RSI superior y vender al precio del inferior, respectivamente. Sólo si el precio ya está por encima del límite superior del indicador RSI, entonces la compra debe estar por encima de este límite y por debajo del valor de este límite + algún valor de sangría desde el límite hacia arriba (en el código he especificado sólo un número 0,1), para las ventas, por el contrario.

Lo hice así:

Parámetros externos:

extern string ___H1 = " __________ Параметры RSI _________ ";
extern int     i_RSITF = 5,
               i_RSIPeriod = 21,
               i_RSIApplied = PRICE_CLOSE;
extern double  i_RSIToUpLimit = 55,                                     // Верхняя граница RSI
               i_RSIToDnLimit = 45;                                     // Нижняя граница RSI

Código de la función que recibe la señal y el valor del RSI en sí:(0,1 aquí es la tolerancia de margen para el rango de compra o venta)

//+-------------------------------------------------------------------------------------+
//| Получаем RSI с заданными параметрами                                                |
//+-------------------------------------------------------------------------------------+
double GetRSI(int RSIIndex)
{
   return (iRSI(NULL, i_RSITF, i_RSIPeriod, i_RSIApplied, RSIIndex));
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   if (FindOrders() > 0)
       return (SIGNAL_NO);

 //  if (GetRSI(PRICE_CLOSE, 0) > GetRSI(PRICE_CLOSE, 1))
   if (GetRSI(0) > i_RSIToUpLimit)
      if (GetRSI(0) < (i_RSIToUpLimit + 0.1))
         return (SIGNAL_BUY);                  // Запускаем функцию открытия покупки
           
   if (GetRSI(0) < i_RSIToDnLimit)
      if (GetRSI(0) > (i_RSIToDnLimit - 0.1))
         return (SIGNAL_SELL);                // Запускаем функцию открытия продаж
   
   return (SIGNAL_NO);
}

A veces el EA abre órdenes desde el mismo nivel, a veces mucho más altas (para comprar) y a veces mucho más bajas (para vender). ¿Por qué? El algoritmo es elemental.

 
Hola a todos. Tengo una pregunta. Me conseguí una copiadora /**/, algo bueno y práctico cuando se trabaja con varias cuentas. Pero el problema es que cuando se ejecuta cualquier otro programa (video, juego, sólo mapas) en paralelo, hay un ruido constante de crujido que sale de los altavoces. ¿Es posible eliminar el problema (traqueteo)? Gracias de antemano.
 

Estoy tratando de escribir un indicador simple basado en RSI (el análogo es RandomIndicatorSignals mq4).

Estoy tratando de escribir un indicador simple basado en RSI (para el análogo de este indicador RandomIndicatorSignals.mq4 del artículo MQL4 Language for Dummies. Indicadores personalizados (Parte 1)(https://www.mql5.com/ru/articles/1500).

La idea es simple, si el RSI dibuja un tope o un valle, dibuja una flecha en el gráfico.

Parece que está bien, pero en mi opinión el buffer de valores RSI para cada vela no se llena, debido a esto no funciona. Aquí está el código.

//+------------------------------------------------------------------+
//|                                                    RSI+Arrow.mq4 |
//|                                                         _______ |
//|                                                    |
//+------------------------------------------------------------------+
#property copyright "_______"
#property link      "_________"


#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Crimson
#property indicator_color2 RoyalBlue
//---- input parameters
extern int       barsToProcess=500;
//---- buffers
double ExtMapBuffer1[],
       ExtMapBuffer2[],
       RSIBuffer3[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,236);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,238);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer (2,RSIBuffer3);
   // для информации о значениях буфера
   SetIndexLabel  (2,"RSIBuffer3");
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {    
   //расчет индикатора на последних барах 
   int limit,i;
   int counted_bars=IndicatorCounted();
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   if(limit>barsToProcess)
   limit=barsToProcess;
   
   //заполняем буфер RSI значениями 
   for(i=0; i<limit; i++)
   if(i>=1)
     {
       RSIBuffer3[i]=iRSI(0,0,8,PRICE_CLOSE,0);
     }       
  //проводим сравнения                        
   for(i=0; i<limit; i++)
   if(i>=1)
        
        {
        if(RSIBuffer3[i+2]-RSIBuffer3[i+1]>0 && RSIBuffer3[i+1]-RSIBuffer3[i]>0) // условия выставления стрелки 

        /* так тоже не работает
        if(RSIBuffer3[i+2]>=RSIBuffer3[i+1] && RSIBuffer3[i+1]<=RSIBuffer3[i])
        */
        
        ExtMapBuffer2[i]=Low[i]-5*Point;
                    
        else
           
        ExtMapBuffer2[i]=0.0;
               
        if(RSIBuffer3[i+2]-RSIBuffer3[i+1]<0 && RSIBuffer3[i+1]-RSIBuffer3[i]<0) // условия выставления стрелки
        
        /* так тоже не работает
        if(RSIBuffer3[i+2]<=RSIBuffer3[i+1] && RSIBuffer3[i+1]>=RSIBuffer3[i])
        */
              
        ExtMapBuffer1[i]=High[i]+5*Point;
           
        else      
           
        ExtMapBuffer1[i]=0.0;           
        }
                   
   return(0);
   }
        
//+------------------------------------------------------------------+      
 
Merincool:

Estoy tratando de escribir un indicador simple basado en RSI (el análogo es RandomIndicatorSignals mq4).

Estoy tratando de escribir un indicador simple basado en RSI (para el análogo de este indicador RandomIndicatorSignals.mq4 del artículo MQL4 Language for Dummies. Indicadores personalizados (Parte 1)(https://www.mql5.com/ru/articles/1500).

La idea es simple, si el RSI dibuja un tope o un valle, dibuja una flecha en el gráfico.

Parece que está bien, pero en mi opinión el buffer de valores RSI para cada vela no se llena, debido a esto no funciona. Aquí está el código.

Está accediendo a valores de indicadores no calculados en el bucle.

Cambiar

for(i=0; i<limit; i++)

a

for(i=limit-1; i>=0; i--)
 
PapaYozh:

Se vuelve a los valores de los indicadores no calculados.

Cambiar

a


Gracias, me ha dado una idea. Sin embargo, me gustaría entender el "significado físico":) como decía nuestro físico

Yo también tengo un problema: 2 códigos de acción "ligeramente" diferentes, pero esencialmente iguales: Borrar todas las órdenes pendientes

1) No funciona correctamente - sólo se elimina un pedido

void start()

  {

   bool   result;     int    cmd,total,OT;

   total=OrdersTotal();

   for(int i=0; i<total; i++)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

        {

         cmd=OrderType();    OT=OrderTicket();

         if(cmd>1)   // !=OP_BUY && cmd!=OP_SELL)

           {

            result=OrderDelete(OT);

           }

        }

     } //end FOR

  }

2) Funciona bien: los borra todos

void start()
{
    string msg="Удалить все отложенные ордера?    ";
//   if (MessageBox(msg,title,MB_YESNO|MB_ICONQUESTION)!=IDYES) return;

   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if (OrderType()>1) OrderDelete(OrderTicket());
   }
}

Por favor, explique: el significado de "en este bucle, se accede a los valores no calculados del indicador".

 
PapaYozh:

Se vuelve a los valores de los indicadores no calculados.

Cambiar

a


¿Puedes deletrearlo? ¿Por qué? Para no cometer más errores en el futuro.
 
PapaYozh:

Se vuelve a los valores de los indicadores no calculados.

Cambiar

a


sigue sin funcionar, el RSIBuffer3 sólo muestra el valor del RSI en la última barra cuando se pasa por encima de una barra
 
Merincool:

Y sigue sin funcionar, el RSIBuffer3 sólo muestra el valor del RSI en la última barra cuando se pasa por encima de la barra

Su quinto parámetro es 0, es decir, el último compás.

hazlo así:

       RSIBuffer3[i]=iRSI(0,0,8,PRICE_CLOSE,i);  

Extracto del documento:

doble iRSI( string symbol, int timeframe, int period, int applied_price, int shift)
Calcula el índice de fuerza relativa y devuelve su valor.
Parámetros:
símbolo - Símbolo cuyos datos deben utilizarse para calcular el indicador. NULL significa el símbolo actual.
marco temporal - Plazo de tiempo. Puede ser cualquiera de los valores de la enumeración Timeframe. 0 significa el marco de tiempo del gráfico actual.
período - Número de períodos para el cálculo.
precio_aplicado - Precio aplicado. Puede ser cualquiera de los valores de la enumeración de precios aplicados.
turno - Índice del valor tomado del búfer del indicador (desplazamiento relativo a la barra actual la cantidad dada de períodos atrás).
 
PapaYozh:

Se vuelve a los valores de los indicadores no calculados.

Cambiar

a


Y lo que también pensé, según tu lógica la herramienta debería calcular el RSI desde el límite y hasta la barra 0, pero ¿hay alguna diferencia en qué lado debería calcular el RSI desde el final o desde el principio? Debería calcular el RSI para cada barra en un rango determinado y poner el valor en un buffer (me refiero a un array), y luego sólo comparar tres valores consecutivos en un array entre sí. ¿O no?

 
amurik61:

Su quinto parámetro es 0, es decir, el último compás.

hazlo así:

Extracto del documento:

doble iRSI( string symbol, int timeframe, int period, int applied_price, int shift)
Calcula el índice de fuerza relativa y devuelve su valor.
Parámetros:
símbolo - Símbolo cuyos datos deben utilizarse para calcular el indicador. NULL significa el símbolo actual.
marco temporal - Plazo de tiempo. Puede ser cualquiera de los valores de la enumeración Timeframe. 0 significa el marco de tiempo del gráfico actual.
período - Número de períodos para el cálculo.
precio_aplicado - Precio aplicado. Puede ser cualquiera de los valores de la enumeración de precios aplicados.
turno - Índice del valor tomado del buffer del indicador (desplazamiento relativo a la barra actual la cantidad de tiempo dada).

Lo probaré, gracias
Razón de la queja: