//+------------------------------------------------------------------+ //| Sun-V2.mq5 | //| Thorsten Fischer Copyright 2019-2020 | //| https://mql5.tfsystem.de | //+------------------------------------------------------------------+ #property copyright "Thorsten Fischer Copyright 2019-2020" #property link "https://mql5.tfsystem.de" #property version "1.00" #property strict #property indicator_chart_window #property indicator_buffers 3 #property indicator_plots 2 //--- Eingabe Variablen input color i_ColorLong=clrBlue; // Farbe Long input color i_ColorShort=clrRed; // Farbe Short input int i_DrawBegin=0; // Zeichnen Anfang input string i_ArrowName="Kreis"; // Namen der Periode 0 input int i_PeriodenZahl=12; // Perioden Zahl 0 input ushort i_ArrowCode=159; // Zeichen Arrow Code 0 input int i_ArrowWidth=5; // Zeichen Arrow Width 0 input int i_ArrowShift=6; // Zeichen Arrow Shift 0 //--- Periode 0 int i_Arrow_Periode=i_PeriodenZahl; //--- Buffer double i_Arrow_Buffer_High[]; double i_Arrow_Buffer_Low[]; double i_Arrow_Buffer_Flag[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,i_Arrow_Buffer_High,INDICATOR_DATA); SetIndexBuffer(1,i_Arrow_Buffer_Low,INDICATOR_DATA); SetIndexBuffer(2,i_Arrow_Buffer_Flag,INDICATOR_DATA); ArraySetAsSeries(i_Arrow_Buffer_High,true); ArraySetAsSeries(i_Arrow_Buffer_Low,true); ArraySetAsSeries(i_Arrow_Buffer_Flag,true); //--- PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_ARROW); PlotIndexSetInteger(0,PLOT_ARROW,i_ArrowCode); PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,i_ArrowShift*-1); //PlotIndexSetInteger(0,PLOT_SHIFT,0); PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,i_DrawBegin); //PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,2); //PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,i_ColorLong); PlotIndexSetInteger(0,PLOT_LINE_COLOR,i_ColorShort); PlotIndexSetInteger(0,PLOT_LINE_WIDTH,i_ArrowWidth); PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0); PlotIndexSetString(0,PLOT_LABEL,i_ArrowName+" High"); //--- PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_ARROW); PlotIndexSetInteger(1,PLOT_ARROW,i_ArrowCode); PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,i_ArrowShift); //PlotIndexSetInteger(1,PLOT_SHIFT,0); PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,i_DrawBegin); //PlotIndexSetInteger(1,PLOT_COLOR_INDEXES,3); PlotIndexSetInteger(1,PLOT_LINE_COLOR,i_ColorLong); //PlotIndexSetInteger(1,PLOT_LINE_COLOR,1,i_ColorShort); PlotIndexSetInteger(1,PLOT_LINE_WIDTH,i_ArrowWidth); PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0.0); PlotIndexSetString(1,PLOT_LABEL,i_ArrowName+" Low"); //--- PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0.0); PlotIndexSetString(2,PLOT_LABEL,"Flag Periode"); //--- IndicatorSetString(INDICATOR_SHORTNAME,"TF Sun"); IndicatorSetInteger(INDICATOR_DIGITS,_Digits); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| 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[]) { //--- Variablen int suche=rates_total-prev_calculated; ArraySetAsSeries(open,true); ArraySetAsSeries(high,true); ArraySetAsSeries(low,true); ArraySetAsSeries(close,true); //--- Testeinstellungen i_Arrow_Periode=2; //--- if(rates_total-prev_calculated==1) { suche=1; } //--- if(prev_calculated==0) { suche--; //Print("Anfang = "+(string)suche); //Print(__FUNCTION__+" / rates_total = "+(string)rates_total+" / prev_calculated = "+(string)prev_calculated+" / high = "+(string)high[suche]+" / low = "+(string)low[suche]+" / close = "+(string)close[suche]); } //--- for(suche; suche>=0 && !IsStopped(); suche--) { //--- if(i_Arrow_Periode<1)return(false); //--- Variablen //int rates_total=ArraySize(i_Arrow_Buffer_High); int f_position_ihighest=0; int f_position_ilowest=0; int f_position_high=0; int f_position_low=0; //--- Vorhergehende Kontrolle if(rates_total-suche>1) { if(i_Arrow_Buffer_Flag[suche+1]<-2) { f_position_high=Periode_Punkt_Suchen(i_Arrow_Buffer_Flag,-1,suche+1); f_position_low=Periode_Punkt_Suchen(i_Arrow_Buffer_Flag,-2,suche+1); //Print("Beide Signale gleichzeitig high = "+(string)f_position_high+" / low = "+(string)f_position_low); if(f_position_highi_Arrow_Buffer_High[suche]) { //Print("High und Low gleich if V1 aktuelle Kerze"); f_position_ihighest=0; } if(i_Arrow_Buffer_Low[f_position_low]f_position_low) { //Print("Sonderfall high 2"); i_Arrow_Buffer_High[suche]=i_Arrow_Buffer_High[suche]; i_Arrow_Buffer_Flag[suche]-=1; } } //--- if(suche==f_position_ilowest)// && i_Arrow_Buffer_Low[f_position_low]>i_Arrow_Buffer_Low[suche]) { //Print("Sonderfall low vor"); //if(!(f_position_low-suche>=i_Arrow_Periode) && !(i_Arrow_Buffer_Low[suche]>i_Arrow_Buffer_Low[f_position_low])) if(i_Arrow_Buffer_Low[f_position_low]>=i_Arrow_Buffer_Low[suche]) { //Print("Sonderfall low 1"); if(f_position_low=0) { i_Arrow_Buffer_Flag[suche]=suche; } } //ChartRedraw(); //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int Periode_Punkt_Suchen(const double &f_array[],const int f_suche=0,const int f_position=0) { //--- int rates_total=ArraySize(f_array); int i=f_position; //--- for(i; i