您现在的位置: 比特财富网 >> 财经 >  >> 外匯
MetaTrader編程入門
歡迎訪問 外 匯 邦 WWW.WaiHuiBang.com

MetaTrader編程入門教程(0)
  ----指標文件構成


例1

//+--------------------------------------------------
//雙些線後是單行注釋,用於注解,自用說明。www.emoneybtc.com/*和*/包起來實現多行注釋,記錄自己的說明介紹,編程使用記錄等
//MQL4語言基本服從C語言的規則-----------注意目前MetaEditor處理不好多字節代碼,所以不要在代碼中使用中文和中文空格-------------+
//每個指標文件只是至少包括三個部分(1)property 和參數,數組聲明,(2)初始化函數nit(), (3)主函數start()
//property 是各種說明信息
//最重要必須的是這三種,(1)說明指標將畫在價格窗口還是獨立的窗口
//(2)有多少個(1~7)儲存指標數據的數組,(3)說明對應將畫指標的繪畫顏色,編號1~7
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
//---- 可設置的參數,可根據需要,由使用者設置
extern int MA_Period=13;
extern int MA_Shift=0;
extern int MA_Method=2;
extern int MA_Price = 6;
/*  MA_Method =
MODE_SMA 0 Simple moving average,
MODE_EMA 1 Exponential moving average,
MODE_SMMA 2 Smoothed moving average,
MODE_LWMA 3 Linear weighted moving average.
*/
/*  MA_Price =
PRICE_CLOSE 0 Close price.
PRICE_OPEN 1 Open price.
PRICE_HIGH 2 High price.
PRICE_LOW 3 Low price.
PRICE_MEDIAN 4 Median price, (high+low)/2.
PRICE_TYPICAL 5 Typical price, (high+low+close)/3.
PRICE_WEIGHTED 6 Weighted close price, (high+low+close+close)/4.
*/
//數組,儲存指標數據
double Buffer0[];

//| 初始化准備函數,裝入時調用一次
int init()
  {
//-設置編號為0的線的線形等參數, 0~6,對應indicator_color1~7
   SetIndexStyle(0,DRAW_LINE);
//---- 設置編號為0的線 與數組的對應關系, 0~6
   SetIndexBuffer(0,Buffer0);
   return(0);
  }

int start()   //指標計算主函數,每次計算調用
  {
  ma();
   return(0);
  }

//自定義函數,這裡只是直接使用庫函數實現MA, 若你自己計算,可設計任何指標   
void ma()
  {
   int  pos=Bars; 
//Bars = Number of bars in the current chart.當前窗口中的蠟燭數
   while(pos>=0)
     {
      Buffer0[pos]=iMA(NULL,0,MA_Period,MA_Shift,MA_Method,MA_Price,pos);
     pos--;
     }
  }
//+--------------------------------------------------
例2
//+--------------------------------------------------

#property indicator_separate_window
#property indicator_buffers 7
#property indicator_color1 Red
#property indicator_color2 Yellow
#property indicator_color3 Blue
#property indicator_color4 Green
#property indicator_color5 Gray
#property indicator_color6 SkyBlue
#property indicator_color7 Tan

extern int MA_Period=13;
extern int MA_Shift=0;
extern int MA_Method=2;
extern int MA_Price = 6;


double Buffer0[];
double Buffer1[];
double Buffer2[];
double Buffer3[];
double Buffer4[];
double Buffer5[];
double Buffer6[];
//----

int init()
  {
//-設置編號為0的線的線形等參數, 0~6,對應indicator_color1~7
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexStyle(4,DRAW_LINE);
   SetIndexStyle(5,DRAW_LINE);
   SetIndexStyle(6,DRAW_LINE);
//---- 設置編號為0的線 與數組的對應關系, 0~6
   SetIndexBuffer(0,Buffer0);
   SetIndexBuffer(1,Buffer1);
   SetIndexBuffer(2,Buffer2);
   SetIndexBuffer(3,Buffer3);
   SetIndexBuffer(4,Buffer4);
   SetIndexBuffer(5,Buffer5);
   SetIndexBuffer(6,Buffer6);
   return(0);
  }

//
int start()   //指標計算主函數,每次計算調用
 {
  ma();
  ma1();
  return(0);
 }


void ma()
  {
   int  pos=Bars;  

   while(pos>=0)
     {
      Buffer0[pos]=iMA(NULL,0,MA_Period,MA_Shift,MA_Method,MA_Price,pos);
      Buffer1[pos]=iMA(NULL,0,MA_Period*2,MA_Shift,MA_Method,MA_Price,pos);
      Buffer2[pos]=iMA(NULL,0,MA_Period*3,MA_Shift,MA_Method,MA_Price,pos);
    pos--;
     }
  }
void ma1()
  {
   int  pos=Bars; 

   while(pos>=0)
     {
      Buffer3[pos]=iMA(NULL,0,MA_Period*4,MA_Shift,MA_Method,MA_Price,pos);
      Buffer4[pos]=iMA(NULL,0,MA_Period*5,MA_Shift,MA_Method,MA_Price,pos);
      Buffer5[pos]=iMA(NULL,0,MA_Period*6,MA_Shift,MA_Method,MA_Price,pos);
      Buffer6[pos]=iMA(NULL,0,MA_Period*7,MA_Shift,MA_Method,MA_Price,pos);
     pos--;
     }
  }

MetaTrader編程入門(1)--智能交易系統基礎

//+------------------------------------------------------------------+
//|                                       Designed by OKwh, China     |
//|                           Copyright  2006, OKwh  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright  2006,  OKwh  "
#property link      ""
#define MAGICMA  200610011231
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
extern int whichmethod = 1;   //1~4 種下單方式
extern  double TakeProfit = 100; 
extern   double StopLoss = 20;
extern double MaximumRisk        = 0.3;
extern  double TrailingStop =25;
extern   int maxOpen = 3;   //最多持倉限制
extern   int maxLots = 5;   //最多單倉限制
extern  int bb = 0;           //非零就跟蹤止贏
extern double MATrendPeriod=26;//使用26均線

int  i, p2, xxx,p1, res;
double Lots;
datetime lasttime;
int init()    //初始化
{
 Lots = 1;
 lasttime = NULL;
 return(0);
}
int deinit()  { return(0); } //反初始化
//| expert start function
int start()
{
  CheckForOpen();
  if (bb>0)   CTP();    //跟蹤止贏
  return(0);
}
//+------------------------------------------------------------------+
double LotsOptimized()    //確定下單量,開倉調用
{
  double lot=Lots;
  int    orders=HistoryTotal();     // history orders total
  int    losses=0;                  // number of losses orders without a break
  //MarketInfo(Symbol(),MODE_MINLOT);
  //MarketInfo(Symbol(),MODE_MAXLOT);
  //MarketInfo(Symbol(),MODE_LOTSTEP);
  lot=NormalizeDouble(MaximumRisk * AccountBalance()/AccountLeverage(),1);
  if(lot<0.1) lot=0.1;
  if(lot>maxLots) lot=maxLots;
  return(lot);
}

//平倉持有的買單
void CloseBuy()
{
  if (OrdersTotal( )  > 0 )  
  {
    for(i=OrdersTotal()-1;i<0;i++)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
     if(OrderType()==OP_BUY)
     {
      OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
      Sleep(5000);
     }
    }
  }
}
//平倉持有的賣單
void CloseSell()
{
  if (OrdersTotal( )  > 0 )  
  {
    for(i=OrdersTotal()-1;i<0;i++)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
     if(OrderType()==OP_SELL)
      {
       OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
       Sleep(5000);
       }
    }
  }
}
//判斷是否買或賣或平倉
int buyorsell()   //在這個函數計算設置你的交易信號
  {
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   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);
 if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious      &&  MaCurrent>MaPrevious)
   return (1); // 買  Ma在上升,Macd在0線上,並且兩線上交叉
 if(MacdCurrent>0 && MacdCurrentSignalPrevious
       && MaCurrent    return (-1);  // 賣
 return (0); //不交易
}
int nowbuyorsell = 0;
void CheckForOpen()
{
 if (Time[0] == lasttime ) return; //每時間周期檢查一次
 lasttime = Time[0];
 nowbuyorsell = buyorsell(); //獲取買賣信號
 
 if (nowbuyorsell == 1) //買 先結束已賣的
     CloseSell();
 if (nowbuyorsell == -1) //賣 先結束已買的
      CloseBuy();
  if (TimeDayOfWeek(CurTime()) == 1)
   {
    if (TimeHour(CurTime()) < 3 ) return; //周一早8點前不做
   }
  if (TimeDayOfWeek(CurTime()) == 5)
   {
     if (TimeHour(CurTime()) > 19 ) return; //周五晚11點後不做
    }

 if (OrdersTotal( ) >= maxOpen)  return ;  
//如果已持有開倉數達到最大,不做
 if (nowbuyorsell==0) return;   //不交易
 TradeOK();   //去下單交易
}
void TradeOK()   //去下單交易
{
int error ;
if (nowbuyorsell == 1) //買
   {
      switch (whichmethod)
      {
      case 1:   res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);break;
      case 2:   res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-StopLoss*Point,0,"",MAGICMA,0,Blue); break;
      case 3:   res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,Ask+TakeProfit*Point,"",MAGICMA,0,Blue);break;
      case 4:   res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MAGICMA,0,Blue);break;
      default :  res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);break;
      }
      if (res <=0)
      {
       error=GetLastError();
      if(error==134)Print("Received 134 Error after OrderSend() !! ");             // not enough money
      if(error==135) RefreshRates();   // prices have changed
      }
      Sleep(5000);
      return ;   
   }
if (nowbuyorsell == -1) //賣
    {
      switch (whichmethod)
      {
      case 1:   res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); break;
      case 2:   res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+StopLoss*Point,0,"",MAGICMA,0,Red);  break;
      case 3:   res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,Bid-TakeProfit*Point,"",MAGICMA,0,Red); break;
      case 4:   res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",MAGICMA,0,Red);  break;
      default : res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); break;
      }
      if (res <=0)
      {
      error=GetLastError();
      if(error==134) Print("Received 134 Error after OrderSend() !! ");            // not enough money
      if(error==135) RefreshRates();   // prices have changed
      }
      Sleep(5000);
       return ;   
    }
}

void CTP()     //跟蹤止贏
{
 bool  bs = false;
  for (int i = 0; i < OrdersTotal(); i++)
  {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
    if (OrderType() == OP_BUY)
    {
      if ((Bid - OrderOpenPrice()) > (TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT)))
      {
        if (OrderStopLoss() < Bid - TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT))
        {
          bs = OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(),0, Green);
        }
      }
    }
    else if (OrderType() == OP_SELL)
    {
      if ((OrderOpenPrice() - Ask) > (TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT)))
      {
        if ((OrderStopLoss()) > (Ask + TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT)))
        {    
          bs = OrderModify(OrderTicket(), OrderOpenPrice(),
            Ask + TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(),0, Tan);
  }
      }
    }
  }
}
MT編程入門教程(2)----指標畫哪裡?價格窗口還是獨立窗口?

其實,都可以,不過是坐標的規格化,使得它們在相近的數據范圍,就可以畫在一起。
看你自己的習慣。畫在價格窗口,方便和價格同時感受。

//+本例展示了如何把MA轉換後畫到獨立窗口,同樣也可以把獨立窗口的指標改畫在價格窗口
//要達到這些目的,需要考慮兩個方面 1 估計數據的范圍,以確定以什麼為單位? 2 確定坐標偏移,也就是確定坐標零點。
//目的就是讓你要畫的多條線在同樣的數值范圍,這樣才能同時畫出,達到參考目的
//比如-1000到+1000和0到+4這樣兩套數據要變換後才能在同圖畫出,
//轉換方法復習中學數學直角坐標系的縮放和平移部分-------------------------+

// 共畫2條線
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Yellow

// Parameter
// MA-Properties
extern double MovingFast     = 7;  
extern   double MovingSlow     = 13;  
extern   double MovingSlow02     = 13;  
extern   int MaM=2;
extern   int MaP=2;
extern   int MaM0=3;
extern   int MaP0=3;

extern   int range1 = 11;
extern   int range2 = 4;

int i;

// Buffer
//// 共畫2條線,用2個數組存儲線數據
double bufferMA1[];
double bufferMA2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                 |
//+------------------------------------------------------------------+
int init()
{

//// 設置2條線的順序編號,畫法,對應數組,
  SetIndexStyle( 0, DRAW_LINE );
  SetIndexBuffer( 0, bufferMA1 );
  SetIndexStyle( 1, DRAW_LINE );
  SetIndexBuffer( 1, bufferMA2 );
  return(0);
}
int deinit() {   return(0);}
int start()
{
double Buffer10,Buffer11,Buffer20,Buffer21,Buffer30, Buffer31;
int countedBars = IndicatorCounted();
  //---- check for possible errors
if ( countedBars < 0 )   { return(-1);   }
if ( countedBars > 0 ) { countedBars--; }
int   barsToCount = Bars - countedBars;
for ( int i = barsToCount; i >= 0; i-- )
{
  //// 開始計算
  Buffer20 = iMA(NULL,0,MovingFast,0,MaM,MaP, i) ;//MovingFast
  Buffer30 = iMA(NULL,0,MovingSlow,0,MaM,MaP, i) ;//MovingSlow
  Buffer21 = iMA(NULL,0,MovingFast,0,MaM,MaP, i+range1) ;
  Buffer31 = iMA(NULL,0,MovingSlow02,0,MaM,MaP, i+range2) ;
  //賦值給數組以便畫線,使用Point使得坐標以點為單位,保證本指標對不同貨幣的一致y軸單位和視覺效果
  bufferMA1[i] = MathRound((Buffer20-Buffer21)/Point);
  bufferMA2[i] = MathRound((Buffer30-Buffer31)/Point);
}
return(0);
}
上面把兩個MA的差值畫在獨立窗口,當然若把差值再加上一個MA,就可以畫在價格窗口。
MA及其各種變化是最常用的指標基礎。MA一般常用來替代價格本身 再做進一步計算。

如改
#property indicator_chart_window
......
  Buffer10 = iMA(NULL,0,MovingFast*6,0,MaM,MaP, i)
  bufferMA1 = MathRound(Buffer20-Buffer21)+Buffer10 ;
  bufferMA2 = MathRound(Buffer30-Buffer31)+Buffer10 ;
.........

就可以把它們跌加到價格上畫了。

你只需修改Buffer10 ,Buffer20, Buffer21 Buffer30, Buffer31為你需要的,在考慮一下數據范圍坐標問題,你可以畫任意的指標了。

使用timeframes參數可獲得其它時間周期的數據。
使用Symbol( ) 可獲得當前貨幣對的名稱。
使用Point可獲得當前貨幣對的點值。

MT編程入門教程(3)----設計開發指標和自動交易系統的注意事項(個人觀點,僅供參考)

一、 指標的本質和用途:

交易的本質,最基本的交易是一對買賣(有些交易商運行多次部分平倉,有些運行交易間相關聯如一個平倉是另一個開倉的條件等),利用交易生存期間的價格變化贏利或虧損,可以看出,一個基本的交易有五個要素(1)倉位大小,(2)建倉價格,(3)平倉價格,(4)開倉時間,(5)平倉時間。基本的交易活動交易圍繞這5個要素展開,綜合考慮贏利和虧損的可能而進行,其中只有(1)是自己可完全控制的,其它要素決策的依據信息如市場價格、時間演化、其它(政治經濟氣候需求等)影響的相互復雜作用而不斷變化。對於你們這類大多數交易者,所能獲得的信息只有兩個方面(1)市場本身的價格和時間歷史,(2)公開安排的新聞發布,一般均基於此進行交易(當然這裡不考慮個人的什麼靈感)。這兩個方面也就是技術分析和基本面分析的基礎。

指標之所以需要是因為市場價格和時間變動是不斷變化的過程,動態變化是其基本特征,其中的復雜程度超出了人類的精確認知能力,難以精確的使用自然科學使用的那種基於重現和必然的分析方法。人基本上出於大腦對價格時間圖的形象形狀的直覺感知進行判斷分析的。形象形狀的直覺感知方法事實上是大腦對輪廓形狀、方向趨勢、快慢力度、長短高低、躍變累積等特征的提取能力。鑒於此,所謂指標應需而生,目的就是提煉突出這些特征。基礎信息就是相關的時間序列和價格序列,如移動平均指標就是相鄰相近某數量價格數值的權重加和平均,其中使用的數值就是價格因素的貢獻,價格數值的數目或者說對應的時間坐標就是時間因素,這樣用一種數學方法處理選取的價格因素和時間因素得到一個或一系列新的數值,畫出圖得到新的形象以幫助人獲得跟明確清晰的感覺。傳統上時間信息被當作簡單的等間隔整數序列來使用。只有個別如周期分析較多考慮了時間因素。

無論什麼指標,實際都是借助或復雜或簡單的數學方法對輪廓形狀、方向趨勢、快慢力度、長短高低、躍變累積等特征提取。認識到這一點,就再不會為那些激動人心的命名而激動(當然有些人喜歡激動,喜歡靈感,喜歡玄妙,而我自己,無奈由於長期的職業訓練,只會用清晰的已知的數理化去表示或近似表示那模糊變動的東西,以實現可操作,喪失了以模糊表達模糊只可意會不可言傳的能力了)。

二、指標開發:

借助或復雜或簡單的數學方法對輪廓形狀、方向趨勢、快慢力度、長短高低、躍變累積等特征提取時,人們一般大多從模仿修改已有指標開始。開發中要注意(1)重點要表示那類特征;(2)在單邊趨勢、突變、振蕩三類情況下的表現如何;(3)優點和缺點;(4)什麼情況下最有效,什麼情況下無效;(5)時間特征如何。

三、交易系統

交易系統要解決很多問題,二不僅是寫個公式那麼簡單,因為它要考慮很多因素。(1)時間周期和貨幣種類;(2)對各種單邊趨勢、突變、振蕩的適合程度;(3)如何降低失效的損失;(4)如何優化市場成長為活的系統。

編程要考慮(1)判斷下單策略;(2)止贏止損跟蹤策略;(3)倉位控制;(4)平倉策略;(5)動態調整策略。

事實上,即便是相同指標,不同人使用也是不同的結果。而且成功持續穩定贏利的實際交易往往需要多指標的綜合使用和判斷。

每個指標和交易系統都有自己的長處和不足,每個交易者還有自己的個性和交易經驗和習慣,它們的合適配合,才會增加贏利的可能,否則,任何指標或交易系統都毫無價值。

完全自動的交易系統可能還沒有,可能現實中能生存的是指標、交易系統和人的某種組合,以相互補充和動態調整,以適應市場甚至市場的規律也是變化的這個基本點。

鑒於我國外匯交易正逐漸擴展,並且很可能不會是股市那要的發展過程,受朋友邀請,業余指導一個小團隊的對外匯交易策略的研究設計工作,篩選出的有效指標將會在eBay和淘寶銷售,初步先研發MT的指標,適當時候推出基於互聯網的訓練程序。我將毫無保留任何有效的技術,因為我明白,那些是工具,即使同樣的工具有不同人使用也會產生不同的結果,那種認為給大眾公開技術指標交易系統就會讓自己失敗的說法是好無根據證據的。市場實際是不斷變化甚至進化的,任何技術實際是表達表示它的某部分特征而已,而實際交易是人綜合處理各種特征的結果。

歡迎訪問 外 匯 邦 WWW.WaiHuiBang.com
  • 上一个财经:
  • 下一个财经:
    • 股票術語--放量

          放量,量是成交量,成交量比前一段時間成交明顯放大。<  例如,昨天全天的成交量是1億,今天忽然變成4億了,

    • 新手炒股需要准備什麼?必備工具大全之二

      凡事預則立,不預則廢!炒股也是這樣,畢竟它是一個可以賺錢的地方,不可能平白無故給你送一筆錢吧,天底下好像沒有這等好事,所以,提前做

    • 炒外匯入門:應該從哪裡開始

      外_匯_邦 WaiHuiBang.com 很多的投資者認為炒外匯應該首先從掌握外匯知識入門,我卻有不同的觀點。炒外匯應從了解外匯風險開

    • 征信不良能找人弄掉嗎?

      最佳答案: 現在市面上確實有征信修復公司,還有不少假廣告摻雜其中,建議的話還是不要相信。除非是銀行或

    • 淘寶賬號可以同時兩個手機登錄嗎?

      最佳答案: 一個淘寶賬號可兩個手機同時登錄,使用也正常,但在付款時若需要使用支付寶就很不方便了,因為

      風險提示:比特財富網的各種信息資料僅供參考,不構成任何投資建議,不對任何交易提供任何擔保,亦不構成任何邀約,不作為任何法律文件,投資人據此進行投資交易而產生的後果請自行承擔,本網站不承擔任何責任,理財有風險,投資需謹慎。
    比特財富網 版權所有 © www.emoneybtc.com