MT4自带EA:MACDSample详解
(2015-01-20 10:05:02)
标签:
股票仓位变量信号线macd |
分类: 【百万金圆】 |
MetaQuotes语言4
是需要“外部变量”辅助的。外部变量可以从外部设定,在智能交易程序源代码设定之后不可以修改。提供一个额外的灵活性。在我们的程序中,MATrendPeriod
变量作为外部变量指定。 在程序开始我们插入这个变量。
检测初始数据
该代码部分通常使用在所有的智能交易中。因为是一个标准的检测:// 初始数据检测
// 确认智能交易运行正常非常重要
//图表和用户设置不能出现任何错误
// 变量(Lots, StopLoss, TakeProfit,
// TrailingStop) 我们的情况需要检测TakeProfit
// 图表中少于100 柱
if(Bars<100)
{
Print("少于 100柱");
return(0);
}
if(TakeProfit<10)
{
Print("赢利少于10");
return(0); // 检测TakeProfit
} 对于数据的快速通道设置内部变量
在源代码中经常需要注意指标值或计算值。简化代码和数据放置在内部变量中。int start()
{
double MacdCurrent, MacdPrevious, SignalCurrent;
double SignalPrevious, MaCurrent, MaPrevious;
int cnt, ticket, total;
// 简化代码
//数据放置在内部变量中
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
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_EMA,PRICE_CLOSE,0);
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
该代码部分通常使用在所有的智能交易中。因为是一个标准的检测:// 初始数据检测
// 确认智能交易运行正常非常重要
//图表和用户设置不能出现任何错误
// 变量(Lots, StopLoss, TakeProfit,
// TrailingStop) 我们的情况需要检测TakeProfit
// 图表中少于100 柱
if(Bars<100)
{
Print("少于 100柱");
return(0);
}
if(TakeProfit<10)
{
Print("赢利少于10");
return(0); // 检测TakeProfit
} 对于数据的快速通道设置内部变量
在源代码中经常需要注意指标值或计算值。简化代码和数据放置在内部变量中。int start()
{
double MacdCurrent, MacdPrevious, SignalCurrent;
double SignalPrevious, MaCurrent, MaPrevious;
int cnt, ticket, total;
// 简化代码
//数据放置在内部变量中
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
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_EMA,PRICE_CLOSE,0);
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
现在,用iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0)代替,您可以在源代码中使用MacdCurrent。
检测交易终端 是空的吗?如果是:
在我们的智能交易中,我们仅使用开单和操作挂单。不过,使更安全,我们来认识一种 对于先前定单交易终端检测:total=OrdersTotal();
if(total<1)
{ 检测: 账户上的可用保证金
在分析市场状况之前,检测你的账户上可用的自由保证金可以开仓。if(AccountFreeMargin()<(1000*Lots))
{
Print("没有资金.自由保证金 =", AccountFreeMargin());
return(0);
} 可能是看涨仓位 (BUY)?
进入看涨仓位的条件: MACD 低于零, 向上并且穿过信号线向下。这就是我们在 MQL4中描述的 (注意我们在指标上的业务值保存在先前的变量中):// 尽可能检测看涨仓位 (BUY)
if(MacdCurrent<0 &&MacdCurrent>SignalCurrent &&
MacdPrevious
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) &&
MaCurrent>MaPrevious)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,
"macd sample",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY 开单 :",OrderOpenPrice());
}
else Print("错误 opening BUY order :",GetLastError());
return(0);
}
在我们的智能交易中,我们仅使用开单和操作挂单。不过,使更安全,我们来认识一种 对于先前定单交易终端检测:total=OrdersTotal();
if(total<1)
{ 检测: 账户上的可用保证金
在分析市场状况之前,检测你的账户上可用的自由保证金可以开仓。if(AccountFreeMargin()<(1000*Lots))
{
Print("没有资金.自由保证金 =", AccountFreeMargin());
return(0);
} 可能是看涨仓位 (BUY)?
进入看涨仓位的条件: MACD 低于零, 向上并且穿过信号线向下。这就是我们在 MQL4中描述的 (注意我们在指标上的业务值保存在先前的变量中):// 尽可能检测看涨仓位 (BUY)
if(MacdCurrent<0 &&MacdCurrent>SignalCurrent &&
MacdPrevious
MathAbs(MacdCurrent)>(MACDOpenLevel*Point) &&
MaCurrent>MaPrevious)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,
"macd sample",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY 开单 :",OrderOpenPrice());
}
else Print("错误 opening BUY order :",GetLastError());
return(0);
}
附加的检验 山丘 的大小上面已经给出了描述。 MACDOpenLevel变量是一个用户指定变量,它不可能改变程序文本,但是却有很大的灵活性。在程序开始我们插入这个变量的描述。
可能是卖空仓位(SELL)?
进入卖空仓位的条件: MACD高于零,向上并且穿过信号线向下。注解如下:// 尽可能的检测卖空仓位(SELL)
if(MacdCurrent>0 &&MacdCurrentSignalPrevious
&&
MacdCurrent>(MACDOpenLevel*Point) &&MaCurrent
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,
"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL 开单 :",OrderOpenPrice());
}
else Print("错误SELL定单开仓 :",GetLastError());
return(0);
} return(0);
} 周期循环检验先前开仓 //进入市场的正确性非常重要
// 但是更重要的是安全退出...
for(cnt=0;cnt
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&// 检验开仓
OrderSymbol()==Symbol()) // 检验货币对
{
进入卖空仓位的条件: MACD高于零,向上并且穿过信号线向下。注解如下:// 尽可能的检测卖空仓位(SELL)
if(MacdCurrent>0 &&MacdCurrentSignalPreviou
MacdCurrent>(MACDOpenLevel*Point) &&MaCurrent
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,
"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL 开单 :",OrderOpenPrice());
}
else Print("错误SELL定单开仓 :",GetLastError());
return(0);
} return(0);
} 周期循环检验先前开仓 //进入市场的正确性非常重要
// 但是更重要的是安全退出...
for(cnt=0;cnt
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL &&// 检验开仓
OrderSymbol()==Symbol()) // 检验货币对
{
“cnt” ” 是一个循环的变量必须在程序开始指定如下:
int
cnt = 0; 如果是看涨仓位if(OrderType()==OP_BUY) // 打开看张仓位
{ 应该平仓吗?
退出看涨仓位的条件: MACD 穿过信号线, MACD 高于零,向上并穿过信号线向下。if(MacdCurrent>0 &&MacdCurrentSignalPrevious &&
MacdCurrent>(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平仓
return(0); //退出
} 应该重设追踪止损马?
我们设定追踪止损只有在仓位盈利已经超过追踪水平点,并且新的止损水平点好于先前的水平。// 检测追踪止损
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,
OrderTakeProfit(),0,Green);
return(0);
}
}
}
{ 应该平仓吗?
退出看涨仓位的条件: MACD 穿过信号线, MACD 高于零,向上并穿过信号线向下。if(MacdCurrent>0 &&MacdCurrentSignalPreviou
MacdCurrent>(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //平仓
return(0); //退出
} 应该重设追踪止损马?
我们设定追踪止损只有在仓位盈利已经超过追踪水平点,并且新的止损水平点好于先前的水平。// 检测追踪止损
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,
OrderTakeProfit(),0,Green);
return(0);
}
}
}
我们停止操作符。
}
如果是卖空仓位else //卖空仓位
{ 应该平仓吗?
退出卖空仓位的条件: MACD穿过信号线,MACD低于零,向上并且穿过信号线向下。if(MacdCurrent<0 &&MacdCurrent>SignalCurrent &&
MacdPrevious(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); //平仓
return(0); // 退出
} 应该重设追踪止损吗?
我们设定追踪止损只有在仓位盈利已经超过追踪水平点,并且新的止损水平点好于先前的水平。// 检测追踪止损
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) ||(OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,
OrderTakeProfit(),0,Red);
return(0);
}
}
}
{ 应该平仓吗?
退出卖空仓位的条件: MACD穿过信号线,MACD低于零,向上并且穿过信号线向下。if(MacdCurrent<0 &&MacdCurrent>SignalCurrent &&
MacdPrevious(MACDCloseLevel*Point))
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); //平仓
return(0); // 退出
} 应该重设追踪止损吗?
我们设定追踪止损只有在仓位盈利已经超过追踪水平点,并且新的止损水平点好于先前的水平。// 检测追踪止损
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) ||(OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,
OrderTakeProfit(),0,Red);
return(0);
}
}
}
关闭所有残留开仓。
}
}
}
return(0);
} 这样一步一步地编写我们的智能交易。
}
}
return(0);
} 这样一步一步地编写我们的智能交易。
前一篇:编制自动交易系统的基本知识
后一篇:EA 常用自定义函数 汇总