Errores, fallos, preguntas - página 37

 
kirill190982:
Probablemente lo ignore por ahora, pero en MQL4 el compilador no producía tales observaciones
Ese es otro tema, había muchas cosas que no estaban allí... :)
 
Interesting:

Las variables probablemente estén bien. Por favor, vea mi post anterior...

No sé, si conviertes double a int, definitivamente habrá una pérdida, y si viceversa, lo más probable es que haya un error durante la normalización, ya que el segundo valor de la función es de tipo int
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
Interesting:

Pregunta a los desarrolladores sobre los eventos de "usuario" y varios expertos trabajando en el mismo terminal.

Quiero saber si quiero hacerlo bien o no.


La idea es la siguiente

En el transcurso de la obra tenemos que informar a los expertos "vecinos" sobre algunos de los procesos que tienen lugar.

...

Si es una buena idea, puede mejorarse y formalizarse como artículo. ¿O añadirlo a la sección de ayuda dedicada a los eventos de los usuarios?

Hay un ejemplo para la función EventChartCustom:

//+------------------------------------------------------------------+
//|                                            ButtonClickExpert.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
 
string buttonID="Button";
string labelID="Info";
int broadcastEventID=5000;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- создадим кнопку, для передачи пользовательских событий
   ObjectCreate(0,buttonID,OBJ_BUTTON,0,100,100);
   ObjectSetInteger(0,buttonID,OBJPROP_COLOR,White);
   ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,Gray);
   ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,100);
   ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,200);
   ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,50);
   ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial");
   ObjectSetString(0,buttonID,OBJPROP_TEXT,"Кнопка");
   ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10);
   ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);
 
//--- создадим метку для вывода информации
   ObjectCreate(0,labelID,OBJ_LABEL,0,100,100);
   ObjectSetInteger(0,labelID,OBJPROP_COLOR,Red);
   ObjectSetInteger(0,labelID,OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,labelID,OBJPROP_YDISTANCE,50);
   ObjectSetString(0,labelID,OBJPROP_FONT,"Trebuchet MS");
   ObjectSetString(0,labelID,OBJPROP_TEXT,"Нет информации");
   ObjectSetInteger(0,labelID,OBJPROP_FONTSIZE,20);
   ObjectSetInteger(0,labelID,OBJPROP_SELECTABLE,0);
 
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectDelete(0,buttonID);
   ObjectDelete(0,labelID);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- проверим событие на нажатие кнопки мышки
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickedChartObject=sparam;
      //--- если нажатие на объекте с именем buttonID
      if(clickedChartObject==buttonID)
        {
         //--- состояние кнопки - нажата кнопка или нет
         bool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE);
         //--- выведем в лог отладочное сообщение
         Print("Кнопка нажата =",selected);
         int customEventID; // номер пользовательского события для отправки
         string message;    // сообщение для отправки в событии
         //--- если кнопка нажата
         if(selected)
           {
            message="Кнопка нажата";
            customEventID=CHARTEVENT_CUSTOM+1;
           }
         else // кнопка не нажата
           {
            message="Кнопка отжата";
            customEventID=CHARTEVENT_CUSTOM+999;
           }
         //--- отправим пользовательское событие "своему"графику
         EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,message);
         //--- отправим сообщение всем открытым графикам
         BroadcastEvent(ChartID(),0,"Broadcast Message");
         //--- отладочное сообщение
         Print("Отправлено событие с ID =",customEventID);
        }
      ChartRedraw();// принудительно перерисуем все объекты на графике
     }
 
//--- проверим событие на принадлежность к пользовательским событиям
   if(id>CHARTEVENT_CUSTOM)
     {
      if(id==broadcastEventID)
        {
         Print("Получили широковещательное сообщение от графика с id="+lparam);
        }
      else
        {
         //--- прочитаем текстовое сообщение в событии
         string info=sparam;
         Print("Обрабатывается ПОЛЬЗОВАТЕЛЬСКОЕ событие с ID =",id);
         //--- выведем сообщение в метке
         ObjectSetString(0,labelID,OBJPROP_TEXT,sparam);
         ChartRedraw();// принудительно перерисуем все объекты на графике
        }
     }
  }
//+------------------------------------------------------------------+
//| послать широковещательное сообщение всем открытм графикам        |
//+------------------------------------------------------------------+
void BroadcastEvent(long lparam,double dparam,string sparam)
  {
   int eventID=broadcastEventID-CHARTEVENT_CUSTOM;
   long currChart=ChartFirst();
   int i=0;
   while(i<CHARTS_MAX)          // у нас наверняка не больше CHARTS_MAX открытых графиков
     {
      EventChartCustom(currChart,eventID,lparam,dparam,sparam);
      currChart=ChartNext(currChart); // на основании предыдущего получим новый график
      if(currChart==0) break;  // достигли конца списка графиков
      i++;                     // не забудем увеличить счетчик
     }
  }
//+------------------------------------------------------------------+

Pruébalo.

 
kirill190982:
No sé, si convertimos double a int definitivamente habrá una pérdida, pero si es al revés, lo más probable es que haya un error durante la normalización, porque el segundo valor de la función es de tipo int

Si escribes int a doble, todo se maneja normalmente, el compilador sólo descarta la parte fraccionaria (según la regla).

Sin embargo, en la situación inversa, el compilador empieza a dudar y da un aviso sobre posibles problemas (según le parece).

Y como todos sabemos del hecho de que cuando se TIENE que CREAR en una situación así, le "aconsejamos" que lo haga. :)

PS

Quizás los desarrolladores desactiven las advertencias REALES en el futuro, y entonces, como en MQL4, el compilador dejará de gritar sobre todo tipo de trivialidades...

 
Interesting:

Pregunta a los desarrolladores sobre los eventos de "usuario" y varios expertos trabajando en el mismo terminal.

Así que quiero preguntar si quiero hacerlo bien o no.


He aquí una idea.

En el transcurso de la obra necesitamos informar a los Asesores Expertos "vecinos" sobre algunos procesos que tienen lugar.

Por ejemplo, los siguientes procesos deben ser supervisados en primer lugar:

1. Cierre de expertos;

2. Descarga del Asesor Experto;

3. Cese de las operaciones comerciales;

4. Reanudar las operaciones comerciales.


Implementar

I. Crear 4 identificadores de eventos:

1 - CHARTEVENT_CUSTOM+1//Inicio del Asesor Experto

2 - CHARTEVENT_CUSTOM+2//Descarga del Asesor Experto

3 - CHARTEVENT_CUSTOM+3 //Parada de operaciones comerciales

4 - CHARTEVENT_CUSTOM+4//Reinicio de las operaciones comerciales


II. Seguimiento de eventos

Cuando se produce una situación determinada, el Asesor Experto genera un mensaje SPARTEVENT utilizando EventChartCustom.

Al mismo tiempo,el Asesor Experto escribe en sparam un comentario (su nombre y el tipo de evento, u otra información) , ylparam su propio identificador de gráfico.

Los Asesores Expertos en otros gráficos (si pueden identificar correctamente la naturaleza de un evento) responderán a este EA.


PS

Si la idea es buena, puede ser terminada y formada como un artículo. ¿O añadirlo a la sección de ayuda dedicada a los eventos personalizados?

Y no veo el sentido de usar varios EAs a la vez, especialmente si juegas con varias herramientas - puedes hacer fácilmente con un solo EA, la modificación, la apertura y el cierre también pueden ser hechos por un solo EA, el análisis de indicadores también
 
Rosh:

Hay un ejemplo de la función EventChartCustom:

Pruébalo.

Sí, este ejemplo ya lo he visto antes (no sé ni cuánto tiempo hace). Quería preguntar si mi idea es correcta e interesante en términos de aplicación.

PS

Si no tiene cabida en la ayuda, tal vez alguien acepte perfeccionarla y escribir un artículo sobre esta aplicación de eventos.

También sería interesante utilizar eventos personalizados en forma de órdenes de un EA a otro (u otros). si se resume todo, resultaría en mi opinión un artículo muy interesante.

Por desgracia, no tengo tiempo para ocuparme de ello...

 
kirill190982:
Y no veo el sentido de usar varios EAs a la vez, especialmente si juegas con varios símbolos - se puede hacer fácilmente con un solo EA, la modificación, la apertura y el cierre también se puede hacer por un solo EA, el análisis de los indicadores, también

Siempre hay un sentido, sobre todo porque no todos los EAs son multidivisa a priori (basado en la experiencia en MQL4).

Por lo tanto, no es fácil para los principiantes y para muchos de los que solían dedicarse al comercio mecánico organizar adecuadamente las multidivisas...


Sólo Dios sabe lo que pasará si alguien quiere ejecutar, digamos, 2-3 copias de MACD Sample en una cuenta.


Además las situaciones son diferentes, otros Asesores Expertos pueden jugar un papel secundario recibiendo órdenes del primero.

Además, esta variante será aceptable cuando otros EAs ("vecinos") no comercien, sino que sólo procesen datos o realicen ciertos trabajos.

También se pueden implementar cosas similares en la comunicación entre índices y EAs (con un cierto enfoque).

PS

Por eso sugerí trabajar en esta cuestión y si algún progamer experimentado estaría dispuesto a escribir un artículo. Me alegraría especialmente que los propios desarrolladores dedicaran parte de su tiempo a este asunto.

Creo que hay suficiente material para más de un artículo...

 
Interesting:
............

Por desgracia, no tengo tiempo para hacerlo...

Lo entendemos. Demasiado tiempo dedicado a comentar a todo el mundo y todo....
 
AM2:

Estoy viendo vMA y Close[]. En wotch, está contando bien. También lo probé así:

De nuevo me sale otro error. Tal vez haya otra forma de calcular la media móvil simple. ¿O tomar el mango iMA y CopyBuffer donde debe estar?

1. En la wotcha, debe especificar el nombre de la matriz Close (sólo verá información general) o un valor específico de Close[1], Close[2],..., Close[i].

2. No se puede ver cómo su código llena la matriz mrate

3. Mira la biblioteca estándar MovingAverages.mqh - habrá un ejemplo de cálculo de MA

 
joo:
Lo entendemos. Se dedica demasiado tiempo a comentar todo y a todo....


También hay tiempo suficiente para comentar y poner en práctica ciertas ideas.

Es sólo que probablemente no aborde el tema con la seriedad suficiente como para cubrir todo el campo (y ya estoy tratando algunas de las aplicaciones de la idea, puramente para mí).

Pero en cualquier caso, probablemente no escribiré artículos sobre este tema (por diversas razones)...