Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1306

 

Bitte helfen Sie, fügte ich einen weiteren Puffer an den Indikator (double ma_buffer_stop[];), aber es zeichnet nicht oder geben Fehler(

//+------------------------------------------------------------------+
//|                                                   MTF_Moving.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                             https://www.mql5.com/ru/users/melnik |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/melnik"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 2
#property indicator_color1 Red
#property indicator_color2 Blue
#property indicator_color3 Black
#property indicator_type1 DRAW_LINE
#property indicator_type2 DRAW_LINE
#property indicator_type3 DRAW_LINE

double ma_buffer_slow[];
double ma_buffer_fast[];
double ma_buffer_stop[];

//--- input parameters
input int                     PeriodMaSlow=21;  //Period slow Ma
input int                     PeriodMaFast=13;  //Pertiod fast Ma
input ENUM_APPLIED_PRICE      PriceMa=0;        //Applied price
input ENUM_MA_METHOD          MethodMa=0;       //Method Ma
input ENUM_TIMEFRAMES         Timeframe=60;     //Timeframe for calculate

ENUM_TIMEFRAMES prd;

int index=-1;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, ma_buffer_slow, INDICATOR_DATA);
   SetIndexBuffer(1, ma_buffer_fast, INDICATOR_DATA);
   SetIndexBuffer(2, ma_buffer_stop, INDICATOR_DATA);
//---
   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[])
  {
//---
   if((rates_total-prev_calculated-PeriodMaSlow)<=0)return(0);
  
   if(Period()>Timeframe) prd=PERIOD_CURRENT;
   if(Period()<=Timeframe) prd=prd=Timeframe;
  
   for(int i=rates_total-prev_calculated-PeriodMaSlow-1;i>=0;i--)
   {
      if(TimeMinute(time[i])==0)index=iBarShift(Symbol(), prd, time[i], false);
      
      ma_buffer_fast[i]=iMA(Symbol(), prd, PeriodMaFast, 0, MethodMa, PriceMa, index);
      ma_buffer_slow[i]=iMA(Symbol(), prd, PeriodMaSlow, 0, MethodMa, PriceMa, index);
      if(ma_buffer_fast[i+1]>=ma_buffer_slow[i+1]&&ma_buffer_fast[i]<ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]+50*Point;}
      if(ma_buffer_fast[i+1]<=ma_buffer_slow[i+1]&&ma_buffer_fast[i]>ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]-50*Point;}
   }
  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Check, sind wir hier überhaupt reingekommen?

if(ma_buffer_fast[i+1]>=ma_buffer_slow[i+1]&&ma_buffer_fast[i]<ma_buffer_slow[i]) printf(ma_buffer_slow[i]);
Das ist nur das erste, was mir einfällt.
 

Manchmal erwische ich die Division bei Null. (In der Dynamik kann alles passieren).

Ich suche danach, indem ich die Teilungsoperationen kommentiere und den EA auf das Diagramm werfe.

Gibt es eine Möglichkeit, die Zeichenfolge mit dem Fehler mit normaleren Methoden zu erhalten?

Das Problem ist, dass der Fehler nur in einem bestimmten Zustand auftritt. D.h., der Fehler kann in einem bestimmten Zeitrahmen und mit einer neuen Kerze verschwinden. Es ist gut, wenn Sie es um 4 Uhr bemerken. Es ist Zeit, sie zu finden.

 
Valeriy Yastremskiy:

Gibt es eine Möglichkeit, die Zeile mit dem Fehler mit konventionelleren Methoden zu erhalten?

Sie sollten einen Eintrag im Expertenprotokoll mit der Datei- und Zeilennummer haben, in der die Division durch Null stattfand

 
Igor Makanu:

Sie sollten in Ihrem Expert Advisor-Protokoll einen Eintrag mit der Datei- und Zeilennummer haben, in der die Division durch Null stattfand

2020.11.27 11:55:29.795 qstr7_52_1 EURUSD,H4: Nullteilung in 'qstr7_52_1.mq4' (962,43)

Nur dies.

962,43 jedoch.

Bitte sehr))) Danke!!!!!


 
Aleksei Stepanenko:

Steigen wir hier überhaupt ein?

Nur so aus dem Stegreif.

Gehen Sie zu

Wenn ich dies tue, zeichnet es

   double prev01,prev02;

   if((rates_total-prev_calculated-PeriodMaSlow)<=0)return(0);
  
   if(Period()>Timeframe) prd=PERIOD_CURRENT;
   if(Period()<=Timeframe) prd=prd=Timeframe;
  
   for(int i=rates_total-prev_calculated-PeriodMaSlow-1;i>=0;i--)
   {
      if(TimeMinute(time[i])==0)index=iBarShift(Symbol(), prd, time[i], false);
      
      ma_buffer_fast[i]=iMA(Symbol(), prd, PeriodMaFast, 0, MethodMa, PriceMa, index);
      ma_buffer_slow[i]=iMA(Symbol(), prd, PeriodMaSlow, 0, MethodMa, PriceMa, index);
      prev01=iMA(Symbol(), prd, PeriodMaFast, 0, MethodMa, PriceMa, index+1);
      prev02=iMA(Symbol(), prd, PeriodMaSlow, 0, MethodMa, PriceMa, index+1);
      if(prev01>=prev02&&ma_buffer_fast[i]<ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]+50*Point;}
      if(prev01<=prev02&&ma_buffer_fast[i]>ma_buffer_slow[i])
      {ma_buffer_stop[i]=ma_buffer_slow[i]-50*Point;}
   }
  
 

Dieses Array hat nur an den Schnittpunkten die richtigen Werte, ansonsten ist sein Wert EMPTY_VALUE. Daher ist nichts sichtbar. Sie müssen eine globale Variable eingeben und ihr zum Zeitpunkt des Schnittpunkts Werte zuweisen. Und sie gibt bereits den aktuellen Wert zum Zeitpunkt des Schnittpunkts an, oder den vergangenen Wert, wenn es keinen Schnittpunkt gibt.

double Stop=0;
int OnCalculate(....

if(ma_buffer_fast[i+1]>=ma_buffer_slow[i+1]&&ma_buffer_fast[i]<ma_buffer_slow[i]) Stop=ma_buffer_slow[i]+50*Point;
if(ma_buffer_fast[i+1]<=ma_buffer_slow[i+1]&&ma_buffer_fast[i]>ma_buffer_slow[i]) Stop=ma_buffer_slow[i]-50*Point;

ma_buffer_stop[i]=Stop;
 
Aleksei Stepanenko:

Dieses Array hat nur an den Schnittpunkten die richtigen Werte, ansonsten ist sein Wert EMPTY_VALUE. Daher ist nichts sichtbar. Sie müssen eine globale Variable eingeben und ihr zum Zeitpunkt des Schnittpunkts Werte zuweisen. Und sie gibt bereits den aktuellen Wert zum Zeitpunkt des Schnittpunkts an, oder den vergangenen Wert, wenn es keinen Schnittpunkt gibt.

Danke, es hat funktioniert)

 
Ist es möglich, den Zeitrahmenwechsel zwangsweise abzubrechen, wenn die Indikatorfunktion noch läuft?
 
Aleksei Stepanenko:

Dieses Array hat nur an den Schnittpunkten die richtigen Werte, ansonsten ist sein Wert EMPTY_VALUE. Daher ist nichts sichtbar. Sie müssen eine globale Variable eingeben und ihr zum Zeitpunkt des Schnittpunkts Werte zuweisen. Und sie gibt bereits den aktuellen Wert zum Zeitpunkt des Schnittpunkts an, oder den vergangenen Wert, wenn es keinen Schnittpunkt gibt.

Ich habe PeriodMaSlow mit 2 multipliziert

   if((rates_total-prev_calculated-PeriodMaSlow)<=0)return(0);
  
   if(Period()>Timeframe) prd=PERIOD_CURRENT;
   if(Period()<=Timeframe) prd=prd=Timeframe;
  
   for(int i=rates_total-prev_calculated-PeriodMaSlow-1;i>=0;i--)

und der ursprüngliche Code funktioniert ohne Fehler

Grund der Beschwerde: