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

 
Igor Kryuchkov:

Strg+B --> Schaltfläche "Alle" - es gibt ein Objekt, das ich meine. Das Problem ist, dass wenn ich ein RECHTECK auf die normale Weise ohne Canvas. Es wird die richtige Anzahl von RECTANGLE-Objekten erstellt.

Mit Canvas kann ich nur eine erstellen. Warum ist das so? Ich gebe jedemRECHTECK einen eigenen Namen.


Vielen Dank für den Programmierer, natürlich.

Warum denken Sie, dass Ihr Name einzigartig ist? Haben Sie dies überprüft, bevor Sie ein neues Objekt erstellen? Und überprüfen Sie das Ergebnis der Objekterstellung? Wie lautet der Fehlercode für diesen Fall?

 
Artyom Trishkin:

Kein vollständig reproduzierbarer Code - keine konkrete Diskussion. Ich weiß nicht, was Sie da gemacht haben. Sie haben aus der einfachsten Sache eine Art Problem gemacht.

#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#include <Canvas\Canvas.mqh>
CCanvas C;

int History = 5000;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
        
//---
   return(INIT_SUCCEEDED);
  }
  
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[])
  {
//---




   

           int BarsCounted = IndicatorCounted();
           if (BarsCounted < 0) return (-1);
           if (BarsCounted > 0) BarsCounted--;
           int BarsTotal = Bars - BarsCounted;
           if( BarsTotal > History ) BarsTotal = History;
   

           for (int i = BarsTotal-1; i >=1 ; i--)
           { 
           
         
         
               double rsi = iRSI(NULL, 0, 14, PRICE_CLOSE, i);
               
         
               
               if(rsi > 70 ) {
         
                  C.CreateBitmap(0, 0, i, Time[i+5], Close[i+1], 50, 70,COLOR_FORMAT_ARGB_NORMALIZE);
                  C.Rectangle(10, 40, 70, 80, ColorToARGB(clrRed,200));
                  C.Update(true); 
                  
                  Print(i);
                  
               } 
           
               
           
         
           
           }
  

  
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
Igor Kryuchkov:

Was meinen Sie mit Neustart?

Ich habe eine Berechnung von Auftragseröffnungen mit globalen Variablen. Steht sie beispielsweise auf 5, bedeutet dies, dass bereits fünf Aufträge eröffnet wurden und ich darauf warte, dass der sechste Auftrag erteilt wird. Wenn der Zähler auf 5 gesetzt wird, bedeutet dies, dass 5 zusätzliche Aufträge geöffnet werden, obwohl sie bereits geöffnet sind. Das Gleiche passiert, wenn ich das Terminal schließe und wieder öffne. Wie kann man das beheben?

 
Rustam Bikbulatov:

Ich habe eine Berechnung von Auftragseröffnungen mit globalen Variablen. Steht sie beispielsweise auf 5, bedeutet dies, dass bereits fünf Aufträge eröffnet wurden und ich darauf warte, dass der sechste Auftrag erteilt wird. Wenn der Zähler auf 5 gesetzt wird, bedeutet dies, dass 5 zusätzliche Aufträge geöffnet werden, obwohl sie bereits geöffnet sind. Das Gleiche passiert, wenn ich das Terminal schließe und wieder öffne. Wie kann man das beheben?

In der Funktion int OnInit() müssen wir das Vorhandensein einer globalen Variablen prüfen. Wenn sie existiert und größer als Null ist, setzen wir sie auf Null.

 
Igor Kryuchkov:
Ist das eine Vier?
 
Artyom Trishkin:
Ist es ein Vierfaches?

Ja. Ich habe bemerkt, dass MQL4, als ich nach Canvas fragte

 
Artyom Trishkin:
Ist das eine Vier?
Auf einem Vierer sollte es auch funktionieren, nehme ich an.
 
Igor Kryuchkov:
Ich nehme an, das sollte auch bei einem Vierer funktionieren.
//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|              Copyright 2019, Artem A. Trishkin, Skype artmedia70 |
//|                         https://www.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Artem A. Trishkin, Skype artmedia70"
#property link      "https://www.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property indicator_chart_window
#include <Arrays\ArrayObj.mqh>
#include <Canvas\Canvas.mqh>
class CCanvObj : public CObject
  {
public:
   CCanvas           m_canvas;
  };
int History = 5000;
string prefix=MQLInfoString(MQL_PROGRAM_NAME)+"_";
CArrayObj list_canvas;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom deindicator initialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- indicator buffers mapping
   ObjectsDeleteAll(0,prefix);
//---
   return;
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
     }
//--- Цикл расчёта индикатора
   for(int i=fmin(limit,History); i>=0; i--)
     {
      double rsi=iRSI(NULL,PERIOD_CURRENT,14,PRICE_CLOSE,i);
      if(rsi>70)
        {
         //--- Создаём новый объект CCanvas
         CCanvObj *obj=new CCanvObj();
         if(obj==NULL)
            continue;
         if(!list_canvas.Add(obj))
            continue;
         string name=prefix+(string)i;
         //--- Создаём ресурс Bitmap с именем name
         if(obj.m_canvas.CreateBitmap(0,0,name,time[i+5],close[i+1],50,70,COLOR_FORMAT_ARGB_NORMALIZE))
           {
            obj.m_canvas.Rectangle(0,0,49,69,ColorToARGB(clrRed,200));
            obj.m_canvas.Update(true); 
           }
        }
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Artyom Trishkin:

Danke, es funktioniert alles.

Kann beim Skalieren des Diagramms auch das Rechteck verkleinert werden?


Die Skala wird nachgeführt. Aber der Indikator versteht das nur bei einem neuen Tick,

Manchmal gibt es eine große Verzögerung. Was kann ich dagegen tun?

 
Igor Kryuchkov:

Danke, es funktioniert alles.

Kann beim Skalieren des Diagramms auch das Rechteck verkleinert werden?


Die Skala wird nachgeführt. Aber der Indikator versteht das nur bei einem neuen Tick,

Manchmal gibt es eine große Verzögerung. Was können Sie dagegen tun?

  1. Sie wollten eine Größenänderung bei der Skalierung vermeiden ...
  2. OnChartEvent() ist nicht tick-abhängig
  3. Aktualisieren Sie alle in OnChartEvent() erstellten Objekte, wenn das erforderliche Diagrammereignis registriert wird. Andernfalls werden die Daten nur bei einem neuen Häkchen aktualisiert.