MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1798

 

皆さん、こんにちは。

という質問をさせていただいています。

私はmt4ターミナルと、取引シグナルのアラートを生成するExpert Advisor(自作)を持っています。携帯端末にアラートを送信してほしい。設定した、テストが来た、注文パラメーターの 変更が来た、でもEAからのアラートが来ない...。理由はわかりません、ググっても答えはでませんでした。

アラートは端末本体に反映されます。
 
と言いながら、おしゃべりをするのは気が引ける。Stackoverflow や Discord チャンネルのようなものがあればいいと思います。
 
Sergey Dymov 注文パラメーターの 変更が来た、でもEAからのアラートが来ない...。理由はわかりません、ググっても答えはでませんでした。
コードを見なければならない...ここにはテレパスはいない)
 
MakarFX #:
コードを見たいんだけど...テレパスはいないんだ)

すべて標準装備

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

{Alert("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("EURJPYの買い。EUR=", EURTP, ", JPY=", JPYTP); z=2;}.//

if ((EURTP>=3)&&(JPYTP<=0)&&(z!=2))
    {
     Alert("Покупай EURJPY. EUR=", EURTP, ", JPY=", JPYTP); z=2;
     SendNotification(текст сообщения);
    } 
 
ありがとう、みんな一生忘れない!」。
 

OK、クリックだけで線を作ったり消したり、カーソルの位置で色や名前が変わったり...。何も変わらず、同じ問題です。ボタンバーの位置に応じて、線が作成されます。私は一番下に持っているので、条件では黄色(Sell Stop)ですが、ここでは条件 if(price > Ask) に発生があります。なぜなら、私が何かのくだりでボタンをクリックしたとき、価格はチャート上の最高値と同じで、それはAskより高いので、この時点で price > Ask = true となります。まあ、論理的には、次のマウス操作ですべて解決するはずなのだが、そうではない。ボタンを1回クリックするだけで、ログを記録します。

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 (No Object)の理由は分かりませんが、多分過去のエラーなのでしょう。

ボタンをクリックすると、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 #:

プログラマー初心者のあなたへのアドバイスです。デバッグの 使い方を学ぶ(非常に強力なツールです)。そして、自分で考えてみてください。面白いですね。もし複雑になったら(ありえないけど)、簡単なものから始めてください。デバッグは、アプリケーションがどのように動作しているかを細部に至るまで把握するのに役立つはずです。

普段はテスターで動かないので必要ないのですが、今回は実データで動きますので、ぜひ試してみてください。私が理解したところでは、オブジェクトの名前を変更したこのコードのバージョンは、前回、色を変更してオブジェクトを再作成したときと変わりはありません。


アップデイト

デバッグモードでmql4でラインを作成するために使用するボタンが、チャートに存在しない