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

 
N本のバーにOBJ_RECTANGLEが ないことを確認するにはどうしたらいいですか?
 
neverness:

MT5で本当に変わったことはありますか?

mt4にもmt5にもそのようなものはありません。

mt5では、H2のタイムオーバーで、現在の期間のセパレータが表示されるバグもあります。

 
Ghabo:
N本のバーにOBJ_RECTANGLEが 存在しないことを確認するには?
こんな風に試してみてはいかがでしょうか?
  int n = Bars(Symbol(), PERIOD_CURRENT, ObjectGetInteger(0,"Rectangle",OBJPROP_TIME,1), TimeCurrent());
  Print(n);
 
Vitaly Muzichenko:

mt4にもmt5にもそのようなものはありません。

mt5では、H2以上の時間帯で、現在の期間でのセパレータの表示でエラーが発生することもあります。

この「議論」の中で、私の質問に対する唯一の「建設的な答え」をやっと見ることができました。

エラーに関しては、MT4とMT5の両方で、現在の(最後の)フレームのすべてのセパレータ週で存在します。

先週のセパレーターMT4/MT5では、どこでもセパレーターが5日ではなく7日描画されます。

でも、そんなことはどうでもいいんです。これまでも、これからも、エラーは起こり続ける。デリミタを描画するプログラムコードがあれば、すべて修正できるかもしれません。

驚くのはミスではなく、まったく別のことなのです。

MT4/MT5が存在している間、予測される領域にデリミタを描画するプログラムを 誰も考えなかったのでしょうか?

なんといっても、プログラムが一番シンプルなんです。

必要なのは、最後の仕切りの位置と、X軸に沿った時間の「解」(つまり、1ピクセルにかかる時間間隔)だけです。

そして、これまで誰も、「?

これには本当に驚きました。

今回も全部自分でやらなければならない。

 
Igor Makanu:

難しいことではないのですが、MTでインジケーターがどのように機能し、どのような利点があるのかを理解していないようです

その通りでしょう。

数学的な逸話がある。

ある数学者が、「やかんの中でどうやってお湯を沸かすのか?

空のやかんを手に取り、水を注ぎ、調理器具の上に置き、調理器具のスイッチを入れて、お湯が沸くのを待ちます。

- OKです。でも、もしヤカンがすでに満杯だったらどうしますか?- と数学者は問う。

- やかんから水を注ぎ、上記の方法で問題を解決します。- が数学者に答える。

それでは、どうぞ。

このジョークは、あなたのことです。

 
neverness:

このジョークは、あなたのことです。

うーん、笑っていいのか悪いのか・・・。もし、あなたの気まぐれをすべて満たしてくれる取引端末を知って いたら、何の意味があるのでしょうか?私はMT4/5に100%満足しています。それで何でもできますし、チャートにD1期間を描くインディケータはそのまま、プログラミングに興味を持ったら、自分のニーズに合わせて改造してください・・・。無理だろうなぁ・・・。

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot line1
#property indicator_label1  "Period"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
#property indicator_label2  "Period"
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- input parameters
input int      Days=3;
//--- indicator buffers
double         Pmax[],Pmin[];
bool run=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Pmax);
   SetIndexBuffer(1,Pmin);
   run=true;
   switch(_Period)
     {
      case PERIOD_M1:   SetIndexShift(0,1440*Days);SetIndexShift(1,1440*Days);   break;
      case PERIOD_M5:   SetIndexShift(0,288*Days); SetIndexShift(1,288*Days);    break;
      case PERIOD_M15:  SetIndexShift(0,96*Days);  SetIndexShift(1,96*Days);     break;
      case PERIOD_M30:  SetIndexShift(0,48*Days);  SetIndexShift(1,48*Days);     break;
      case PERIOD_H1:   SetIndexShift(0,24*Days);  SetIndexShift(1,24*Days);     break;
      case PERIOD_H4:   SetIndexShift(0,6*Days);   SetIndexShift(1,6*Days);      break;
      default: run=false; SetIndexShift(0,0); SetIndexShift(1,0);ArrayInitialize(Pmax,EMPTY_VALUE);ArrayInitialize(Pmin,EMPTY_VALUE); break;
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   if(prev_calculated==0)
     {
      run=true;
      ArrayInitialize(Pmax,EMPTY_VALUE);
      ArrayInitialize(Pmin,EMPTY_VALUE);
     }
   if(run)
     {
      int i=0,lastperiod=TimeDay(time[0]);
      double maxvalue;
      if(!ChartGetDouble(ChartID(),CHART_PRICE_MAX,0,maxvalue)) maxvalue=1000.0;
      maxvalue*=10.0;
      while(i<rates_total)
        {
         if(TimeDay(time[i])!=lastperiod)
           {
            lastperiod=TimeDay(time[i]);
            Pmax[i-1]=maxvalue;
            Pmin[i-1]=0.0;
           }
         else
           {
            Pmax[i]=EMPTY_VALUE;
            Pmin[i]=EMPTY_VALUE;
           }
         i++;
        }
      run=false;
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
チャート EURUSD.e, H1, 2018.11.09 13:11 UTC, RoboForex (CY) Ltd, MetaTrader 4, Demo


すでに試しましたが、なぜかわかりません、初めて見たので、タイムフレームを切り替えるときにバッファを初期化するよう です

 
neverness:

この「議論」の中で、私の質問に対する唯一の「建設的な答え」をやっと見ることができました。

エラーに関しては、MT4とMT5の両方で、現在の(最後の)フレームのすべてのセパレータ週で存在します。

先週のセパレーターMT4/MT5では、どこでもセパレーターが5日ではなく7日描画されます。

でも、そんなことはどうでもいいんです。これまでも、これからも、エラーは起こり続ける。デリミタを描画するプログラムコードがあれば、すべて修正できるかもしれません。

驚くのはミスではなく、まったく別のことなのです。

MT4/MT5が存在している間、予測される領域にデリミタを描画するプログラムを 誰も考えなかったのでしょうか?

なんといっても、プログラムが一番シンプルなんです。

必要なのは、最後の仕切りの位置と、X軸に沿った時間の「解」(つまり、1ピクセルにかかる時間間隔)だけです。

そして、これまで誰も、「?

これには本当に驚きました。

もう一度言いますが、すべて自分でやるしかないのです。

言ったでしょー、何度もやってるんです。(とか(市場でも、複数の指標で)。

で、すでにコードを書いたとのことですが、また書いてくれるのでしょうか?)

 
Igor Makanu:

うーん、笑っていいのか悪いのか......。もし、あなたの気まぐれをすべて満たしてくれる取引端末を知って いたら、何の意味があるのでしょうか? 私はMT4/5に100%満足しています、それで何でもできます、チャートにD1期間を描くインディケータを維持し、プログラミングに興味を持ち、あなたのニーズに合わせて変更する・・・・。無理だろうなぁ・・・。


このようなバグを見たのは初めてで、理由が わからない。

もちろん、ありがとうございます。

やはり、不完全な日は、生理の区切りが標準のものと一致しません。

でも、標準のセパレータを描き直すのではなく、予測領域のセパレータと履歴のセパレータをドッキングさせるようにすればいいと思うので、あまり関係ないですね。

そうすれば、不完全な履歴の日の区切り文字の位置が、予測の区切り文字に影響を与えることはない。

もう一つ、標準の区切り文字とインジケータの重要な違いは、標準の区切り文字はチャート自体のイベントごとに更新されますが、インジケータはOnCalculate()イベントごとに更新されることです。これは目立つのでは......と思ったのですが、実際はほとんど目立ちません。

もちろん、このインジケータは再設計されるべきですが、とにかくありがとうございます。見ていて面白かったです。

 
Ghabo:

これは、指定された名前のオブジェクトのバーのインデックスであることが判明した。オブジェクトは1つ以上あり、その名前は「QUADRO」+Time[i+1] 10本の棒にそのようなオブジェクトがないことを知るにはどうすればよいですか?

バッファの場合は、値が空の場合、チャートに何も表示されないことは明らかですが、オブジェクトの場合はどうでしょうか。

if (ObjectFind(0,"QUADRO"+Time[10])<0)
        {
        //объекта нет на 10 баре
        }
 
Vitaly Muzichenko:
この方法で試してみてもいいのでしょうか?
  int n = Bars(Symbol(), PERIOD_CURRENT, ObjectGetInteger(0,"Rectangle",OBJPROP_TIME,1), TimeCurrent());

ありがとうございます。これは、指定された名前のオブジェクトのバーインデックス(120983)であることが判明しました。オブジェクトは1つ以上あり、その名前は「QUADRO」+Time[i+1] 10本の棒にそのようなオブジェクトがないことを知るにはどうすればよいですか?

バッファの場合は、値が空の場合、チャートに何も表示されないのはわかりますが、オブジェクトの場合はどうでしょうか?