Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 957

 
Igor Kryuchkov:

Ctrl+B --> bouton "All" - il y a un objet, ce qui est ce dont je parle. Leproblème est que si je crée un RECTANGLE de manière normale sans Canvas. Il crée le bon nombre d'objetsRECTANGLE.

Avec Canvas, je ne peux en créer qu'un seul. Pourquoi est-ce que c'est comme ça ? Je crée un nom unique pour chaqueRECTANGLE.


Merci pour le programmeur, bien sûr.

Pourquoi pensez-vous que votre nom est unique ? L'avez-vous vérifié avant de créer un nouvel objet ? Et vérifiez-vous le résultat de la création de l'objet? Quel est le code d'erreur pour cela ?

 
Artyom Trishkin:

Pas de code entièrement reproductible - pas de discussion concrète. Je ne sais pas ce que vous avez fait là. Vous avez fait une sorte de problème à partir de la chose la plus simple.

#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:

Qu'entendez-vous par redémarrage ?

J'ai un calcul d'ouvertures de commandes utilisant des variables globales. Par exemple, s'il est égal à 5, cela signifie que cinq ordres ont déjà été ouverts et que j'attends le sixième ordre pour monter. Si le compteur est fixé à 5, cela signifie que 5 ordres supplémentaires sont ouverts, bien qu'ils soient déjà ouverts. La même chose se produit lorsque je ferme le terminal et que je l'ouvre à nouveau. Comment le réparer ?

 
Rustam Bikbulatov:

J'ai un calcul d'ouvertures de commandes utilisant des variables globales. Par exemple, s'il est égal à 5, cela signifie que cinq ordres ont déjà été ouverts et que j'attends le sixième ordre pour monter. Si le compteur est fixé à 5, cela signifie que 5 ordres supplémentaires sont ouverts, bien qu'ils soient déjà ouverts. La même chose se produit lorsque je ferme le terminal et que je l'ouvre à nouveau. Comment le réparer ?

Dans la fonction int OnInit(), nous devons vérifier l'existence de la variable globale. Si elle existe et est supérieure à zéro, nous la mettons à zéro.

 
Igor Kryuchkov:
C'est un quatre ?
 
Artyom Trishkin:
C'est un quadruple ?

Oui. J'ai remarqué que le MQL4 quand j'ai posé la question sur Canvas

 
Artyom Trishkin:
C'est un quatre ?
Sur un quatre, ça devrait marcher aussi, je suppose.
 
Igor Kryuchkov:
Ça devrait marcher sur un quatre, aussi, je suppose.
//+------------------------------------------------------------------+
//|                                                         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:

Merci, tout fonctionne.

Lorsque vous mettez le graphique à l'échelle, le rectangle peut-il également être réduit ?


L'échelle est suivie. Mais l'indicateur ne le comprend qu'avec un nouveau tick,

Parfois, il y a un énorme retard. Que puis-je faire ?

 
Igor Kryuchkov:

Merci, tout fonctionne.

Lorsque vous mettez le graphique à l'échelle, le rectangle peut-il également être réduit ?


L'échelle est suivie. Mais l'indicateur ne le comprend qu'avec un nouveau tick,

Parfois, il y a un énorme retard. Que pouvez-vous faire ?

  1. Vous vouliez éviter le redimensionnement à l'échelle ...
  2. OnChartEvent() n'est pas dépendant des tics.
  3. Mettez à jour tous les objets créés dans OnChartEvent(), lorsque l'événement graphique nécessaire est enregistré. Sinon, la mise à jour ne se fera que lors d'un nouveau tick.
Raison: