Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 957

 
Igor Kryuchkov:

Ctrl+B --> botón "Todo" - hay un objeto, que es lo que estoy hablando. El problema es que si creo un RECTÁNGULO de la manera normal sin Canvas. Crea el número correcto de objetosRECTÁNGULO.

Con Canvas, sólo puedo crear uno. ¿Por qué es así? Hago un nombre único para cadaRECTÁNGULO.


Gracias al programador, por supuesto.

¿Por qué cree que su nombre es único? ¿Lo has comprobado antes de crear un nuevo objeto? ¿Y compruebas el resultado de la creación del objeto? ¿Cuál es el código de error para esto?

 
Artyom Trishkin:

No hay código totalmente reproducible - no hay discusión concreta. No sé qué has hecho ahí. Has hecho un problema de lo más sencillo.

#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é quiere decir con reinicios?

Tengo un cálculo de aperturas de pedidos utilizando variables globales. Por ejemplo, si es 5, significa que ya se han abierto cinco pedidos y estoy esperando que suba el sexto. Si el contador se pone a 5, significa que se abren 5 órdenes adicionales, aunque ya estén abiertas. Lo mismo ocurre cuando cierro el terminal y lo vuelvo a abrir. ¿Cómo solucionarlo?

 
Rustam Bikbulatov:

Tengo un cálculo de aperturas de pedidos utilizando variables globales. Por ejemplo, si es 5, significa que ya se han abierto cinco pedidos y estoy esperando que suba el sexto. Si el contador se pone a 5, significa que se abren 5 órdenes adicionales, aunque ya estén abiertas. Lo mismo ocurre cuando cierro el terminal y lo vuelvo a abrir. ¿Cómo solucionarlo?

En la función int OnInit(), tenemos que comprobar la existencia de una variable global. Si existe y es mayor que cero, la ponemos a cero.

 
Igor Kryuchkov:
¿Es un cuatro?
 
Artyom Trishkin:
¿Es un cuádruple?

Sí. Me di cuenta de que MQL4 cuando pregunté por Canvas

 
Artyom Trishkin:
¿Es un cuatro?
En un cuatro también debería funcionar, supongo.
 
Igor Kryuchkov:
Supongo que también debería funcionar en un cuatro.
//+------------------------------------------------------------------+
//|                                                         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:

Gracias, todo funciona.

Al escalar el gráfico, ¿se puede reducir también el rectángulo?


La balanza se rastrea. Pero el indicador sólo lo entiende con un nuevo tick,

A veces hay un gran retraso. ¿Qué puedo hacer al respecto?

 
Igor Kryuchkov:

Gracias, todo funciona.

Al escalar el gráfico, ¿se puede reducir también el rectángulo?


La balanza se rastrea. Pero el indicador sólo lo entiende con un nuevo tick,

A veces hay un gran retraso. ¿Qué puede hacer al respecto?

  1. Querías evitar el cambio de tamaño a escala...
  2. OnChartEvent() no depende de los ticks
  3. Actualiza todos los objetos creados en OnChartEvent(), cuando se registra el evento gráfico necesario. De lo contrario, sólo se actualizará en una nueva garrapata.
Razón de la queja: