
今天咱们继续说MT4自带的另一个EA:MACD Sample,是用Macd和均线两个指标配合进出场的策略。不多说了,直接上源码,有问题的小伙伴请在评论区留言。
//+------------------------------------------------------------------+
//| MACD Sample.mq4 |
//| Copyright 2005-2014, MetaQuotes Software Corp. |
//| http://www.mql4.com |
//+------------------------------------------------------------------+
#property copyright "2005-2014, MetaQuotes Software Corp."
#property link "http://www.mql4.com"
input double TakeProfit =5000; //获利=50点
input double Lots =0.1; //每次下单量=01手
input double StopLoss =400; //初始止损=40点
input double TrailingStop =500; //移动止损=50点
input double MACDOpenLevel =3; //开仓水平=3点
input double MACDCloseLevel=2; //平仓水平=2点
input int MATrendPeriod =100; //均线趋势周期
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnTick(void)
{
double MacdCurrent,MacdPrevious; //定义变量-小数型:当前MACD柱、前次MACD柱
double SignalCurrent,SignalPrevious; //定义变量-小数型:当前MACD线、前次MACD线
double MaCurrent,MaPrevious; //定义变量-小数型:当前均线、前次均线
int cnt,ticket,total; //定义变量-整数型:cnt、tickt、total
//---
// initial data checks初始条件检查
// it is important to make sure that the expert works with a normal这些参数与数值的设置,其重要性就是确保本软件能在主图中正常运行,并保障使用者不会产生错误
// chart and the user did not make any mistakes setting external
// variables (Lots, StopLoss, TakeProfit, 还可以根据我们的要求进行改变参数(如:下单量、止损,止赢、移动止损),我们这里选择止赢
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars主图中上的K线不少于100根
//---
if(Bars<100)//如果(K线数<100)
{
Print("bars less than 100"); //输出(“少于100根”)
return;
}
if(TakeProfit<10) //如果(止赢<10点)
{
Print("TakeProfit less than 10"); //输出(“止赢小于10点”)
return;
}
//--- to simplify the coding and speed up access data are put into internal variables进入加速度计算的基本编码 计算数据中的变量设置
//基本数据计算
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
//当前MACD=
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
//前次MACD=
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_SMA,PRICE_CLOSE,0);
//当前MA=
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_SMA,PRICE_CLOSE,1);
//前次MA=
//帐户资金检查
total=OrdersTotal();//总数=仓单统计
if(total<1) //如果(总数<1)
{
//--- no opened orders identified没有开仓的情况
if(AccountFreeMargin()<(1000*Lots))//如果(帐户可用资金<1000*开仓量)
{
Print("We have no money. Free Margin = ",AccountFreeMargin());//输出(“没有足够的资金,可用保证金=”,帐户可用资金)
return;
}
//--- check for long position (BUY) possibility 检查长期可能的(多头买入)方向
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
//如果(当前MACD<0 且 当前MACD>当前信号 且前次MACD<前次信号且 取绝对值(当前MACD)>开仓水平*点 且当前均线>前次均线)
//---MACD处于0轴以下(熊市)+MACD与信号形成金叉+MACD的绝对值>MACD开仓水平值*点数+均线上升--(条件:零下金叉+均线上行)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
// ticket=发送订单(当前货币对,多仓,开仓量,卖价,滑点=3,无止损,止赢=卖价+止赢*点,“简单MACD”,订单号,限挂单=0,绿色箭头显示)
if(ticket>0)//如果(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
//如果(定单选择(订单索引,选择模式,来自交易的订单-开单/挂单))
Print("BUY order opened : ",OrderOpenPrice());
//输出(“买单开仓价:”,开仓价)
}
else
Print("Error opening BUY order : ",GetLastError());
//否则,输出(“多单开仓错误:”,错误信息)
return;
}
//--- check for short position (SELL) possibility检查短期可能的(空头)方向
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
//如果(当前MACD>0 且 当前MACD<当前信号 且前次MACD>前次信号且 当前MACD>MACD水平*点 且当前MAC<前次MA)
//----MACD处于0轴以上(牛市)+MACD与信号形成死叉+MACD值>MACD开仓水平值*点数+均线下降--(条件:零上死叉+均线下行)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
// ticket=发送订单(当前货币对,空仓,开仓量,买价,滑点=3,无止损,止赢=买价-止赢*点,“简单MACD”,订单号,限挂单,红色箭头显示)
if(ticket>0)//如果(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
//如果(定单选择(订单索引,选择模式,来自交易的订单-开单/挂单))
Print("SELL order opened : ",OrderOpenPrice());
//输出(“卖单开仓价:”,开仓价)
}
else
Print("Error opening SELL order : ",GetLastError());
//否则,输出(“空单开仓错误:”,错误信息)
}
//--- exit from the "no opened orders" block
return;
}
//--- it is important to enter the market correctly,这对于正确进行买卖是重要的but it is more important to exit it correctly但更重要的是对于正确退出市场...
//仓单与挂单检查
for(cnt=0;cnt<total;cnt++) //循环查找(cnt=0;cnt<总数;cnt=cnt+1)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))//订单选择(订单索引号,查找模式,来自交易的订单-开单/挂单)
continue;
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) // check for symbol
{
//--- —开仓是长期方向
if(OrderType()==OP_BUY)
//如果(订单类型=多单)
{
//---查检是否应用平仓
//--- 多头平仓
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
MacdCurrent>(MACDCloseLevel*Point))
//如果(当前MACD>0 且 当前MACD<当前信号且 前次MACD>前次信号 且当前MACD>MACD平仓水平*点)
//--MACD处于0轴上方+MACD与信号线形成死叉+当前MACD>MACD平仓水平*点
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
Print("OrderClose error ",GetLastError());
//--- 平仓(订单索引,订单持仓量,买价,滑点=3,紫罗兰色箭头)
return;
}
//--- 多头移动止损并挂单修改
if(TrailingStop>0)//如果(移动止损>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
//如果(买价-订单开仓价>移动止损*点)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
//如果(订单止损价<买价-移动止损*点)
{
//---修改订单(订单索引,开仓价,买价-移动止损*点,止赢价,限价单,绿色箭头显示)
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
else //否则 –就到短期方向
{
//空头平仓
//--- /如果(当前MACD<0 且 当前MACD>当前信号且 前次MACD<前次信号 且 MACD与信号线形成金叉 且取绝对值(当前MACD)>MACD平仓水平*点)
//----MACD处于0轴下方+MACD与信号出现金叉+当前MACD绝对值>MACD平仓点
if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
{
//---平仓(订单编号,订单仓量,卖价,滑点=3,紫罗兰色箭头显示)
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
Print("OrderClose error ",GetLastError());
return;
}
//--空头移动止损并挂单修改
if(TrailingStop>0)//如果(移动止损>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))//如果(订单开仓价-卖价>移动止损*点)
{
//如果(订单止损价>卖价+移动止损*点 或 订单止损=0)---订单止损=0,代表不设止损价
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
//--- 修改订单(订单编号,开仓价,卖价+移动止损*P,止赢,限价单,红色箭头显示)
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
}
}
}
//+------------------------------------------------------------------+ 上一篇 MT4自带的均线EA注释详解
下一篇 潘多拉魔盒统计













1条评论
2025-10-24 06:49:58 回复TA