新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 957

 
Igor Kryuchkov:

Ctrl+B-->"全部 "按钮--有一个对象,这就是我所说的。问题是,如果我以 正常方式创建 一个没有Canvas的RECTANGLE。它创建了正确数量的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,这意味着有5个额外的订单被打开,尽管它们已经被打开。当我关闭终端并再次打开它时,同样的情况也发生了。如何解决这个问题?

 
Rustam Bikbulatov:

我有一个使用全局变量 的订单开销的计算。例如,如果是5,这意味着已经有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()中创建的所有对象。否则,只有在新的蜱虫上才会被更新。
原因: