|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
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); } //+------------------------------------------------------------------+ |
|
|||
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" Nur eine kleine Anmerkung, gerade wenn Anfänger sie lesen. Danke. AVT |
|
|||
erweiterte Version
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 AVT |
Lesezeichen |
|
|