诚信为本
量力而为
当前位置:峰汇在线 > MQL语言 > 正文

MT4指标编程框架

要编写一个常规的MT4指标,需要在程序中写明以下几点:
1、头部声明版权及版本相关信息。
2、指定指标所属窗口(主窗口 indicator_chart_window,副窗口indicator_separate_window)及指标线的颜色、宽度、水平位置等。
3、定义指标相关参数。
4、建立数组,用以保存指标线在各个位置的值。
5、初始化int OnInit()函数中将数组和指标线关联。
6、int OnCalculate(…….)主函数中根据具体计算方式给每个数组赋值。
7、如果指标有创建图表对象需要在结束时删除,可以在void OnDeinit(const int reason)函数中指定。

下面以如图所示的MT4自带的MACD做说明。
MT4自带的单线MACD指标

一、首先写入头部信息。

//+------------------------------------------------------------------+
//| Custom MACD.mq4 |
//| Copyright 2005-2014, MetaQuotes Software Corp. |
//| http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2005-2014, MetaQuotes Software Corp."
#property link "http://www.mql4.com"
#property description "Moving Averages Convergence/Divergence"
#property strict

二、如果指标需要调用函数库或dll类文件,在此声明。

#include <MovingAverages.mqh>

三、接着指定指标窗口及指标线的相关属性。

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Silver
#property indicator_color2 Red
#property indicator_width1 2

四、定义指标相关参数。

input int InpFastEMA=12; // Fast EMA Period
input int InpSlowEMA=26; // Slow EMA Period
input int InpSignalSMA=9; // Signal SMA Period

五、定义数组及相关变量。

double ExtMacdBuffer[];
double ExtSignalBuffer[];
bool ExtParameters=false;

六、int OnInit(void)函数中将数组和对应的指标线关联。int OnInit(void)函数在初始化运行一次。

//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit(void)
{
IndicatorDigits(Digits+1);
//--- drawing settings
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexStyle(1,DRAW_LINE);
SetIndexDrawBegin(1,InpSignalSMA);
//--- indicator buffers mapping
SetIndexBuffer(0,ExtMacdBuffer);
SetIndexBuffer(1,ExtSignalBuffer);
//--- name for DataWindow and indicator subwindow label
IndicatorShortName("MACD("+IntegerToString(InpFastEMA)+","+IntegerToString(InpSlowEMA)+","+IntegerToString(InpSignalSMA)+")");
SetIndexLabel(0,"MACD");
SetIndexLabel(1,"Signal");
//--- check for input parameters
if(InpFastEMA<=1 || InpSlowEMA<=1 || InpSignalSMA<=1 || InpFastEMA>=InpSlowEMA)
{
Print("Wrong input parameters");
ExtParameters=false;
return(INIT_FAILED);
}
else
ExtParameters=true;
//--- initialization done
return(INIT_SUCCEEDED);
}

七、void OnDeinit(const int reason)函数中在结束运行一次。可以写入一些删除特定对象的函数。这里用不到。

   void OnDeinit(const int reason)
     {

     }

八、int OnCalculate(…….)主函数,价格跳动一次函数运行一次,函数中根据特定的计算方法给数组赋值。

//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence |
//+------------------------------------------------------------------+
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[])
{
int i,limit;
//---
if(rates_total<=InpSignalSMA || !ExtParameters)
return(0);
//--- last counted bar will be recounted
limit=rates_total-prev_calculated;
if(prev_calculated>0)
limit++;
//--- macd counted in the 1-st buffer
for(i=0; i<limit; i++)
ExtMacdBuffer[i]=iMA(NULL,0,InpFastEMA,0,MODE_EMA,PRICE_CLOSE,i)-
iMA(NULL,0,InpSlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
//--- signal line counted in the 2-nd buffer
SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
//--- done
return(rates_total);
}
//+------------------------------------------------------------------+
打赏
版权所有转载请注明标题及链接:峰汇在线 » MT4指标编程框架
上一篇:
下一篇:
分享到: 更多 (0)

如您觉得此文不错请扫码打赏!

支付宝扫一扫打赏

微信扫一扫打赏