您现在的位置: 比特财富网 >> 财经 >  >> 外匯
外匯智能EA交易示例
外_匯_邦 WaiHuiBang.com

  交易原理:

Long (BUY) entry – MACD指標在零以下, 從下至上並且穿過低端的信號線。www.emoneybtc.com

 

Short (SELL) entry – MACD 指標在零以上,從上至下並且穿過頂端的信號線

贏利上限的執行,追蹤止損的執行或當穿過 MACD 的信號線 (MACD 指標在零以上,從上至下並且穿過頂端的信號線)。

 贏利上限的執行,追蹤止損的執行或當穿過 MACD 的信號線 (MACD指標在零以下, 從下至上並且穿過低端的信號線)。

重要提示:從我們的分析上排除一些 MACD 指標微不足道的變化 (圖表上的小 ‘山丘’),

我們介紹一種補充檢測‘山丘’大小的辦法如下:指標的大小應該在最低價的最後5個單元

(5*Point,對於 USD/CHF = 0.0005 和 USD/JPY = 0.05).

步驟 1 – 編寫智能交易的描述

步驟 2 –創建程序的基本結構

測試智能交易的源代碼將只占據一點位置,但是還是有些量經常很難抓住,特別是我們不是專業的編成工作者 – 另外,我們不需要這些描述,不是嗎? 

一個標准智能交易的結構構想,讓我們看看以下部分的描述:

1、初始變量
所有使用在智能交易程序中的變量必須按照 MetaQuotes Language 4 要求的指定。這就是為什麼我們在程序的開始插入初始變量的原因

extern double TakeProfit = 50; extern double Lots = 0.1; extern double TrailingStop = 30; extern double MACDOpenLevel=3; extern double MACDCloseLevel=2; extern double MATrendPeriod=26;

MetaQuotes語言4 是需要“外部變量”輔助的。外部變量可以從外部設定,在智能交易程序源代碼設定之後不可以修改。

提供一個額外的靈活性。在我們的程序中,MATrendPeriod 變量作為外部變量指定。 在程序開始我們插入這個變量。

extern double MATrendPeriod=26;

 

2、初始數據檢測

 

檢測圖表,圖表中的柱數

檢測外部變量值:標准手, S/L, T/P, T/S

 

3、對於快速數據通道設置內部變量

 

4、檢測交易終端 – 是無效的嗎?如果是:

 

檢測: 賬戶上的可用保證金…

可能是看漲倉位 (BUY)?

開設看漲倉位並退出

可能是賣空倉位 (SELL)?

開設賣空倉位並退出

退出智能交易····

 

5、周期循環檢驗先前開倉

 

如果是看漲倉位

應該平倉?

應該重新設定追蹤止損?

如果是賣空倉位

應該平倉?

應該重新設定追蹤止損?

 

返回的結果很簡單,只有4種。

現在讓我們嘗試一步一步地區完成列出的計劃:

這樣一步一步地編寫我們的智能交易…

 

 

初始變量
所有使用在智能交易程序中的變量必須按照 MetaQuotes Language 4 要求的指定。這就是為什麼我們在程序的開始插入初始變量的原因extern double TakeProfit = 50; extern double Lots = 0.1; extern double TrailingStop = 30; extern double MACDOpenLevel=3; extern double MACDCloseLevel=2; extern double MATrendPeriod=26;
MetaQuotes語言4 是需要“外部變量”輔助的。外部變量可以從外部設定,在智能交易程序源代碼設定之後不可以修改。提供一個額外的靈活性。在我們的程序中,MATrendPeriod 變量作為外部變量指定。 在程序開始我們插入這個變量。extern double MATrendPeriod=26;檢測初始數據該代碼部分通常使用在所有的智能交易中。因為是一個標准的檢測:
// 初始數據檢測 // 確認智能交易運行正常非常重要 //圖表和用戶設置不能出現任何錯誤 // 變量(Lots, StopLoss, TakeProfit, // TrailingStop) 我們的情況需要檢測TakeProfit // 圖表中少於100 柱 if(Bars<100) { Print("少於 100柱"); return(0); } if(TakeProfit<10) { Print("贏利少於10"); return(0); // 檢測TakeProfit }對於數據的快速通道設置內部變量在源代碼中經常需要注意指標值或計算值。簡化代碼和數據放置在內部變量中。int start() { double MacdCurrent, MacdPrevious, SignalCurrent; double SignalPrevious, MaCurrent, MaPrevious; int cnt, ticket, total; // 簡化代碼 //數據放置在內部變量中 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);
現在,用 iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0)代替,您可以在源代碼中使用 MacdCurrent。 
檢測交易終端 –是空的嗎?如果是:在我們的智能交易中,我們僅使用開單和操作掛單。不過,使更安全,我們來認識一種 對於先前定單交易終端檢測:total=OrdersTotal(); if(total<1) {
return(0); } 
檢測: 賬戶上的可用保證金…在分析市場狀況之前,檢測你的賬戶上可用的自由保證金可以開倉。if(AccountFreeMargin()<(1000*Lots)) { Print("沒有資金.自由保證金 = ", AccountFreeMargin()); return(0); }可能是看漲倉位 (BUY)?進入看漲倉位的條件: MACD 低於零, 向上並且穿過信號線向下。這就是我們在 MQL4中描述的 (注意我們在指標上的業務值保存在先前的變量中):
// 盡可能檢測看漲倉位 (BUY) if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious 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 開單 : ",OrderOpenPrice()); } else Print("錯誤 opening BUY order : ",GetLastError()); return(0); }附加的檢驗‘山丘’的大小上面已經給出了描述。 MACDOpenLevel變量是一個用戶指定變量它不可能改變程序文本,但是卻有很大的靈活性。在程序開始我們插入這個變量的描述。可能是賣空倉位(SELL)?進入賣空倉位的條件: MACD高於零,向上並且穿過信號線向下。注解如下:
// 盡可能的檢測賣空倉位(SELL) if(MacdCurrent>0 && MacdCurrentSignalPrevious && MacdCurrent>(MACDOpenLevel*Point)&& MaCurrent { 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 開單 : ",OrderOpenPrice()); } else Print("錯誤SELL定單開倉 : ",GetLastError()); return(0); } 
周期循環檢驗先前開倉//進入市場的正確性非常重要 // 但是更重要的是安全退出... for(cnt=0;cnt { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && // 檢驗開倉 OrderSymbol()==Symbol()) // 檢驗貨幣對 {
“cnt” – ” 是一個循環的變量必須在程序開始指定如下:int cnt = 0;如果是看漲倉位if(OrderType()==OP_BUY) // 打開看張倉位 {我們停止操作符。}
應該平倉嗎?退出看漲倉位的條件: MACD 穿過信號線, MACD 高於零,向上並穿過信號線向下。if(MacdCurrent>0 && MacdCurrentSignalPrevious && MacdCurrent>(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平倉 return(0); //退出 }應該重設追蹤止損馬?我們設定追蹤止損只有在倉位盈利已經超過追蹤水平點,並且新的止損水平點好於先前的水平。// 檢測追蹤止損 if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss() { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop, OrderTakeProfit(),0,Green); return(0); } } }
如果是賣空倉位else //賣空倉位 {
關閉所有殘留開倉。} } } return(0); }應該平倉嗎?退出賣空倉位的條件: MACD穿過信號線,MACD低於零,向上並且穿過信號線向下。
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); //平倉 return(0); // 退出 }應該重設追蹤止損嗎?我們設定追蹤止損只有在倉位盈利已經超過追蹤水平點,並且新的止損水平點好於先前的水平。// 檢測追蹤止損 if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop, OrderTakeProfit(),0,Red); return(0); } } }這樣一步一步地編寫我們的智能交易…

步驟3 – 集中程序的結果代碼

讓我們打開智能交易的設定:使用按鈕打開”屬性…”菜單。在窗口內指定運行參量的外部設定:

從先前部分集中全部代碼:

//+------------------------------------------------------------------+ //| MACD Sample.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.funion.com | //+------------------------------------------------------------------+ extern double TakeProfit = 50; extern double Lots = 0.1; extern double TrailingStop = 30; extern double MACDOpenLevel=3; extern double MACDCloseLevel=2; extern double MATrendPeriod=26; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int start() { double MacdCurrent, MacdPrevious, SignalCurrent; double SignalPrevious, MaCurrent, MaPrevious; int cnt, ticket, total; // 檢測初始化數據 // 確定智能交易在圖表中運行正常非常重要 // 用戶在外部變量交易中不會產生任何錯誤 // 外部變量 (標准手數, 止損,贏利, // 追蹤止損) 在這種情況下,我們檢測圖表中贏利水平要小於100 柱 if(Bars<100) { Print("少於 100柱"); return(0); } if(TakeProfit<10) { Print("贏利少於10"); return(0); // 檢測贏利水平 } // 簡化代碼和加速通道 // 數據被放置在內部變量中 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) { // 沒有指定開單 if(AccountFreeMargin()<(1000*Lots)) { Print("沒有資金. 自由保證金 = ", AccountFreeMargin()); return(0); } // 盡可能檢測看漲倉位 (BUY)  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 定單開倉 : ",OrderOpenPrice()); } else Print("錯誤BUY定單開倉 : ",GetLastError()); return(0); } // 盡可能檢測賣空倉位(SELL) 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 定單開倉 : ",OrderOpenPrice()); } else Print("錯誤SELL定單開倉 : ",GetLastError()); return(0); } return(0); } // 正確進入市場很重要, // 但正確退出市場更重要... for(cnt=0;cnt<total;cnt++) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && // 檢測開倉 OrderSymbol()==Symbol()) // 檢測貨幣對 { if(OrderType()==OP_BUY) // 看漲倉位開倉 { // 需要平倉嗎? if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平倉 return(0); // 退出 } // 檢測追蹤止損 if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green); return(0); } } } } else // 去賣空倉位 { // 需要平倉嗎? if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point)) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // 平倉 return(0); //退出 } // 檢測追蹤止損 if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red); return(0); } } } } } } return(0); } // 結束

對於最後智能交易的確認,只需要指定外部變量值 “Lots = 1″, “Stop Loss (S/L) = 0″ (not used), “Take Profit (T/P) = 120″ (appropriate for one-hour intervals), “Trailing Stop (T/S) = 30″. 當然,你可以使用自己的值。按 “編寫”按鈕,如果沒有任何錯誤信息出現 (你可以從 MetaEditor的列表中復制), 按 “保存”鍵保存智能交易。

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