English Русский 中文 Deutsch 日本語 Português
La inacción es el estímulo para el progreso o cómo trabajar con gráficos de forma interactiva

La inacción es el estímulo para el progreso o cómo trabajar con gráficos de forma interactiva

MetaTrader 4Ejemplos | 20 abril 2016, 15:24
482 0
Vladimir
Vladimir

Introducción

En un foro de habla inglesa he descubierto una interesante descripción de la interpretación de los niveles Fibo. La idea principal es la corrección del movimiento de impulso que se acerca a la región entre 38,2 a 61,8 %. Como he visto el vídeo subido ahí y como en intentado dibujar los niveles Fibo en los gráficos por mí mismo, he usado esta herramienta en mi propia práctica diaria.

No me apoyaré en las ventajas e inconvenientes de este sistema. Quiero decir otra cosa aquí. Soy perezoso por naturaleza (suponiendo que no estoy solo en esto) y todos estos interminables trazados y redibujados de fib para la búsqueda de esa zona inversa en un gráfico me ha aburrido bastante y he decidido apartar el trabajo en MQL4.

El problema principal que necesito resolver es la visualización automática de las zonas con algunos colores en el gráfico del precio de los fib dibujados a mano. No es un secreto que la visualización del color de los objetos mejora su percepción vívida. Estoy de acuerdo en que es mucho más fácil percibir un objeto en un gráfico que analizar una serie de líneas con números todo el tiempo.

Procesamiento de coordenadas de objetos gráficos

Realmente creo que la interactividad debe estar presente durante el trabajo con un gráfico. Necesitamos conseguir que el programa dibuje los iconos o incluso los dibujos gráficos adicionales realizados por un trader, y también necesitamos que le acompañe el sonido en aquellos casos en que se cruce la línea de tendencia, por ejemplo.

Es necesario señalar las ventajas del dibujado manual:

  • Este permite al propio trader asignar un punto de referencia para el dibujado de objetos en el gráfico.
  • Se guardan un número suficiente de entradas de código, por lo igual puede decirse de la carga del procesador del ordenador.
  • No es necesario programar una lógica inicial del dibujado de un objeto en un gráfico. A propósito, no es tan fácil lograr la lógica de forma programática. Echemos un vistazo a cuántos indicadores "ZigZag" hay, por ejemplo.

Aquí quiero mostrar cómo implementar un indicador de la intersección de una línea de tendencia dibujada a mano.

En primer lugar, vamos a dibujar una línea de tendencia en un gráfico. Luego encontraremos esta línea en la lista de objetos. Esta línea se llama, por ejemplo: Trendline 29344. Trendline es la descripción de la propia línea y 29344 es el número asignado a ella por el terminal de cliente de MetaTrader 4.

Vamos a renombrar Trendline como TrDup y será la línea de la tendencia ascendente.

Luego, repetimos los mismos pasos para la creación de otra línea de tendencia y creamos la línea de tendencia TrDown usando la que mostraremos como la tendencia descendente.

(el indicador 1_01_Tr_Alert se ajusta junto con estas líneas exactamente y se usan los mismo nombres en el indicador de dibujado de las líneas de la tendencia Demark TL_by_Demark_v6)

Ahora necesitamos leer el número de los objetos en el gráfico usando MQL4.

int    obj_total=ObjectsTotal();

Obtenemos el número de objetos en el gráfico en la variable obj_total.

Ahora tenemos el número de objetos y queda elegir el necesario para seguir con el procesamiento del algoritmo. Para hacerlo, usamos el operador típico del ciclo y encontramos los objetos "TrDup" y "TrDdown".

// Determine the Trend line object
int    obj_total=ObjectsTotal();
  string index;
  for(int i=0;i<obj_total;i++)
    {
     index=ObjectName(i);
      string substrTL_down = StringSubstr (index, 0, 7);
            if (substrTL_down == "TrDdown") string TrDLine_down=index;
      string substrTL_up = StringSubstr (index, 0, 5);
            if (substrTL_up == "TrDup") string TrDLine_up=index;
    
    }

Luego asignamos sus nombres a las variables string TrDLine_down y TrDLine_up.

