- //+------------------------------------------------------------------+
- //| foo.mq4 |
- //| Copyright 2018, Tang Qizhe. |
- //| https://www.baidu.com |
- //+------------------------------------------------------------------+
- #property copyright "Copyright 2018, Tang Qizhe."
- #property link "https://www.baidu.com"
- #property version "1.00"
- #property strict
- #property indicator_chart_window
- #property indicator_buffers 4
- #property indicator_plots 4
-
- //--- plot shortPeriodLine
- const string shortPeriodLine = "shortPeriodLine";
- #property indicator_label1 "shortPeriodLine"
- #property indicator_type1 DRAW_LINE
- #property indicator_color1 clrRed
- #property indicator_style1 STYLE_SOLID
- #property indicator_width1 1
- double shortPeriodLineBuffer[];
-
- //--- plot longPeriodLine
- const string longPeriodLine = "longPeriodLine";
- #property indicator_label2 "longPeriodLine"
- #property indicator_type2 DRAW_LINE
- #property indicator_color2 clrWhite
- #property indicator_style2 STYLE_SOLID
- #property indicator_width2 1
- double longPeriodLineBuffer[];
-
- //--- plot buyArrow
- const string buyArrow = "buyArrow";
- #property indicator_label3 "buyArrow"
- #property indicator_type3 DRAW_ARROW;
- #property indicator_color3 clrRed
- #property indicator_style3 STYLE_SOLID
- #property indicator_width3 1
- double buyArrowBuffer[];
-
- //--- plot sellArrow
- const string sellArrow = "sellArrow";
- #property indicator_label4 "sellArrow"
- #property indicator_type4 DRAW_ARROW
- #property indicator_color4 clrLime
- #property indicator_style4 STYLE_SOLID
- #property indicator_width4 1
- double sellArrowBuffer[];
-
- //--- input parameters
- input int shortPeriodDay = 10;
- input int longPeriodDay = 20;
-
-
- int OnInit() {
-
- // 设置buffer数组与指标的一一对应关系
- SetIndexBuffer(0,shortPeriodLineBuffer);
- SetIndexBuffer(1,longPeriodLineBuffer);
- SetIndexBuffer(2,buyArrowBuffer);
- SetIndexBuffer(3,sellArrowBuffer);
-
-
- // 设置箭头类型(225、226为箭头的类型)
- SetIndexArrow(2, 225);
- SetIndexArrow(3, 226);
-
-
- /** 指标准备工作的另一种形式
- SetIndexBuffer(0,shortPeriodLineBuffer);
- SetIndexLabel(0, "shortPeriodLine");
- SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 1, clrRed);
- */
-
- return(INIT_SUCCEEDED);
- }
-
-
-
- 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[]) {
-
- // 异常处理:如果当前k线数目过少, 则不执行之后的代码
- if(rates_total < MathMax(shortPeriodDay, longPeriodDay)) return 0;
-
- // 优化程序的执行效率:只操作之前没操作过的k线.(limit: 需要跟新的k线个数)
- int limit = rates_total - prev_calculated;
-
- // 最后一根k线有新的价格来时, 仅刷新最后一根k线
- if(limit == 0) limit++;
-
-
- // 根据系统自带指标MA, 画两条线
- for(int i = 0; i < limit; i++) {
- shortPeriodLineBuffer = iMA(Symbol(), PERIOD_CURRENT, shortPeriodDay, 0, MODE_SMA, PRICE_CLOSE, i);
- longPeriodLineBuffer = iMA(Symbol(), PERIOD_CURRENT, longPeriodDay, 0, MODE_SMA, PRICE_CLOSE, i);
- }
-
-
- // 在两条线的交叉处画箭头
- for(int i = 0; i < limit; i++) {
- if(shortPeriodLineBuffer > longPeriodLineBuffer && shortPeriodLineBuffer[i+1] < longPeriodLineBuffer[i+1]) {
- buyArrowBuffer = shortPeriodLineBuffer;
- } else if(shortPeriodLineBuffer<longPeriodLineBuffer && shortPeriodLineBuffer[i+1]>longPeriodLineBuffer[i+1]) {
- sellArrowBuffer = longPeriodLineBuffer;
- }
- }
-
- return(rates_total);
- }
复制代码
|