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);
}
//+------------------------------------------------------------------+