| 以文本方式查看主题 - 金字塔客服中心 - 专业程序化交易软件提供商 (http://weistock.com/bbs/index.asp) -- 公式模型编写问题提交 (http://weistock.com/bbs/list.asp?boardid=4) ---- [原创]请问如何把MT4的MACD单线指标写在金字塔里面呢? (http://weistock.com/bbs/dispbbs.asp?boardid=4&id=88471) | |
| --  作者:chenqishui -- 发布时间:2015/12/15 21:33:34 -- [原创]请问如何把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 #include <MovingAverages.mqh> //--- indicator settings #property  indicator_separate_window #property  indicator_buffers 2 #property  indicator_color1  Silver #property  indicator_color2  Red #property  indicator_width1  2 //--- indicator parameters input int InpFastEMA=12;   // Fast EMA Period input int InpSlowEMA=26;   // Slow EMA Period input int InpSignalSMA=9;  // Signal SMA Period //--- indicator buffers double    ExtMacdBuffer[]; double    ExtSignalBuffer[]; //--- right input parameters flag bool      ExtParameters=false; //+------------------------------------------------------------------+ //| 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);   } //+------------------------------------------------------------------+ //| 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);   } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //|                                                  MACD Sample.mq4 | //|                   Copyright 2005-2014, MetaQuotes Software Corp. | //|                                              http://www.mql4.com | //+------------------------------------------------------------------+ #property copyright   "2005-2014, MetaQuotes Software Corp." #property link        "http://www.mql4.com" input double TakeProfit    =50; input double Lots          =0.1; input double TrailingStop  =30; input double MACDOpenLevel =3; input double MACDCloseLevel=2; input int    MATrendPeriod =26; //+------------------------------------------------------------------+ //|                                                                  | //+------------------------------------------------------------------+ void OnTick(void)   {    double MacdCurrent,MacdPrevious;    double SignalCurrent,SignalPrevious;    double MaCurrent,MaPrevious;    int    cnt,ticket,total; //--- // initial data checks // it is important to make sure that the expert works with a normal // chart and the user did not make any mistakes setting external  // variables (Lots, StopLoss, TakeProfit,  // TrailingStop) in our case, we check TakeProfit // on a chart of less than 100 bars //---    if(Bars<100)      {       Print("bars less than 100");       return;      }    if(TakeProfit<10)      {       Print("TakeProfit less than 10");       return;      } //--- to simplify the coding and speed up access data are put into internal variables    MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);    MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);    SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);    SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);    MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);    MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);    total=OrdersTotal();    if(total<1)      {       //--- no opened orders identified       if(AccountFreeMargin()<(1000*Lots))         {          Print("We have no money. Free Margin = ",AccountFreeMargin());          return;         }       //--- check for long position (BUY) possibility       if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&           MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)         {          ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);          if(ticket>0)            {             if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                Print("BUY order opened : ",OrderOpenPrice());            }          else             Print("Error opening BUY order : ",GetLastError());          return;         }       //--- check for short position (SELL) possibility       if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&           MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)         {          ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);          if(ticket>0)            {             if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))                Print("SELL order opened : ",OrderOpenPrice());            }          else             Print("Error opening SELL order : ",GetLastError());         }       //--- exit from the "no opened orders" block       return;      } //--- it is important to enter the market correctly, but it is more important to exit it correctly...       for(cnt=0;cnt<total;cnt++)      {       if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))          continue;       if(OrderType()<=OP_SELL &&   // check for opened position           OrderSymbol()==Symbol())  // check for symbol         {          //--- long position is opened          if(OrderType()==OP_BUY)            {             //--- should it be closed?             if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&                 MacdCurrent>(MACDCloseLevel*Point))               {                //--- close order and exit                if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))                   Print("OrderClose error ",GetLastError());                return;               }             //--- check for trailing stop             if(TrailingStop>0)               {                if(Bid-OrderOpenPrice()>Point*TrailingStop)                  {                   if(OrderStopLoss()<Bid-Point*TrailingStop)                     {                      //--- modify order and exit                      if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))                         Print("OrderModify error ",GetLastError());                      return;                     }                  }               }            }          else // go to short position            {             //--- should it be closed?             if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&                 MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))               {                //--- close order and exit                if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))                   Print("OrderClose error ",GetLastError());                return;               }             //--- check for trailing stop             if(TrailingStop>0)               {                if((OrderOpenPrice()-Ask)>(Point*TrailingStop))                  {                   if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))                     {                      //--- modify order and exit                      if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))                         Print("OrderModify error ",GetLastError());                      return;                     }                  }               }            }         }      } //---   } //+------------------------------------------------------------------+ | |
| --  作者:chenqishui -- 发布时间:2015/12/15 21:39:03 -- 都没人回答 | |
| --  作者:jinzhe -- 发布时间:2015/12/16 8:37:48 -- 系统有自带的MACD, 如果上面有特别之处需要做全部翻译的,请解释一下上面的代码 | |
| --  作者:chenqishui -- 发布时间:2015/12/16 12:05:04 -- 系统自带的是双线的MACD 上面的代码是MT4单线MACD的代码 我想要在金字塔写单线的MACD代码 | |
| --  作者:chenqishui -- 发布时间:2015/12/16 12:54:24 -- [原创] 
 | |
| --  作者:jinzhe -- 发布时间:2015/12/16 13:10:33 -- 请解释一下双线和单线的区别。并注释一下上面的代码 | |
| --  作者:chenqishui -- 发布时间:2015/12/16 13:43:08 --  双线就是有两条线快线慢线     单线就是只有一条线 | |
| --  作者:chenqishui -- 发布时间:2015/12/16 13:45:28 -- 我就是看不懂这个指标代码才发帖的 | |
| --  作者:jinzhe -- 发布时间:2015/12/16 13:45:49 -- 金字塔里面有diff和dea两条线,用户看一下是哪条线是不需要的 | |
| --  作者:jinzhe -- 发布时间:2015/12/16 13:46:23 -- http://www.weistock.com/bbs/dispbbs.asp?boardid=2&Id=31614&page=3 用户的图并没有显示出来,按照链接进行发图 |