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

 

Hola a todos.

Pido ayuda con esta pregunta.

Tengo un terminal mt4 y un Asesor Experto (casero) que genera alertas de señales de trading. Quiero que las alertas se envíen al terminal móvil. Lo he configurado, viene el test, vienen los cambios en los parámetros de la orden, pero no vienen las alertas del EA... No sé cuál es la razón, Google no me dio ninguna respuesta.

Las alertas se reflejan en el propio terminal.
 
y sin embargo es un lugar incómodo para charlar. Estaría bien algún tipo de canal de stackoverflow y/o discord.
 
Sergey Dymov cambios en los parámetros de la orden, pero no vienen las alertas del EA... No sé cuál es la razón, Google no me dio ninguna respuesta.
Tienes que ver el código... aquí no hay telépatas)
 
MakarFX #:
Necesito ver el código... aquí no hay telépatas)

Todo es estándar

if ((EURTP>=3)&&(JPYTP<=0)&&(z!=2))

{Alert("Comprar EURJPY. EUR=", EURTP, ", JPY=", JPYTP); z=2;} //

 
Sergey Dymov cambios en los parámetros de la orden, pero no vienen las alertas del EA... No sé cuál es la razón, Google no me dio ninguna respuesta. Las alertas se reflejan en el propio terminal.

https://www.mql5.com/ru/docs/network/sendnotification

https://docs.mql4.com/ru/common/sendnotification

Документация по MQL5: Сетевые функции / SendNotification
Документация по MQL5: Сетевые функции / SendNotification
  • www.mql5.com
SendNotification - Сетевые функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Sergey Dymov #:

Todo es estándar

if ((EURTP>=3)&&(JPYTP<=0)&&(z!=2))

{Alert("Comprar EURJPY. EUR=", EURTP, ", JPY=", JPYTP); z=2;} //

if ((EURTP>=3)&&(JPYTP<=0)&&(z!=2))
    {
     Alert("Покупай EURJPY. EUR=", EURTP, ", JPY=", JPYTP); z=2;
     SendNotification(текст сообщения);
    } 
 
¡Gracias, chicos! Nunca lo olvidaré.
 

Bien, he creado y borrado líneas sólo con un clic, y el color y el nombre cambian con la ubicación del cursor y... nada ha cambiado, los mismos problemas. La línea se crea en función de la ubicación de la barra de botones. Lo tengo en la parte inferior, por lo que por condición es amarillo (Sell Stop) pero aquí hay una ocurrencia en la condición if(price > Ask) porque cuando hago clic en el botón para alguna mierda el precio es igual al precio más alto en el gráfico, que es más alto que Ask, por lo que en este punto price > Ask = true. Pues joder, lógicamente el siguiente movimiento del ratón debería arreglarlo todo, pero no. Registra sólo un clic en el botón.

2021.12.07 03:05:56.888 test GBPUSD,M1: Buy Stop rename onto Buy Stop false error 0
2021.12.07 03:05:53.408 test GBPUSD,M1: Buy Stop rename onto Buy Stop false error 0
2021.12.07 03:05:53.408 test GBPUSD,M1: Stop Loss rename onto Buy Stop false error 0
2021.12.07 03:05:53.408 test GBPUSD,M1: Buy Stop rename onto Sell Stop true error 0
2021.12.07 03:05:53.408 test GBPUSD,M1: Sell Stop rename onto Buy Stop true error 0
2021.12.07 03:05:53.408 test GBPUSD,M1: Sell Stop create true error 4204

No sé por qué 4204 (No Object) tal vez es un error pasado.

Después de hacer clic en el botón se puede ver una línea verde en el nivel de licitación, la línea no responde a un desplazamiento del cursor del ratón. Si el cursor se desplaza por encima del Asc, los mensajes se vierten continuamente

2021.12.07 03:14:00.993 test GBPUSD,M1: Buy Stop rename onto Buy Stop false error 0
2021.12.07 03:13:59.563 test GBPUSD,M1: Buy Stop rename onto Buy Stop false error 0
2021.12.07 03:13:57.363 test GBPUSD,M1: Buy Stop rename onto Buy Stop false error 0
2021.12.07 03:13:57.253 test GBPUSD,M1: Buy Stop rename onto Buy Stop false error 0
2021.12.07 03:13:57.223 test GBPUSD,M1: Buy Stop rename onto Buy Stop false error 0
2021.12.07 03:13:57.223 test GBPUSD,M1: Buy Stop rename onto Buy Stop false error 0
2021.12.07 03:13:57.193 test GBPUSD,M1: Buy Stop rename onto Buy Stop false error 0
2021.12.07 03:13:57.153 test GBPUSD,M1: Buy Stop rename onto Buy Stop false error 0
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
    datetime static dt          = 0;
    double   static price       = 0;
    int      static window      = 0;
    double   static sl          = 0;
    string   static line_name;
    double static price2 = 0;
    double static price3 = 0;
    double static price4 = 0;


  if(id==CHARTEVENT_OBJECT_CLICK){
    //Нажатие на SO в зависимоти от расположения панели создаёт линию
    if(sparam=="Button Stop Order"){
      if(panel_position == 1 || panel_position == 2){
        line_name = "Buy Stop";
        CreateLine(line_name, clrGreen);
      }
      if(panel_position == 3 || panel_position == 4){
        line_name = "Sell Stop";
        CreateLine(line_name, clrYellow);
      }
    }
    //Нажатие на линию меняет цвет на красный
    if(sparam=="Buy Stop" || sparam=="Sell Stop") {
      ObjectSetString(0,line_name,OBJPROP_NAME,"Stop Loss");
      line_name = "Stop Loss";
      Print(line_name, " onto red ",ObjectSetInteger(0, line_name, OBJPROP_COLOR, clrRed));
    }
    //Нажатие на красной линии удаляет её и отжимает кнопку
    if(sparam=="Stop Loss"){
      ObjectDelete(line_name);
      button_name = "Button Stop Order";
      ms=GetMicrosecondCount();
    }
  }
  //Если кнопка SO нажата, то линия будет следовать за курсором
  if(ObjectGetInteger(0,"Button Stop Order",OBJPROP_STATE)){
    int x = (int)lparam;
    int y = (int)dparam;
    //Переведём координаты X, Y в дату и время
    if(ChartXYToTimePrice(window,x,y,window,dt,price)){
      Comment(StringFormat("CURSOR PRICE %.5f \nIF PRICE > ASK %.5f\nIF PRICE < BID %.5f\nIF PRICE IN SPREAD ZONE %.5f",
                            price,price2,price4,price3));
      //Линия меняет цвет с зелёного на желтый
      if(price < Bid){
        price4 = price;
        if(ObjectExist(0,"Buy Stop") || ObjectExist(0,"Not Allowed")){
          Print(line_name," rename onto Sell Stop ", ObjectSetString(0,line_name,OBJPROP_NAME,"Sell Stop")," error ", GetLastError());
          line_name = "Stop Loss";
          ObjectSetInteger(0, line_name, OBJPROP_COLOR, clrYellow);
        }
      }
      //Линия меняет цвет с желтого на зелёный
      if(price > Ask){
        price2 = price;
        if(ObjectExist(0,"Sell Stop") || ObjectExist(0,"Not Allowed")){
          Print(line_name," rename onto Buy Stop ", ObjectSetString(0,line_name,OBJPROP_NAME,"Buy Stop")," error ", GetLastError());
          line_name = "Buy Stop";
          ObjectSetInteger(0, line_name, OBJPROP_COLOR, clrGreen);
        }
      }
      //Линия меняет цвет на серый если в зоне спреда
      if(price > Bid && price < Ask){
        price3 = price;
        if(ObjectExist(0,"Sell Stop") || ObjectExist(0,"Buy Stop")){
          Print(line_name," rename onto Not Allowed ", ObjectSetString(0,line_name,OBJPROP_NAME,"Not Allowed")," error ", GetLastError());
          line_name = "Not Allowed";
          ObjectSetInteger(0, line_name, OBJPROP_COLOR, clrGray);
        }
      }
      //Прикрепляем линию к курсору
      if(id == CHARTEVENT_MOUSE_MOVE)
        if(ObjectMove(line_name,0,0,price))
          ChartRedraw(0);
    }
  }else if(ObjectExist(0,line_name)) Print(line_name," delete ",ObjectDelete(line_name)," error ", GetLastError());
  //Если нажать Esc то удалится линия и кнопка отожмется
  if(id == CHARTEVENT_KEYDOWN && lparam == 27){
      button_name = "Button Stop Order";
      ms=GetMicrosecondCount();
  }
}
//----------------------------------------------------------------------
void CreateLine(const string name, const color clr)
{
  Print(name," create ",ObjectCreate(0, name, OBJ_HLINE, 0,TimeCurrent(),Bid)," error ", GetLastError());
  ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
  ObjectSetInteger(0, name, OBJPROP_STYLE, 3); 
}
bool ObjectExist(const long _chartID, const string _name) { return(ObjectFind(_chartID, _name) >= 0); }
 
Nerd Trader #:


Mi consejo para ti, como programador novato. Aprende a utilizar la depuración (una herramienta muy potente). Y descúbrelo por ti mismo. Es interesante. Si se complica (lo que es poco probable), empieza por uno fácil. La depuración le ayudará a averiguar cómo funciona su aplicación con gran detalle.

Отладка программ на MQL5
Отладка программ на MQL5
  • www.mql5.com
Эта статья ориентирована в первую очередь на программистов, которые уже изучили язык, но еще недостаточно освоились в разработке программ. Статья раскрывает практические приемы отладки программ и является объединенным опытом, не только моим, но и многих программистов, на опыте которых я учился.
 
Mihail Matkovskij #:

Mi consejo, como programador principiante. Aprende a utilizar la depuración (una herramienta muy potente). Y descúbrelo por ti mismo. Es interesante. Si se complica (lo que es poco probable), empieza por uno fácil. La depuración debe ayudarle a averiguar cómo funciona su aplicación hasta el más mínimo detalle.

Normalmente no lo necesito porque no funciona en el probador, pero en este caso funciona con datos reales y deberías probarlo. Por lo que entiendo, la versión de este código con el cambio de nombre del objeto no es diferente de la última vez, cuando los objetos fueron recreados con el cambio de color, porque el cambio de nombre hace lo mismo: crea el objeto con el nuevo nombre y elimina el antiguo.


UPD

Los botones que uso para crear líneas en mql4 en modo de depuración están ausentes en el gráfico

Razón de la queja: