Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 957

 
Igor Kryuchkov:

Ctrl+B --> botão "Todos" - há um objeto, que é do que estou falando. O problema é que se eu criar um RECTÂNGULO da maneira normal sem Tela. Ele cria o número certo de objetosRECTANGLE.

Com a Tela, só posso criar uma. Por que é assim? Eu faço um nome único para cadaRECTÂNGULO.


Obrigado pelo programador, é claro.

Por que você acha que seu nome é único? Você já verificou antes de criar um novo objeto? E você verifica o resultado da criação do objeto? Qual é o código de erro para isso?

 
Artyom Trishkin:

Nenhum código totalmente reprodutível - nenhuma discussão concreta. Eu não sei o que você fez lá. Você criou algum tipo de problema a partir da coisa mais simples.

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

O que você quer dizer com reinício?

Eu tenho um cálculo de aberturas de pedidos usando variáveis globais. Por exemplo, se for 5, significa que cinco pedidos já foram abertos e eu estou esperando que o sexto pedido suba. Se o contador estiver definido em 5, significa que 5 ordens extras são abertas, embora já estejam abertas. O mesmo acontece quando eu fecho o terminal e o abro novamente. Como consertá-lo?

 
Rustam Bikbulatov:

Eu tenho um cálculo de aberturas de pedidos usando variáveis globais. Por exemplo, se for 5, significa que cinco pedidos já foram abertos e eu estou esperando que o sexto pedido suba. Se o contador estiver definido em 5, significa que 5 ordens extras são abertas, embora já estejam abertas. O mesmo acontece quando eu fecho o terminal e o abro novamente. Como consertá-lo?

Na função int OnInit(), temos que verificar a existência de uma variável global. Se ela existir e for maior que zero, nós a fixamos em zero.

 
Igor Kryuchkov:
Isso é um quatro?
 
Artyom Trishkin:
É um quádruplo?

Sim. Eu notei que a MQL4 quando perguntei sobre Tela

 
Artyom Trishkin:
Isto é um quatro?
Em um quatro também deveria funcionar, suponho eu.
 
Igor Kryuchkov:
Suponho que também deveria funcionar em um quatro, suponho.
//+------------------------------------------------------------------+
//|                                                         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:

Obrigado, tudo isso funciona.

Ao redimensionar o gráfico, o retângulo também pode ser reduzido?


A escala é rastreada. Mas o indicador só o entende com um novo tique,

Às vezes, há um grande atraso. O que posso fazer a respeito?

 
Igor Kryuchkov:

Obrigado, tudo isso funciona.

Ao escalar o gráfico, o retângulo também pode ser reduzido?


A escala é rastreada. Mas o indicador só o entende com um novo tique,

Às vezes, há um grande atraso. O que você pode fazer a respeito disso?

  1. Você queria evitar o redimensionamento em escalas ...
  2. OnChartEvent() não é dependente de tick-dependent
  3. Atualizar todos os objetos criados no OnChartEvent(), quando o evento gráfico necessário for registrado. Caso contrário, somente com um novo tick será atualizado.
Razão: