MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 957

 
Igor Kryuchkov:

Ctrl+B --> "All "ボタン - オブジェクトは1つです。問 題は、Canvasを使わずに通常の方法でRECTANGLEを作成 した場合です。適切な数のRECTANGLEオブジェクトが 作成されます。

Canvasでは、1つしか作れないんです。なぜ、そんなふうになるのでしょうか。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つの注文が開かれていて、6つ目の注文が上がるのを待っているということです。カウンタが5に設定された場合、すでに開いているにもかかわらず、5つの追加注文が開かれたことを意味します。ターミナルを閉じてから再度開いても同じことが起こります。どうすれば直るのか?

 
Rustam Bikbulatov:

グローバル変数 を使って、オーダーオープンの計算をしています。例えば5であれば、すでに5つの注文が開かれていて、6つ目の注文が上がるのを待っているということです。カウンタが5に設定された場合、すでに開いているにもかかわらず、5つの追加注文が開かれたことを意味します。ターミナルを閉じてから再度開いても同じことが起こります。どうすれば直るのか?

int OnInit()関数では、グローバル変数の存在を確認し、存在していて0より大きい場合は0に設定します。

 
Igor Kryuchkov:
これって4点?
 
Artyom Trishkin:
4倍なのか?

そうそう、MQL4はCanvasについて質問したときに気づいたのですが

 
Artyom Trishkin:
これは4なのか?
4号機でも使えるはずだ。
 
Igor Kryuchkov:
4でも使えるはずだ。
//+------------------------------------------------------------------+
//|                                                         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()はtick依存ではない
  3. 必要なチャートイベントが登録されたら、OnChartEvent() で作成したすべてのオブジェクトを更新します。そうでない場合は、新しいティックの時のみ更新されます。