初学者的问题 MQL5 MT5 MetaTrader 5 - 页 553

 
Vitalii Ananev:

取代Close[2],将指标值放在第二个柱子上(例如iRSI(.......,2)),取代Close[1],将指标值放在第一个柱子上。而uroven是水平的 价值。

其余的,上面已经告诉你了。

谢谢你。
 
你能告诉我是否有人在mt5的图表右侧看到过当天的侧量,对于mt4,我在这里找到了https://www.mql5.com/ru/code/9777。我有两个变种:要么重写其中的变量,要么找一个现成的。或者我不认为订购,,,,,,,,我需要检查一个平衡理论,,,,。我找到一个适用于mt5的作品,在左边画出昨天的轮廓,但有一个重要的缺点,它没有画出 今天的情况。因此,我想从右边的图表模式信息中添加交易时刻发生的情况
Рыночный профиль ( Market Profile)
Рыночный профиль ( Market Profile)
  • 投票: 6
  • 2006.10.11
  • Collector
  • www.mql5.com
Рыночный профиль ( Market Profile) использует альтернативное представление информации как о горизонтальном, так и о вертикальном движении рынка.
 
Maria Baburina:

先决条件。


ProfitSellDBL在此计算

利润=0.01

Tral_Start__Upgr等同于一个int类型的外部变量,等于5。

Tral_Size__Upgr同样等于4

TV--刻度值,=10

总价卖出DBL = 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);
}

在四分之一的时候,它工作得很好!在五个人中,它是一个无赖。与四合院相比,这是否是另一个架构上的限制?给我一个关于这个讨论的链接,我自己找不到。


 
我的理解是否正确,你只能在终端本身 第一次调用(不是手动)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中,每一次SetIndexBuffer之后,都需要等待终端对OnCalculate的第一次调用。

这个功能在任何地方都没有记录。而且它似乎不符合 "初学者 "的定义。

我们是否可以预期在MT5中,这种行为将与MT4相同?也就是说,在终端本身第一次调用OnCalculate之后,可以顺利地调用SetIndexBuffer

 
comp:

事实证明,你错了。你只能在终端本身调用OnCalculate的时候调用它。在这种情况下,在MT4中条件更灵活,因为你只需要调用OnCalculate一次。但在MT5中,每次在SetIndexBuffer之后,你必须等待终端本身对OnCalculate的调用。证明

在MT4中,该指标的工作没有问题,在MT5中,它将崩溃并出现错误。事实证明,在MT4中,你只需要等待终端对OnCalculate的第一次调用,然后对缓冲区做任何你想做的事情,包括使用SetIndexBuffer重新定义它们。但在MT5中,每一次SetIndexBuffer之后,都需要等待终端对OnCalculate的第一次调用。

这种特殊性在任何地方都没有记载。而且它似乎不符合 "初学者 "的定义。

我们是否可以预期在MT5中,这种行为将与MT4相同?也就是说,在终端自己第一次调用OnCalculate之后,就可以顺利调用SetIndexBuffer 了?

不要搞什么口头禅--自然,对OnCalculate的调用意味着终端本身的调用,因为
OnCalculate()函数只在自定义指标中被调用,当需要通过计算事件来计算指标值的时候。这通常发生在收到符号的新刻度线时,该指标是为其计算的。该指标不需要附在这个符号的任何价格图表上。