Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Kleiner Indi um CustomIndicator Buffer auszulesen (http://www.expert-advisor.com/forum/showthread.php?t=6806)

noSkill06s 18.10.20 01:14

Kleiner Indi um CustomIndicator Buffer auszulesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi Leute, habe einen kleinen Indikator geschrieben,

mit diesem könnt ihr kontrollieren welcher Arrayindex(Bufferindex+1) welcher visuellen Darstellung des genutzten Indikators anspricht.

Anwendung:
1.MT4 Strategietester öffnen
2."Expertenprogramm" klicken "Indikator" auswählen
->Orientierung (Strategiefenster rechts oben)
3.Diesen Indicator auswählen
4.Indikator-Eigenschaften klicken
5.Euren gewünschten Indikator Namen "exakt eintippen"
6.Buffer auswählen
->a. Mit Buffer 0 starten
->b. Mit Buffer 0+1 weitermachen

Ergebnis: der Indikator malt blaue Kringel um den ausgewählten Buffer somit wisst ihr der Buffer x ist die visuelle Darstellung des Indikators x

Ich habe den Code ausgiebig kommentiert für meine Unterlagen ich denke es ist hilfreich für Anfänger (gehöre in Mql4 selbst noch dazu) von den Profis erwarte ich aufrichtige Kritik (ernsthaft bin für Kritik sehr dankbar also nur her damit).

Die Idee für den Indikator ist nicht von mir sondern eine Lektion von Jim Dandy da ich es aber für super hilfreich halte wollte ich es teilen.

Schönes WE

nun hier der Code (wird auch noch als Download beigefügt):
Code:

//+------------------------------------------------------------------+
//|                    5_HOW_INDICATORS_BECOME_PART_OF_THE_CHART.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                            https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version  "1.00"
#property strict
//STEPPOINT1-STEP1: HOW TO CREATE FUNCTION INDICATOR WHO READS THE BUFFER OF SELECTED INDICATOR
//STEPPOINT1-STEP1: DECLARE CORRECT AMOUNT OF BUFFERS ON THE PROPERTY
#property indicator_buffers 1
//STEPPOINT1-STEP2: DECLARE AND INITIALIZE BUFFER COLOR
//                ->ARRAYINDEX0 = BUFFERINDEX1
#property indicator_color1 clrBlue
//STEPPOINT1-STEP3: DECLARE AND INITALIZE BUFFER WIDTH
//                  ->ARRAYINDEX0 = BUFFERINDEX1
#property indicator_width1 3
#property indicator_chart_window
//STEPPOINT1-STEP3: DECLARE VARIABLE RETURN VALUE DATA TYPE  „STRING (FIXED)“
input string name = "bollinger_bicolor";
//STEPPOINT1-STEP4: DECLARE VARIABLE RETURN VALUE DATA TYPE "INT (FIXED)"
input int mode = 0;
//STEPPOINT1-STEP5: DECLARE DYNAMIC ARRAYS
double circleBuffer[];

/*         
STEPPOINT1: HOW TO WRITE AN INDICATOR WHO READS THE BUFFER OF SELECTED INDICATOR

            HOW TO CREATE FUNCTION INDICATOR WHO READS THE BUFFER OF SELECTED INDICATOR
            STEP1: DECLARE CORRECT AMOUNT OF BUFFERS ON THE PROPERTY
            STEP2: DECLARE AND INITIALIZE BUFFER COLOR
                  ->ARRAYINDEX0 = BUFFERINDEX1
            STEP3: DECLARE AND INITALIZE BUFFER WIDTH
                  ->ARRAYINDEX0 = BUFFERINDEX1
            STEP4: DECLARE VARIABLE RETURN VALUE DATA TYPE  „STRING (FIXED)“
            STEP5: DECLARE VARIABLE RETURN VALUE DATA TYPE "INT (FIXED)"
            STEP6: DECLARE DYNAMIC ARRAYS
            STEP7: ASSOCIATE ARRAY WITH SET FUNCTIONS
                  -DRAW ARROW
                    ->FUNCTION "SETINDEXBUFFER"
                    ->FUNCTION "SETINDEXSTYLE"
                    ->FUNCTION "SETINDEXLABLEL"
                    ->FUNCTION "SETINDEXARROW"
            STEP8: DECLARE CONTROL STRUCTURE (IF) 
                  ->DECLARE CORRECT COUNTING OF BARS   
            STEP9:  RETURN VALUE DATA TYPE "DOUBLE (FIXED)"
            STEP10: KEYWORD "ICUSTOM"
            STEP11: ROUND BRACKETS OPEN
            STEP12: POSITION1 RETURN VALUE DATA TYPE "STRING (FIXED)"
            STEP13: POSITION1 "SYMBOL" (SYMBOL)
                    ->NULL (NULL=SYMBOL())
            STEP14: POSITION2 RETURN VALUE DATA TYPE "INT (FIXED)"
            STEP15: POSITION2 "TIMEFRAME" (TIMEFRAME)
                    ->0 (0=PERIOD_CURRENT)
            STEP16: POSITION3 RETURN VALUE DATA TYPE "STRING (FIXED)"
            STEP17: POSITION3 "NAME" (PATH/NAME OF THE CUSTOM INDICATOR COMPILED PROGRAM)
                    ->NAME (NAME=INDICATORNAME)
            STEP18: POSITION4 RETURN VALUE DATA TYPE "INT (FIXED)"
            STEP19: POSITION4 "MODE" (LINE INDEX)
                    ->BUFFER ARRAYINDEX
            STEP20: POSITION5 RETURN VALUE DATA TYPE "INT (FIXED)"
            STEP21: POSITION5 "SHIFT" (SHIFT)
                    ->NUMBER OF BAR (CURRENT BAR = 0/...)
            STEP22: ROUND BRACKETS CLOSE
            STEP23: END ";"
            STEP24: DECLARE CONTROL STRUCTURE (IF)
                    ->BUFFER TRUE DRAW
            STEP24: FUNCTION DRAWING "1"
                    ->FIRST FINISHED BAR
*/

//+------------------------------------------------------------------+
//| Custom indicator initialization function                        |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
  //STEPPOINT1-STEP7: ASSOCIATE ARRAY WITH SET FUNCTIONS
  //      -DRAW ARROW
  //        ->FUNCTION "SETINDEXBUFFER"
  //        ->FUNCTION "SETINDEXSTYLE"
  //        ->FUNCTION "SETINDEXLABLEL"
  //        ->FUNCTION "SETINDEXARROW"
  SetIndexBuffer(0,circleBuffer);
  SetIndexStyle(0,DRAW_ARROW);
  SetIndexLabel(0,"Circle Signal");
  SetIndexArrow(0,161);
//---
  return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
  //STEPPOINT1-STEP8: DECLARE CONTROL STRUCTURE (IF) 
  //      ->DECLARE CORRECT COUNTING OF BARS
  if(rates_total-prev_calculated !=0){
      //STEPPOINT1-STEP9:  RETURN VALUE DATA TYPE "DOUBLE (FIXED)"
      //STEPPOINT1-STEP10: KEYWORD "ICUSTOM"
      //STEPPOINT1-STEP11: ROUND BRACKETS OPEN
      //STEPPOINT1-STEP12: POSITION1 RETURN VALUE DATA TYPE "STRING (FIXED)"
      //STEPPOINT1-STEP13: POSITION1 "SYMBOL" (SYMBOL)
      //                  ->NULL (NULL=SYMBOL())
      //STEPPOINT1-STEP14: POSITION2 RETURN VALUE DATA TYPE "INT (FIXED)"
      //STEPPOINT1-STEP15: POSITION2 "TIMEFRAME" (TIMEFRAME)
      //                  ->0 (0=PERIOD_CURRENT)
      //STEPPOINT1-STEP16: POSITION3 RETURN VALUE DATA TYPE "STRING (FIXED)"
      //STEPPOINT1-STEP17: POSITION3 "NAME" (PATH/NAME OF THE CUSTOM INDICATOR COMPILED PROGRAM)
      //                  ->NAME (NAME=INDICATORNAME)
      //STEPPOINT1-STEP18: POSITION4 RETURN VALUE DATA TYPE "INT (FIXED)"
      //STEPPOINT1-STEP19: POSITION4 "MODE" (LINE INDEX)
      //                  ->BUFFER ARRAYINDEX
      //STEPPOINT1-STEP20: POSITION5 RETURN VALUE DATA TYPE "INT (FIXED)"
      //STEPPOINT1-STEP21: POSITION5 "SHIFT" (SHIFT)
      //                  ->NUMBER OF BAR (CURRENT BAR = 0/...)
      //STEPPOINT1-STEP22: ROUND BRACKETS CLOSE
      //STEPPOINT1-STEP23: END ";"
      double findBuffer = iCustom(NULL,0,name,mode,1);
      //STEPPOINT1-STEP24: DECLARE CONTROL STRUCTURE (IF)
      //                  ->BUFFER TRUE DRAW
      if(findBuffer !=EMPTY_VALUE){
        //STEPPOINT1-STEP24: FUNCTION DRAWING "1"
        //                  ->FIRST FINISHED BAR
        circleBuffer[1]=findBuffer;
      }
  }

//--- return value of prev_calculated for next call
  return(rates_total);
  }
//+------------------------------------------------------------------+


Indikator-Trading 18.10.20 10:05

Sehr schön! Wenn du noch etwas mehr Mehrwert aus diesem Hilfsindikator rauskitzeln willst, dann würde ich noch folgendes Integrieren:

-Shiftdefinition als Input definieren
-den jeweiligen Wert auch als Print mit ausgeben
-bei Shift >0 den Print immer nur nach abgeschlossener Kerze ausgeben
-Die "alten" Kreise löschen, sobald eine neue Kerze entstanden ist

Gruß Timo

AVT 18.10.20 14:15

Und bitte, bitte die Kommentare nicht alle in Großbuchstaben.
Nicht nur weil es schwer zu lesen ist, sondern auch weil es teilweise einfach falsch ist - Beispiel:
Code:

Zeile 41 ff.:
 ->FUNCTION "SETINDEXBUFFER"
 ->FUNCTION "SETINDEXSTYLE"
 ->FUNCTION "SETINDEXLABLEL"
 ->FUNCTION "SETINDEXARROW"

Die Funktionen heißen korrekt SetIndexBuffer, SetIndexStyle, SetIndexLabel und SetIndexArrow. Weil es wichtig ist, wie genau etwas geschrieben wird (die meisten Programmiersprachen sind ja "case sensitive"), ist es verständlicher und richtiger, das auch in den Kommentaren gleich zu berücksichtigen.
Nur eine kleine Anmerkung, gerade wenn Anfänger sie lesen.
Danke. AVT

AVT 19.10.20 00:35

erweiterte Version
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe die Version von @noSkill06s ein wenig erweitert.

Sie funktioniert jetzt auch mit Indikatoren, die in einem Unterfenster laufen (deren Werte sind ja manchmal so weit vom eigentlichen Kurswert entfernt, daß sie nicht direkt in den Chart "gepunktet/gekringelt" werden können).

Das Einzige, was hier nicht berücksichtigt wird, sind Beschränkungen der vergangenen Werte (das was in dem zu prüfenden Indikator als "LookBackBars" oder "PastBars" oder ähnliches angegeben werden kann); ich denke, das ist auch nicht notwendig - der zu prüfende Indikator wird mit seinen Vorgabewerten aufgerufen, ist dort eine Beschränkung auf die letzten 1440 Kerzen aber der Tester auf eine sehr viel längere Zeitdauer eingestellt, dann dauert es eben eine Weile, bis Daten zur Verfügung stehen.

@Indikator-Trading
Die alten/vorigen PaintBuffer sollten für mich drin bleiben, weil ich so im Tester in die Vergangenheit zurückblicken kann, ob/wann der jeweilige Indikatorbuffer ein für meine Zwecke gutes Signal liefert (z.B. Long einzusteigen).

Auch hier alles an Kommentaren erlaubt :D
AVT


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:09 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum