新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 1798

 

大家好。

我请求帮助解决这个问题。

我有一个MT4终端和一个专家顾问(自制),它为交易信号生成警报。我希望警报被发送到移动终端。我配置了它,测试来了,订单参数的变化 来了,但EA的警报却没有来......我不知道原因是什么,谷歌没有给我任何答案。

警报反映在终端本身。
 
但这是一个尴尬的聊天场所。某种stackoverflow和/或discord频道将是很好的。
 
Sergey Dymov 订单参数的变化 来了,但EA的警报却没有来......我不知道原因是什么,谷歌没有给我任何答案。
你必须看到代码...这里没有心灵感应者)
 
MakarFX #:
我需要看到代码...这里没有心灵感应)

一切都是标准的

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

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

 
Sergey Dymov 订单参数的变化 来了,但EA的警报却没有来......我不知道这是什么原因,谷歌没有给我任何答案。 警报反映在终端本身。

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

一切都是标准的

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

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

if ((EURTP>=3)&&(JPYTP<=0)&&(z!=2))
    {
     Alert("Покупай EURJPY. EUR=", EURTP, ", JPY=", JPYTP); z=2;
     SendNotification(текст сообщения);
    } 
 
谢谢大家!我永远不会忘记它
 

好的,我只通过点击来创建和删除线条,颜色和名称随着光标的位置而改变,并且...没有任何改变,同样的问题。这条线的创建取决于按钮栏的位置。我把它放在底部,所以根据条件,它是黄色的(卖出止损),但这里有一个发生在条件if(price > Ask),因为当我点击按钮的一些废话价格等于图表上的最高价格,这比Ask高,所以在这一点上价格> Ask = true。好吧,他妈的,从逻辑上讲,鼠标的下一步移动应该能解决一切问题,但是没有。登录时只需点击一次按钮。

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

我不知道为什么是4204(无对象),也许是过去的错误。

点击按钮后,你可以在Bid层看到一条绿线,该线对鼠标光标移动没有反应。如果光标移动到Asc上面,信息就会不断地被倒出来

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


作为一个程序员新手,我给你的建议是。学习如何使用调试 (一个非常强大的工具)。并自己想办法解决。这很有意思。如果它变得复杂(这不太可能),就从一个简单的开始。调试将帮助你弄清你的应用程序是如何工作的,非常详细。

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

作为一个初级程序员,我给你的建议是。学习如何使用调试 (一个非常强大的工具)。并自己想办法解决。这很有意思。如果它变得复杂(这不太可能),就从一个简单的开始。调试应该帮助你弄清你的应用程序是如何工作的,直到最小的细节。

我通常不需要它,因为它在测试器中不起作用,但在这种情况下,它对真实数据起作用,你应该试一试。我的理解是,这段带有重命名对象的代码的版本与上次没有区别,当时对象被重新创建并改变了颜色,因为重命名做了同样的事情:它用新的名字创建对象并删除了旧的。


UPD

在调试模式下,我用来在mql4中创建线条的按钮在图表中没有。