0

我尝试了以下方法:

adx_output = iADX(_Symbol,TimePeriod,Candles_for_adx);
Print(ChartGetDouble(0,CHART_PRICE_MAX,2));
Print(ChartGetDouble(0,CHART_PRICE_MIN,2));
Print(ChartGetDouble(0,CHART_POINTS_PER_BAR,2));

但是上面的代码给了我当前或基于刻度的时间序列的中间值。我想访问以前蜡烛的范围。但找不到任何有用的东西。
请让我知道这个问题的建议。

4

1 回答 1

1

您没有检查正确的值

好吧,
使用 MetaTrader 的 GUI 图表的属性{ CHART_PRICE_MIN, CHART_PRICE_MAX }是可能的,但图表的布局由 aPriceDOMAIN 事件 (QUOTE-s) 和一些可配置选项控制,而不是由 ADX 技术指标值本身控制,因此这些检索到的数字是从 GUI 接收的-状态,几乎与实际寻求的{ min, MAX }-ADX 值无关。

方法:

  • 一个聪明而复杂的方法是创建一个 CustomIndicator 或一个类,执行这个确切的服务。

  • 一种天真的但实用的方法是检查并重新检查所需的iADX()-{ MAIN, +DI, -DI }值:


/* -----------------------------------------------//
int  iADX(                                        // MQL5-call-inteface:
           string           symbol,               //      symbol name
           ENUM_TIMEFRAMES  period,               //      period
           int              adx_period            //      averaging period
           );
*/

#define currentChartID         0
#define currentChartMainWINDOW 0

int    nBARsVISIBLE = ChartGetInteger( currentChartID, CHART_VISIBLE_BARS,
                                       currentChartMainWINDOW
                                       ); 
double iADX_VISIBLE[nBARsVISIBLE];
double iADX_VISIBLE_min,
       iADX_VISIBLE_MAX;
int    iADX_IndicatorHANDLE = iADX( _Symbol,
                                     TimePeriod,
                                     Candles_for_adx
                                     );
/* -----------------------------------------------//
int  CopyBuffer(                                  // MQL5-call-inteface:
                  int       indicator_handle,     // indicator handle
                  int       buffer_num,           // indicator buffer number
                  int       start_pos,            // start position
                  int       count,                // amount to copy
                  double    buffer[]              // target array to copy
                  );
*/
int RetCODE = CopyBuffer( iADX_IndicatorHANDLE,
                          MODE_MAIN,              // { 0: MODE_MAIN | 1: MODE_PLUSDI | 2: MODE_MINUSDI }
                          0,
                          nBARsVISIBLE,
                          iADX_VISIBLE
                          );
 if ( RetCODE == -1 ) {...}
 else {
       iADX_VISIBLE_min = iADX_VISIBLE[ ArrayMinimum( iADX_VISIBLE ) ];
       iADX_VISIBLE_MAX = iADX_VISIBLE[ ArrayMaximum( iADX_VISIBLE ) ];
       ...
 }

鉴于最后一条评论

好吧,这可能是我的问题的答案,但是先生,我想要图表限制而不是 ADX 最小值最大值。我可以稍后计算它,但目前想要有图形限制。我正在尝试使用 ADX 图进行一些实验。–贾弗威尔逊 1 小时前

   #define currentChartID          0       // adapt to fit your current setup
   #define currentChartSubWinID    0       // adapt to fit your current setup

   double priceMin = ChartGetDouble( currentChartID,
                                     CHART_PRICE_MIN,
                                     currentChartSubWinID
                                     );
   double priceMax = ChartGetDouble( currentChartID,
                                     CHART_PRICE_MAX,
                                     currentChartSubWinID
                                     );
   Print( "INF:: Chart(", currentChartID, ":", currentChartSubWinID, ").CHART_PRICE_MAX = ", priceMin );
   Print( "INF:: Chart(", currentChartID, ":", currentChartSubWinID, ").CHART_PRICE_MAX = ", priceMax );
于 2018-04-02T12:28:19.027 回答