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: 4580
Beiträge: 41416
Benutzer: 6.972
Aktive Benutzer: 209
Links: 82
Wir begrüßen unseren neuesten Benutzer: M0rtis
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 16 Stunden
- M0rtis
vor einem Tag
- Alexander2...
vor 3 Tagen
- Geldman041...
vor 3 Tagen
- jomaka
vor einer Woche
- wurzel269

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 88
Gesamt: 89
Team: 0
Team:  
Benutzer:  noSkill06s
Freunde anzeigen

Empfehlungen

Like Tree3Likes
  • 1 Post By Indikator-Trading
  • 1 Post By AVT
  • 1 Post By AVT
Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt vor 4 Wochen
Neues Mitglied
 
Registriert seit: Aug 2020
Beiträge: 17
noSkill06s befindet sich auf einem aufstrebenden Ast
Standard Lücken bei CrossOver

Hallo Leute,

ich stehe irgendwie total auf dem Schlauch, habe einen Übungsindikator geproggt, um mehr Erfahrung zu sammeln aber ja komm gerade nicht weiter bzw. kann den Wald vor lauter bäumen nicht mehr sehen xdddd

folgendes:

upperShortMovingAverage = MovingAverage 9
upperLongMovingAverage = MovingVerage 14

9>14 = Bollinger Band UpperLine = Green
9<14 = Bollinger Band UpperLie = Red

lowerShortMovingAverage = MovingAverage 9
lowerLongMovingAverage = MovingVerage 14

9>14 = Bollinger Band lowerLine = Green
9<14 = Bollinger Band lowerLine = Red

Problem genau an der Stelle wo die Überkreuzung stattfindet entstehen lücken in der Bollinger Bands anzeige egal ob upperLine oder lowerLine

ich poste mal den Code bin echt offen für alles, aber denke das Problem muss mit dem Counting Bars zu tun haben bin irgendwie total überfragt gerade :/

Hinweis:
was mir auch sehr komisch vorkommt wenn ich i+1 oder i+10 mache bekomme ich auch keine ArrayOutOfRange Fehlermeldung?????

Code:
//+------------------------------------------------------------------+
//|                                                    presvm_v1.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
#property indicator_chart_window
//setting Buffers
#property indicator_buffers 8
//preCompiling color (Buffer1 = ArrayIndex0)
#property indicator_color1 clrGreen //modeUpperBBandGreen
#property indicator_color2 clrRed //modeLowerBBandRed
#property indicator_color3 clrRed //modeUpperBBandRed
#property indicator_color4 clrGreen //modeLowerBBandGreen
#property indicator_color5 clrGreen //modeMiddleBBandGreen
#property indicator_color6 clrRed //modeMiddleBBandRed
#property indicator_color7 clrGreen//upArrow
#property indicator_color8 clrRed//downArrow
//preCompiling width
#property indicator_width1 2 //modeUpperBBandGreen
#property indicator_width2 2 //modeLowerBBandRed
#property indicator_width3 2 //modeUpperBBandRed
#property indicator_width4 2 //modeLowerBBandGreen
#property indicator_width5 2 //modeMiddleBBandGreen
#property indicator_width6 2 //modeMiddleBBandRed
#property indicator_width7 3 //upArrow
#property indicator_width8 3 //downArrow

//externalSettings upArrowDownArrow
extern string visualization;//>>>>>>Visualization Settings<<<<<<
extern bool arrowsVisualization = true;
extern bool bandsVisualization = true;
//externalSettings upperBBand
extern string upperDescriptionBBand;//>>>>>>upper Bollinger Bands Settings<<<<<<
extern int upperBBandPeriod = 20;
extern int upperBBandOffset = 0;
extern int upperBBandDeviation = 2;
extern ENUM_APPLIED_PRICE upperBBandPrice = PRICE_OPEN;
//externalSettings lowerBBand
extern string lowerDescriptionBBand;//>>>>>>lower Bollinger Bands Settings<<<<<<
extern int lowerBBandPeriod = 20;
extern int lowerBBandOffset = 0;
extern int lowerBBandDeviation = 2;
extern ENUM_APPLIED_PRICE lowerBBandPrice = PRICE_OPEN;
//externalSettings upperShortMovingAverage
extern string upperShortMovingAverageDescription; //>>>>>>upper Short Moving Average Settings<<<<<<
extern int upperShortMovingAveragePeriod = 9;
extern int upperShortMovingAverageOffset = 0;
extern ENUM_MA_METHOD upperShortMovingAverageMode = MODE_SMA;
extern ENUM_APPLIED_PRICE upperShortMovingAveragePrice = PRICE_OPEN;
//externalSettings upperLongMovingAverage
extern string upperLongMovingAverageDescription; //>>>>>>upper Long Moving Average Settings<<<<<<
extern int upperLongMovingAveragePeriod = 14;
extern int upperLongMovingAverageOffset = 0;
extern ENUM_MA_METHOD upperLongMovingAverageMode = MODE_SMA;
extern ENUM_APPLIED_PRICE upperLongMovingAveragePrice = PRICE_OPEN;
//externalSettings lowerShortMovingAverage
extern string lowerShortMovingAverageDescription; //>>>>>>lower Short Moving Average Settings<<<<<<
extern int lowerShortMovingAveragePeriod = 9;
extern int lowerShortMovingAverageOffset = 0;
extern ENUM_MA_METHOD lowerShortMovingAverageMode = MODE_SMA;
extern ENUM_APPLIED_PRICE lowerShortMovingAveragePrice = PRICE_OPEN;
//externalSettings lowerLongMovingAverage
extern string lowerLongMovingAverageDescription; //>>>>>>lower Long Moving Average Settings<<<<<<
extern int lowerLongMovingAveragePeriod = 14;
extern int lowerLongMovingAverageOffset = 0;
extern ENUM_MA_METHOD lowerLongMovingAverageMode = MODE_SMA;
extern ENUM_APPLIED_PRICE lowerLongMovingAveragePrice = PRICE_OPEN;

//arrayDeclaration (Dynamic)
double modeUpperBBandGreen[];
double modeLowerBBandRed[];
double modeUpperBBandRed[];
double modeLowerBBandGreen[];
double modeMiddleBBandGreen[];
double modeMiddleBBandRed[];
double upArrow[];
double downArrow[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   //modeUpperBBandGreen
   SetIndexBuffer(0,modeUpperBBandGreen);
   SetIndexStyle(0,DRAW_LINE);
   //modeLowerBBandGreen
   SetIndexBuffer(1,modeLowerBBandRed);
   SetIndexStyle(1,DRAW_LINE);
   //modeUpperBBandGreen
   SetIndexBuffer(2,modeUpperBBandRed);
   SetIndexStyle(2,DRAW_LINE);
   //modeLowerBBandGreen
   SetIndexBuffer(3,modeLowerBBandGreen);
   SetIndexStyle(3,DRAW_LINE);
   //modeMiddleBBandGreen
   SetIndexBuffer(4,modeMiddleBBandGreen);
   SetIndexStyle(4,DRAW_LINE);
   //modeMiddleBBandRed
   SetIndexBuffer(5,modeMiddleBBandRed);
   SetIndexStyle(5,DRAW_LINE);   
   //upArrow
   SetIndexBuffer(6,upArrow);
   SetIndexStyle(6,DRAW_ARROW);
   SetIndexArrow(6,233);
   SetIndexLabel(6,"Buy Signal");
   //downArrow
   SetIndexBuffer(7,downArrow);
   SetIndexStyle(7,DRAW_ARROW);
   SetIndexArrow(7,234);
   SetIndexLabel(7,"Sell Signal");  
//---
   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[])
  {
//---
   //Counting Bars
   int counted_bars, limit;
   counted_bars=IndicatorCounted();
   limit=Bars-counted_bars;
   
   for(int i=0;i<limit;i++){
   
   //Bollinger Band declaration
   double modeUpperBBand=iBands(NULL,0,upperBBandPeriod,upperBBandDeviation,upperBBandOffset,upperBBandPrice,MODE_UPPER,i);
   double modeLowerBBand=iBands(NULL,0,lowerBBandPeriod,lowerBBandDeviation,lowerBBandOffset,lowerBBandPrice,MODE_LOWER,i);
   double modeMiddleBBand=iBands(NULL,0,lowerBBandPeriod,lowerBBandDeviation,lowerBBandOffset,lowerBBandPrice,MODE_MAIN,i);
   
   //Moving Average declaration
   double upperShortMovingAverage=iMA(NULL,0,upperShortMovingAveragePeriod,upperShortMovingAverageOffset,upperShortMovingAverageMode,upperShortMovingAveragePrice,i);
   double upperLongMovingAverage=iMA(NULL,0,upperLongMovingAveragePeriod,upperLongMovingAverageOffset,upperLongMovingAverageMode,upperLongMovingAveragePrice,i); 
   double lowerShortMovingAverage=iMA(NULL,0,lowerShortMovingAveragePeriod,lowerShortMovingAverageOffset,lowerShortMovingAverageMode,lowerShortMovingAveragePrice,i);
   double lowerLongMovingAverage=iMA(NULL,0,lowerLongMovingAveragePeriod,lowerLongMovingAverageOffset,lowerLongMovingAverageMode,lowerLongMovingAveragePrice,i);
   double movingAverage200=iMA(NULL,0,200,0,MODE_SMA,PRICE_OPEN,i);

   //visualization of Bollinger Band and Moving Average (conditional)
   if(bandsVisualization==true){
      //modeUpperBBandGreen
      if(upperShortMovingAverage>upperLongMovingAverage){
         modeUpperBBandGreen[i]=modeUpperBBand;
         modeUpperBBandRed[i]=EMPTY_VALUE;
         //modeLowerBBandGreen
         if(lowerShortMovingAverage>lowerLongMovingAverage){
            modeLowerBBandGreen[i]=modeLowerBBand;
            modeLowerBBandRed[i]=EMPTY_VALUE;
          //modeLowerBBandRed  
         }else if(lowerShortMovingAverage<lowerLongMovingAverage){
            modeLowerBBandRed[i]=modeLowerBBand;
            modeLowerBBandGreen[i]=EMPTY_VALUE;
         }
       //modeUpperBBandRed 
      }else if(upperShortMovingAverage<upperLongMovingAverage){
         modeUpperBBandRed[i]=modeUpperBBand;
         modeUpperBBandGreen[i]=EMPTY_VALUE;
         //modeLowerBBandGreen
         if(lowerShortMovingAverage>lowerLongMovingAverage){
            modeLowerBBandGreen[i]=modeLowerBBand;
            modeLowerBBandRed[i]=EMPTY_VALUE;
          //modeLowerBBandRed
         }else if(lowerShortMovingAverage<lowerLongMovingAverage){
            modeLowerBBandRed[i]=modeLowerBBand;
            modeLowerBBandGreen[i]=EMPTY_VALUE;
         }
        }
      }

   //visualization of upArrow and downArrow with Alert (conditional)
   if(arrowsVisualization==true){
      if(upperShortMovingAverage>upperLongMovingAverage && lowerShortMovingAverage>lowerLongMovingAverage 
         && Close[i]<Open[i]
         && Close[i]<modeLowerBBand
         ){
         upArrow[i]=Close[i];
      }else if(upperShortMovingAverage<upperLongMovingAverage && lowerShortMovingAverage<lowerLongMovingAverage 
               && Close[i]>Open[i]
               && Close[i]>modeUpperBBand
              ){
         downArrow[i]=Close[i];
         }      
      }
      
    //visualization of modeMiddleBBandGreen and modeMiddleBBandRed
    if(movingAverage200<Close[i]){
      modeMiddleBBandGreen[i]=modeMiddleBBand;
      modeMiddleBBandRed[i]=EMPTY_VALUE;
    }else{
      modeMiddleBBandRed[i]=modeMiddleBBand;
      modeMiddleBBandGreen[i]=EMPTY_VALUE;
    }
    
    
   }
//--- return value of prev_calculated for next call
   return(rates_total);
 }
//+------------------------------------------------------------------+
Angehängte Grafiken
Dateityp: png Bildschirmfoto 2020-10-29 um 23.17.28.png (30,6 KB, 6x aufgerufen)
Mit Zitat antworten
  #2 (permalink)  
Alt vor 4 Wochen
Benutzerbild von Indikator-Trading
Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 133
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

Eine Linie braucht zwei Punkte, damit sie gezeichnet werden kann. Beim Wechsel vom roten zum grünen Band kannst du z.b. das Band, welches als nächstes auf Empty_Value gesetzt werden würde auf den Wert des ersten grünen setzten. Vice versa für den Wechsel von grün zu blau. Alternativ auch eine dritte Farbe, welche dann immer nur die Wechselpunkte zum zeichnen bekommt. Gruß Timo
noSkill06s likes this.
Mit Zitat antworten
  #3 (permalink)  
Alt vor 4 Wochen
AVT AVT ist offline
Premium Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 453
AVT befindet sich auf einem aufstrebenden Ast
Standard

Indikator-Trading hat bereits gesagt, woran es liegt.
Ich verfahre bei so etwas grundsätzlich so:

1. Bänder/Linien werden zuerst in neutraler Farbe gezeichnet
2. bei Bedingung erfüllt
a. wird ein grüner Buffer (9>14)
b. wird ein roter Buffer (9<14)
mit dem neutralen Wert über die neutrale Farbe gezeichnet

Reihenfolge der Buffer in OnInit
1. neutral: wird immer gezeichnet
2. grün: wird nur bei Bedingung a gezeichnet
3. rot: wird nur bei Bedingung b gezeichnet

Nachteil: man braucht 2 zusätzliche Buffer im MT4
Vorteil: man kann z.B. eine Option zum Ein-/Ausschalten des Farbwechsels einsetzen. Der neutrale Wert ist immer vorhanden (man erhält keine Lücken und sieht zugleich, wann keiner der Bedingungen erfüllt ist; praktisch zum Auslesen, wenn man nur den Wert braucht). Man kann auch nur die neutrale Version nutzen.

AVT
noSkill06s likes this.
Mit Zitat antworten
  #4 (permalink)  
Alt vor 3 Wochen
Neues Mitglied
 
Registriert seit: Aug 2020
Beiträge: 17
noSkill06s befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Indikator-Trading Beitrag anzeigen
Eine Linie braucht zwei Punkte, damit sie gezeichnet werden kann. Beim Wechsel vom roten zum grünen Band kannst du z.b. das Band, welches als nächstes auf Empty_Value gesetzt werden würde auf den Wert des ersten grünen setzten. Vice versa für den Wechsel von grün zu blau. Alternativ auch eine dritte Farbe, welche dann immer nur die Wechselpunkte zum zeichnen bekommt. Gruß Timo
danke für die Hilfe, aber dennoch habe ich es nicht hinbekommen ich habe eine kleine Hilfe genommen was aber mist ist, ich schalte die Farbe immer zuerst auf Grün und lass dann die Bedingungen prüfen bei einem Crossover kommt dann aber der Farbwechsel um 1 Bar zu spät :/
Angehängte Grafiken
Dateityp: png Bildschirmfoto 2020-10-31 um 02.38.21.png (29,9 KB, 5x aufgerufen)
Angehängte Dateien
Dateityp: mq4 iCustom_Testing_Area_no_neutral_zone.mq4 (9,4 KB, 0x aufgerufen)
Mit Zitat antworten
  #5 (permalink)  
Alt vor 3 Wochen
Neues Mitglied
 
Registriert seit: Aug 2020
Beiträge: 17
noSkill06s befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AVT Beitrag anzeigen
Indikator-Trading hat bereits gesagt, woran es liegt.
Ich verfahre bei so etwas grundsätzlich so:

1. Bänder/Linien werden zuerst in neutraler Farbe gezeichnet
2. bei Bedingung erfüllt
a. wird ein grüner Buffer (9>14)
b. wird ein roter Buffer (9<14)
mit dem neutralen Wert über die neutrale Farbe gezeichnet

Reihenfolge der Buffer in OnInit
1. neutral: wird immer gezeichnet
2. grün: wird nur bei Bedingung a gezeichnet
3. rot: wird nur bei Bedingung b gezeichnet

Nachteil: man braucht 2 zusätzliche Buffer im MT4
Vorteil: man kann z.B. eine Option zum Ein-/Ausschalten des Farbwechsels einsetzen. Der neutrale Wert ist immer vorhanden (man erhält keine Lücken und sieht zugleich, wann keiner der Bedingungen erfüllt ist; praktisch zum Auslesen, wenn man nur den Wert braucht). Man kann auch nur die neutrale Version nutzen.

AVT
danke für die Hilfe so funktioniert alles obwohl ich oben und unten keine neutral Zonen wollte aber so funktioniert es richtig, den Lösungsvorschlag von Timo konnte ich nicht umsetzen :/
Angehängte Grafiken
Dateityp: png Bildschirmfoto 2020-10-31 um 02.41.27.png (32,9 KB, 4x aufgerufen)
Angehängte Dateien
Dateityp: mq4 iCustom_Testing_Area_upperLowerMiddle_neutral.mq4 (10,2 KB, 2x aufgerufen)
Mit Zitat antworten
  #6 (permalink)  
Alt vor 3 Wochen
AVT AVT ist offline
Premium Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 453
AVT befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von noSkill06s Beitrag anzeigen
danke für die Hilfe so funktioniert alles obwohl ich oben und unten keine neutral Zonen wollte aber so funktioniert es richtig, den Lösungsvorschlag von Timo konnte ich nicht umsetzen :/
Wenn ich Dich richtig verstehe, willst Du also das hier?
1. Band oben und Band unten nur grün/rot Wechsel
2. Band mitte grün/gelb/rot Wechsel

Dann formuliere die Bedingungen für 1. anders:
9>=14 noch grün und 9<14 rot -- oder 9>14 grün und 9<=14 schon rot
Das deckt alle Fälle ab. Du mußt nur entscheiden, ob der = Fall noch als grün gilt oder schon rot erscheint.
So auf die Schnelle ohne Prüfung im MT. AVT
noSkill06s likes this.
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 +1. Es ist jetzt 02:23 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.
-----------------------------------------------------------------------------------------------------------------------------