Problem mit iCustom und Extreme_TMA_line_indicator - Seite 2

Einloggen oder registrieren, um einen Kommentar zu schreiben
Paul_K
40
Paul_K  
Carl Schreiber:

Na, dann fang doch mal an zu experimentieren.

InpRedraw wird doch nur einmal im Code verwendet:

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

auf

Probier es einfach...

Danke für die Hinweise, dass mit dem

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

hatte ich auch schon ausprobiert, aber ohne Erfolg.

Hab auch im Indikator-Code die ganze enum und InpRedraw Geschichte rausgeschmissen,

der Indikator funktionierte sogar noch :) da war ich richtig glücklich, weil ich erst seit einem Jahr dabei bin, aber

es hat alles nichts geholfen.  Bin hinundhergerisssen, ob es an der iCustom Parameterübergabe liegt oder

am Indi-Code... aber das ergibt keinen Sinn, weil der Indikator in Realtime einwandfrei funktioniert...

Carl Schreiber
Moderator
10154
Carl Schreiber  

Kann es daran liegen dass der Tester bezüglich der Parameter 'seinen eigenen Kopf' hat?

Druck doch mal in beiden OnInit()s aus, welchen Wert der Parameter hat.

Otto Pauser
2170
Otto Pauser  

Bei mir steht der Indikator 'Extreme_TMA_line_indicator.mq5' mehrfach herum.

Einmal im Ordner MQL5\Indicators und im Ordner MQL5\Indicators\Examples. Prüf mal nach ob der bei dir auch mehrfach herumsteht.

Da hat der EA bei mir den falschen Indi 'erwischt'.

Jetzt geht's.

Paul_K
40
Paul_K  
Otto Pauser:

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.

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

so mache ich es meistens, ohne Parameter, weil ich die Standardeinstellung bevorzuge,

aber das verrückte ist, dass es nicht funktioniert, er liefert immer die "No" Einstellung (rote Linien).

ich habe schon viele iCustoms implementiert, aber so ein Problem hatte ich noch nie...

Otto Pauser
2170
Otto Pauser  
Paul_K:

so mache ich es meistens, ohne Parameter, weil ich die Standardeinstellung bevorzuge,

aber das verrückte ist, dass es nicht funktioniert, er liefert immer die "No" Einstellung (rote Linien).

ich habe schon viele iCustoms implementiert, aber so ein Problem hatte ich noch nie...

Das ist auch mir ein Rätsel- Ich hab den Indi umgebaut. Die Colorline herausgenommen und auch die letzten 2 parameter. Bei mir läuft er.

Versuche den mal. Ich hab die (alte) statische definition auf dynamisch (flexibler) umgestellt.

//+------------------------------------------------------------------+
//|                                   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 4
#property indicator_plots   3
//--- input parameters
input uint              InpPeriodTMA      =   56;        // TMA period
input uint              InpPeriodATR      =  100;        // ATR period
input double            InpMultiplierATR  =  2.0;        // ATR multiplier
//--- indicator buffers
double         BufferTMA[];
double         BufferTop[];
double         BufferBottom[];
double         BufferATR[];
//--- global variables
double         multiplier;
double         threshold;
int            period_tma;
int            period_atr;
int            period_max;
int            handle_atr;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
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;
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferTMA,INDICATOR_DATA);
   SetIndexBuffer(1,BufferTop,INDICATOR_DATA);
   SetIndexBuffer(2,BufferBottom,INDICATOR_DATA);
   SetIndexBuffer(3,BufferATR,INDICATOR_CALCULATIONS);
   
   PlotIndexSetString(0,PLOT_LABEL,"TMA");
   PlotIndexSetString(1,PLOT_LABEL,"Top");
   PlotIndexSetString(2,PLOT_LABEL,"Low");
   PlotIndexSetString(3,PLOT_LABEL,"ATR");

   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);
   PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_LINE);
   
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);
   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,1);
   PlotIndexSetInteger(2,PLOT_LINE_WIDTH,1);

   PlotIndexSetInteger(0,PLOT_LINE_COLOR,clrGreen);
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,clrDarkGray);
   PlotIndexSetInteger(2,PLOT_LINE_COLOR,clrDarkGray);
   
//--- 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(BufferTop,true);
   ArraySetAsSeries(BufferBottom,true);
   ArraySetAsSeries(BufferATR,true);
//--- create handles
   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);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries(close,true);
//--- Проверка и расчёт количества просчитываемых баров
   if(rates_total<fmax(period_max,4)) return 0;
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-period_max-2;
      ArrayInitialize(BufferTMA,EMPTY_VALUE);
      ArrayInitialize(BufferTop,EMPTY_VALUE);
      ArrayInitialize(BufferBottom,EMPTY_VALUE);
      ArrayInitialize(BufferATR,0);
     }
//--- Подготовка данных
   int count=(limit>1 ? rates_total : 1);
   int copied=CopyBuffer(handle_atr,0,0,count,BufferATR);
   if(copied!=count) return 0;
   
//--- Расчёт индикатора
   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(i-j>0)
              {
               sum+=(period_tma-j+1)*close[i-j];
               sumw+=(period_tma-j+1);
              }
           }
         if(sumw!=0)
           {
            BufferTMA[i]=sum/sumw;
           }
        }
     }

//--- Канал и Цвет
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      double range=BufferATR[i]*multiplier;
      BufferTop[i]=BufferTMA[i]+range;
      BufferBottom[i]=BufferTMA[i]-range;
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Paul_K
40
Paul_K  
Otto Pauser:

Das ist auch mir ein Rätsel- Ich hab den Indi umgebaut. Die Colorline herausgenommen und auch die letzten 2 parameter. Bei mir läuft er.

Versuche den mal. Ich hab die (alte) statische definition auf dynamisch (flexibler) umgestellt.

Krass :) tausendfachen Dank das du dir die Mühe gemacht hast.

ich kann es kaum glauben, hast was gut bei mir.

Werde ihn heute Abend gleich mal ausprobieren... fühlt sich an wie Weihnachten, kann es kaum abwarten :)

Vielen, vielen Dank!!!

Paul_K
40
Paul_K  
Otto Pauser:

Das ist auch mir ein Rätsel- Ich hab den Indi umgebaut. Die Colorline herausgenommen und auch die letzten 2 parameter. Bei mir läuft er.

Versuche den mal. Ich hab die (alte) statische definition auf dynamisch (flexibler) umgestellt.

Ich habe deinen Indikator eingebaut und sogar MT5 neu installiert, aber das Ergebnis hat sich leider nicht verändert...

Auf dem Bild habe ich einen Ausschnitt vom Ergebnis, könntest du bitte den Tag mal bei dir durchlaufen lassen, um

zu gucken, ob es da Unterschiede gibt...

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

//+------------------------------------------------------------------+
//| 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


//+------------------------------------------------------------------+
//| global definitions                                               |
//+------------------------------------------------------------------+
double Bid;
double Ask;
double Balance = 0; // Bruttokontostand
double Equity = 0;  // Nettokontostand
input double sto = 200;
input double tpo = 200;

int      haTMA;
double   buTmaMid[],
         buTmaTop[],
         buTmaBot[];
int      toCopy=3;
double   myTmaMid_0,
         myTmaTop_0,
         myTmaBot_0;
         


//+------------------------------------------------------------------+
//| Expert initialization function                                   | ,InpPeriodTMA,InpPeriodATR,InpMultiplierATR,InpThreshold,InpRedraw
//+------------------------------------------------------------------+
int OnInit()
{
   haTMA=iCustom(_Symbol,_Period,"Examples\\Extreme_TMA_line_indicator1"); 
   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()
{

   Balance=AccountInfoDouble(ACCOUNT_BALANCE);

   Equity=AccountInfoDouble(ACCOUNT_EQUITY);

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

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

   MqlRates PreisInfo[];

   ArraySetAsSeries(PreisInfo,true);

   CopyRates(Symbol(),Period(),0,3,PreisInfo);  
   
   double Kurs_0 = PreisInfo[0].close; 
   double Kurs_1 = PreisInfo[1].close; 
   
   if(CopyBuffer(haTMA,0,0,toCopy,buTmaMid)!=toCopy) return;
   if(CopyBuffer(haTMA,1,0,toCopy,buTmaTop)!=toCopy) return;
   if(CopyBuffer(haTMA,2,0,toCopy,buTmaBot)!=toCopy) return;

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

      
    if(PositionsTotal()==0){
      
      if(Kurs_0 > myTmaTop_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)+
                   "\nmyTmaTop_0: "+DoubleToString(myTmaTop_0,_Digits)+
                   "\nmyTmaBot_0: "+DoubleToString(myTmaBot_0,_Digits)+
                   "\nmyTmaMid_0: "+DoubleToString(myTmaMid_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);
}
Dateien:
ergebnis.JPG 295 kb
Paul_K
40
Paul_K  
Carl Schreiber:

Kann es daran liegen dass der Tester bezüglich der Parameter 'seinen eigenen Kopf' hat?

Druck doch mal in beiden OnInit()s aus, welchen Wert der Parameter hat.

Carl Schreiber:

Kann es daran liegen dass der Tester bezüglich der Parameter 'seinen eigenen Kopf' hat?

Druck doch mal in beiden OnInit()s aus, welchen Wert der Parameter hat.


Das glaube ich auch langsam, das mein Tester sein eigenes Ding durchzieht...

Ich hab mir das IndikatorHandle ausgeben lassen, da kam ne 10.0000000 raus

bei den Arrays habe ich nur Fehlermeldungen erhalten, keine Ahnung wie das in der Oninit() gehen soll...

Otto Pauser
2170
Otto Pauser  
Paul_K:

Ich habe deinen Indikator eingebaut und sogar MT5 neu installiert, aber das Ergebnis hat sich leider nicht verändert...

Auf dem Bild habe ich einen Ausschnitt vom Ergebnis, könntest du bitte den Tag mal bei dir durchlaufen lassen, um

zu gucken, ob es da Unterschiede gibt...

Ich schau mir das noch heute, etwas später, an.
Paul_K
40
Paul_K  
Otto Pauser:
Ich schau mir das noch heute, etwas später, an.

danke, mach dir aber keinen Streß...

PS Ich habe vergessen die IsNewBar() einzubauen, aber das ändert am Ergebnis ja nichts

123
Einloggen oder registrieren, um einen Kommentar zu schreiben