您现在的位置: 比特财富网 >> 财经 >  >> 外匯
一個帶注釋的完整的EA基礎構架【源碼】
外_匯_邦 WaiHuiBang.com

希望學習EA編程的朋友,可以參考如下我們提供的源碼【帶注釋】

這個EA例子的交易邏輯是:

N日高點 N日低點,超過高點做空,低過低點做多。www.emoneybtc.com

帶止損 止盈 及移動止損的處理部分。

如果你能細心研究掌握此EA的設計邏輯,基本可以入門MQL的實戰編程了。

還是那句老話:自己多動腦,多做實驗!

源碼如下:

#property copyright "Copyright ?2007, FXunion.com." //指標版權信息
#property link. "http://www.FXunion.com" //指標聯系的網站鏈接
//=====可調參數部分==============
#define Magic 20090101 //預定義的常量 Magic用於後面程序裡的開倉動作時標記在訂單裡面的一個符號,用於區別其他EA程序下的單 防止混亂
extern int N=50; //參數 後面程序裡用它作為N根K線的數量
extern int SL=100;//參數 後面程序裡下單的時候用這個設置的點數作為入場時訂單的止損價格。
extern int TrailingStop=30;//參數 後面程序裡用這個作為移動止損的點數設置
extern double 每單手數=0.1;//參數 表示後面下單的倉位的大小
extern int 滑點偏移點數=3;//參數 表示下單時 服務器端的價格與當前看到的價格相差的范圍,如果在此范圍內,則允許以服務器端的價格成交
//----全局變量===================
int Tick;//用於記錄訂單的唯一編號
double StopLost;//用於記錄止損

//========主函數部分開始============
int start()//主函數 沒來一個價格這個函數就運行一次
{
int Ticket; //局部變量 用於記錄每次下單後的狀態,用於判斷下單動作是否成功,如果不成功則做相應處理和提示
int rderTypeNow=GetOrderTypeHolding();//通過自定義函數得到當前持倉單的交易類型 買 賣
//自定義函數中做了處理,如果沒有發現當前有持倉 則返回-1
if (OrderTypeNow==-1)//空倉階段 -1表示沒有持倉的狀態
{
if (TradeOrNo(1))//多單入場條件 自定義函數TradeOrNo(1)參數1 表示針對多單的方向進行判斷是否滿足入場條件
{
Ticket=OrderSend(Symbol(),OP_BUY,每單手數,Ask,滑點偏移點數,Ask-SL*Point,0,"",Magic,0,0);//多單入場
//Ticket表示入場動作的執行結果,如果小於0表示入場動作失敗
if(Ticket<0)
{
Print("多單入場失敗"+GetLastError());
return(0); //推出本次start函數的執行
}
}else
if (TradeOrNo(2))//空單入場條件
{
Ticket=OrderSend(Symbol(),OP_SELL,每單手數,Bid,滑點偏移點數,Bid+SL*Point,0,"",Magic,0,0);
if(Ticket<0)
{
Print("空單入場失敗"+GetLastError());
return(0);
}
}
return;
}else//===============持倉階段===========================
{
switch(OrderTypeNow)
{
case OP_BUY://多單持倉情況下,滿足空單入場條件
if (TradeOrNo(2))
{
if(OrderClose(Tick,OrderLots(),Bid,滑點偏移點數)==false)//平掉多單持倉單
{
Print("翻轉發生 多頭平倉失敗"+GetLastError());
return;
}else//平倉後,反手建立空單
{
Ticket=OrderSend(Symbol(),OP_SELL,每單手數,Bid,滑點偏移點數,Bid+SL*Point,0,"",Magic,0,0);
if(Ticket<0)
{
Print("空單反手建倉失敗"+GetLastError());
return(0);
}
}
}else //判斷移動止損
{
if (Ask>StopLost+2*TrailingStop*Point)
{
OrderModify(Tick,OrderOpenPrice(),StopLost+TrailingStop*Point,0,0,CLR_NONE);
return;
}
}
break;
case OP_SELL:
if (TradeOrNo(1))
{
if(OrderClose(Tick,OrderLots(),Ask,滑點偏移點數)==false)//平掉空單持倉單
{
Print("翻轉發生 空頭平倉失敗"+GetLastError());
return;
}else//平倉後,反手建立多單
{
Ticket=OrderSend(Symbol(),OP_BUY,每單手數,Ask,滑點偏移點數,Ask-SL*Point,0,"",Magic,0,0);
if(Ticket<0)
{
Print("多單反手建倉失敗"+GetLastError());
return(0);
}
}
}else //判斷移動止損
{
if (Bid<StopLost-2*TrailingStop*Point)
{
OrderModify(Tick,OrderOpenPrice(),StopLost-TrailingStop*Point,0,0,CLR_NONE);
return;
}
}
break;
}
return;
}

return(-1);
}
//=================自定義函數部分======================================
int GetOrderTypeHolding()//從最近持倉單提取訂單類型,如果沒有持倉單,則認為是止贏出場或程序剛開始運行返回-1
{int Type=-1;
//int temptime=0;
for(int i=OrdersTotal()-1;i>=0;i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic )
{
Type=OrderType();
Tick=OrderTicket();
StopLost=OrderStopLoss();
}
}
return(Type);
}
//======================================================
bool TradeOrNo(int Type)//判斷當前指定方向的入場條件是否成立
{
double NHigh=High[iHighest(Symbol(),0,MODE_HIGH,N,2)];
double NLow=Low[iLowest(Symbol(),0,MODE_LOW,N,2)];
switch(Type)
{
case 1://判斷多單入場條件是否成立
if (Close[1]>NHigh)//做多條件成立
{
return(true);
}
break;
case 2:
if (Close[1]<NLow)//做空條件成立
{
return(true);
}
break;
}
return(false);
}

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