Diskussion zum Artikel "Die Erstellung der benutzerdefinierten Indikatoren unter Verwendung der Klasse CCanvas" - Seite 2

 
fxsaber:

Das ist eine gute Nachricht! Was ist die Idee dahinter? Anstelle eines Tickverlaufs eine benutzerdefinierte Zeitreihe?

Nein. Zeichnen Sie ein Histogramm der Tickrate neben dem Tickverlauf.

So können Sie beim Spielen mit den Parametern die Aktivitätszeiträume visuell bestimmen und vielleicht einige Muster finden.

 
Dennis Kirichenko:

Gutes Thema. Vielen Dank an den Autor, wird ein Tick-Indikator auf Leinwand machen.....

Mir ist folgendes aufgefallen.

Es gibt ein privates Datenmitglied m_canvas_name, aber die Methode, die seinen Wert setzt - Name() - ist öffentlich. Imho wird das Prinzip der Kapselung verletzt. Ich werde diese Methode privat machen.

Vielleicht geschützt? Denn alle anderen erben von CCanvasBase. Und dann wird es unmöglich sein, diese Methode in ihnen zu verwenden. Obwohl ich nicht weiß, vielleicht haben Sie etwas anderes in der allgemeinen Struktur geändert.

 
Alexander Fedosov:

Vielleicht geschützt? Denn alle anderen erben CCanvasBase. Und dann kann man diese Methode nicht in ihnen verwenden. Obwohl ich nicht weiß, vielleicht haben Sie etwas anderes in der allgemeinen Struktur geändert.


Also ja, geschützt.

Dann hier:

bool CCanvasBase::DeleteCanvas()
  {
   return(ObjectDelete(0,m_canvas_name)?true:false);
  }
//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Deinitialisierungsfunktion |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ind.Delete();
   ChartRedraw();
  }

Warum so kompliziert im Indikator? Imho müssen Sie den Canvas selbst aufräumen. Ich würde die DeleteCanvas()-Methode um ChartRedraw() erweitern .

 
fxsaber:

Wenn Sie Skizzen haben, schicken Sie bitte Screenshots/Videos. Ich habe selbst einen solchen Indikator gepostet, aber er ist nicht unter die Leute gekommen. Obwohl ich keine bessere Lösung gefunden habe. Es ist interessant, andere Lösungen auf Kanvas zu sehen.


Ich mache gerade eine für FORTS. Ich habe sie im üblichen Format erstellt, aber im Tester funktioniert sie wie die Hölle, wenn sie vom EA-Body aufgerufen wird. Jetzt werde ich den ganzen Code in den EA übertragen...

 
Dennis Kirichenko:

Ja, das ist richtig.

Dann hier:

Warum so kompliziert im Indikator? Meiner Meinung nach ist es notwendig, den Canvas selbst aufzuräumen. Ich würde ChartRedraw() zur DeleteCanvas()-Methode hinzufügen .

Ja, auf diese Weise wird es weniger unnötige Zeilen geben. Wir machen den Canvas sauber und schicken den Redraw dorthin.

 

Das ist nicht wirklich der richtige Weg:

//+------------------------------------------------------------------+
//|| Löscht eine Grafikressource|
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   return(ObjectDelete(0,m_canvas_name)?true:false);
  }

Warum ein ternärer Operator? - Wenn man es einfach machen kann:

//+------------------------------------------------------------------+
//|| Löscht eine Grafikressource|
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   return ObjectDelete(0,m_canvas_name);
  }

Ich habe es so gemacht:

//+------------------------------------------------------------------+
//|| Löscht eine Grafikressource|
//+------------------------------------------------------------------+
bool CCanvasBase::DeleteCanvas()
  {
   if(ObjectFind(0,m_canvas_name)>-1)
      if(ObjectDelete(0,m_canvas_name))
        {
         ChartRedraw();
         return true;
        }
   return false;
  }


Aber Canvas hat seine eigene Methode zum Löschen von CCanvas::Destroy().

Warum müssen wir noch etwas hinzufügen?

 

Ich habe ein Problem mit der vertikalen Skalierung.

Ich möchte ein Tick-Chart auf RTS erstellen, bei dem das Maximum auf der Y-Achse 97784,0 und das Minimum 97756,0 ist.

Ich tue dies im Code:

//--- Aktualisierung des Diagramms
double min_y=NormalizeDouble(min_pr-0.2*diff,_Digits);
double max_y=NormalizeDouble(max_pr+0.2*diff,_Digits);
ticks_ind.YMin(min_y);
ticks_ind.YMax(max_y);
ticks_ind.SetArrayValue(prices);


Ich erhalte dies:

https://www.mql5.com/ru/charts/7227612/rts-9-17-m1-ao-otkritie-broker

Das Minimum wird korrekt angezeigt, aber dann gibt es ein Rauschen.

Offenbar ist die Methode CLineGraph::VerticalScale() nicht so fein abgestimmt, wie ich denke, oder noch schlimmer, wie sie sein sollte.

График RTS-9.17, M1, 2017.06.19 15:22 UTC, АО ''Открытие Брокер'', MetaTrader 5, Real
График RTS-9.17, M1, 2017.06.19 15:22 UTC, АО ''Открытие Брокер'', MetaTrader 5, Real
  • www.mql5.com
Символ: RTS-9.17. Период графика: M1. Брокер: АО ''Открытие Брокер''. Торговая платформа: MetaTrader 5. Режим торговли: Real. Дата: 2017.06.19 15:22 UTC.
 
Документация по MQL5: Стандартная библиотека / Научные графики / CGraphic
Документация по MQL5: Стандартная библиотека / Научные графики / CGraphic
  • www.mql5.com
Стандартная библиотека / Научные графики / CGraphic - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Anatoly, danke für den Tipp, ich werde ihn verwenden. Es ist schade, dass sich die Idee als unfreundlicher Code entpuppt...