Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1798

 

Olá a todos.

Estou pedindo ajuda com esta pergunta.

Eu tenho um terminal mt4 e um Expert Advisor (de fabricação caseira) que gera alertas para sinais comerciais. Quero que os alertas sejam enviados para o terminal móvel. Eu o configurei, o teste vem, as mudanças nos parâmetros de ordem vêm, mas os alertas da EA não vêm... Não sei qual é a razão, o google não me deu nenhuma resposta.

Os alertas são refletidos no próprio terminal.
 
e ainda assim é um lugar incômodo para conversar. Algum tipo de canal de fluxo de empilhamento e/ou discordância seria bom.
 
Sergey Dymov as mudanças nos parâmetros de ordem vêm, mas os alertas da EA não vêm... Não sei qual é a razão, o google não me deu nenhuma resposta.
Você tem que ver o código...não há telepatas aqui)
 
MakarFX #:
Preciso ver o código... não há telepatas aqui)

Tudo é padrão

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

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

 
Sergey Dymov as mudanças nos parâmetros de ordem vêm, mas os alertas da EA não vêm... Não sei qual é a razão, o google não me deu nenhuma resposta. Os alertas são refletidos no próprio 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 #:

Tudo é padrão

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

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

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

OK, criei e excluí linhas apenas por clique, e a cor e o nome mudam com a localização do cursor e... nada mudou, os mesmos problemas. A linha é criada de acordo com a localização da barra de botões. Eu o tenho na parte inferior, então por condição é amarelo (Sell Stop), mas aqui há uma ocorrência em condição se (preço > Ask) porque quando eu clico no botão para algum preço de porcaria é igual ao preço mais alto na tabela, que é mais alto que Ask, então neste ponto preço > Ask = verdadeiro. Bem, que se lixe, logicamente o próximo movimento do mouse deve consertar tudo, mas não. Faça apenas um clique no botão.

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

Não sei por que 4204 (Sem objeto) talvez seja um erro do passado.

Após clicar no botão você pode ver uma linha verde no nível Bid, a linha não responde a um deslocamento do cursor do mouse. Se o cursor se mover acima da Asc, as mensagens são continuamente derramadas

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 #:


Meu conselho para você, como um programador novato. Aprenda a usar o debug (uma ferramenta muito poderosa). E descubra por si mesmo. É interessante. Se ficar complicado (o que é improvável), comece com uma fácil. Debug o ajudará a descobrir como funciona sua aplicação em grandes detalhes.

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

Meu conselho para você, como um programador iniciante. Aprenda a usar o debug (uma ferramenta muito poderosa). E descubra por si mesmo. É interessante. Se ficar complicado (o que é improvável), comece com uma fácil. O Debug deve ajudá-lo a descobrir como funciona sua aplicação até o menor detalhe.

Normalmente não preciso dele porque não funciona no testador, mas neste caso funciona com dados reais e você deve tentar. O que eu entendo, versão deste código com renomeação de objeto não é diferente da última vez, quando os objetos foram recriados com mudança de cor, porque a renomeação faz a mesma coisa: cria objeto com novo nome e apaga o antigo.


UPD

Os botões que uso para criar linhas em mql4 em modo de depuração estão ausentes no gráfico

Razão: