Einzelnen Beitrag anzeigen
  #1 (permalink)  
Alt 18.10.20
noSkill06s noSkill06s ist offline
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 36
noSkill06s befindet sich auf einem aufstrebenden Ast
Standard Kleiner Indi um CustomIndicator Buffer auszulesen

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);
  }
//+------------------------------------------------------------------+
Angehängte Dateien
Dateityp: zip checkCustomIndicatorBuffer.mq4.zip (2,4 KB, 9x aufgerufen)