Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1798

 

Ciao a tutti.

Chiedo aiuto per questa domanda.

Ho un terminale mt4 e un Expert Advisor (fatto in casa) che genera avvisi per i segnali di trading. Voglio che gli avvisi siano inviati al terminale mobile. L'ho configurato, arriva il test, arrivano i cambiamenti nei parametri dell'ordine, ma gli avvisi dell'EA non arrivano... Non so quale sia la ragione, Google non mi ha dato alcuna risposta.

Gli avvisi si riflettono nel terminale stesso.
 
eppure è un posto scomodo per chiacchierare. Una sorta di canale stackoverflow e/o discord sarebbe bello.
 
Sergey Dymov cambiamenti nei parametri dell'ordine, ma gli avvisi dell'EA non arrivano... Non so quale sia la ragione, Google non mi ha dato alcuna risposta.
Dovete vedere il codice... non ci sono telepati qui)
 
MakarFX #:
Ho bisogno di vedere il codice... nessun telepate qui)

Tutto è standard

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

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

 
Sergey Dymov cambiamenti nei parametri dell'ordine, ma gli avvisi dell'EA non arrivano... Non so quale sia la ragione, Google non mi ha dato alcuna risposta. Gli avvisi si riflettono nel terminale stesso.

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

Tutto è standard

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

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

if ((EURTP>=3)&&(JPYTP<=0)&&(z!=2))
    {
     Alert("Покупай EURJPY. EUR=", EURTP, ", JPY=", JPYTP); z=2;
     SendNotification(текст сообщения);
    } 
 
Grazie, ragazzi! Non lo dimenticherò mai!
 

OK, ho creato e cancellato linee solo con un clic, e il colore e il nome cambiano con la posizione del cursore e... Non è cambiato nulla, stessi problemi. La linea viene creata a seconda della posizione della barra dei pulsanti. Ce l'ho in basso, quindi per condizione è giallo (Sell Stop) ma qui c'è un'occorrenza nella condizione if(price > Ask) perché quando clicco sul pulsante per qualche schifezza il prezzo è uguale al prezzo più alto sul grafico, che è più alto di Ask, quindi a questo punto price > Ask = true. Beh, cazzo, logicamente la prossima mossa del mouse dovrebbe sistemare tutto, ma no. Registra solo un clic sul pulsante.

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

Non so perché 4204 (No Object) forse è un errore passato.

Dopo aver cliccato sul pulsante si può vedere una linea verde a livello di Bid, la linea non risponde allo spostamento del cursore del mouse. Se il cursore si sposta sopra l'Asc, i messaggi vengono riversati 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 #:


Il mio consiglio per te, come programmatore principiante. Imparate a usare il debug (uno strumento molto potente). E capirlo da solo. È interessante. Se diventa complicato (il che è improbabile), inizia con uno facile. Il debug vi aiuterà a capire come funziona la vostra applicazione nei minimi dettagli.

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

Il mio consiglio per te, come programmatore principiante. Imparate a usare il debug (uno strumento molto potente). E capirlo da solo. È interessante. Se diventa complicato (il che è improbabile), inizia con uno facile. Il debug dovrebbe aiutarvi a capire come funziona la vostra applicazione fino al più piccolo dettaglio.

Di solito non ne ho bisogno perché non funziona nel tester, ma in questo caso funziona con dati reali e dovreste provarlo. Quello che capisco, la versione di questo codice con rinominare l'oggetto non è diversa dall'ultima volta, quando gli oggetti sono stati ricreati con il cambio di colore, perché rinominare fa la stessa cosa: crea l'oggetto con il nuovo nome e cancella quello vecchio.


UPD

I pulsanti che uso per creare linee in mql4 in modalità debug sono assenti nel grafico

Motivazione: