extern int _MagicNumber = 1123;
extern double MAPeriod=26; //指数均线周期
extern double StopLossSpred = 100; //初始止损离均线的点数
extern double CloseSpred = 150; //后半仓止损离均线的点数
extern double Lots=0.02; //持仓,必须为偶数
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double MacdCurrent, MacdPrevious, Ma;
int cnt, ticket, total;
if(Bars<100)
{
Print("K线少于100根!");
return(0);
}
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,2);
Ma=iMA(NULL,0,MAPeriod,0,MODE_EMA,PRICE_CLOSE,0);
total=OrdersTotal();
//开单检查
if(total<1) //持仓单数小于1才开单
{
// 检查资金
if(AccountFreeMargin()<(1000*Lots))//资金大于才开单
{
Print("资金不足: ", AccountFreeMargin());
return(0);
}
// 检查开多单的可能性
if(MacdCurrent>0 && MacdPrevious<0 && Ask>Ma && Ask<=Ma+200*Point) //MACD首红且汇价位于均线上20点内做多
{
ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ma+100*Point,3,Ma-StopLossSpred*Point,0,"lbs-buy", _MagicNumber,TimeCurrent()+Period()*1440,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("开多单成功 : ",OrderOpenPrice());
}
else Print("开多单发生错误 : ",GetLastError());
return(0);
}
// 检查开空单的可能性
if(MacdCurrent<0 && MacdPrevious>0 && Bid<Ma && Bid>=Ma-200*Point) //MACD首绿且汇价位于均线下20点内做空
{
ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Ma-100*Point,3,Ma+StopLossSpred*Point,0,"lbs-sell", _MagicNumber,TimeCurrent()+Period()*1440,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("开空单成功 : ",OrderOpenPrice());
}
else Print("开空单发生错误 : ",GetLastError());
return(0);
}
return(0);
}
//减仓及平仓检查
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if ( OrderMagicNumber() != _MagicNumber ) continue;
if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) // check for symbol
{
if(OrderType()==OP_BUY) // 如果有做多单存在
{
//多单减仓检查
if(Ask-OrderOpenPrice()>=OrderOpenPrice()-OrderStopLoss() && OrderOpenPrice()>OrderStopLoss() && OrderLots()==Lots)
{
ticket=OrderClose(OrderTicket(),Lots/2,Bid,3,Violet); // 平掉一半仓位
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("多单减仓成功 : ",OrderOpenPrice());
}
else Print("多单减仓发生错误 : ",GetLastError());
return(0);
}
//修改后半仓位的止损价到盈亏平衡点
if(Ask-OrderOpenPrice()>OrderOpenPrice()-OrderStopLoss() && OrderOpenPrice()>OrderStopLoss() && OrderLots()==Lots/2)
{
ticket=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("多单盈亏平衡点修改成功 : ",OrderOpenPrice());
}
else Print("多单盈亏平衡点修改发生错误 : ",GetLastError());
return(0);
}
//根据行情发展修改剩余仓位的止损价到均线下15点
if(Ma-CloseSpred*Point>OrderStopLoss() && OrderOpenPrice()<=OrderStopLoss() && OrderLots()==Lots/2)
{
ticket=OrderModify(OrderTicket(),OrderOpenPrice(),Ma-CloseSpred*Point,OrderTakeProfit(),0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("多单止损修改成功 : ",OrderOpenPrice());
}
else Print("多单止损修改发生错误 : ",GetLastError());
return(0);
}
}
else // 如果有做空单存在
{
//空单减仓检查
if(OrderOpenPrice()-Bid>OrderStopLoss()-OrderOpenPrice() && OrderOpenPrice()<OrderStopLoss() && OrderLots()==Lots)
{
ticket=OrderClose(OrderTicket(),Lots/2,Ask,3,Violet); // 平掉一半仓位
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("空单减仓成功 : ",OrderOpenPrice());
}
else Print("空单减仓发生错误 : ",GetLastError());
return(0);
}
//修改后半仓位的止损价到盈亏平衡点
if(OrderOpenPrice()-Bid>OrderStopLoss()-OrderOpenPrice() && OrderOpenPrice()<OrderStopLoss() && OrderLots()==Lots/2)
{
ticket=OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("空单盈亏平衡点修改成功 : ",OrderOpenPrice());
}
else Print("空单盈亏平衡点修改发生错误 : ",GetLastError());
return(0);
}
//根据行情发展修改剩余仓位的止损价到均线下15点
if(Ma+CloseSpred*Point<OrderStopLoss() && OrderOpenPrice()>=OrderStopLoss() && OrderLots()==Lots/2)
{
ticket=OrderModify(OrderTicket(),OrderOpenPrice(),Ma+CloseSpred*Point,OrderTakeProfit(),0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("空单止损修改成功 : ",OrderOpenPrice());
}
else Print("空单止损修改发生错误 : ",GetLastError());
return(0);
}
}
}
}
return(0);
}用这个, |