MT4机里的Moving Average.mq4是怎么编译的

 我来答
zhjunxhe
2012-01-04
知道答主
回答量:38
采纳率:0%
帮助的人:11.9万
展开全部
  //+------------------------------------------------------------------+
  //| Custom Moving Average.mq4 |
  //| Copyright ?2004, MetaQuotes Software Corp. |
  //| http://www.metaquotes.net/ |
  //+------------------------------------------------------------------+
  #property copyright "Copyright ?2004, MetaQuotes Software Corp."
  #property link "http://www.metaquotes.net/"

  #property indicator_chart_window
  #property indicator_buffers 1
  #property indicator_color1 Red
  //---- indicator parameters
  extern int MA_Period=13;
  extern int MA_Shift=0;
  extern int MA_Method=0;
  //---- indicator buffers
  double ExtMapBuffer[];
  //----
  int ExtCountedBars=0;
  //+------------------------------------------------------------------+
  //| Custom indicator initialization function |
  //+------------------------------------------------------------------+
  int init()
  {
  int draw_begin;
  string short_name;
  //---- drawing settings
  SetIndexStyle(0,DRAW_LINE);
  SetIndexShift(0,MA_Shift);
  IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
  if(MA_Period<2) MA_Period=13;
  draw_begin=MA_Period-1;
  //---- indicator short name
  switch(MA_Method)
  {
  case 1 : short_name="EMA("; draw_begin=0; break;
  case 2 : short_name="SMMA("; break;
  case 3 : short_name="LWMA("; break;
  default :
  MA_Method=0;
  short_name="SMA(";
  }
  IndicatorShortName(short_name+MA_Period+")");
  SetIndexDrawBegin(0,draw_begin);
  //---- indicator buffers mapping
  SetIndexBuffer(0,ExtMapBuffer);
  //---- initialization done
  return(0);
  }
  //+------------------------------------------------------------------+
  //| |
  //+------------------------------------------------------------------+
  int start()
  {
  if(Bars<=MA_Period) return(0);
  ExtCountedBars=IndicatorCounted();
  //---- check for possible errors
  if (ExtCountedBars<0) return(-1);
  //---- last counted bar will be recounted
  if (ExtCountedBars>0) ExtCountedBars--;
  //----
  switch(MA_Method)
  {
  case 0 : sma(); break;
  case 1 : ema(); break;
  case 2 : smma(); break;
  case 3 : lwma();
  }
  //---- done
  return(0);
  }
  //+------------------------------------------------------------------+
  //| Simple Moving Average |
  //+------------------------------------------------------------------+
  void sma()
  {
  double sum=0;
  int i,pos=Bars-ExtCountedBars-1;
  //---- initial accumulation
  if(pos<MA_Period) pos=MA_Period;
  for(i=1;i<MA_Period;i++,pos--)
  sum+=Close[pos];
  //---- main calculation loop
  while(pos>=0)
  {
  sum+=Close[pos];
  ExtMapBuffer[pos]=sum/MA_Period;
  sum-=Close[pos+MA_Period-1];
  pos--;
  }
  //---- zero initial bars
  if(ExtCountedBars<1)
  for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;
  }
  //+------------------------------------------------------------------+
  //| Exponential Moving Average |
  //+------------------------------------------------------------------+
  void ema()
  {
  double pr=2.0/(MA_Period+1);
  int pos=Bars-2;
  if(ExtCountedBars>2) pos=Bars-ExtCountedBars-1;
  //---- main calculation loop
  while(pos>=0)
  {
  if(pos==Bars-2) ExtMapBuffer[pos+1]=Close[pos+1];
  ExtMapBuffer[pos]=Close[pos]*pr+ExtMapBuffer[pos+1]*(1-pr);
  pos--;
  }
  }
  //+------------------------------------------------------------------+
  //| Smoothed Moving Average |
  //+------------------------------------------------------------------+
  void smma()
  {
  double sum=0;
  int i,k,pos=Bars-ExtCountedBars+1;
  //---- main calculation loop
  pos=Bars-MA_Period;
  if(pos>Bars-ExtCountedBars) pos=Bars-ExtCountedBars;
  while(pos>=0)
  {
  if(pos==Bars-MA_Period)
  {
  //---- initial accumulation
  for(i=0,k=pos;i<MA_Period;i++,k++)
  {
  sum+=Close[k];
  //---- zero initial bars
  ExtMapBuffer[k]=0;
  }
  }
  else sum=ExtMapBuffer[pos+1]*(MA_Period-1)+Close[pos];
  ExtMapBuffer[pos]=sum/MA_Period;
  pos--;
  }
  }
  //+------------------------------------------------------------------+
  //| Linear Weighted Moving Average |
  //+------------------------------------------------------------------+
  void lwma()
  {
  double sum=0.0,lsum=0.0;
  double price;
  int i,weight=0,pos=Bars-ExtCountedBars-1;
  //---- initial accumulation
  if(pos<MA_Period) pos=MA_Period;
  for(i=1;i<=MA_Period;i++,pos--)
  {
  price=Close[pos];
  sum+=price*i;
  lsum+=price;
  weight+=i;
  }
  //---- main calculation loop
  pos++;
  i=pos+MA_Period;
  while(pos>=0)
  {
  ExtMapBuffer[pos]=sum/weight;
  if(pos==0) break;
  pos--;
  i--;
  price=Close[pos];
  sum=sum-lsum+price*MA_Period;
  lsum-=Close[i];
  lsum+=price;
  }
  //---- zero initial bars
  if(ExtCountedBars<1)
  for(i=1;i<MA_Period;i++) ExtMapBuffer[Bars-i]=0;
  }
  //+------------------------------------------------------------------+

  这就是从MT4上面复制下来的
上海德康电子
2023-06-12 广告
ALPS Bluetooth 模块是一种支持蓝牙协议的无线通信模块,通常用于连接蓝牙设备,如手机、耳机、音箱等。ALPS Bluetooth 模块有多种类型,其中包括:1. UGZZC-G 车载用Bluetooth模块:这是一种内置蓝牙协议... 点击进入详情页
本回答由上海德康电子提供
每日最新经济知识
2012-01-05 · TA获得超过1.9万个赞
知道大有可为答主
回答量:1.3万
采纳率:56%
帮助的人:2727万
展开全部
Moving Average实际上和MACD线
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式