Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 957

 
Igor Kryuchkov:

Ctrl+B --> pulsante "Tutto" - c'è un oggetto, che è quello di cui sto parlando. Ilproblema è che se creo un RETTANGOLO in modo normale senza Canvas. Crea il giusto numero di oggettiRECTANGLE.

Con Canvas, posso crearne solo uno. Perché è così? Faccio un nome unico per ogniRETTANGOLO.


Grazie al programmatore, naturalmente.

Perché pensi che il tuo nome sia unico? Avete controllato prima di creare un nuovo oggetto? E controllate il risultato della creazione dell'oggetto? Qual è il codice di errore per questo?

 
Artyom Trishkin:

Nessun codice completamente riproducibile - nessuna discussione concreta. Non so cosa hai fatto lì. Hai creato una specie di problema dalla cosa più semplice.

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

Cosa intende per riavvio?

Ho un calcolo delle aperture degli ordini utilizzando variabili globali. Per esempio, se è 5, significa che sono già stati aperti cinque ordini e sto aspettando che il sesto salga. Se il contatore è impostato a 5, significa che vengono aperti 5 ordini extra, anche se sono già aperti. Lo stesso accade quando chiudo il terminale e lo riapro. Come risolvere il problema?

 
Rustam Bikbulatov:

Ho un calcolo delle aperture degli ordini utilizzando variabili globali. Per esempio, se è 5, significa che sono già stati aperti cinque ordini e sto aspettando che il sesto salga. Se il contatore è impostato a 5, significa che vengono aperti 5 ordini extra, anche se sono già aperti. Lo stesso accade quando chiudo il terminale e lo riapro. Come risolvere il problema?

Nella funzione int OnInit(), dobbiamo controllare l'esistenza della variabile globale. Se esiste ed è maggiore di zero, la impostiamo a zero.

 
Igor Kryuchkov:
È un quattro?
 
Artyom Trishkin:
È un quadruplo?

Sì. Ho notato che MQL4 quando ho chiesto di Canvas

 
Artyom Trishkin:
È un quattro?
Anche su un quattro dovrebbe funzionare, suppongo.
 
Igor Kryuchkov:
Dovrebbe funzionare anche su un quattro, suppongo.
//+------------------------------------------------------------------+
//|                                                         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:

Grazie, funziona tutto.

Quando si ridimensiona il grafico si può rimpicciolire anche il rettangolo?


La scala è tracciata. Ma l'indicatore lo capisce solo con un nuovo tick,

A volte c'è un enorme ritardo. Cosa posso fare?

 
Igor Kryuchkov:

Grazie, funziona tutto.

Quando si ridimensiona il grafico si può rimpicciolire anche il rettangolo?


La scala è tracciata. Ma l'indicatore lo capisce solo con un nuovo tick,

A volte c'è un enorme ritardo. Cosa si può fare?

  1. Volevi evitare il ridimensionamento a scalare ...
  2. OnChartEvent() non dipende dai tick
  3. Aggiorna tutti gli oggetti creati in OnChartEvent(), quando l'evento grafico necessario viene registrato. Altrimenti, solo su un nuovo tick sarà aggiornato.