点差与点差平均值

| 发表于 2020-7-26 08:48:56 | 显示全部楼层 |复制链接
  1. #property strict
  2. #property indicator_separate_window
  3. #property indicator_buffers 2
  4. #property indicator_plots   2
  5. //--- plot Spread
  6. #property indicator_label1  "Spread"
  7. #property indicator_type1   DRAW_LINE
  8. #property indicator_color1  clrRed
  9. #property indicator_style1  STYLE_SOLID
  10. #property indicator_width1  1
  11. //--- plot SpArray
  12. #property indicator_label2  "SpreadMap"
  13. #property indicator_type2   DRAW_LINE
  14. #property indicator_color2  clrYellow
  15. #property indicator_style2  STYLE_SOLID
  16. #property indicator_width2  1
  17. //--- indicator buffers
  18. extern int    ExtSize=0;
  19. input bool     InpPrint=false;
  20. double         SpreadBuffer[];
  21. double         SpreadMapBuffer[];
  22. const string SpreadMapName="SpreadMap";
  23. int Showbars=ExtSize;
  24. //+------------------------------------------------------------------+
  25. //| Custom indicator initialization function                         |
  26. //+------------------------------------------------------------------+
  27. int OnInit()
  28.   {
  29.    Showbars=(ExtSize<=0)?(int)ChartGetInteger(0,CHART_WIDTH_IN_BARS,ChartWindowFind()):ExtSize;//ChartGetInteger(0,CHART_WINDOWS_TOTAL)CHART_VISIBLE_BARS
  30.    if(ChartSetInteger(0,CHART_SHOW_ASK_LINE,0,true))
  31.       ChartSetInteger(0,CHART_COLOR_ASK,clrSnow);
  32.    if(ChartSetInteger(0,CHART_SHOW_BID_LINE,0,true))
  33.       ChartSetInteger(0,CHART_COLOR_BID,clrSilver);
  34.    if(ObjectFind(SpreadMapName)< 0) //ObjectFind(Name),if (ObjectFind(name + " Label") != 0)
  35.      {
  36.       ObjectCreate(SpreadMapName, OBJ_ARROW_RIGHT_PRICE,ChartWindowFind(),TimeCurrent(), 0);
  37.       ObjectSet(SpreadMapName, OBJPROP_SELECTABLE,false);
  38.       ObjectSet(SpreadMapName, OBJPROP_COLOR, clrYellow);
  39.       ObjectSet(SpreadMapName, OBJPROP_STYLE, STYLE_SOLID);
  40.       ObjectSet(SpreadMapName, OBJPROP_WIDTH, 1);//粗细
  41.      }
  42. //--- indicator buffers mapping
  43.    SetIndexEmptyValue(0,0.0);
  44.    SetIndexBuffer(0,SpreadBuffer);
  45.    SetIndexBuffer(1,SpreadMapBuffer);
  46. //---
  47.    ArraySetAsSeries(SpreadBuffer,true);
  48.    ArraySetAsSeries(SpreadMapBuffer,true);
  49.    ZeroMemory(SpreadBuffer);
  50.    ZeroMemory(SpreadMapBuffer);
  51.    return(INIT_SUCCEEDED);
  52.   }
  53. //+------------------------------------------------------------------+
  54. //| Custom indicator iteration function                              |
  55. //+------------------------------------------------------------------+
  56. int OnCalculate(const int rates_total,
  57.                 const int prev_calculated,
  58.                 const datetime &time[],
  59.                 const double &open[],
  60.                 const double &high[],
  61.                 const double &low[],
  62.                 const double &close[],
  63.                 const long &tick_volume[],
  64.                 const long &volume[],
  65.                 const int &spread[])
  66.   {
  67. //---
  68.    static MqlTick last_tick;
  69.    int size = prev_calculated;
  70.    if(iRefreshRates(last_tick))//last_tick.bid!=Bid
  71.      {
  72.       if(size<Showbars && size<rates_total)
  73.          size+=1;
  74.       if(size>1)
  75.          ArrayCopy(SpreadBuffer,SpreadBuffer,1,0,size-1);
  76.       double mspread=MarketInfo(_Symbol,MODE_SPREAD);
  77.       if(mspread<=0)
  78.          mspread=(last_tick.ask-last_tick.bid)/_Point;
  79.       SpreadBuffer[0]=mspread;
  80.       //---
  81.       double sum=0.0;
  82.       for(int i=0; i<size; i++)
  83.          sum+=SpreadBuffer[i]; // Summation for the double
  84.       if(size<=4)
  85.          SpreadMapBuffer[0]=size>0?(sum/size):SpreadBuffer[0]; // Just divide the sum by the number
  86.       else                                                     //--- now, get the highest value itself in the array
  87.         {
  88.          double terminal=SpreadBuffer[ArrayMaximum(SpreadBuffer)]+SpreadBuffer[ArrayMinimum(SpreadBuffer)];
  89.          SpreadMapBuffer[0]=(sum-terminal)/(size-2);
  90.         }
  91.       ArrayInitialize(SpreadMapBuffer,SpreadMapBuffer[0]);
  92.       ObjectMove(SpreadMapName, 0, last_tick.time, SpreadMapBuffer[0]);//修改移动
  93.      }
  94. //--- return value of prev_calculated for next call
  95.    return(size);
  96.   }
  97. //+------------------------------------------------------------------+
  98. //|                                                                  |
  99. //+------------------------------------------------------------------+
  100. void OnChartEvent(const int id,
  101.                   const long &lparam,
  102.                   const double &dparam,
  103.                   const string &sparam)
  104.   {
  105. //---
  106.    if(id == CHARTEVENT_CHART_CHANGE)
  107.      {
  108.       long v_bars;
  109.       if(ExtSize<=0)
  110.          if(ChartGetInteger(0,CHART_VISIBLE_BARS,0,v_bars) || ChartGetInteger(0,CHART_WIDTH_IN_BARS,0,v_bars))
  111.            {
  112.             if(Showbars!=v_bars)
  113.               {
  114.                Showbars=(int)v_bars;
  115.                if(InpPrint)
  116.                   Print("ArrarySize Freshed:"+IntegerToString(Showbars));
  117.               }
  118.            }
  119.      }
  120.   }
  121. //+------------------------------------------------------------------+
  122. bool iRefreshRates(MqlTick &last_tick,string symbol=NULL)export
  123.   {
  124.    if(symbol==NULL)
  125.       symbol=_Symbol;
  126.    if(!IsConnected())
  127.       return(false);
  128.    if(SymbolInfoTick(symbol,last_tick))
  129.       return(true);
  130. //--- refresh rates
  131.    if(symbol==_Symbol&&RefreshRates())
  132.       return(true);
  133.    Print("RefreshRates failed");
  134.    return(false);
  135.   }
复制代码
最近访问 头像模式
举报

评论 使用道具

发新帖
EA交易
您需要登录后才可以评论 登录 | 立即注册