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

 
Сергей Таболин:

Como yo, un diletante, que no puede entender el significado sagrado de todas las clases, y en general, por qué la POO es necesaria en nuestro negocio (de comercio), entiendo - las clases son todas escritas (tanto por MQ como por el gurú) bibliotecas de código, diseñadas para "facilitar" la vida a los "no-gurús de la escritura de código".

El problema es, y ya lo he dicho, que usar todo este "alivio" no facilita la escritura de código. Porque siempre hay que volver a comprobar todos los pedidos que uno mismo envía. Porque prácticamente todo el mundo insiste en que compruebe también algunas "transacciones". Sobre todo porque estas "...acciones" llegan al azar.

Doy la orden - de clavar un clavo en este lugar en tal ángulo. Eso es todo. A continuación recibo una respuesta: el clavo está clavado. Y entonces me llega un aviso de que:

  • tal vez el clavo era el tamaño equivocado - necesidad de comprobar.
  • Tal vez sea el ángulo incorrecto, hay quecomprobarlo.
  • Tal vez está martillado en el lugar equivocado - necesidad decomprobar.

Entonces, ¿por qué necesito estos artistas (clases)?

Puede que esté exagerando un poco, pero la cuestión no cambia.

¿Y por qué? Porque cualquier dato procesado en las clases puede ser cambiado de manera que la clase ni siquiera sospeche que ha sido cambiado.


Ya veo.

Por cierto, estoy de acuerdo en que la POO no facilita la programación.

La POO facilita el mantenimiento de los proyectos grandes, pero tiende a dificultar la creación de los pequeños.

La POO es más difícil para los principiantes.

Utilizar las clases de otras personas es, hasta cierto punto, utilizar cajas negras.

 
Hola. ¿Podríais decirme dónde me he equivocado y por qué el indicador no muestra flechas?
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window


double      Buy[];            // Буфер для покупок
double      Sell[];           // Буфер для продаж


input int tenkan_sen1 = 9;
input int kijun_sen1  = 26;
input int senkou_span_b1 = 52;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 
//--- indicator buffers mapping
   SetIndexBuffer(0,Buy);
   SetIndexBuffer(1,Sell);  
   // Устанавливаем нулевые значения для индикатора, при которых не будет сигнальных стрелок
   SetIndexEmptyValue (0, 0);
   SetIndexEmptyValue (1, 0);
   //Определяем стиль отображения индикаторных линий - стрелка
   SetIndexStyle (0, DRAW_ARROW);
   SetIndexStyle (1, DRAW_ARROW); 
   // Установим значки "стрелки" для буферов
   SetIndexArrow(0, 234);  //Стрелка "вниз" для продаж
   SetIndexArrow(1, 233);  //Стрелка "вверх" для покупок
   //Устанавливаем текст описания стрелок индикатора для отображения информации в всплывающей подсказке.
   SetIndexLabel(0, "Продаём");
   SetIndexLabel(1, "Покупаем");
   //Определяем разрядность значений индикаторных линий - приравниваем разрядности фин. инструмента
   IndicatorDigits (Digits);
   //Строка с кратким названием индикатора выводится в сплывающей подсказке при наведении указателя мыши на стрелку
   IndicatorShortName ("Мой первый индикатор");
   
//---
   
//---
   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 limit=rates_total-prev_calculated-1;
   if(limit<1) return(0);
   for(int i=limit;i>=0;i--)
     {
      // Снимем показания индикатора
      double tenkan_sen = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_TENKANSEN,i);
      double kijun_sen = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_KIJUNSEN,i);
      double senkou_span_b = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_SENKOUSPANA,i);
      double senkou_span_a = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_SENKOUSPANB,i);
      double chikou_span = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_CHIKOUSPAN,i);
            
      if(tenkan_sen>kijun_sen)
         Buy[i]=high[i];
         
     if(tenkan_sen<kijun_sen)
         Sell[i]=low[i];
     }
   /*input int tenkan_sen = 9;
input int kijun_sen  = 26;
input int senkou_span_b = 52;*/
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
jarikn:
Hola. ¿Podría decirme dónde me he equivocado y por qué el indicador no muestra flechas?
#property indicator_buffers 2
 
MakarFX:

¡Puse la línea que faltaba pero todavía no hay flechas!

 
jarikn:

