微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MQL 4/5找到蜡烛中心的25%和75%

如何解决MQL 4/5找到蜡烛中心的25%和75%

我希望在蜡烛上以25%,50%和75%的水平绘制一个点。在蜡烛长度的50%处绘制点的代码如下。如何在25%和75%处添加点。

以下代码适用于MT5。我试图通过除以(high [i] + low [i])/ 4来更改逻辑,但是根本没有显示点。

#property copyright "copyright 2018,MetaQuotes Software Corp."
#property link      "https://mql5.com"
#property version   "1.00"
#property description "Colored Middle Point of candles"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   1
//--- plot ColorMidPoint
#property indicator_label1  "Color Middle Point"
#property indicator_type1   DRAW_COLOR_ARROW
#property indicator_color1  clrDodgerBlue,clrDarkOrange,clrDarkGray
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- enums
enum ENUM_CANDLE_TYPE
  {
   TYPE_CANDLE_HL,// Candle
   TYPE_CANDLE_OC       // Body
  };
//---
enum ENUM_ARROW_TYPE
  {
   TYPE_ARROW_DOT0      =  158,// Smallest Dot
   TYPE_ARROW_DOT1      =  159,// Small Dot
   TYPE_ARROW_DOT2      =  108,// Big Dot
   TYPE_ARROW_SQUARE1   =  167,// Small Square
   TYPE_ARROW_SQUARE2   =  110,// Big Square
   TYPE_ARROW_DIAMOND1  =  115,// Small Diamond
   TYPE_ARROW_DIAMOND2  =  116,// Big Diamond
   TYPE_ARROW_CROSS     =  251   // Cross
  };
//--- input parameters
input ENUM_CANDLE_TYPE  InpTypeCandle     =  TYPE_CANDLE_HL;   // Middle point for
input ENUM_ARROW_TYPE   InpTypeArrow      =  TYPE_ARROW_DOT1;  // Dots type
//--- indicator buffers
double         BufferCMP[];
double         BufferColors[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,BufferCMP,INDICATOR_DATA);
   SetIndexBuffer(1,BufferColors,INDICATOR_COLOR_INDEX);
//--- setting a code from the Wingdings charset as the property of PLOT_ARROW
   PlotIndexSetInteger(0,PLOT_ARROW,(int)InpTypeArrow);
//--- setting indicator parameters
   IndicatorSetString(INDICATOR_SHORTNAME,"CandleMidPoint");
   IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//--- setting buffer arrays as timeseries
   ArraySetAsSeries(BufferCMP,true);
   ArraySetAsSeries(BufferColors,true);
//---
   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[])
  {

   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);


   int limit=rates_total-prev_calculated;
   if(limit>1)
     {
      limit=rates_total-1;
      ArrayInitialize(BufferCMP,EMPTY_VALUE);
      ArrayInitialize(BufferColors,2);
     }

/
   for(int i=limit; i>=0 && !Isstopped(); i--)
     {
      BufferCMP[i]=(InpTypeCandle==TYPE_CANDLE_OC ? (open[i]+close[i])/2.0 : (high[i]+low[i])/2.0);
      BufferColors[i]=(open[i]<close[i] ? 0 : open[i]>close[i] ? 1 : 2);
     }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }

解决方法

如果要为每个蜡烛添加3个不同的点,则将需要3个不同的指标缓冲区,但只有一个:

double BufferCMP[];

如果创建3,则可以为每个缓冲区分配不同的方法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。