初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 553

 
Vitalii Ananev:

Close[2]の代わりに2本目のバーのインジケータ値(例えばiRSI(......,2) )を、Close[1]の代わりに1本目のバーのインジケータ値を入力します。そして、urovenはレベルの 値です。

あとは、すでに上記でお伝えしたとおりです。

ありがとうございます。
 
mt5でチャートの右側にその日のサイドボリュームを見たことがある人がいたら教えてください。mt4ではここで見つけました。https://www.mql5.com/ru/code/9777.私は2つのバリエーションを持っている:その中の変数を書き換えるか、既製のものを見つける。 または私は順序の意味がわからない、、、、、私は1つの平衡論を確認する必要がある、、、、。 私は昨日の日のプロファイルが左に描かれているmt5用の作品を見つけましたが、一つの重要な欠点があります、それは 今日起こることを描かない ことです。そこで、右側からのチャートパターン情報に、取引の瞬間に何が起きているのかを加えたいと思います
Рыночный профиль ( Market Profile)
Рыночный профиль ( Market Profile)
  • 投票: 6
  • 2006.10.11
  • Collector
  • www.mql5.com
Рыночный профиль ( Market Profile) использует альтернативное представление информации как о горизонтальном, так и о вертикальном движении рынка.
 
Maria Baburina:

前提条件


ProfitSellDBLはここで計算されます。

Profit_Upgr = 0.01

Tral_Start__Upgrはint型の外部変数に等しく、5と等価である。

Tral_Size__Upgrも同様に4となります。

TV - 刻み値、=10

SumLotSellDBL = 0.04

読ませていただきました。Tral_Start__Upgr, Tral_Size__Upgr とその外部変数が double で定義されている場合の動作について見ました。すなわち、変換やデータの損失なしにすべてが同じタイプになるときです。結果は同じです。何がいけなかったのか?
 
Maria Baburina:
読んでみてください。Tral_Start__Upgr, Tral_Size__Upgr とその外部変数が double で定義されている場合の動作について見ました。すなわち、変換やデータの損失がなく、すべてが同じタイプである場合。結果は同じです。何がいけなかったのか?

盲人が聾唖者に話しかける。誰かにテストしてもらいたいなら、他のマシンでコンパイルしてテストできる最小限のコードが必要です。コードなし - 何も話すことはありません。

追加:デバッグを使用する(Debugging

-事前設定

-停止位置

-デバッグの開始

-観察可能な表現

-コールスタックビュー

-ステップバイステップデバッギング

-デバッグの停止、再開、終了

-ヒストリーデバッグ

 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

comp, 2016.04.03 18:21

ランタイムエラー

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1

class CLASS
{
public:
  double Buffer[];
  
  CLASS( void )
  {
    SetIndexBuffer(0, this.Buffer);
  }
};

CLASS* Class;

void OnInit( void )
{
  Class = new CLASS;
    
  delete Class;

  Class = new CLASS;

  Class.Buffer[0] = 0; // array out of range
  
  delete Class;
  
  return;
}

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[] )
{  
  return(rates_total);
}

4では、問題なく動作しました5ではバツです。これもクアッドに比べたアーキテクチャの限界なのでしょうか?これに関する議論のリンクを教えてください、自分では見つけられませんでした。


 
ターミナル自体が(手動ではなく)OnCalculateを最初に呼び出した後にのみ、インジケータバッファに 何かを割り当てることができるという理解で合っていますか?
 
comp:
ターミナル(手動ではない)OnCalculateの最初の呼び出しの後にのみ、何かが指標バッファに 割り当てられるというのは、正しく理解されていますか?

OnCalculate()が呼ばれた後、インジケータ・バッファにアクセスすることができます。同時に、インジケータ・バッファ自体もグローバル変数領域で宣言して おく必要があります。

//+------------------------------------------------------------------+
//|                                                  Accelerator.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "2009, MetaQuotes Software Corp."
#property link        "http://www.mql5.com"
#property description "Accelerator/Decelerator"

//---- indicator settings
#property indicator_separate_window
#property indicator_buffers 6
#property indicator_plots   1
#property  indicator_type1   DRAW_COLOR_HISTOGRAM
#property  indicator_color1  Green,Red
#property  indicator_width1  2
#property  indicator_label1  "AC"
//--- indicator buffers
double ExtACBuffer[];
double ExtColorBuffer[];
double ExtFastBuffer[];
double ExtSlowBuffer[];
double ExtAOBuffer[];
double ExtSMABuffer[];
//--- handles for MAs
int    ExtFastSMAHandle;
int    ExtSlowSMAHandle;
//--- bars minimum for calculation
#define  DATA_LIMIT 37
 

探していたものが見つかったと思うのですが、コードの古さが原因でエラーになります

直すのを手伝ってくれ......無理のない範囲で。

と、右側に回すのを手伝ってもらえると助かります。

ファイル:
 
Karputov Vladimir:

OnCalculate()が呼び出された後、インジケータ・バッファにアクセスすることができます。

結論から言うと、あなたは間違っています。端末がOnCalculateを呼び出したときのみ適用可能です。この場合、MT4での条件はOnCalculateを一度だけ呼び出せばよいので、より柔軟性があります。また、MT5では、SetIndexBufferの後、毎回ターミナル自身によるOnCalculateの呼び出しを待つ必要があります。プルーフ

#property strict

#property indicator_chart_window
#property indicator_buffers 1

#ifdef __MQL5__
  #property indicator_plots 1
#endif   

#ifdef __MQL5__
  #define TRUE true
  #define FALSE false
#endif   

class CLASS
{
public:
  double Buffer[];
  
  CLASS( void )
  {
    ::SetIndexBuffer(0, this.Buffer);
  }

  #define  TIMESERIES(X)                                                  \
     ::ArraySetAsSeries(X, TRUE);                                        \
     Size = ::MathMin(Copy##X(::Symbol(), ::Period(), 0, bars, X), Size);  

  static int FullOnCalculate( void )
  {
    int Spread[];
    long RealVolume[];
    
    int Size = INT_MAX;
    
    #ifdef __MQL4__
      const int bars = ::Bars;
    #endif

    #ifdef __MQL5__
      const int bars = ::Bars(::Symbol(), ::Period());
    #endif

     TIMESERIES(Spread)
    TIMESERIES(RealVolume)
    
    #ifdef __MQL4__
      return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, Volume, Spread));
    #endif

    #ifdef __MQL5__
      datetime Time[];
      double Open[];
      double High[];
      double Low[];
      double Close[];
      long TickVolume[];
  
      TIMESERIES(Time)
      TIMESERIES(Open)
      TIMESERIES(High)
      TIMESERIES(Low)
      TIMESERIES(Close)
      TIMESERIES(TickVolume)
    
      return(::OnCalculate(Size, 0, Time, Open, High, Low, Close, RealVolume, TickVolume, Spread));
    #endif    
  }  
};

CLASS* Class;

bool FirstRunOnCalculate = TRUE; // Необходимо TRUE, т.к. вызов OnCalculate только самим терминалом инициирует индикаторный буфер

void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam )
{
  if (id == CHARTEVENT_CHART_CHANGE)
  {
    Print(__FUNCTION__);
    
    ::OnDeinit();
    
    ::Class = new CLASS;
        
  if (!FirstRunOnCalculate)    
    CLASS::FullOnCalculate(); // Тут будет задница для MT5 (в MT4 - без проблем), т.к. после SetIndexBuffer в MT5 надо дожидаться вызова OnCalculate САМИМ терминалом
  }
  
  return;
}

void OnDeinit( const int Reason = 0 )
{
  if (::CheckPointer(::Class) == POINTER_DYNAMIC)
    delete ::Class;

  return;
}

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[] )
{  
  Print(__FUNCTION__);  

  if (FirstRunOnCalculate)
    FirstRunOnCalculate = FALSE;
  
  if (::CheckPointer(::Class) != POINTER_INVALID)
    ::Class.Buffer[0] = 0; // array out of range - MT5-ERROR!!!

  return(rates_total);
}

MT4ではこのインジケータは問題なく動作しますが、MT5ではエラーでクラッシュします。結果的には、MT4ではターミナルによるOnCalculateの最初の呼び出しを待つだけで、SetIndexBufferを使った再定義を含め、バッファに対してやりたいことができるようになりました。しかし、MT5では、EVERY SetIndexBufferの後、ターミナルによる最初のOnCalculateの呼び出しを待つ必要があります。

この機能はどこにも記載されていません。また、「ビギナー」の定義にも当てはまらないようです。

MT5では、この動作はMT4と同じになると考えてよいのでしょうか?つまり、端末自身が最初にOnCalculateを呼び出した後、問題なくSetIndexBufferを呼び 出すことができるのでしょうか?

 
comp:

結論から言うと、あなたは間違っています。端末自身からOnCalculateが呼び出されたときのみ呼び出すことができます。この場合、MT4ではOnCalculateを一度だけ呼び出せばよいので、より柔軟な条件設定が可能です。しかし、MT5では、SetIndexBufferの後、毎回ターミナル自身によるOnCalculateの呼び出しを待つ必要があります。プルーフ

MT4ではこのインジケータは問題なく動作しますが、MT5ではエラーでクラッシュします。結果的には、MT4ではターミナルによるOnCalculateの最初の呼び出しを待つだけで、SetIndexBufferを使った再定義を含め、バッファに対してやりたいことは何でもできるのです。しかし、MT5では、EVERY SetIndexBufferの後、ターミナルによる最初のOnCalculateの呼び出しを待つ必要があります。

この機能はどこにも記載されていません。また、「ビギナー」の定義にも当てはまらないようです。

MT5では、この動作はMT4と同じになると考えてよいのでしょうか?つまり、端末自身がOnCalculateを最初に呼び出した後、問題なくSetIndexBufferを呼び 出すことができるのでしょうか?

冗長にならないように - 当然、OnCalculateの呼び出しは、端末自身による呼び出しを意味する、なぜなら
OnCalculate()関数はCalculateイベントによってインジケータ値を計算する必要がある場合にのみ、カスタムインジケータで呼び出さ れます。これは通常、インジケータが計算されるシンボルに対して新しいティックが受信されたときに発生します。このインジケータは、このシンボルのどの価格チャートにも添付する必要はありません。
理由: