Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Lücken bei CrossOver (http://www.expert-advisor.com/forum/showthread.php?t=6819)

noSkill06s 29.10.20 23:20

Lücken bei CrossOver
 
Liste der Anhänge anzeigen (Anzahl: 1)
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);
 }
//+------------------------------------------------------------------+


Indikator-Trading 30.10.20 06:46

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

AVT 30.10.20 09:15

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 31.10.20 02:39

Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von Indikator-Trading (Beitrag 44642)
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 :/

noSkill06s 31.10.20 02:42

Liste der Anhänge anzeigen (Anzahl: 2)
Zitat:

Zitat von AVT (Beitrag 44643)
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 :/

AVT 31.10.20 09:28

Zitat:

Zitat von noSkill06s (Beitrag 44648)
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


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:17 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum