Problem mit iCustom und Extreme_TMA_line_indicator

 

Hallo zusammen,

obwohl ich schon andere Indikatoren wie z.B. Keltner Channel   mit den iCustom problemlos in meine EAs implementieren konnte, will es mir

mit dem  Extreme_TMA_line_indicator“ einfach nicht so recht gelingen.

Der EA läuft zwar mit dem Indikator, aber die standardmäßige Einstellung „Redraw=Yes“

oder im Indikator-Code „input ENUM_INPUT_YES_NO    InpRedraw  =  INPUT_YES;“ wird nicht genommen, sondern

immer nur die Einstellung „Redraw=No“.

Der visuelle Strategie-Tester benutzt auch die „No“ Einstellung. Der Strategie-Test ohne visuelle Option gibt am Ende des Tests aber einen Chart mit der „Yes“ Einstellung aus.

Über die Parameter der iCustom Funktion klappte es auch nicht, aber ich bin noch nicht so lange dabei und weiß wie nicht genau man „enum“   Variablen übergibt…

Ich würde mich über eure Hilfe sehr freuen, da ich einfach nicht mehr weiterweiß.

#include<Trade\Trade.mqh>
CTrade  trade;

int TmaHandle=0;
double UpTma[];
double LowTma[];
double BuffTMA[];
double BuffAtr[];

MqlRates PreisInfo[];
double Bid;
double Ask;
double Balance = 0; 
double Equity = 0;  
input double sto = 250;
input double tpo = 250;

int OnInit()
  {
   
   TmaHandle=iCustom(Symbol(),Period(),"Examples\\Extreme_TMA_line_indicator",56,100,2,0.5,1); // Funktioniert auch ohne Parameter nicht richtig
   
    if(TmaHandle==INVALID_HANDLE)
      {
         Print("*ERROR* Invalid TMA handle");
         return(INIT_FAILED);
      }
  
    ArraySetAsSeries(PreisInfo,true);
    ArraySetAsSeries(UpTma,true);
    ArraySetAsSeries(LowTma,true);
    ArraySetAsSeries(BuffTMA,true);
    ArraySetAsSeries(BuffAtr,true);
   
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
 
  }

void OnTick(){

   Balance=AccountInfoDouble(ACCOUNT_BALANCE);

   Equity=AccountInfoDouble(ACCOUNT_EQUITY);

   Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);

   Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   CopyRates(Symbol(),Period(),0,4,PreisInfo); 
   
   double Kurs_0 = PreisInfo[0].close; 
   double Kurs_1 = PreisInfo[1].close; 
      
   CopyBuffer(TmaHandle,2,0,3,UpTma);  
   CopyBuffer(TmaHandle,3,0,3,LowTma); 
   CopyBuffer(TmaHandle,4,0,3,BuffAtr);   
   CopyBuffer(TmaHandle,0,0,3,BuffTMA);  //  =>   0=Middle 2=Up 3=Low

   double myBuffAtr_0     =  BuffAtr[0];
   double myUpTma_0       =  UpTma[0];
   double myLowTma_0      =  LowTma[0];
   double myBuffMidTma_0  =  BuffTMA[0];
     
      
   // If the bar time isn't equal to the saved time, it indicates that we have a new tick
   static datetime Old_Time;
   datetime New_Time[1];
   bool IsNewBar=false;

   // copying the last bar time to the element New_Time[0]
   int copied=CopyTime(_Symbol,_Period,0,1,New_Time);

   if(copied>0) // ok, the data has been copied successfully
     {
      if(Old_Time!=New_Time[0]) // if old time isn't equal to new bar time
        {
         IsNewBar=true;   // if it isn't a first call, the new bar has appeared

         if(MQL5InfoInteger(MQL5_DEBUGGING))
            Print("We have new bar here ",New_Time[0]," old time was ",Old_Time);
            Old_Time=New_Time[0];    // saving bar time
        }
     }
   else
     {
      Alert("Error in copying historical times data, error =",GetLastError());
      ResetLastError();
      return;
     }

   //--- EA should only check for new trade if we have a new bar
   if(IsNewBar==false)
     {
      return;
     }  
   
   
   if(PositionsTotal()==0){
    
    if( Kurs_0 > myUpTma_0){  
      
             trade.Sell(0.1,NULL,Bid,(Bid+sto*_Point),(Bid-tpo*_Point),NULL);   
             Print("TMA/Diff: " ,DoubleToString(KuTaDif_0,5));
             Print("kurs_0: " ,DoubleToString(Bid));
             Print("upTMA[0]: " ,DoubleToString(myUpTmaATR_0,5));
             Print("BufferTMA/Mid: " ,DoubleToString(myBuffMidTma_0,5));
             Print("LowTMA: " ,DoubleToString(myLowTma_0,5));
             Print("BuffATR: " ,DoubleToString(myBuffAtr_0,5));
                       
    }  
   }else{
      return;
   }
   
}

und der Code vom Extreme_TMA_line_indicator


//+------------------------------------------------------------------+
//|                                   Extreme_TMA_line_indicator.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                                 https://mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com"
#property version   "1.00"
#property description "Extreme TMA Line indicator"
#property indicator_chart_window
#property indicator_buffers 5
#property indicator_plots   3
//--- plot TMA
#property indicator_label1  "TMA"
#property indicator_type1   DRAW_COLOR_LINE
#property indicator_color1  clrGreen,clrRed,clrDarkGray
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Top
#property indicator_label2  "Top"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrYellow
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2
//--- plot Bottom
#property indicator_label3  "Bottom"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrYellow
#property indicator_style3  STYLE_SOLID
#property indicator_width3  2


//--- enums
enum ENUM_INPUT_YES_NO
  {
   INPUT_YES   =  1, // Yes
   INPUT_NO    =  0  // No
  };
  
//--- input parameters
input uint                InpPeriodTMA      =  56;         // TMA period
input uint                InpPeriodATR      =  100;        // ATR period
input double              InpMultiplierATR  =  2.0;        // ATR multiplier
input double              InpThreshold      =  0.5;        // Trend threshold
input ENUM_INPUT_YES_NO   InpRedraw         =  INPUT_YES;  // Redraw

  
//--- indicator buffers            
double         BufferTMA[];
double         BufferColors[];
double         BufferTop[];
double         BufferBottom[];
double         BufferATR[];

//--- global variables
double         multiplier;
double         threshold;
int            period_tma;
int            period_atr;
int            period_max;
int            handle_atr;


int OnInit()
  {
//--- set global variables
   period_tma=int(InpPeriodTMA<1 ? 1 : InpPeriodTMA);
   period_atr=int(InpPeriodATR<1 ? 1 : InpPeriodATR);
   period_max=fmax(period_atr,period_tma);
   multiplier=InpMultiplierATR;
   threshold=InpThreshold;
   
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferTMA,INDICATOR_DATA);
   SetIndexBuffer(1,BufferColors,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,BufferTop,INDICATOR_DATA);
   SetIndexBuffer(3,BufferBottom,INDICATOR_DATA);
   SetIndexBuffer(4,BufferATR,INDICATOR_CALCULATIONS);
   
//--- setting indicator parameters
   IndicatorSetString(INDICATOR_SHORTNAME,"Extreme TMA Line ("+(string)period_tma+","+(string)period_atr+","+DoubleToString(multiplier,1)+","+DoubleToString(threshold,2)+")");
   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
   
//--- setting buffer arrays as timeseries
   ArraySetAsSeries(BufferTMA,true);
   ArraySetAsSeries(BufferColors,true);
   ArraySetAsSeries(BufferTop,true);
   ArraySetAsSeries(BufferBottom,true);
   ArraySetAsSeries(BufferATR,true);
   
//--- create handles
   ResetLastError();
   handle_atr=iATR(NULL,PERIOD_CURRENT,period_atr);
   if(handle_atr==INVALID_HANDLE)
     {
      Print("The iATR(",(string)period_atr,") object was not created: Error ",GetLastError());
      return INIT_FAILED;
     }
   return(INIT_SUCCEEDED);
  }
  

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[])
  {
  
//--- Festlegen von Pufferarrays als Zeitreihen
   ArraySetAsSeries(close,true);
   
// Überprüfen und Berechnen der Anzahl der berechneten Balken
   if(rates_total<fmax(period_max,4)) return 0;
   
//--- Überprüfen und Berechnen der Anzahl der berechneten Balken
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-period_max-2;
      ArrayInitialize(BufferTMA,EMPTY_VALUE);   
      ArrayInitialize(BufferColors,2);
      ArrayInitialize(BufferTop,EMPTY_VALUE);  
      ArrayInitialize(BufferBottom,EMPTY_VALUE);   
      ArrayInitialize(BufferATR,0); 
     }
     
//--- Datenaufbereitung
   int count=(limit>1 ? rates_total : 1);
   int copied=CopyBuffer(handle_atr,0,0,count,BufferATR);
   if(copied!=count) return 0;
   
//--- Indikatorberechnung
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      int tcount=period_tma;
      bool period_last=(i==0 ? true : false);

      while(tcount>0)
        {
         tcount=(!period_last ? 0 : tcount-1);
         double sum=0;
         double sumw=(period_tma+2)*(period_tma+1)/2;
         for(int j=0; j<=period_tma; j++)
           {
            sum+=(period_tma-j+1)*close[i+j];  
            if(InpRedraw){
             
               if(i-j>0){
                 
                  sum+=(period_tma-j+1)*close[i-j];
                  sumw+=(period_tma-j+1);
                 }
              }
           }
         if(sumw!=0)
           {
            BufferTMA[i]=sum/sumw;
           
           }
        }
     }

//--- Kanal und Farbe
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      double slope=(BufferTMA[i] - BufferTMA[i+1]) / (0.1 * BufferATR[i]);
      double range= (BufferATR[i] * multiplier);
      BufferTop[i]= (BufferTMA[i] + range);
      BufferBottom[i]= (BufferTMA[i] - range);
      
      if(slope>threshold)
         BufferColors[i]=BufferColors[i+1]=0;
      else if(slope<-threshold)   //-
         BufferColors[i]=BufferColors[i+1]=1;
      else
         BufferColors[i]=BufferColors[i+1]=2;
     }

//--- return value of prev_calculated for next call
   return( rates_total);
  }
//+------------------------------------------------------------------+

/*
 
                 
*/
 
Paul_K:

Hallo zusammen,

obwohl ich schon andere Indikatoren wie z.B. Keltner Channel   mit den iCustom problemlos in meine EAs implementieren konnte, will es mir

mit dem  Extreme_TMA_line_indicator“ einfach nicht so recht gelingen.

Der EA läuft zwar mit dem Indikator, aber die standardmäßige Einstellung „Redraw=Yes“

oder im Indikator-Code „input ENUM_INPUT_YES_NO    InpRedraw  =  INPUT_YES;“ wird nicht genommen, sondern

immer nur die Einstellung „Redraw=No“.

Der visuelle Strategie-Tester benutzt auch die „No“ Einstellung. Der Strategie-Test ohne visuelle Option gibt am Ende des Tests aber einen Chart mit der „Yes“ Einstellung aus.

Über die Parameter der iCustom Funktion klappte es auch nicht, aber ich bin noch nicht so lange dabei und weiß wie nicht genau man „enum“   Variablen übergibt…

Ich würde mich über eure Hilfe sehr freuen, da ich einfach nicht mehr weiterweiß.

und der Code vom Extreme_TMA_line_indicator


Schau dir im Datenfenster (Ctrl+D) die Buffer an. Dieser Indikator hat nur 3 auslesbare! Wie du selbst bemerkst:

0=Middle 2=Up 3=Low

Du kannst nur das auslesen:

   CopyBuffer(TmaHandle,0,0,3,BuffTMA);
   CopyBuffer(TmaHandle,1,0,3,UpTma);  
   CopyBuffer(TmaHandle,2,0,3,LowTma); 

PS: Irgendwo hab ich mal einen Indikator gefunden der das mit regression viel glatter zustande bringt. Evtl. findet den jemand.

 
Otto Pauser:

Schau dir im Datenfenster (Ctrl+D) die Buffer an. Dieser Indikator hat nur 3 auslesbare! Wie du selbst bemerkst:

Du kannst nur das auslesen:

PS: Irgendwo hab ich mal einen Indikator gefunden der das mit regression viel glatter zustande bringt. Evtl. findet den jemand.

Danke für die Antwort.

Ich habe mit den Buffern vieles ausprobiert, aber ohne Erfolg.

Hab auch schon die myBuffAtr_0 (Buffer 4)  auf den myUpTma draufaddiert,

was der „Redraw=Yes“ Einstellung sehr nahe kommt, aber nicht 100%ig übereinstimmt...

 

Ich verstehe nicht ganz, was Du und wo Du es willst!

Im Tester eine Darstellung, im Online-Chart ein Neuzeichnen, woran soll das erkennbar sein?

 

Hallo,


ich hab den indi erst vor kurzen für eine. Freund in einem ea platziert


im ea definierst du dir diese enum

enum ENUM_INPUT_YES_NO
  {
   INPUT_YES   =  1, // Yes
   INPUT_NO    =  0  // No
  };
und dann in die oninit



   TMAh = iCustom(_Symbol,TMATimeframe,"tma_centered_bands_V5",HalfLength,AtrPeriod,AtrMultiplier,InpThreshold,use_Repaint);
   ArraySetAsSeries(TMAu,true);
   ArraySetAsSeries(TMAd,true);

Und für alle anderen, ich war zu faul um die korrektheit des handle abzufragen 😂


edit, die eingabeparameter

input ENUM_DELEMITTER s4;
input string TMA_Settings="----TMA Setting---";
input ENUM_TIMEFRAMES TMATimeframe = PERIOD_CURRENT;
input int       HalfLength     = 34;       // Centered TMA half period
input int       AtrPeriod      = 100;      // Average true range period
input double    AtrMultiplier  =3.5;        // Average true range multiplier
input double            InpThreshold      =  0.5;        // Trend threshold
input ENUM_INPUT_YES_NO    use_Repaint=INPUT_YES;


Btw, in meinen Augen ist der indi unbrauchbar, sieht gut aus, ist aber auch im no repaint stark repaintend

 
amando:

Hallo,


ich hab den indi erst vor kurzen für eine. Freund in einem ea platziert


im ea definierst du dir diese enum

Und für alle anderen, ich war zu faul um die korrektheit des handle abzufragen 😂


edit, die eingabeparameter


Btw, in meinen Augen ist der indi unbrauchbar, sieht gut aus, ist aber auch im no repaint stark repaintend

Hallo,

danke, wußte gar nicht das man es auch so machen kann.

Hab das hoffentlich alles richtig angepasst..., aber leider wieder ohne Erfolg...

#include<Trade\Trade.mqh>
CTrade  trade;

enum ENUM_INPUT_YES_NO
  {
   INPUT_YES   =  1, // Yes
   INPUT_NO    =  0  // No
  };

int TmaHandle=0;
double UpTma[];
double LowTma[];
double MidTma[];

MqlRates PreisInfo[];
double Bid;
double Ask;
double Balance = 0;
double Equity = 0;  
input double sto = 250;
input double tpo = 250;

input uint      InpPeriodTMA      = 56;       // Centered TMA half period  
input uint      InpPeriodATR      = 100;      // Average true range period  
input double    InpMultiplierATR  = 2;        // Average true range multiplier  
input double    InpThreshold     =  0.5;        // Trend threshold
input ENUM_INPUT_YES_NO   InpRedraw = INPUT_YES;  

int OnInit()
  {
   
   TmaHandle=iCustom(Symbol(),Period(),"Examples\\Extreme_TMA_line_indicator",InpPeriodTMA,InpPeriodATR,InpMultiplierATR,InpThreshold,InpRedraw); 
   
    if(TmaHandle==INVALID_HANDLE)
      {
         Print("*ERROR* Invalid TMA handle");
         return(INIT_FAILED);
      }
  //Sortieren die Preisinformationen nach Kerzenaktualität
    ArraySetAsSeries(PreisInfo,true);
    ArraySetAsSeries(UpTma,true);
    ArraySetAsSeries(LowTma,true);
    ArraySetAsSeries(MidTma,true);
   
   return(INIT_SUCCEEDED);
  }


void OnDeinit(const int reason)
  {
   
  }


void OnTick(){

   Balance=AccountInfoDouble(ACCOUNT_BALANCE);

   Equity=AccountInfoDouble(ACCOUNT_EQUITY);

   Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);

   Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   CopyRates(Symbol(),Period(),0,4,PreisInfo); 
   
   double Kurs_0 = PreisInfo[0].close; 
   double Kurs_1 = PreisInfo[1].close; 
     
      
   // Kopiere Daten ins Band-Array für 3 Kerzen
   CopyBuffer(TmaHandle,2,0,3,UpTma);  
   CopyBuffer(TmaHandle,3,0,3,LowTma);    
   CopyBuffer(TmaHandle,0,0,3,MidTma);  //  =>  0=Middle 2=Up 3=Low

   // Berechne den Bandwert für die Kerze 0
   double myUpTma_0       =  UpTma[0];
   double myLowTma_0      =  LowTma[0];
   double myMidTma_0  =  MidTma[0];
      
          
   // If the bar time isn't equal to the saved time, it indicates that we have a new tick
   static datetime Old_Time;
   datetime New_Time[1];
   bool IsNewBar=false;

   // copying the last bar time to the element New_Time[0]
   int copied=CopyTime(_Symbol,_Period,0,1,New_Time);

   if(copied>0) // ok, the data has been copied successfully
     {
      if(Old_Time!=New_Time[0]) // if old time isn't equal to new bar time
        {
         IsNewBar=true;   // if it isn't a first call, the new bar has appeared

         if(MQL5InfoInteger(MQL5_DEBUGGING))
            Print("We have new bar here ",New_Time[0]," old time was ",Old_Time);
            Old_Time=New_Time[0];    // saving bar time
        }
     }
   else {
      Alert("Error in copying historical times data, error =",GetLastError());
      ResetLastError();
      return;
     }

   //--- EA should only check for new trade if we have a new bar
   if(IsNewBar==false){
      return;
     }  
    
   
   if(PositionsTotal()==0){
    
    if( Kurs_0 > myUpTma_0){  
      
       //    trade.Buy(0.1,NULL,Ask,(Ask-sto*_Point),(Ask+tpo*_Point),NULL);
             trade.Sell(0.1,NULL,Bid,(Bid+sto*_Point),(Bid-tpo*_Point),NULL);             
             Print("kurs_0: " ,DoubleToString(Bid));
             Print("upTMA[0]: " ,DoubleToString(myUpTma_0,5));
             Print("MidTma: " ,DoubleToString(myMidTma_0,5));
             Print("LowTMA: " ,DoubleToString(myLowTma_0,5));                   
                }  
   }else{
      return;
   }
   
} // Ende OnTick()

 
Carl Schreiber:

Ich verstehe nicht ganz, was Du und wo Du es willst!

Im Tester eine Darstellung, im Online-Chart ein Neuzeichnen, woran soll das erkennbar sein?

Mit den verschiedenen Strategie-Tester Einstellungen wollte ich nur veranschaulichen,

das der Indikator unterschiedlich dargestelllt wird, obwohl es der gleiche Indikator ist.

Die Ergebnisse aus den Buffern sind immer = "InpRedraw  =  INPUT_NO" Einstellung, die blauen Linien im Chart.

Die magenta Linien = "InpRedraw  =  INPUT_YES" Einstellung, die der EA eigentlich handeln soll.

Im live Modus funktioniert der Indikator ganz normal, man kann zwischen den Optionen problemlos switchen.


Dateien:
EURUSDM30.png  64 kb
 

Na, dann fang doch mal an zu experimentieren.

InpRedraw wird doch nur einmal im Code verwendet:

if(InpRedraw)

Also, da der Debugger mit historischen Daten (Strg+F5) über den Tester läuft setzt da mal einen Debugger halt und kontrolliere den Wert und den Weg!

Du kannst aber auch die Variable ändern:

von

input ENUM_INPUT_YES_NO   InpRedraw         =  INPUT_YES;  // Redraw

auf

input bool InpRedraw         =  true;  // true=Redraw false:no

Probier es einfach...

 

Ich kann dich nicht länger leiden sehen, hatte auch mal so ein besch...eidenes Bufferproblem und war über Hilfe dankbar.

So funktionierts:

//+------------------------------------------------------------------+
//|                                                 ExtremumTest.mq5 |
//|                               Copyright © 2019, Ing. Otto Pauser |
//|                       https://www.mql5.com/de/users/kronenchakra |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Ing. Otto Pauser"
#property link      "https://www.mql5.com/de/users/kronenchakra"
#property version   "1.00"

//+------------------------------------------------------------------+
//| definitions                                                      |
//+------------------------------------------------------------------+
enum ENUM_INPUT_YES_NO     // kleine Änderung: ENUMs beginnen, sofern nicht anders angegeben, IMMER bei 0
{
   INPUT_NO,  // No
   INPUT_YES  // Yes
};

//+------------------------------------------------------------------+
//| input parameters                                                 |
//+------------------------------------------------------------------+
input uint              InpPeriodTMA      =  56;         // TMA period
input uint              InpPeriodATR      =  100;        // ATR period
input double            InpMultiplierATR  =  2.0;        // ATR multiplier
input double            InpThreshold      =  0.5;        // Trend threshold
input ENUM_INPUT_YES_NO InpRedraw         =  INPUT_YES;  // Redraw

//+------------------------------------------------------------------+
//| global definitions                                               |
//+------------------------------------------------------------------+
int      haTMA;
double   buTmaMid[],
         buTmaTop[],
         buTmaBot[];
int      toCopy=3;
double   myTmaMid_0,
         myTmaTop_0,
         myTmaBot_0;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   haTMA=iCustom(_Symbol,_Period,"Examples\\Extreme_TMA_line_indicator",InpPeriodTMA,InpPeriodATR,InpMultiplierATR,InpThreshold,InpRedraw); 
   if(haTMA==INVALID_HANDLE)
      {
         Alert("*ERROR* Invalid TMA handle");
         return(INIT_FAILED);
      }

   ArraySetAsSeries(buTmaMid,true);
   ArraySetAsSeries(buTmaTop,true);
   ArraySetAsSeries(buTmaBot,true);

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Comment("");
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   if(CopyBuffer(haTMA,0,0,toCopy,buTmaMid)!=toCopy) return;
   if(CopyBuffer(haTMA,2,0,toCopy,buTmaTop)!=toCopy) return;
   if(CopyBuffer(haTMA,3,0,toCopy,buTmaBot)!=toCopy) return;

   myTmaMid_0 =  buTmaMid[0];
   myTmaTop_0 =  buTmaTop[0];
   myTmaBot_0 =  buTmaBot[0];

   Comment(
            "\nmyTmaMid_0: "+DoubleToString(myTmaMid_0,_Digits)+
            "\nmyTmaTop_0: "+DoubleToString(myTmaTop_0,_Digits)+
            "\nmyTmaBot_0: "+DoubleToString(myTmaBot_0,_Digits)
          );
}

//+------------------------------------------------------------------+
//| Utilities                                                        |
//+------------------------------------------------------------------+

bool IsNewBar(void)                                            // returns true if new candle was born
{
   static datetime oldTime=WRONG_VALUE;
   datetime barTime=iTime(_Symbol,_Period,0);
   if(oldTime==WRONG_VALUE)
      oldTime=barTime;
   if(barTime==oldTime)
      return(false);
   else
      oldTime=barTime;
   return(true);
}

Der Grund warum du verzweifelt bist ist der ColorBuffer, der sich bei der Bufferindizierung dazwischen schiebt.

Deshalb musst du Buffer 0,2,3 auslesen. 1 ist der Colorbuffer. Auch den könntest du lesen, da steht der Farbindex drin.

Die Funktion IsNewBar() gibt's als Draufgabe.

Tips: lass den Styler deinen Code bearbeiten. ich hab den Styler auf GNU eingestellt.
        OnDeinit() kannst du einfach weglassen, sofern du sie nicht brauchst.
        Funktionen wie IsNewBar() lagere in zB: myUtilities.mqh aus und verwende sie mit #include <myUtilities.mqh>

LG Otto

 
Otto Pauser:

Ich kann dich nicht länger leiden sehen, hatte auch mal so ein besch...eidenes Bufferproblem und war über Hilfe dankbar.

So funktionierts:

Der Grund warum du verzweifelt bist ist der ColorBuffer, der sich bei der Bufferindizierung dazwischen schiebt.

Deshalb musst du Buffer 0,2,3 auslesen. 1 ist der Colorbuffer. Auch den könntest du lesen, da steht der Farbindex drin.

Die Funktion IsNewBar() gibt's als Draufgabe.

Tips: lass den Styler deinen Code bearbeiten. ich hab den Styler auf GNU eingestellt.
        OnDeinit() kannst du einfach weglassen, sofern du sie nicht brauchst.
        Funktionen wie IsNewBar() lagere in zB: myUtilities.mqh aus und verwende sie mit #include <myUtilities.mqh>

LG Otto

Danke für die Tips und die IsNewBar() Funktion, die werde ich mir mal genauer ansehen...

Ich habe deinen Code ausprobiert, aber das Problem ist noch da.

Mit den Buffernummern habe ich normalerweise keine Probleme, nur bei diesem Indikator, der Spuck immer nur die

InpRedraw         =  INPUT_NO

Ergebnisse aus, im Bild ist es das rote Linienpaar.

Der EA soll aber das hellblaue Linienpaar handeln, was laut Indikator-Code auch die Standard Einstellung ist.

LG

Paul

Dateien:
EURUSDM30.png  86 kb
 
Paul_K:

Der EA soll aber das hellblaue Linienpaar handeln, was laut Indikator-Code auch die Standard Einstellung ist.

Jetzt habe ich das Problem begriffen. Der letzte Inputparameter wird einfach nicht an den Indi weitergegeben.

Lass den letzten Parameter (inpRedraw) einfach weg, dann sollte der Indi die Standardeinstellung nehmen.

Im Prinzip könntest du alle weglassen, kannst aber dann nix mehr optiomieren.

ChartIndicatorAdd(0,0,haTMA);

Wenn du das in die OnInit() einfügst siehst du den Indi im Chart. (nicht nur im Tester).