根据R-Breaker原理琢磨出来的代码,实测效果不太理想,收益率偏小。有需求的小伙伴可以拷贝优化。
void OpenOrder(){
double a =0.2 ;
double b =0.5 ;
double c= 0.04;
double d= 0.3;
double Highs = High[iHighest(NULL,PERIOD_D1,MODE_HIGH,0,0)];//获取当天的最高价
double Lows = Low[iHighest(NULL,PERIOD_D1,MODE_LOW,0,0)];//获取当天的最低价
double Closes = Low[iHighest(NULL,PERIOD_D1,MODE_CLOSE,0,0)]; //前一级别的收盘价
double SellSetup = Highs + a*(Closes - Lows);//观察卖出价
double BuySetup = Lows - a*(Highs - Closes);//观察买入价
double SellEnter = b*(Highs+Lows)+c*(Highs-Lows);//反转卖出价
double BuyEnter = b*(Highs+Lows)+c*(Highs-Lows);//反转买入价
double SellBreak = BuySetup - d * (SellSetup - BuySetup);//突破卖出价*/
double BuyBreak = SellSetup + d * (SellSetup - BuySetup);//突破买入价
Print("突破买入价:"+BuyBreak);
Print("突破卖出价:"+SellBreak);
//统计订单
int buys=0,sells=0,signal=0;
bool result;
for(i=0; i<=OrdersTotal()-1; i++)
{
result=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
{
buys++;
}
if(OrderType()==OP_SELL)
{
sells++;
}
}
}
int position_long = buys;
int position_short = sells;
double THigh = High[iHighest(NULL,PERIOD_D1,MODE_HIGH,0,0)];//获取当天的最高价
double TLow = Low[iHighest(NULL,PERIOD_D1,MODE_LOW,0,0)];//获取当天的最低价
//突破策略
if(position_long == 0 && position_short ==0){
//在空仓的情况下,如果盘中价格超过突破买入价,则采取趋势策略,即在该点位开仓做多
if(Close[0] > BuyBreak){
o_rs = OrderSend(Symbol(),OP_BUY,lots,Ask,3,0,0,"RBreaker",Magic,0,clrGreen);
Print("空仓,盘中价格超过突破买入价: 开仓做多");
if(o_rs == false)Print("盘中价格超过突破买入价,开仓失败,错误:"+DoubleToString(GetLastError()));
//在空仓的情况下,如果盘中价格跌破突破卖出价,则采取趋势策略,即在该点位开仓做空
}else if(Close[0] < SellBreak){
o_rs = OrderSend(Symbol(),OP_SELL,lots,Bid,3,0,0,"RBreaker",Magic,0,clrRed);
Print("空仓,盘中价格跌破突破卖出价: 开仓做空");
}
//设置止损条件
}else{
//有持仓时,反转策略:
//多仓条件下
if(position_long && OrdersTotal()<2){
if(THigh > SellSetup && Close[0]<SellEnter){
/*多头持仓,当日内最高价超过观察卖出价后,
盘中价格出现回落,且进一步跌破反转卖出价构成的支撑线时,
采取反转策略,即在该点位反手做空*/
CloseOrder(1);
o_rs = OrderSend(Symbol(),OP_SELL,lots,Bid,3,0,0,"RBreaker",Magic,0,clrRed);
Print("空多头持仓,当日内最高价超过观察卖出价后跌破反转卖出价: 反手做空");
if(o_rs == false)Print("盘中价格超过破卖出价,开仓失败,错误:"+DoubleToString(GetLastError()));
}
}else if(position_short && OrdersTotal()<2){
if(TLow <BuySetup && Close[0]>BuyEnter){
/* 空头持仓,当日内最低价低于观察买入价后,
盘中价格出现反弹,且进一步超过反转买入价构成的阻力线时,
采取反转策略,即在该点位反手做多
*/
CloseOrder(0);
o_rs = OrderSend(Symbol(),OP_BUY,lots,Ask,3,0,0,"RBreaker",Magic,0,clrGreen);
Print("空头持仓,当日最低价低于观察买入价后超过反转买入价: 反手做多");
if(o_rs == false)Print("当日最低价低于观察买入价后超过反转买入价,反手做多开仓失败,错误:"+DoubleToString(GetLastError()));
}
}
}
if(Hour()==23 && Minute()==54){
CloseOrder(0);
CloseOrder(1);
}
}
void CloseOrder(int type){
for(i=0; i<=OrdersTotal()-1; i++)
{
o_rs=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderType() == OP_BUY && type==1){
orderclosebuy(i,OrderLots());
}else{
orderclosebuy(i,OrderLots());
}
}
}