希望學習EA編程的朋友,可以參考如下我們提供的源碼【帶注釋】
這個EA例子的交易邏輯是:
N日高點 N日低點,超過高點做空,低過低點做多。www.emoneybtc.com
帶止損 止盈 及移動止損的處理部分。
如果你能細心研究掌握此EA的設計邏輯,基本可以入門MQL的實戰編程了。
還是那句老話:自己多動腦,多做實驗!
源碼如下:
#property copyright "Copyright ?2012, 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);
}
首先要明白的一點:價值投資是不變的當進入價值投資的時代,我們今天看很多的創業者發的項目書,不再看他背後有多少站台的人,因為那沒用。要換個思
研究數字貨幣,對於美國來說,可能僅僅是一種改善美元經濟體系的一種錦上添花,而對於中國來說,這是一次重大的歷史機會,如果錯過這次機會,無論中
截至目前,國內還未出現統一的個人信息保護立法,對於數據安全和隱私保護,尚留空白。 全國政協委員、原中國保監會副主席周延禮正
新公布的文件顯示,摩根大通(JPMorgan Chase)正尋求為一種使用分布式賬本的系統申請專利,該系統可以促進和協調金融交易。在美國專
過去一年大家都在談論比特幣、挖礦,今年大家又都在談論區塊鏈、去中心化,可我發現一個非常有意思的現象,這些是什麼?我身邊所有的人:老師、同學
為什麼銀行存款利息那麼低,仍然有很多人願意把錢存銀行?為什麼余額寶預期收益率並不算高,卻有那麼多人爭相搶購?為什麼股市風險那麼大,
外_匯_邦 WaiHuiBang.com 對於虧損的原因,我做過長時間的思考,最終得出的結論 是因為 貪
股票價格是股票在市場上出售的價格。它是具體價格及其波動受制於各種經濟、政治等方面的因素,並受到投資心理和交易技術等的影響。概括起來說,影響股
最佳答案: 閒魚上架1688的商品可以按照以下方法來操作:1、首先,先在1688平台上找到自己想賣的
最佳答案: 如果工作之余想利用空閒時間兼職做點副業,可以選擇做以下的副業:1、通過寫軟文投稿來賺錢。