Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 957

 
Igor Kryuchkov:

Ctrl+B --> кнопка "Все"   - там один обьект о чем я и говорю. Проблема в том, что если я создаю  RECTANGLE обычным способом без Canvas. Создается нужное количество RECTANGLE  обьектов.

Через Canvas почему то создается только один. Почему такое может быть? Имя для каждого RECTANGLE  делаю уникальное. 


За программиста конечно спасибо. 

Почему вы считаете, что имя у вас уникальное? Вы его проверяли перед созданием нового объекта? А проверяете результат создания объекта? Какой код ошибки при этом?

 
Artyom Trishkin:

Нет полностью воспроизводимого кода - нет и конкретного обсуждения. Я не знаю чего вы там наворотили. Из простейшего сделали какую-то проблему.

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

Что значит перезагрузки?

У меня идет исчисление открытии ордеров с помощью глобальных переменных. Например если стоит 5 то значит уже открылись пять ордеров и ждет шестой ордер чтобы повыситься. Если компилируешь то счетчик стоит на 5 то открывает 5 лишних ордеров хоть и уже открыты они. Так же происходит если отключаешь терминал и включаешь. Как это исправить? .

 
Rustam Bikbulatov:

У меня идет исчисление открытии ордеров с помощью глобальных переменных. Например если стоит 5 то значит уже открылись пять ордеров и ждет шестой ордер чтобы повыситься. Если компилируешь то счетчик стоит на 5 то открывает 5 лишних ордеров хоть и уже открыты они. Так же происходит если отключаешь терминал и включаешь. Как это исправить? .

В функции int OnInit() нужно сделать проверку на существование глобальной переменной, если она существует и например больше нуля то делаем ее ноль. 

 
Igor Kryuchkov:
Это четвёрка?
 
Artyom Trishkin:
Это четвёрка?

Да. Я подметил что MQL4 когда спрашивал про Canvas

 
Artyom Trishkin:
Это четвёрка?
На четверке тоже должно работать, я преполагаю.
 
Igor Kryuchkov:
На четверке тоже должно работать, я преполагаю.
//+------------------------------------------------------------------+
//|                                                         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:

Спасибо, все работает. 

При масштабировании графика можно прямоугольник тоже меньше делать? 


Масштаб отслеживается. А вот индикатор это понимает только с новым тиком,

бывает огромное запоздание. Что можно с этим сделать?

 
Igor Kryuchkov:

Спасибо, все работает. 

При масштабировании графика можно прямоугольник тоже меньше делать? 


Масштаб отслеживается. А вот индикатор это понимает только с новым тиком,

бывает огромное запоздание. Что можно с этим сделать?

  1. Вы же хотели уйти от изменения размеров при масштабировании ...
  2. OnChartEvent() не зависит от тиков
  3. Обновлять все созданные объекты в OnChartEvent() при регистрации нужного события чарта. В противном случае - только на новом тике будут обновляться.
Причина обращения: