EA9-均线交易系统

define MAGICMA 20100604
//+------------------------------------------------------------------+
extern int 检查均线模式 = 1; //1~4 种下单方式 1 仅开仓, 2 有止损无止赢, 3 有止赢无止损, 4 有止赢也有止损
extern double 赢利目标 = 150; //
extern double 止损 = 30; //
extern double 最大风险 = 0.3; //资金控制,控制下单量
extern double 跟踪止损 = 25; //
extern int 最大开仓次数 = 3; //最多开仓次数限制
extern double 最大手数 = 0.1; //最多单仓持仓量限制
extern int 是否允许跟踪止赢 = 0; //非零就允许跟踪止赢
extern int 小时间框 = 5;
extern int 大时间框 = 15;
int 小均线周期=5,
大均线周期=30,
i,
p2,
xxx,
p1,
res;
double 手数;
datetime 最后时间; //时间控制, 仅当一个时间周期完成才检查条件
//+----------------------初始化-------------------------------------+
int init()
{
手数 = 1;
最后时间 = NULL;
return(0);
}
//+---------------------反初始化-------------------------------------+
int deinit() { return(0); }
//+---------------------主程序---------------------------------------+
int start()
{
开仓前检查子(); //开仓 平仓 条件检查 和操作
if (是否允许跟踪止赢>0) 跟踪止损设置子(); //跟踪止赢
return(0);
}
//+-------确定下单量 子函数()----------------------------------------+
double 手数最佳化子()
{
double lot =手数;
//MarketInfo(Symbol(),MODE_MINLOT); 相关信息
//MarketInfo(Symbol(),MODE_MAXLOT);
//MarketInfo(Symbol(),MODE_LOTSTEP);
lot=NormalizeDouble(最大风险 * AccountBalance()/AccountLeverage(),1); //开仓量计算
if(lot<0.1) lot=0.1; if(lot>最大手数) lot=最大手数;
return(lot);
}
//----------平买 单子函数()------------------------------------------+
void 平买子()
{
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 平卖子()
{
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 买卖平条件子() // 在这个函数时可以更改设置你的交易信号 ( 这里使用MACD 和MA 做例子)
{
double 小均线1, 小均线2, 小均线3, 大均线1, 大均线2;
小均线1= iMA(NULL,小时间框,4, 0,MODE_SMA,PRICE_MEDIAN,1); 小均线2= iMA(NULL,小时间框,4, 0,MODE_SMA,PRICE_MEDIAN,2); 小均线3= iMA(NULL,小时间框,4, 0,MODE_SMA,PRICE_MEDIAN,3); 大均线1= iMA(NULL,大时间框,60,0,MODE_SMA,PRICE_MEDIAN,1); 大均线2= iMA(NULL,大时间框,60,0,MODE_SMA,PRICE_MEDIAN,2);
if(大均线1>大均线2 &&小均线2<小均线3 &&小均线1>小均线2) // 买条件 大周期时间Ma在上升,小周期均线向上转折
return (1); // 返回信号值为1
if(大均线1<大均线2 &&小均线2>小均线3 &&小均线1<小均线2) // 卖条件
return (-1); // 卖信号
return (0); // 若上述信号值没有,则返回不交易信号0
}
//+---------------开仓前内容的检查 子函数()-------------------------+
int 现在买卖 = 0;
void 开仓前检查子()
{
if (Time[0] == 最后时间 ) return; // 如果现在开盘时间与最后时间不同,则将现在的开盘时间赋给最后时间
最后时间 = Time[0];
现在买卖 = 买卖平条件子(); //将变量赋为 获取买卖条件子函数的信号值
if (现在买卖 == 1) //买 先结束已卖的
平卖子();
if (现在买卖 == -1) //卖 先结束已买的
平买子();
if (TimeDayOfWeek( TimeCurrent() )==1) //如果 服务器时间的星期数为周一
{
if (TimeHour( TimeCurrent() ) <3 ) return; //且服务器的时间小时数在3点前,则不进行交易 } if (TimeDayOfWeek( TimeCurrent() )==5) { if (TimeHour( TimeCurrent() )>19 ) return; //周五晚19点后不做(服务器时间)
}
if (OrdersTotal() >= 最大开仓次数) return ; //如果已持有开仓次数达到最大,不做
if (现在买卖==0) return; //如果交易信号值为0,不交易
TradeOK(); //去下单交易
}
//+------------------去下单交易 子函数()------------------------------+
void TradeOK()
{
int 错误 ;
if (现在买卖 == 1) //买信号
{
switch (检查均线模式)
{
case 1: res=OrderSend(Symbol(),OP_BUY,手数最佳化子(),Ask,3, 0, 0, "",MAGICMA,0,Blue);break;
case 2: res=OrderSend(Symbol(),OP_BUY,手数最佳化子(),Ask,3, Ask-止损Point, 0, "",MAGICMA,0,Blue);break; case 3: res=OrderSend(Symbol(),OP_BUY,手数最佳化子(),Ask,3, 0, Ask+赢利目标Point, "",MAGICMA,0,Blue);break;
case 4: res=OrderSend(Symbol(),OP_BUY,手数最佳化子(),Ask,3, Ask-止损Point, Ask+赢利目标Point, "",MAGICMA,0,Blue);break;
default : res=OrderSend(Symbol(),OP_BUY,手数最佳化子(),Ask,3, 0, 0, "",MAGICMA,0,Blue);break; } if (res <=0) { 错误=GetLastError(); if(错误==134) Print("错误134 :没钱了!! "); if(错误==135) RefreshRates(); // 价格已发生变化 } Sleep(5000); return ;
}
if (现在买卖 == -1) //卖信号出现
{
switch (检查均线模式)
{
case 1: res=OrderSend(Symbol(),OP_SELL,手数最佳化子(),Bid,3, 0, 0, "",MAGICMA,0,Red); break;
case 2: res=OrderSend(Symbol(),OP_SELL,手数最佳化子(),Bid,3, Bid+止损Point, 0, "",MAGICMA,0,Red); break; case 3: res=OrderSend(Symbol(),OP_SELL,手数最佳化子(),Bid,3, 0, Bid-赢利目标Point,"",MAGICMA,0,Red); break;
case 4: res=OrderSend(Symbol(),OP_SELL,手数最佳化子(),Bid,3, Bid+止损Point, Bid-赢利目标Point,"",MAGICMA,0,Red); break;
default : res=OrderSend(Symbol(),OP_SELL,手数最佳化子(),Bid,3, 0, 0, "",MAGICMA,0,Red); break; } if (res <=0) { 错误=GetLastError(); if(错误==134) Print("错误134 :没钱了!!!! "); if(错误==135) RefreshRates(); // 价格已发生变化,再刷新一下数据 } Sleep(5000); //等待5秒 return ;
}
}
//+---------------------//跟踪止损 子函数---------------------------------------------+
void 跟踪止损设置子()
{
bool 修改 = false;
for (int i=0; i (跟踪止损MarketInfo(OrderSymbol(), MODE_POINT))) //开仓价格 当前止损和当前价格比较判断是否要修改跟踪止赢设置 { if (OrderStopLoss() < Bid -跟踪止损MarketInfo(OrderSymbol(), MODE_POINT))
{
修改 = OrderModify(OrderTicket(),
OrderOpenPrice(),
Bid - 跟踪止损MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(), 0, Green); } } } else if (OrderType()==OP_SELL) { if ((OrderOpenPrice() -Ask) > (跟踪止损MarketInfo(OrderSymbol(), MODE_POINT))) //开仓价格 当前止损和当前价格比较判断是否要修改跟踪止赢设置
{
if ((OrderStopLoss()) > (Ask + 跟踪止损MarketInfo(OrderSymbol(), MODE_POINT))) { 修改 = OrderModify(OrderTicket(), OrderOpenPrice(), Ask + 跟踪止损MarketInfo(OrderSymbol(),MODE_POINT),
OrderTakeProfit(),
0,
Tan);
}
}
}
}
}
//+------------------------------------------------------------------+