¡Puse la línea que faltaba pero todavía no hay flechas!

mostrar

 
MakarFX:

mostrar

//+------------------------------------------------------------------+
//|                                                     ishimocu.mq4 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2

//--- input parameters
double      Buy[];            // Буфер для покупок
double      Sell[];           // Буфер для продаж


input int tenkan_sen1 = 9;
input int kijun_sen1  = 26;
input int senkou_span_b1 = 52;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 
//--- indicator buffers mapping
   SetIndexBuffer(0,Buy);
   SetIndexBuffer(1,Sell);  
   // Устанавливаем нулевые значения для индикатора, при которых не будет сигнальных стрелок
   SetIndexEmptyValue (0, 0);
   SetIndexEmptyValue (1, 0);
   //Определяем стиль отображения индикаторных линий - стрелка
   SetIndexStyle (0, DRAW_ARROW);
   SetIndexStyle (1, DRAW_ARROW); 
   // Установим значки "стрелки" для буферов
   SetIndexArrow(0, 234);  //Стрелка "вниз" для продаж
   SetIndexArrow(1, 233);  //Стрелка "вверх" для покупок
   //Устанавливаем текст описания стрелок индикатора для отображения информации в всплывающей подсказке.
   SetIndexLabel(0, "Продаём");
   SetIndexLabel(1, "Покупаем");
   //Определяем разрядность значений индикаторных линий - приравниваем разрядности фин. инструмента
   IndicatorDigits (Digits);
   //Строка с кратким названием индикатора выводится в сплывающей подсказке при наведении указателя мыши на стрелку
   IndicatorShortName ("Мой первый индикатор");
   
//---
   
//---
   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 limit=rates_total-prev_calculated-1;
   if(limit<1) return(0);
   for(int i=limit;i>=0;i--)
     {
      // Снимем показания индикатора
      double tenkan_sen = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_TENKANSEN,i);
      double kijun_sen = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_KIJUNSEN,i);
      double senkou_span_b = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_SENKOUSPANA,i);
      double senkou_span_a = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_SENKOUSPANB,i);
      double chikou_span = iIchimoku(NULL,0,tenkan_sen1,kijun_sen1,senkou_span_b1,MODE_CHIKOUSPAN,i);
            
      if(tenkan_sen>kijun_sen)
         Buy[i]=high[i];
         
     if(tenkan_sen<kijun_sen)
         Sell[i]=low[i];
     }
   /*input int tenkan_sen = 9;
input int kijun_sen  = 26;
input int senkou_span_b = 52;*/
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
jarikn:

Tengo un dibujo...


 
MakarFX:

Estoy dibujando...


Maldita sea. mal ishimoku ejecutar )))) muchas gracias

 
Alexey Viktorov:

Sí... Mínima escritura y máximo dolor de cabeza...

¿Qué es exactamente? Quizá esté haciendo algo mal.

 
Andrey Sokolov:

¿Qué es exactamente? ¿Estoy haciendo algo mal?

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

OOP para escolares.

Alexey Viktorov, 2019.10.04 16:01

Creo que mql tiene un conjunto muy limitado de problemas para ser resueltos por OOP. El lenguaje en sí, me parece, no es más que OOP en C++ o lo que sea. Y esta POO se ofrece en forma de biblioteca estándar. Y a esta OOP se sugiere añadir, si no, no diría, otra OOP. Y luego otro paso... Bien dicho Warlock, aunque enfadado, pero benévolo, para mis tareas OOP es como un plato giratorio para perros. Y de qué sirve definir una tarea y luego implementarla usando POO, si esta tarea puede ser resuelta en estilo procedimental sin ningún problema.

Por ejemplo, tome .mqh de fxsaber`a para escribir códigos para MT5 así como para MT4. Tal vez alguien lo necesite, pero mira quién. A alguien que no quiera o no pueda dominar mql5. O tomar el iCanvas de Nikolay... olvido su apellido. Parece ser una biblioteca útil, pero no es fácil entenderla, y no hay documentación, ni siquiera una mínima descripción. No es una queja, lo siento Nikolay, es un hecho. Así que, cuando decidí intentar escribir una etiqueta gráfica, fue más fácil escribirla sin referencia a la biblioteca estándar ni a la biblioteca de Nikolai.

Y luego puedes leer todo el hilo.