您现在的位置: 比特财富网 >> 财经 >  >> 外匯
MQL5變色線的畫法(比MQL4更加簡單)
外_匯_邦 WaiHuiBang.com MQL5裡有一種特殊指標數組“顏色數組”,他是和畫線的指標數組配合使用的。www.emoneybtc.com通過對他的簡單賦值可以使畫出的線變色。
首先要在指標頭部定義裡指定一條線對應的數組是要使用變色畫線方式,指定方法是:
#property indicator_typeX DRAW_COLOR_LINE
這裡X代表畫線的數組序號
DRAW_COLOR_LINE代表畫線,此外還可以有如下畫線方式: 
復制代碼
  1.  
  2. DRAW_COLOR_LINE
  3. Colorful Line彩色線
  4. DRAW_COLOR_SECTION
  5. Multicolored section彩色塊
  6. DRAW_COLOR_HISTOGRAM
  7. Multicolored histogram from the zero line彩色柱狀圖
  8. DRAW_COLOR_HISTOGRAM2
  9. Multicolored histogram of the two indicator buffers彩色柱狀圖2
  10. DRAW_COLOR_ARROW
  11. Drawing colored arrows彩色箭頭
  12. DRAW_COLOR_ZIGZAG
  13. Colorful ZigZag彩色ZigZag
  14. DRAW_COLOR_BARS
  15. Multi-colored bars彩色竹線圖
  16. DRAW_COLOR_CANDLES
  17. Multi-colored candles彩色蠟燭圖

然後緊跟一個顏色的定義語句:
#property indicator_colorX Red,Green
兩個顏色之間用逗號分隔
============================================
針對上面程序頭部的定義,之後要開始全局數組的定義。
這裡要注意實現變色需要針對一條線使用兩個數組,
例如:
double bMaBuffer[],bColorBuffer[];
然後進入OnInit事件進行兩個數組的分別設定:
SetIndexBuffer(0,bMaBuffer,INDICATOR_DATA);//INDICATOR_DATA表示是用於畫線的數組
SetIndexBuffer(1,bColorBuffer,INDICATOR_COLOR_INDEX);//INDICATOR_COLOR_INDEX表示是用於變色的顏色數組
注意:
如果這裡要畫多條彩色線,則畫線數組和顏色數組的序號要緊鄰。
============================================
下一步就是在OnCaculate事件裡進行畫線數組的計算,同時根據自定義的條件對顏色數組進行賦值。
賦值規則是:
當對應K線序號的顏色數組被賦值1.0時,對應畫線數組的顏色為 第一個顏色
當對應K線序號的顏色數組被賦值0.0時,對應畫線數組的顏色為 第二個顏色
完。
程序舉例源碼如下:【畫出兩個變色線】
復制代碼
  1.  
  2. //+------------------------------------------------------------------+
  3. //| Test.mq5 |
  4. //| Copyright 2009, MetaQuotes Software Corp. |
  5. //| http://bbs.520fx.com |
  6. //+------------------------------------------------------------------+
  7. #property copyright "2009, 520FX"
  8. #property link "http://www.mql5.com"
  9. #property version "1.00"
  10. #property indicator_chart_window
  11. #property indicator_buffers 4
  12. #property indicator_plots 2
  13. #property indicator_color1 Red,Green
  14. #property indicator_type1 DRAW_COLOR_LINE
  15. #property indicator_style1 STYLE_SOLID
  16. #property indicator_width1 2
  17. #property indicator_color2 Yellow,Blue
  18. #property indicator_type2 DRAW_COLOR_LINE
  19. #property indicator_style2 STYLE_SOLID
  20. #property indicator_width2 2
  21. input int MaPeriod=13;
  22. double bMaBuffer[],bMaBuffer1[],bColorBuffer[],bColorBuffer1[];
  23. int iMaHandle,iMaHandle1;
  24. //+------------------------------------------------------------------+
  25. //| Custom indicator initialization function |
  26. //+------------------------------------------------------------------+
  27. int OnInit()
  28. {
  29. //--- indicator buffers mapping
  30. SetIndexBuffer(0,bMaBuffer,INDICATOR_DATA);
  31. SetIndexBuffer(1,bColorBuffer,INDICATOR_COLOR_INDEX);
  32. SetIndexBuffer(2,bMaBuffer1,INDICATOR_DATA);
  33. SetIndexBuffer(3,bColorBuffer1,INDICATOR_COLOR_INDEX);
  34. IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
  35. iMaHandle=iMA(NULL,0,MaPeriod,0,MODE_SMA,PRICE_CLOSE);
  36. iMaHandle1=iMA(NULL,0,MaPeriod+50,0,MODE_SMA,PRICE_CLOSE);
  37. //---
  38. return(0);
  39. }
  40. //+------------------------------------------------------------------+
  41. //| Custom indicator iteration function |
  42. //+------------------------------------------------------------------+
  43. int OnCalculate(const int rates_total,
  44. const int prev_calculated,
  45. const datetime& time[],
  46. const double& open[],
  47. const double& high[],
  48. const double& low[],
  49. const double& close[],
  50. const long& tick_volume[],
  51. const long& volume[],
  52. const int& spread[])
  53. {
  54. //--- return value of prev_calculated for next call
  55. //--- checking for bars count
  56. if(rates_total<MaPeriod)
  57. return(0);
  58. //--- detect start position
  59. int start;
  60. //if(prev_calculated>1) start=prev_calculated-1;
  61. //else start=1;
  62. if(prev_calculated<0)return(-1);else start=rates_total-prev_calculated+1;
  63. int to_copy;
  64. if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
  65. else
  66. {
  67. to_copy=rates_total-prev_calculated;
  68. if(prev_calculated>0) to_copy++;
  69. }
  70. if(CopyBuffer(iMaHandle,0,0,to_copy,bMaBuffer)<=0)
  71. {
  72. Print("Getting fast SMA is failed! Error",GetLastError());
  73. return(0);
  74. }
  75. if(CopyBuffer(iMaHandle1,0,0,to_copy,bMaBuffer1)<=0)
  76. {
  77. Print("Getting fast SMA1 is failed! Error",GetLastError());
  78. return(0);
  79. }
  80. //--- main cycle
  81. for(int i=start;i<rates_total;i++)
  82. {
  83. if(bMaBuffer[i]>close[i-1])
  84. bColorBuffer[i]=1.0;
  85. else bColorBuffer[i]=0.0;
  86. if(bMaBuffer1[i]>close[i-1])
  87. bColorBuffer1[i]=1.0;
  88. else bColorBuffer1[i]=0.0;
  89. }
  90. return(rates_total);
  91. }
  92. //+------------------------------------------------------------------+
外_匯_邦 WaiHuiBang.com
  風險提示:比特財富網的各種信息資料僅供參考,不構成任何投資建議,不對任何交易提供任何擔保,亦不構成任何邀約,不作為任何法律文件,投資人據此進行投資交易而產生的後果請自行承擔,本網站不承擔任何責任,理財有風險,投資需謹慎。
比特財富網 版權所有 © www.emoneybtc.com