Fehler, Irrtümer, Fragen - Seite 37

 
kirill190982:
Ich werde es wahrscheinlich erst einmal ignorieren, aber in MQL4 hat der Compiler solche Bemerkungen nicht erzeugt
Das ist ein ganz anderes Thema, es gab eine Menge Dinge, die nicht da waren... :)
 
Interesting:

Die Variablen sind wahrscheinlich in Ordnung. Siehe meinen Beitrag oben...

Ich weiß nicht, wenn Sie double in int konvertieren, gibt es definitiv einen Verlust, und wenn umgekehrt, gibt es höchstwahrscheinlich einen Fehler bei der Normalisierung, da der zweite Funktionswert vom Typ int ist
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
Interesting:

Frage an die Entwickler in Bezug auf "Benutzer"-Ereignisse und mehrere Experten, die an demselben Terminal arbeiten.

Ich möchte wissen, ob ich es richtig machen will oder nicht?


Die Idee ist folgende

Im Laufe des Stücks müssen wir die "benachbarten" Experten über einige der stattfindenden Prozesse informieren.

...

Wenn es eine gute Idee ist, kann sie fertiggestellt und als Artikel formatiert werden. Oder fügen Sie sie dem Abschnitt "Hilfe" hinzu, der den Benutzerereignissen gewidmet ist?

Es gibt ein Beispiel für die Funktion EventChartCustom:

//+------------------------------------------------------------------+
//|                                            ButtonClickExpert.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
 
string buttonID="Button";
string labelID="Info";
int broadcastEventID=5000;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- создадим кнопку, для передачи пользовательских событий
   ObjectCreate(0,buttonID,OBJ_BUTTON,0,100,100);
   ObjectSetInteger(0,buttonID,OBJPROP_COLOR,White);
   ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,Gray);
   ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,100);
   ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,200);
   ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,50);
   ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial");
   ObjectSetString(0,buttonID,OBJPROP_TEXT,"Кнопка");
   ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10);
   ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);
 
//--- создадим метку для вывода информации
   ObjectCreate(0,labelID,OBJ_LABEL,0,100,100);
   ObjectSetInteger(0,labelID,OBJPROP_COLOR,Red);
   ObjectSetInteger(0,labelID,OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,labelID,OBJPROP_YDISTANCE,50);
   ObjectSetString(0,labelID,OBJPROP_FONT,"Trebuchet MS");
   ObjectSetString(0,labelID,OBJPROP_TEXT,"Нет информации");
   ObjectSetInteger(0,labelID,OBJPROP_FONTSIZE,20);
   ObjectSetInteger(0,labelID,OBJPROP_SELECTABLE,0);
 
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectDelete(0,buttonID);
   ObjectDelete(0,labelID);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- проверим событие на нажатие кнопки мышки
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickedChartObject=sparam;
      //--- если нажатие на объекте с именем buttonID
      if(clickedChartObject==buttonID)
        {
         //--- состояние кнопки - нажата кнопка или нет
         bool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE);
         //--- выведем в лог отладочное сообщение
         Print("Кнопка нажата =",selected);
         int customEventID; // номер пользовательского события для отправки
         string message;    // сообщение для отправки в событии
         //--- если кнопка нажата
         if(selected)
           {
            message="Кнопка нажата";
            customEventID=CHARTEVENT_CUSTOM+1;
           }
         else // кнопка не нажата
           {
            message="Кнопка отжата";
            customEventID=CHARTEVENT_CUSTOM+999;
           }
         //--- отправим пользовательское событие "своему"графику
         EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,message);
         //--- отправим сообщение всем открытым графикам
         BroadcastEvent(ChartID(),0,"Broadcast Message");
         //--- отладочное сообщение
         Print("Отправлено событие с ID =",customEventID);
        }
      ChartRedraw();// принудительно перерисуем все объекты на графике
     }
 
//--- проверим событие на принадлежность к пользовательским событиям
   if(id>CHARTEVENT_CUSTOM)
     {
      if(id==broadcastEventID)
        {
         Print("Получили широковещательное сообщение от графика с id="+lparam);
        }
      else
        {
         //--- прочитаем текстовое сообщение в событии
         string info=sparam;
         Print("Обрабатывается ПОЛЬЗОВАТЕЛЬСКОЕ событие с ID =",id);
         //--- выведем сообщение в метке
         ObjectSetString(0,labelID,OBJPROP_TEXT,sparam);
         ChartRedraw();// принудительно перерисуем все объекты на графике
        }
     }
  }
//+------------------------------------------------------------------+
//| послать широковещательное сообщение всем открытм графикам        |
//+------------------------------------------------------------------+
void BroadcastEvent(long lparam,double dparam,string sparam)
  {
   int eventID=broadcastEventID-CHARTEVENT_CUSTOM;
   long currChart=ChartFirst();
   int i=0;
   while(i<CHARTS_MAX)          // у нас наверняка не больше CHARTS_MAX открытых графиков
     {
      EventChartCustom(currChart,eventID,lparam,dparam,sparam);
      currChart=ChartNext(currChart); // на основании предыдущего получим новый график
      if(currChart==0) break;  // достигли конца списка графиков
      i++;                     // не забудем увеличить счетчик
     }
  }
//+------------------------------------------------------------------+

Probieren Sie es aus.

 
kirill190982:
Ich weiß nicht, wenn wir double zu int konvertieren wird es definitiv ein Verlust, aber wenn umgekehrt, wird es höchstwahrscheinlich einen Fehler bei der Normalisierung, weil der zweite Wert des int-Typ-Funktion

Wenn Sie int nach double schreiben, wird alles normal gehandhabt, der Compiler verwirft nur den gebrochenen Teil (gemäß der Regel).

In der umgekehrten Situation beginnt der Compiler jedoch zu zweifeln und gibt eine Warnung über mögliche Probleme aus (wie es ihm scheint).

Und da wir alle wissen, dass man in einer solchen Situation SCHAFFEN MUSS, "raten" wir ihm, es zu tun. :)

PS

Vielleicht werden die Entwickler in Zukunft REAL-Warnungen abschalten, und dann wird der Compiler, wie in MQL4, aufhören, über alle möglichen Trivialitäten zu schreien...

 
Interesting:

Frage an die Entwickler in Bezug auf "Benutzer"-Ereignisse und mehrere Experten, die an demselben Terminal arbeiten.

Ich möchte also fragen, ob ich es richtig machen will oder nicht?


Hier ist eine Idee.

Im Laufe des Stücks müssen wir die "benachbarten" Fachberater über einige Vorgänge informieren, die sich abspielen.

Zum Beispiel sollten die folgenden Prozesse zuerst überwacht werden:

1. Fachmännisches Abschließen;

2. Entladen des Expert Advisors;

3. Beendigung von Handelsgeschäften;

4. Wiederaufnahme des Handelsbetriebs.


Umsetzung

I. Erstellen Sie 4 Bezeichner von Ereignissen:

1 - CHARTEVENT_CUSTOM+1//Start des Expert Advisors

2 - CHARTEVENT_CUSTOM+2//Entladen des Expert Advisors

3 - CHARTEVENT_CUSTOM+3 //Handelsgeschäfte einstellen

4 - CHARTEVENT_CUSTOM+4//Wiederaufnahme des Handelsbetriebs


II. Verfolgung von Ereignissen

Wenn eine bestimmte Situation eintritt, generiert der Expert Advisor eine SPARTEVENT-Meldung unter EventChartCustom.

Gleichzeitigschreibt der Expert Advisor in sparam einen Kommentar (Name und Art des Ereignisses oder andere Informationen) undlparam seinen eigenen Chart-Identifikator.

Die Expert Advisors auf anderen Charts (wenn sie die Art eines Ereignisses richtig erkennen können) reagieren auf diesen EA.


PS

Wenn die Idee gut ist, kann sie fertiggestellt und zu einem Artikel geformt werden. Oder fügen Sie sie dem Hilfebereich für benutzerdefinierte Ereignisse hinzu?

Und ich sehe nicht den Sinn in der Verwendung von mehreren EAs auf einmal, vor allem, wenn Sie mehrere Tools spielen - Sie können leicht mit einem EA, Modifikation, Öffnung und Schließung kann auch von einem EA, Indikator-Analyse zu getan werden
 
Rosh:

Es gibt ein Beispiel für die Funktion EventChartCustom:

Probieren Sie es aus.

Ja, ich habe dieses Beispiel schon einmal gesehen (ich weiß nicht einmal, wie lange es her ist). Ich wollte fragen, ob meine Idee richtig und für die Umsetzung interessant ist.

PS

Wenn es nicht in die Hilfe passt, dann wird sich vielleicht jemand bereit erklären, es zu verfeinern und einen Artikel über diese Anwendung von Ereignissen zu schreiben.

Es wäre auch interessant, benutzerdefinierte Ereignisse in Form von Aufträgen von einem EA zu einem anderen (oder anderen) zu verwenden. wenn Sie alles zusammenfassen, würde es meiner Meinung nach ein sehr interessanter Artikel werden.

Leider habe ich keine Zeit, mich damit zu befassen...

 
kirill190982:
Und ich sehe keinen Sinn darin, mehrere EAs auf einmal zu verwenden, vor allem, wenn Sie mehrere Symbole spielen - Sie können leicht mit einem EA, Modifikation, Öffnen und Schließen kann auch von einem EA, die Analyse von Indikatoren, auch getan werden

Es gibt immer einen Sinn, zumal nicht alle EAs a priori mehrwährungsfähig sind (basierend auf den Erfahrungen mit MQL4).

Das bedeutet, dass es für Anfänger und viele derjenigen, die früher im mechanischen Handel tätig waren, nicht einfach ist, den Handel mit mehreren Währungen richtig zu organisieren...


Wer weiß, was passiert, wenn jemand z. B. 2-3 Kopien der MACD-Probe auf einem Konto ausführen will.


Abgesehen davon, dass die Situationen unterschiedlich sind, können andere Expert Advisors eine sekundäre Rolle spielen, indem sie die Aufträge des ersten Advisors entgegennehmen.

Diese Variante ist auch akzeptabel, wenn andere EAs ("Nachbarn") nicht handeln, sondern nur Daten verarbeiten oder bestimmte Arbeiten erledigen.

Ähnliches kann auch in der Kommunikation zwischen Indizes und EAs (mit einem bestimmten Ansatz) umgesetzt werden.

PS

Deshalb habe ich vorgeschlagen, diese Frage zu bearbeiten und zu fragen, ob ein erfahrener Progamer bereit wäre, einen Artikel zu schreiben. Ich würde mich besonders freuen, wenn die Entwickler selbst etwas Zeit für dieses Thema aufwenden würden.

Ich denke, es gibt genug Stoff für mehr als einen Artikel...

 
Interesting:
............

Leider habe ich nicht die Zeit dazu...

Wir verstehen das. Zu viel Zeit damit verbracht, jeden und alles zu kommentieren....
 
AM2:

Ich schaue mir vMA und Close[] an. In wotch, es ist gut zu zählen. Ich habe es auch auf diese Weise versucht:

Wieder erhalte ich einen Fehler. Vielleicht gibt es eine andere Möglichkeit, den einfachen gleitenden Durchschnitt zu berechnen. Oder nehmen Sie den Handle iMA und CopyBuffer , wo er sein sollte?

1. Im wotcha sollten Sie entweder den Namen des Close-Arrays angeben (Sie sehen nur allgemeine Informationen) oder einen bestimmten Wert von Close[1], Close[2],..., Close[i].

2. Sie können nicht sehen, wie Ihr Code das mrate-Array füllt

3. Sehen Sie sich die Standardbibliothek MovingAverages.mqh an - dort finden Sie ein Beispiel für eine MA-Berechnung

 
joo:
Wir verstehen das. Es wird zu viel Zeit damit verbracht, jeden und alles zu kommentieren....


Es bleibt auch genügend Zeit für Kommentare und die Umsetzung bestimmter Ideen.

Es ist nur so, dass ich mich wahrscheinlich nicht ernsthaft genug mit dem Thema auseinandersetzen werde, um den gesamten Bereich abzudecken (und ich beschäftige mich bereits mit einigen Anwendungen der Idee, rein für mich selbst).

Aber auf jeden Fall werde ich wahrscheinlich keine Artikel zu diesem Thema schreiben (aus verschiedenen Gründen)...