此文旨在为希望学习EA编程的读者提供一份参考源码(带注释)。该EA的交易逻辑包括:在N日高点做空,N日低点做多,并具备止损、止盈及移动止损的处理。深入理解这份源码的设计逻辑,将有助于你入门MQL的实战编程。记得多思考,多实践检验!
//+——————————————————————+
//| 基础框架模板.mq4 |
//| Copyright © 2009-2024, http://www.QChaos.com |
//| https://www.qchaos.com/ |
//+——————————————————————+
property copyright "Copyright © 量化混沌, http://www.qchaos.com"
property link "https://www.qchaos.com"
property version "2.01"
property description "———————————————"
property description "EA、指标公式分享"
property description "EA、指标编写业务承接"
property description "———————————————"
property description "更多资源,关注公众号:量化程序"
property description "微 信:QChaos001"
property description "手机号:134-8068-5281"
property description "———————————————"
//=====可调参数部分==============
define Magic 888888 // Magic常量,用于区分订单
extern int N=50; // N根K线的数量
extern int SL=100; // 止损设置的点数
extern int TrailingStop=30; // 移动止损的点数
extern double LotSize=0.1; // 下单的仓位大小
extern int Slippage=3; // 滑点偏移点数
//—-全局变量===================
int Tick; // 用于记录订单的唯一编号
double StopLost; // 用于记录止损
//========主函数部分开始============
int start() // 主函数,每个价格更新都会执行一次
{
int Ticket; // 用于记录下单状态
int OrderTypeNow=GetOrderTypeHolding(); // 获取当前持仓单的交易类型
if (OrderTypeNow==-1) // 无持仓状态
{
if (TradeOrNo(1)) // 多单入场条件
{
Ticket=OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, Ask-SLPoint, 0, "", Magic, 0, 0);
if(Ticket<0)
{
Print("多单入场失败" + GetLastError());
return(0);
}
}
else if (TradeOrNo(2)) // 空单入场条件
{
Ticket=OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, Bid+SLPoint, 0, "", Magic, 0, 0);
if(Ticket<0)
{
Print("空单入场失败" + GetLastError());
return(0);
}
}
return;
}
else // 持仓阶段
{
switch(OrderTypeNow)
{
case OP_BUY:
// 其余逻辑处理…
break;
case OP_SELL:
// 其余逻辑处理…
break;
}
return;
}
return(-1);
}
//=================自定义函数部分======================================
int GetOrderTypeHolding() // 从持仓单提取订单类型
{
int Type=-1;
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;
}