Fragen von einem "Dummy" - Seite 262

 
agvozdezkiy:

Ich habe gerade angefangen, MQL zu studieren, und hier habe ich einen EA geschrieben, der einen iMA zeichnet und eine Tangente (sehr nah) an den Chart im iMA an dem Punkt zeichnet, an dem der Mauszeiger auf der Zeitachse ist.

Problem eins. Der Expert Advisor ist SEHR langsam. Das bedeutet, dass die Tangente für eine lange Zeit neu gezeichnet wird und nicht der Bewegung der Maus folgt...

Sehen Sie sich meine Version an:

//+------------------------------------------------------------------+
//|                                                Antonio_Mouse.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
int Handle_iMA;
double Buffer_iMA[];
string Name_iMA;
datetime TimeArray[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---Устанавливаем свойство графика посылать события при движении мышы     
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//---Рисуем индикатор iMA
   Handle_iMA=iMA(NULL,0,10,0,MODE_SMA,PRICE_CLOSE);
   if(Handle_iMA!=INVALID_HANDLE)
     {
      ChartIndicatorAdd(0,0,Handle_iMA);
      Print("iMA скопировано в буффер.");
     }
//---
   string name="Line";
   ObjectCreate(0,name,OBJ_TREND,0,0,0);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clrRed);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,10);
   ObjectSetInteger(0,name,OBJPROP_BACK,true);
   ObjectSetInteger(0,name,OBJPROP_RAY_LEFT,false);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,true);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(Handle_iMA);
  }
datetime CarrentBarTime[];
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
  }
double PriceCoord,Angle;
datetime TimeCoord;
int SubWindow,BarPos,X1,Y1,X2,Y2;
int prevX=-1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &XCoord,
                  const double &YCoord,
                  const string &SParam)
  {
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      int x=(int)XCoord;
      int y=(int)YCoord;
      if(x==prevX) return;
      CopyTime(NULL,0,0,1,CarrentBarTime);
      //---
      ChartXYToTimePrice(NULL,x,y,SubWindow,TimeCoord,PriceCoord);
      if(TimeCoord>CarrentBarTime[0]) return;
      CopyBuffer(Handle_iMA,0,TimeCoord+PeriodSeconds(),2,Buffer_iMA);
      //---
      string name="Line";
      ObjectSetDouble(0,name,OBJPROP_PRICE,0,Buffer_iMA[0]);
      ObjectSetInteger(0,name,OBJPROP_TIME,0,TimeCoord);
      ObjectSetDouble(0,name,OBJPROP_PRICE,1,Buffer_iMA[1]);
      ObjectSetInteger(0,name,OBJPROP_TIME,1,TimeCoord+PeriodSeconds());
      //---
      ChartRedraw();
      prevX=x;
     }
  }

Auf meinem Laptop - alles fliegt!

 

Ich erhalte die Fehlermeldung 5040 (Corrupted parameter of type string), wenn ich zum ersten Mal eine Objekterstellungsfunktion aufrufe

void  CreateTL(string name,datetime time1,double price1,datetime time2,double price2,bool ray_left,bool ray_right,color color_TL)
  {
//------------ nTL,nTLh,nTLl,nTLe
   nTL="nTL_"+IntegerToString(MathRand());
   nTLh="nTLh_"+IntegerToString(MathRand());
   nTLl="nTLl_"+IntegerToString(MathRand());
   nTLe="nTLe_"+IntegerToString(MathRand());
//------------
   ObjectCreate(0,name,OBJ_TREND,0,time1,price1,time2,price2);
   ObjectSetInteger(0,name,OBJPROP_COLOR,color_TL);
   ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_DOT);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray_left);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray_right);
   ObjectSetInteger(0,name,OBJPROP_BACK,true);
  };

Wenn vor einem Anruf setzen

nTL="";

Fehler 4002 (Ungültiger Parameter bei internem Aufruf der Client-Terminal-Funktion)

Wenn vor dem Anruf festgelegt

nTL="a";

wird das erste Objekt den Namen a tragen.

Ich nenne es folgendermaßen

if(hlp_var==high_low)
     {
      //CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color);
      CreateTL(nTL,dt[0],pr[0],dt[0],pr[1],false,false,nTL_color);
      CreateTL(nTLe,dt[1],pr[0],dt[1],pr[1],false,false,nTL_color);
      CreateTL(nTLh,dt[0],pr[0],dt[1],pr[0],false,true,nTL_color);
      CreateTL(nTLl,dt[0],pr[1],dt[1],pr[1],false,true,nTL_color);
      CreateTL(nTL,dt[0],pr[0],dt[1],pr[1],false,true,nTL_color);
      CreateTL(nTL,dt[0],pr[1],dt[1],pr[0],false,true,nTL_color);
      Print("CreateTL GetLastError "+IntegerToString(GetLastError()));
     };

Können Sie mir sagen, wo ein Fehler vorliegt?

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 

In der alten Version.

ObjectCreate(0,nTL="nTL_"+IntegerToString(MathRand()),OBJ_TREND,0,time1,price1,time2,price2);

hatte nie irgendwelche Ausfälle.

Ist es ein Fehler im Code oder im Terminal?

 
Silent:

Können Sie mir sagen, wo der Fehler liegt?

Ich weiß nicht, wo der Fehler liegt, aber die Handhabung von Objektnamen ist gelinde gesagt sehr fragwürdig.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
Es ist unklar, warum Sie eine Zufallszahl im Namen des Objekts haben wollen, dies kann ebenfalls zu einem Fehler führen.
 
Silent:

Ich erhalte die Fehlermeldung 5040 (Corrupted parameter of type string), wenn ich das erste Mal die Funktion zur Objekterstellung aufrufe

Wenn vor einem Anruf setzen

Fehler 4002 (Ungültiger Parameter bei internem Aufruf der Client-Terminal-Funktion)

Wenn vor dem Anruf festgelegt

wird das erste Objekt den Namen a tragen.

Ich rufe folgendermaßen an

Können Sie mir sagen, wo der Fehler liegt?

Sind Sie besorgt, weil Get LastError etwas anderes als Null ausgibt? Wenn dies der Fall ist, sollten Sie nur dann einen Fehler anfordern, wenn die Funktion einen Fehler meldet. Und man sollte nicht nach einem Fehler am Ende des Plots fragen, da man sonst einen unsinnigen Wert erhält. So ist es in MT4, vielleicht ist es hier anders.

Pseudocode:

if( ! ObjectCreate(...) )
    Print( GetLastError() );
 
Silent:

Ich erhalte die Fehlermeldung 5040 (Corrupted parameter of type string), wenn ich das erste Mal die Funktion zur Objekterstellung aufrufe

Wenn vor einem Anruf setzen

Fehler 4002 (Ungültiger Parameter bei internem Aufruf der Client-Terminal-Funktion)

Wenn vor dem Anruf festgelegt

wird das erste Objekt den Namen a tragen.

Ich nenne es folgendermaßen

Können Sie mir sagen, wo der Fehler liegt?

Versuchen Sie, Strings durch StringConcatenate() zu "kleben".

 
TheXpert:
Ich weiß nicht, wo der Fehler liegt, aber die Handhabung von Objektnamen ist gelinde gesagt sehr fragwürdig.
Ich werde mir noch eine Woche lang den Kopf zerbrechen. Können Sie es genauer beschreiben? (man kann auch grob sein :))
zfs:
Es ist nicht klar, warum Sie eine Zufallszahl im Objektnamen benötigen, dies könnte zu einem Fehler führen.

Gibt es eine andere Möglichkeit für ein paar hundert Objekte mit eindeutigen Namen?

(Eine Gruppe von Objekten sollte den gleichen Teil der Zeichenkette im Namen haben, um die Gruppe aufzulösen).

 
220Volt:

Sind Sie besorgt, weil Get Last Errors etwas anderes als Null ausgibt? Wenn dies der Fall ist, sollten Sie nur nach einem Fehler fragen, wenn die Funktion einen Fehler meldet. Und man sollte nicht nach einem Fehler am Ende des Plots fragen, da man sonst einen unsinnigen Wert erhält. So ist es in MT4, vielleicht ist es hier anders.

Nein, denn beim ersten Aufruf wird aufgrund eines Fehlers kein Objekt erstellt. Ich dupliziere (vorerst) die Zeile des ersten Aufrufs, die dann beim zweiten Durchlauf erstellt wird.
 
220Volt:

Sind Sie besorgt, weil Get Last Errors etwas anderes als Null ausgibt?

Nun, logischerweise, wenn die Funktion überhaupt den letzten Fehler setzt, dann sollte bei erfolgreicher Beendigung der Funktion ein Nullfehler oder der in der Dokumentation beschriebene Wert auftreten. Es gibt keinen anderen Weg.

Das heißt, wenn der Aufruf erfolgreich war und der Fehler nicht Null ist, muss dieser Fall in der Dokumentation beschrieben werden.

Stumm:

Auf diese Weise werde ich mir noch eine Woche lang den Kopf zerbrechen. Darf ich Ihnen noch ein paar Details nennen? (Sie dürfen grob sein :))

Normalerweise werden die Namen von Objekten desselben Typs aus einem gemeinsamen Teil gebildet, damit sie leicht zu entfernen sind ("nTL_" in Ihrem Fall) und sich unterscheiden. Ich verwende auch Modulbezeichner, wenn es mehr als eines dieser Module gleichzeitig auf der Karte geben kann.

Die Differenz kann alles Mögliche sein, sogar ein Zähler, den Sie jedes Mal erhöhen, wenn Sie ein Objekt erstellen. Aber es ist besser, logisch zu unterscheiden - Objektzeit, Objektkoordinate, das Ziel ist, garantierte Eindeutigkeit zu erreichen. Der Nebeneffekt ist, dass Sie durch erneutes Konstruieren eines Namens die Eigenschaften eines bereits erstellten Objekts ändern können.

Der Zufallsgenerator bietet diese "garantierte Einzigartigkeit" nicht.

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
Grund der Beschwerde: