Zeigen!
Autotrendlines ist einer der besten kostenlosen Indikatoren. Vielen Dank an den Schöpfer dieses Indikators. Aber er hat ein großes Problem! Er entfernt jede Trendlinie, die der Benutzer selbst gezeichnet hat. Ich warte schon lange darauf, dass dieses Problem behoben wird. Ich werde also sehr dankbar sein, wenn dieses Problem im neuen Update gelöst wird.
Fehler, Irrtümer, Fragen
Neuzeichnen von Indikatoren.
Fraktale
Autotrendlines ist einer der besten kostenlosen Indikatoren. Vielen Dank an den Schöpfer dieses Indikators. Aber er hat ein großes Problem! Er entfernt jede Trendlinie, die der Benutzer selbst gezeichnet hat. Ich warte schon lange darauf, dass dieses Problem behoben wird. Ich werde also sehr dankbar sein, wenn dieses Problem im neuen Update gelöst wird.
Fehler, Irrtümer, Fragen
Neuzeichnen von Indikatoren.
Fraktale
Hier die Übersicht, die nur die vom Indikator erzeugte Linie löscht und andere Trends auf dem Chart belässt //+------------------------------------------------------------------+ //| AutoTrendLines.mq5 | //| Copyright 2012, Rone. | //| rone.sergey@gmail.com | //+------------------------------------------------------------------+ // https://www.mql5.com/de/code/1220 //+------------------------------------------------------------------+ //| Automatische Trendlinien. | //| Typ 1. Mit zwei Extremwerten. | //| 1) Vom aktuellen Balken "geht" man nach links und sucht den ersten | //| (rechten) Extrempunkt mit den InpRightExmSide Balken auf beiden | //| Seiten. | //| 2) Gehen Sie vom ersten Punkt wieder nach links und suchen Sie den zweiten (linken) Extrempunkt mit den InpLeftExmSide-Balken auf beiden | //| Seiten. | //| 3) Zeichnen Sie eine Trendlinie. | //| | //| Typ 2. Mit Extremum und Delta. | //| 1) Vom aktuellen Balken nach links "gehen" und den zweiten (linken) Extrempunkt mit den InpLeftExmSide-Balken auf beiden Seiten suchen. | //| 2) Ausgehend vom InpFromCurrent-Balken vom aktuellen Balken und | //| zum zweiten Extrempunkt den Balken mit minimalem Delta finden. | //| 3) Zeichnen Sie eine Trendlinie. | //| | //| HINWEIS: | //| 1) Die Linien werden nur dann neu berechnet, wenn ein neuer Balken erscheint | //| 2) Der aktuelle ungeformte Balken wird nicht in die Berechnungen einbezogen | //| 3) Das Extremum bedeutet einen Balken, bei dem die linken und rechten | //| N Balken Minima darüber und Maxima darunter haben. | //+------------------------------------------------------------------+ #property copyright "Copyright 2012, Rone." #property link "rone.sergey@gmail.com" #property version "1.00" #property description "Automatische Trendlinien" //--- #property indicator_chart_window //--- string prefisso="AUTO_TRND"; enum ENUM_LINE_TYPE { EXM_EXM, // 1: Durch 2 Extremwerte EXM_DELTA // 2: Extremwert und Delta }; //+------------------------------------------------------------------+ //| Klasse CPoint | //+------------------------------------------------------------------+ class CPoint { private: double price; datetime time; public: CPoint(); CPoint(const double p, const datetime t); ~CPoint() {}; void setPoint(const double p, const datetime t); bool operator==(const CPoint &other) const; bool operator!=(const CPoint &other) const; void operator=(const CPoint &other); double getPrice() const; datetime getTime() const; }; //--- CPoint::CPoint(void) { price = 0; time = 0; } //--- CPoint::CPoint(const double p, const datetime t) { price = p; time = t; } //--- void CPoint::setPoint(const double p, const datetime t) { price = p; time = t; } //--- bool CPoint::operator==(const CPoint &other) const { return price == other.price && time == other.time; } //--- bool CPoint::operator!=(const CPoint &other) const { return !operator==(other); } //--- void CPoint::operator=(const CPoint &other) { price = other.price; time = other.time; } //--- double CPoint::getPrice(void) const { return(price); } //--- datetime CPoint::getTime(void) const { return(time); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ CPoint curLeftSup, curRightSup, curLeftRes, curRightRes, nullPoint;
//+------------------------------------------------------------------+ //| Eingabeparameter | //+------------------------------------------------------------------+ input ENUM_LINE_TYPE InpLineType = EXM_DELTA;// Linientyp input int InpLeftExmSide = 10; // Linke Extremseite (Typ 1, 2) input int InpRightExmSide = 3; // Rechte Extremseite (Typ 1) input int InpFromCurrent = 3; // Offset vom aktuellen Balken (Typ 2) input bool InpPrevExmBar = false; // Berücksichtigung des Balkens vor dem Extremum (Typ 2) //--- input int InpLinesWidth = 2; // Linienbreite input color InpSupColor = clrRed; // Farbe der Hilfslinie input color InpResColor = clrBlue; // Farbe der Widerstandslinie //--- globale Variablen int minRequiredBars;
//+------------------------------------------------------------------+ //| Eigene Indikatorinitialisierungsfunktion | //+------------------------------------------------------------------+ int OnInit() { //--- minRequiredBars = InpLeftExmSide * 2 + MathMax(InpRightExmSide, InpFromCurrent) * 2;
//--- Zuordnung der Indikatorpuffer //--- return(0); } //+------------------------------------------------------------------+ //| Benutzerdefinierte Indikator-Deinitialisierungsfunktion | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- int obj_total = ObjectsTotal(0,0); for(int i=obj_total -1; i>=0; i--) { string name= ObjectName(0,i); if(StringFind(name,prefisso,0) == 0) ObjectDelete(0, name); } //--- } //+------------------------------------------------------------------+ //| Eigene Indikator-Iterationsfunktion | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int leftIndex, rightIndex; double delta, tmpDelta; //--- if ( rates_total < minRequiredBars ) { Print("Nicht genug Daten zum Berechnen"); return(0); } //--- if ( prev_calculated != rates_total ) { switch ( InpLineType ) { case EXM_DELTA: //--- Linken Punkt unterstützen leftIndex = rates_total - InpLeftExmSide - 2; for ( ; !isLowestLow(leftIndex, InpLeftExmSide, low) && leftIndex > minRequiredBars; leftIndex-- ); curLeftSup.setPoint(low[leftIndex], time[leftIndex]); //--- Right Point unterstützen rightIndex = rates_total - InpFromCurrent - 2; delta = (low[rightIndex] - low[leftIndex]) / (rightIndex - leftIndex); if ( !InpPrevExmBar ) { leftIndex += 1; } for ( int tmpIndex = rightIndex - 1; tmpIndex > leftIndex; tmpIndex-- ) { tmpDelta = (low[tmpIndex] - curLeftSup.getPrice()) / (tmpIndex - leftIndex); if ( tmpDelta < delta ) { delta = tmpDelta; rightIndex = tmpIndex; } } curRightSup.setPoint(low[rightIndex], time[rightIndex]); //--- Resistance Left Point leftIndex = rates_total - InpLeftExmSide - 2; for ( ; !isHighestHigh(leftIndex, InpLeftExmSide, high) && leftIndex > minRequiredBars; leftIndex-- ); curLeftRes.setPoint(high[leftIndex], time[leftIndex]); //--- Resistance Right Point rightIndex = rates_total - InpFromCurrent - 2; delta = (high[leftIndex] - high[rightIndex]) / (rightIndex - leftIndex); if ( !InpPrevExmBar ) { leftIndex += 1; } for ( int tmpIndex = rightIndex - 1; tmpIndex > leftIndex; tmpIndex-- ) { tmpDelta = (curLeftRes.getPrice() - high[tmpIndex]) / (tmpIndex - leftIndex); if ( tmpDelta < delta ) { delta = tmpDelta; rightIndex = tmpIndex; } } curRightRes.setPoint(high[rightIndex], time[rightIndex]); //--- break; case EXM_EXM: default: //--- Support Right Point rightIndex = rates_total - InpRightExmSide - 2; for ( ; !isLowestLow(rightIndex, InpRightExmSide, low) && rightIndex > minRequiredBars; rightIndex-- ); curRightSup.setPoint(low[rightIndex], time[rightIndex]); //--- Linken Punkt unterstützen leftIndex = rightIndex - InpRightExmSide; for ( ; !isLowestLow(leftIndex, InpLeftExmSide, low) && leftIndex > minRequiredBars; leftIndex-- ); curLeftSup.setPoint(low[leftIndex], time[leftIndex]); //--- Resistance Right Point rightIndex = rates_total - InpRightExmSide - 2; for ( ; !isHighestHigh(rightIndex, InpRightExmSide, high) && rightIndex > minRequiredBars; rightIndex-- ); curRightRes.setPoint(high[rightIndex], time[rightIndex]); //--- Resistance Left Point leftIndex = rightIndex - InpRightExmSide; for ( ; !isHighestHigh(leftIndex, InpLeftExmSide, high) && leftIndex > minRequiredBars; leftIndex-- ); curLeftRes.setPoint(high[leftIndex], time[leftIndex]); //--- break; } //--- Zeichne Unterstützung & Widerstand if ( curLeftSup != nullPoint && curRightSup != nullPoint ) { drawLine(prefisso+"Current_Support", curRightSup, curLeftSup, InpSupColor); } if ( curLeftRes != nullPoint && curRightRes != nullPoint ) { drawLine(prefisso+"Current_Resistance", curRightRes, curLeftRes, InpResColor); } } //--- Rückgabe des Wertes von prev_calculated für den nächsten Aufruf return(rates_total); } //+------------------------------------------------------------------+ //| Die Local Low Suchfunktion | //+------------------------------------------------------------------+ bool isLowestLow(int bar, int side, const double &Low[]) { //--- for ( int i = 1; i <= side; i++ ) { if ( Low[bar] > Low[bar-i] || Low[bar] > Low[bar+i] ) { return(false); } } //--- return(true); } //+------------------------------------------------------------------+ //| Die Suchfunktion für lokale Höchstwerte | //+------------------------------------------------------------------+ bool isHighestHigh(int bar, int side, const double &High[]) { //--- for ( int i = 1; i <= side; i++ ) { if ( High[bar] < High[bar-i] || High[bar] < High[bar+i] ) { return(false); } } //--- return(true); } //+------------------------------------------------------------------+ //| Funktion Trendlinie zeichnen | //+------------------------------------------------------------------+ void drawLine(string name, CPoint &right, CPoint &left, color clr) { //--- ObjectDelete(0, name); //--- ObjectCreate(0, name, OBJ_TREND, 0, right.getTime(), right.getPrice(), left.getTime(), left.getPrice()); ObjectSetInteger(0, name, OBJPROP_WIDTH, InpLinesWidth); ObjectSetInteger(0, name, OBJPROP_COLOR, clr); ObjectSetInteger(0, name, OBJPROP_RAY_LEFT, true); ObjectSetInteger(0, name, OBJPROP_SELECTABLE, true); //--- } //+------------------------------------------------------------------+
Indicators: AutoTrendLines
Hilfe bei der Codierung
expert advisor - verschiedene
ein netter Code, aber die Trendlinie bewegt sich so oft, und sie sollte eine negative Neigung für einen Abwärtstrend und eine positive Neigung für einen Aufwärtstrend haben
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich