Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4554
Beiträge: 41280
Benutzer: 6.945
Aktive Benutzer: 217
Links: 82
Wir begrüßen unseren neuesten Benutzer: majid_z
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- majid_z
vor einem Tag
- Jeatcomput...
vor 2 Tagen
- Herrfroehl...
vor 2 Tagen
- dberkovi
vor 4 Tagen
- ForexFighe...

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 105
Gesamt: 106
Team: 0
Team:  
Benutzer:  Domke01
Freunde anzeigen

Empfehlungen

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt vor 3 Tagen
Neues Mitglied
 
Registriert seit: Aug 2020
Beiträge: 11
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, 2x aufgerufen)
Mit Zitat antworten
  #2 (permalink)  
Alt vor 3 Tagen
Benutzerbild von Indikator-Trading
Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 127
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #3 (permalink)  
Alt vor 2 Tagen
AVT AVT ist offline
Premium Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 441
AVT befindet sich auf einem aufstrebenden Ast
Standard

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
Mit Zitat antworten
  #4 (permalink)  
Alt vor 2 Tagen
AVT AVT ist offline
Premium Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 441
AVT befindet sich auf einem aufstrebenden Ast
Standard 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
Angehängte Dateien
Dateityp: mq4 Example-CheckIndicatorBuffer.mq4 (10,6 KB, 0x aufgerufen)
Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 12:25 Uhr.





Die Suchmaschine - Der Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2020 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2020 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------