Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 1284

 
Youri Lazurenko:

Nochmals vielen Dank, jetzt ist die Linie wie eine Linie, schön zu sehen. Es wird nurObjectDelete(0, name);; benötigt, da sonst die einmal gezeichnete Linie nicht erneut gezeichnet wird. Das gleiche in mql4, ich habe es nur vergessen.

Ich hätte das getan

bool CreateLine(string name, datetime time1, double price1, datetime time2, double price2, color clr)
 {
  if(ObjectFind(ChartID(), name) < 0)
    if(!ObjectCreate(ChartID(), name, OBJ_TREND, 0, 0, 0, 0, 0))
     {
      Print("Ошибка в создании линии");
      return (false);
     }
  ObjectSetInteger(ChartID(), name, OBJPROP_COLOR, clr);
  ObjectSetInteger(ChartID(), name, OBJPROP_STYLE, TrendStyle);
  ObjectSetInteger(ChartID(), name, OBJPROP_WIDTH, TrendWidth);
  ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 0, time1);
  ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 1, time2);
  ObjectSetDouble(ChartID(), name, OBJPROP_TIME, 0, price1);
  ObjectSetDouble(ChartID(), name, OBJPROP_TIME, 1, price2);

  ChartRedraw();
  return(true);
 }
 
Vladimir Karputov:

Was für ein Unsinn. Das gezeichnete grafische Objekt bewegt sich flüssig. Ein Beispiel ist in der Hilfe für jedes Objekt angegeben (für die horizontale LinieOBJ_HLINE).

Sie können auch jede Eigenschaft eines bereits gezeichneten Objekts ändern: Farbe, Stil, Geruch ...

Ich bestreite nicht, dass dies manuell geschieht. Der Expert Advisor zeichnet jedoch Trendlinien nach DeMark-Punkten. Mit der Funktion ObjectDelete(0, name); wird bei einer Änderung der Punkte die alte Trendlinie entfernt und eine neue gezeichnet. Ohne diese Funktion werden die ersten gezeichneten Linien nicht mehr neu gezeichnet. Das ist kein Unsinn, das ist eine Tatsache.

Документация по MQL5: Графические объекты / ObjectDelete
Документация по MQL5: Графические объекты / ObjectDelete
  • www.mql5.com
ObjectDelete - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

Manuell habe ich keine Einwände. Der Expert Advisor hingegen zeichnet Trendlinien nach DeMark-Punkten. Mit der Funktion ObjectDelete(0, name); wird bei einer Änderung der Punkte die alte Trendlinie entfernt und eine neue gezeichnet. Ohne diese Funktion werden die ersten gezeichneten Linien nicht mehr neu gezeichnet. Das ist kein Unsinn, das ist eine Tatsache.

Warum lesen Sie nicht die Hilfe? Und führen Sie das Beispiel aus.

 
Alexey Viktorov:

Ich würde das tun.

Danke, aber ich bleibe bei meiner Variante, sie funktioniert. Ich werde es jedoch anstelle von ObjectDelete(0, name); versuchen.

 ChartRedraw();
Документация по MQL5: Графические объекты / ObjectDelete
Документация по MQL5: Графические объекты / ObjectDelete
  • www.mql5.com
ObjectDelete - Графические объекты - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Vladimir Karputov:

Lesen Sie die Hilfe, um Himmels willen! Und führen Sie das Beispiel aus.

Ich habe den Hinweis gelesen. Nur Sie sind entrüstet und ich schreibe aus der Praxis. Eine andere Sache ist , ChartRedraw() anstelle von ObjectDelet() zu verwenden, ich argumentiere nicht und werde es überprüfen. Dies ist das Einzige, worauf Sie anhand des Beispiels hinweisen müssen.

 
Youri Lazurenko:

Ich habe den Schriftsatz gelesen. Nur Sie empören sich mit Worten, und ich schreibe aus der Praxis. Eine andere Sache ist , ChartRedraw() anstelle von ObjectDelet() zu verwenden, ich argumentiere nicht, und überprüfen Sie es. Dies ist das Einzige, worauf ich anhand des Beispiels hinweisen muss.

Normalerweise bitten die Leute in diesem Thread um Rat und wenn sie ihn bekommen, hören sie zu. Lesen Sie zumindest die Hilfe und wenden Sie Beispiele an. Bitte, wenn Sie anderen nicht zuhören wollen, fragen Sie gar nicht erst.

 
Youri Lazurenko:


Ein Beispiel dafür, wie Sie eine beliebige Eigenschaft des grafischen Objekts"Horizontale Linie" spontan ändern können - dazu müssen Sie das Objekt nicht löschen, sondern nur die Eigenschaft ändern.

C:\Users\barab\OneDrive\Изображения\Screenpresso\2021-02-01_16h09_06.gif

Code:

//+------------------------------------------------------------------+
//|                       OBJ_HLINE change properties on the fly.mq5 |
//|                        Copyright 2021, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- input parameters
input string          InpName="HLine";     // Line name
//--- an array for storing colors contains 14 elements
color colors[]=
  {
   clrRed,clrBlue,clrGreen,clrChocolate,clrMagenta,clrDodgerBlue,clrGoldenrod,
   clrIndigo,clrLightBlue,clrAliceBlue,clrMoccasin,clrWhiteSmoke,clrCyan,clrMediumPurple
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//--- the number of colors
   int size=ArraySize(colors);
//--- get a random value
   int number=MathRand();
//--- get an index in the col[] array as a remainder of the integer devision
   int i=number%size;
//--- set line color
   ObjectSetInteger(ChartID(),InpName,OBJPROP_COLOR,colors[i]);
   ChartRedraw();
  }
//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
Документация по MQL5: Константы, перечисления и структуры / Константы объектов / Типы объектов
  • www.mql5.com
Типы объектов - Константы объектов - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Youri Lazurenko:

Danke, aber ich bleibe bei meiner Variante, sie funktioniert. Ich werde es jedoch anstelle von ObjectDelete(0, name); versuchen.

Völlig falsche Entscheidung. Das Löschen eines grafischen Objekts und das Aktualisieren eines Diagramms ersetzen sich in keiner Weise gegenseitig.

Mein Beispiel prüft zunächst, ob es ein Objekt gibt, insbesondere einen Trend mit dem Namen tfyu, der in der russischen Tastaturbelegung Name ist)). Wenn sie nicht vorhanden ist, wird der Trend eingezeichnet. Ist der Zeichenversuch erfolglos, wird die Meldung angezeigt und die Funktion mit return false beendet.

Alles, was danach kommt, unabhängig davon, ob der Trend bereits vorhanden ist oder gerade gezeichnet wurde, wird mit den angegebenen Parametern, Zeit- und Koordinatenpreisen, Typ, Dicke und allem, was Sie sonst noch hinzufügen können, versehen. Danach wird das Diagramm aktualisiert und die Funktion gibt true zurück.

Im Hinblick auf die Ausführungsgeschwindigkeit ist es weniger kostspielig, das Vorhandensein des Trends zu prüfen, als ihn zu löschen und einen neuen Trend zu zeichnen.

Aber... die endgültige Entscheidung liegt bei dir, und wenn du dich gerne mit dem rechten kleinen Finger am linken Ohr kratzt, habe ich kein Recht, dich davon abzuhalten.

 
Youri Lazurenko:

Und zurück zum Zeichnen der Trendlinie. Falls Sie einen Code benötigen.

Sehr schlechter Code.

 
Alexey Viktorov:

Ich würde dies tun.

Ich hätte das getan:

void CreateLine(string name, datetime time1, double price1, datetime time2, double price2, color clr)
 {
  if(ObjectFind(ChartID(), name) < 0)
   {
    ObjectCreate(ChartID(), name, OBJ_TREND, 0, 0, 0, 0, 0);
    ObjectSetInteger(ChartID(), name, OBJPROP_COLOR, clr);
    ObjectSetInteger(ChartID(), name, OBJPROP_STYLE, TrendStyle);
    ObjectSetInteger(ChartID(), name, OBJPROP_WIDTH, TrendWidth);
   }
   ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 0, time1);
   ObjectSetInteger(ChartID(), name, OBJPROP_TIME, 1, time2);
   ObjectSetDouble(ChartID(), name, OBJPROP_PRICE, 0, price1);
   ObjectSetDouble(ChartID(), name, OBJPROP_PRICE, 1, price2);

  ChartRedraw();
 }
Grund der Beschwerde: