【宽客EA】Disaster - MetaTrader 4EA
它是基于观察,发现在图表上价格与移动平均经常交叉并会移动更远一段距离,它在价格等于MA(590-M1)的地方设置挂单(限价买入或者限价卖出),当价格改变时,MA的值改变,订单也会被修改,直到订单被触发。当订单被触发后,就不会修改。退出 – 通过较紧的获利和止损。一旦EA发现没有订单了,它就会设置一个新的挂单。因为经常有价格只是接触了MA然后就不会进一步发展了,我选择了足够小的止损 - 30个点,获利水平=70.
//+------------------------------------------------------------------+
//| disaster.mq4 |
//| jay|
//| http://www.geekquant.com |
//+------------------------------------------------------------------+
#property copyright "jay"
#property link "http://www.geekquant.com"
extern double StopLoss = 30;
extern double TakeProfit = 70;
extern int MAPER = 590;
int Magic = 54321;
datetime TradeTimeOut;
int init()
{
return(0);
}
int deinit()
{
return(0);
}
int start()
{
// информация по предыдущему ордеру
int preOrderType=-1,preTicket=0;
double prePriceOpen=0,prePriceClose=0,preTP=0,preSL=0;
bool STOPLEVELCHECK;
int i,j,k,l,ticket,err,nBars=0,numOrdersCount=0,numSLCount=0;
int total=OrdersTotal();
double Lot=0.0,PriceStop=0.0,PriceLimit=0.0,Price=0.0;
if (TradeTimeOut==0) TradeTimeOut=CurTime();
if ( TradeTimeOut > CurTime() ) return(0);
if ( Bars < 1000) return(0);
// обработка истории - поиск ордеров
total=OrdersHistoryTotal();
// начинаем выборку с конца, после найденного последнего ордера прерываем дальнейший поиск
for (i=total;i>=0;i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) continue;
if (OrderMagicNumber() == Magic)
{
preOrderType=OrderType();
preTicket=OrderTicket();
prePriceOpen=OrderOpenPrice();
preTP=OrderTakeProfit();
preSL=OrderStopLoss();
prePriceClose=OrderClosePrice();
// последний ордер нашли, больше нам ничего не нужно
break;
}
}
// выборка текущих позиций
total=OrdersTotal();
for (i=0;i<total;i++)
{
if (OrderSelect(i,SELECT_BY_POS)==false) continue;
if (OrderMagicNumber() == Magic)
{
numOrdersCount++;
// если цена отложенного ордера отличается от необходимого - модифицируем
STOPLEVELCHECK = true;
if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
{
Price=NormalizeDouble(iMA(NULL,PERIOD_M1,MAPER,0,MODE_SMA,PRICE_CLOSE,0),Digits);
if (OrderType()==OP_BUYSTOP)
{
PriceStop=Price - MarketInfo(Symbol(),MODE_SPREAD)*Point - StopLoss * Point;
PriceLimit=Price + TakeProfit * Point;
STOPLEVELCHECK = (Price-Ask) > MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
if (preOrderType==OP_BUY && (prePriceOpen-prePriceClose)>0)
{
PriceLimit=Price + 0.5 * TakeProfit * Point;
}
}
if (OrderType()==OP_SELLSTOP)
{
PriceStop=Price + StopLoss * Point;
PriceLimit=Price - MarketInfo(Symbol(),MODE_SPREAD)*Point - TakeProfit * Point;
STOPLEVELCHECK = (Bid-Price) > MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
if (preOrderType==OP_SELL && (prePriceOpen-prePriceClose)<0)
{
PriceLimit=Price - MarketInfo(Symbol(),MODE_SPREAD)*Point - 0.5*TakeProfit * Point;
}
}
if (NormalizeDouble(OrderOpenPrice()-Price,Digits)!=0
&& NormalizeDouble(OrderStopLoss()-PriceStop,Digits)!=0
&& NormalizeDouble(OrderTakeProfit()-PriceLimit,Digits)!=0 && STOPLEVELCHECK)
{
OrderModify(OrderTicket(),Price, PriceStop, PriceLimit ,0,CLR_NONE);
}
}
Price=NormalizeDouble(iMA(NULL,PERIOD_M1,MAPER,0,MODE_SMA,PRICE_CLOSE,0),Digits);
if (OrderType()==OP_BUY && Minute()/5==NormalizeDouble(Minute()/5,0) )
{
if (NormalizeDouble(Bid-OrderStopLoss()-70*Point,Digits)>0)
{
//OrderModify(OrderTicket(),OrderOpenPrice(),,0,0,CLR_NONE);
}
}
if (OrderType()==OP_SELL && Minute()/5==NormalizeDouble(Minute()/5,0) )
{
if (NormalizeDouble(OrderStopLoss()-Ask-70*Point,Digits)>0)
{
//OrderModify(OrderTicket(),OrderOpenPrice(),, 0,0,CLR_NONE);
}
}
}
}
Lot=NormalizeDouble(0.4*AccountFreeMargin()/1000,1);
if (Lot>MarketInfo(Symbol(),MODE_MAXLOT)) Lot=MarketInfo(Symbol(),MODE_MAXLOT);
//if (Lot>5) Lot=5.0;
if (Lot<MarketInfo(Symbol(),MODE_MINLOT)) return(0);
if (numOrdersCount==0) // если открытых ордеров нет - ставим отложенные ордера
{
Price=NormalizeDouble(iMA(NULL,PERIOD_M1,MAPER,0,MODE_SMA,PRICE_CLOSE,0),Digits);
if (Bid-Price > 20 * Point)
{
ticket=OrderSend(Symbol(), OP_SELLSTOP, Lot ,
Price, 1, Price + StopLoss * Point, Price - TakeProfit * Point, "MACROS2", Magic, 0, Red);
//TradeTimeOut=TimeCurrent()+60*60*10;
}
if (Price-Ask > 20 * Point)
{
ticket=OrderSend(Symbol(), OP_BUYSTOP, Lot ,
Price+MarketInfo(Symbol(),MODE_SPREAD)*Point, 1,
Price + MarketInfo(Symbol(),MODE_SPREAD)*Point - StopLoss * Point,
Price + MarketInfo(Symbol(),MODE_SPREAD)*Point + TakeProfit * Point, "MACROS2", Magic, 0, Red);
//TradeTimeOut=TimeCurrent()+60*60*10;
}
}
return(0);
}
页:
[1]