Ahora tenemos las líneas de tendencia identificadas que hemos dibujado en el gráfico manualmente. A partir de este momento, el indicador captura las coordenadas de las líneas y puede realizar algunas acciones con ellas mediante el algoritmo necesario.

Necesitamos obtener una señal para el cierre de la primera barra de la vela por debajo del cierre de la segunda barra, siempre que la línea de tendencia esté entre los cierres de estas dos barras. De esta forma, recibimos una señal de cruce de la línea de tendencia por el precio.

if ((Close[1]>ObjectGetValueByShift(TrDLine, 1)) && (Close[2]<ObjectGetValueByShift(TrDLine, 2)))

Ahora solo necesitamos ejecutar la alerta y ejecutar el archivo de sonido o dibujar, por ejemplo, una flecha en el gráfico cerca de la barra del cruce de la línea de tendencia.

Este método permite organizar fácilmente la cooperación interactiva con muchos objetos añadidos manualmente a un gráfico. Niveles Fibo, canales, etc.

El indicador de visualización de las zonas de color de los niveles Fibo publicado en el foro Onix puede servir de ejemplo: http://www.onix-trade.net/forum/index.php?act=attach&type=post&id=27033&setlanguage=1&langid=ru.

Y el complementado por el indicador ZigZag nen para el dibujado automático de niveles Fibo por la última onda está aquí: http://www.onix-trade.net/forum/index.php?act=attach&type=post&id=27175&setlanguage=1&langid=ru.

A continuación proporciono el código del indicador para la visualización compleja de zonas Fibo, la indicación del cruce de la línea de tendencia y la visualización del precio actual en el gráfico usando el objeto "Price label" situado en el gráfico.

//+------------------------------------------------------------------+
//|                                               1.012_InfoFibo.mq4 |
//|                                                                  |
//|                                                     b2w@narod.ru |
//+------------------------------------------------------------------+
#property copyright "http://www.fibook.ru"
#property link      "b2w@narod.ru"
 
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
//---- input parameters
extern bool Auto_Correct_Line = false;// Autocorrection of the last Fibo point
extern bool ClearRectangle = true;//Deleting of the squares while redrawing of the Fibo levels
extern bool TargetZone = true;//Drawing of the target zones
extern int count_Alert=3; //the number of iterations of Alert
double fibs[] = {-0.618, -0.382, -0.237, 0.0, 0.145, 0.382, 0.618, 0.855, 1.0, 1.237, 1.382, 1.618};
color fibsColor[] = {Maroon, Green, ForestGreen, Teal, SteelBlue, ,
                         SteelBlue, Teal, ForestGreen, Green, Maroon};
double Old_Price;
color FontColor=Black;
string TextAlert[7];   
int y=0,count_a=0;
double ftime;
double win_idx;
string NameFibs;
double Spread;
double ExtMapBufferUP[];
double ExtMapBufferDN[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
      Spread=(Ask-Bid);
 
//---- indicators
   SetIndexStyle(0,DRAW_ARROW,0,1);
   SetIndexArrow(0,233);
   SetIndexBuffer(0,ExtMapBufferUP);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW,0,1);
   SetIndexArrow(1,234);
   SetIndexBuffer(1,ExtMapBufferDN);
   SetIndexEmptyValue(1,0.0);
   
      return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
if(ftime!=Time[0]) count_a=0;
//  int    counted_bars=IndicatorCounted();
//----
// Determine if there are the Fibo levels or not
int    obj_total=ObjectsTotal();
  string index;
  for(int i=0;i<obj_total;i++)
    {
     index=ObjectName(i);
      string substr = StringSubstr(index, 0, 4);
            if (substr == "Fibo")  NameFibs=index;
      string substrTL = StringSubstr (index, 0, 9);
            if (substrTL == "Trendline") 
            string TrDLine=index;
      string substrPR = StringSubstr (index, 0, 5);
            if (substrPR == "Arrow") 
            string PR=index;
    }
 
 
// Paramaters of the trend line
      if (StringLen(TrDLine)>1)
         {
            if (ObjectGet(TrDLine, OBJPROP_PRICE1)>ObjectGet(TrDLine, OBJPROP_PRICE2))
               {
               if ((Close[1]>ObjectGetValueByShift(TrDLine, 1)) && 
                                        (Close[2]<ObjectGetValueByShift(TrDLine, 2)))
                 {
                  ExtMapBufferUP[1]=(Low[1]-5*Point); /*Alert (Symbol(),"  Trend UP enter");*/
                  c_alert(1);
                 }
               }
            else
            if (ObjectGet(TrDLine, OBJPROP_PRICE1)<ObjectGet(TrDLine, OBJPROP_PRICE2))
               {
               if ((Close[1]<ObjectGetValueByShift(TrDLine, 1)) && 
                                        (Close[2]>ObjectGetValueByShift(TrDLine, 2)))
                  {
                   ExtMapBufferDN[1]=(High[1]+5*Point);/*Alert (Symbol(),"  Trend DN enter");*/
                     c_alert(1);
                  }
               }         
         }
// The end of calculation of the trend line
if (StringLen(NameFibs) <1) return(-1);// If there are no Fibo levels, then we exit
// Determine where the Fibo levels are drawn
double pr1=ObjectGet(NameFibs, OBJPROP_PRICE1);// first price High
double pr1vrem=ObjectGet(NameFibs, OBJPROP_TIME1);// first time of the price
double pr2=ObjectGet(NameFibs,OBJPROP_PRICE2);// second price Low
double pr2vrem=ObjectGet(NameFibs, OBJPROP_TIME2);// second time of the price
double fibprop=(pr1-pr2);// The difference between HIGH and LOW
double Timeend=(Time[0]+(Period()*360)); // The right side by the time 
                                         // to display the objects on the chart
double TimeNachalo=(Time[0]+Period()*60);// The right side by the time 
                                         // to display the objects on the chart
//+++
            ObjectMove(PR, 0,Time[0], Bid);// The icon of the current price
//+++
// Parameters of the rectangle of the reverse zone..
double verx=(pr1-fibprop*0.382);
double niz=(pr2+fibprop*0.382);
string UP=DoubleToStr(verx+Spread,Digits); 
string DN=DoubleToStr(niz-Spread,Digits); 
  if (Auto_Correct_Line==true)
      {
         if (High[0]>pr1) ObjectMove(NameFibs, 0,Time[0], High[0]);
         if (Low[0]<pr2) ObjectMove(NameFibs, 1,Time[0], Low[0]);
      }
   if (ClearRectangle == true) ObjectsDeleteAll(0,OBJ_RECTANGLE);// Delete the RECTANGLES objects
// Draw the rectangles in the cycle
        for( y=0;y<11;y++)
      {
      ObjectCreate(("Kvadrat"+y), OBJ_RECTANGLE, 0, TimeNachalo,(pr2+fibprop*fibs[y]), 
                                                        Timeend,(pr2+fibprop*fibs[y+1]) );  
      ObjectSet(("Kvadrat"+y),OBJPROP_COLOR,fibsColor[y]);
      }
// The end of drawing
 
                                /* Drawing of the rectangle of the ZONE */
 ObjectCreate("Kvadrat", OBJ_RECTANGLE, 0, TimeNachalo, verx , Timeend , niz);  
 ObjectSet("Kvadrat",OBJPROP_BACK,false);
 
// The array of text data
       TextAlert[0] =   "Attention two targets "; 
       TextAlert[1] =   ("Order up * "+UP);
       TextAlert[2] =   ("Order down   * "+DN); 
       TextAlert[3] =   ("TARGET up 2  * "+(DoubleToStr(pr1+fibprop*0.618,Digits)));
       TextAlert[4] =   ("TARGET up 1  * "+(DoubleToStr(pr1+fibprop*0.382,Digits))); 
       TextAlert[5] =   ("TARGET down 1  * "+(DoubleToStr(pr2-fibprop*0.382,Digits))); 
       TextAlert[6] =   ("TARGET down 2  * "+(DoubleToStr(pr2-fibprop*0.618,Digits)));
double YDist[] = {20, 55, 80, 120, 150, 180, 210};
color TextAlertClr[] = {Yellow, Green, Red, Green, Green, Red, Red};
        
// Output to the screen the message about orders entering
              for(y=0;y<7;y++)
               ObjectDelete("TextAlerts"+y);
if (TargetZone == true)
      {
      if (Bid > niz && Bid < verx)
            for(y=0;y<7;y++)
                  {
                  ObjectCreate(("TextAlerts"+y), OBJ_LABEL, 0, 0, 0);  
                  ObjectSetText(("TextAlerts"+y),TextAlert[y], 12, "Times New Roman",TextAlertClr[y]);
                  ObjectSet(("TextAlerts"+y), OBJPROP_CORNER, 0);
                  ObjectSet(("TextAlerts"+y), OBJPROP_XDISTANCE, 10);
                  ObjectSet(("TextAlerts"+y), OBJPROP_YDISTANCE, YDist[y]);
                  }
      }
 
// The informer of the price and the currency name
ObjectDelete("Market_Price_Label101");
   ObjectCreate("Market_Text_Label101", OBJ_LABEL, 0, 0, 0);
   ObjectSetText("Market_Text_Label101", (Symbol()+"  "+Period()), 16, "Times New Roman", Yellow);
   ObjectSet("Market_Text_Label101", OBJPROP_CORNER, 2);
   ObjectSet("Market_Text_Label101", OBJPROP_XDISTANCE, 5);
   ObjectSet("Market_Text_Label101", OBJPROP_YDISTANCE, 5);
 
  return(0);
  }
 
//+------------------------------------------------------------------+
 
void c_alert(int w)
 {
 ftime=Time[0];
 if(count_a<count_Alert)
 {count_a+=1;
 PlaySound("ku_ku.wav");
 }
 }
 return;

El cruce de la línea de tendencia en el gráfico de horas GBPUSB se muestra en la siguiente imagen.

Conclusión

La aplicación de este método al procesamiento de los datos recibidos es una buena ayuda para el trabajo del trader. Solo aliviándonos los ojos y liberándonos de la espera continua del momento necesario para activar o cerrar una posición proporciona no solo un descenso en la tensión emocional, sin que también aumenta las posibilidades de no perder los momentos necesarios en el trading.

Y para hacer que todo le sea más fácil, adjunto la plantilla del gráfico GBP que debe poner en la carpeta \templates\.

El propio indicador debe ponerse en la carpeta \experts\indicators\.

Y el archivo de sonido debe ponerse en la carpeta \sounds\.

Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/1546

Archivos adjuntos |
1_012_InfoFibo.mq4 (7.42 KB)
1_01_Tr_Alert.mq4 (3.51 KB)
add_files.zip (5.79 KB)
Método para encontrar los errores en el código mediante comentarios Método para encontrar los errores en el código mediante comentarios
El artículo describe un método de búsqueda de errores en el código de MQL4 basado en los comentarios. Este método ha mostrado ser útil en caso de que problemas originados durante la compilación y provocados por los errores en un código razonablemente grande.
Como escribir Zig Zags rápido sin redibujado Como escribir Zig Zags rápido sin redibujado
Se propone un método bastante universal de escribir indicadores del tipo Zig Zag. El método incluye una parte considerable de los Zig Zags ya descritos y nos permite crear otros nuevos con relativa facilidad.
Interfaces gráficas III: Botones simples y multifuncionales (Capítulo 1) Interfaces gráficas III: Botones simples y multifuncionales (Capítulo 1)
Vamos a comenzar el análisis del control como el botón. Vamos a mostrar los ejemplos de varias clases para la creación de un botón simple, un botón con funcionalidad ampliada (“botón con imagen” y “botón de división”), así como los botones interconectados (grupos de botones y “botones de opción”). Aparte de eso, vamos a introducir algunas adiciones en las clases ya existentes de los controles con el fin de ampliar sus posibilidades.
Repaso de HTML usando MQL4 Repaso de HTML usando MQL4
Hoy d&iacute;a, HTML es uno de los tipos de documentos m&aacute;s utilizados. El terminal de cliente de MetaTrader 4 nos permite guardar las declaraciones, informes de pruebas y optimizaciones como archivos .html. A veces es necesario para obtener informaci&oacute;n de dichos archivos en un programa MQL4. El art&iacute;culo describe una de las variantes de c&oacute;mo obtener la estructura y contenidos de HTML.