Скоро подобное будет готово для АЛОР… тружусь…
//+------------------------------------------------------------------+
//| NFP.mq4 |
//+------------------------------------------------------------------+
extern string TimeSet = "16:25"; //Время в которое происходит выставление стоп ордеров.
extern int Delta = 100, //Выше или ниже екстремумов дня
SL = 0, //Стоплосс в пунктах
TP = 150, //Тейкпрофит в пунктах
risk = 0, //Если 0 то по фиксированному лоту
NoLoss = 0, //Если 0 то нет установки безубытка
trailing = 0; //Если 0 то нет трейлинга
extern double Lot = 1; //используется только при risk = 0
extern bool OpenStop = true; //Выставлять стоп ордера при открытом ордере
extern color color_BAR = DarkBlue; //цвет инфо
//--------------------------------------------------------------------
double MaxPrice,MinPrice;
int STOPLEVEL,magic=123321,tip,TimeBarBay,TimeBarSell,LastDay;
//--------------------------------------------------------------------
int init()
{
if (TP < STOPLEVEL) TP = STOPLEVEL;
if (NoLoss < STOPLEVEL && NoLoss != 0) NoLoss = STOPLEVEL;
if (trailing < STOPLEVEL && trailing != 0) trailing = STOPLEVEL;
Comment("\nУстановленные параметры Nonfarm Payrolls "+"\n"+
"\nTimeSet " , TimeSet, "\n",
"Delta " , Delta, "\n",
"SL ", SL, "\n",
"TP " , TP, "\n",
"Lot ", DoubleToStr(Lot,2),"\n",
"risk ", risk, "\n",
"NoLoss " , NoLoss, "\n",
"trailing ", trailing);
if (TimeSet=="00:00") LastDay=1;
}
//--------------------------------------------------------------------
int start()
{
//-----------------------------------------------------------------
int bay,sel,error;
bool BUY=false,SEL=false;
for (int i=0; i<OrdersTotal(); i++)
{ if (OrderSelect(i, SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=magic) continue;
tip=OrderType();
if (tip==0) BUY = true;//есть позиция на покупку
if (tip==1) SEL = true;//есть позиция на продажу
if (tip==4) bay++;//есть ордер на покупку
if (tip==5) sel++;//есть ордер на продажу
}
}
if ((BUY||SEL)&&(bay!=0||sel!=0)) DelAllStop(); //если есть открытый ордер удаляем стоп ордера
if ( BUY||SEL)
{
if (NoLoss!=0) No_Loss(NoLoss);
if (trailing!=0) TrailingStop(trailing);
return; //если есть открытый ордер тралим или в бу
}
int expiration=CurTime()+(23-TimeHour(CurTime()))*3600+(60-TimeMinute(CurTime()))*60; //время закрытия стоп ордера
double TrPr,StLo;
if (risk!=0) Lot = LOT();
if (bay<1&&Hour()>13&&DayOfWeek()==5&&Day()<=7)//выставляем ордер на покупку если первая пятница месяца и нет ордера на покупку
{
MaxPrice=High[1]+NormalizeDouble(Delta*Point,Digits);
if (Ask+STOPLEVEL*Point>MaxPrice) MaxPrice = NormalizeDouble(Ask+STOPLEVEL*Point,Digits);
if (TP!=0) TrPr = NormalizeDouble(MaxPrice + TP * Point,Digits);
if (SL!=0) StLo = NormalizeDouble(MaxPrice - SL * Point,Digits);
error=OrderSend(Symbol(),OP_BUYSTOP ,Lot,MaxPrice,3,StLo,TrPr,"BUYSTOP BLD",magic,expiration,Blue);
if (error==-1) Print("Error BUYSTOP ",GetLastError()," ",Symbol()," Lot ",Lot," Price ",MaxPrice," SL ",0," TP ",TrPr," expiration ",expiration);
else TimeBarBay=TimeDay(CurTime());
}
if (sel<1&&Hour()>13&&(DayOfWeek()==5 && Day()<=7))
{
MinPrice=Low[1]-NormalizeDouble(Delta*Point,Digits);
if (Bid-STOPLEVEL*Point<MinPrice) MinPrice = NormalizeDouble(Bid-STOPLEVEL*Point,Digits);
if (TP!=0) TrPr = NormalizeDouble(MinPrice - TP * Point,Digits);
if (SL!=0) StLo = NormalizeDouble(MinPrice + SL * Point,Digits);
error=OrderSend(Symbol(),OP_SELLSTOP,Lot,MinPrice,3,StLo,TrPr,"SELLSTOP BLD",magic,expiration,Red );
if (error==-1) Print("Error SELLSTOP ",GetLastError()," ",Symbol()," Lot ",Lot," Price ",MinPrice," SL ",0," TP ",TrPr," expiration ",expiration);
else TimeBarSell=TimeDay(CurTime());
}
return(0);
}
//--------------------------------------------------------------------
void DelAllStop()
{
int tip;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if (OrderSymbol()!=Symbol()||OrderMagicNumber()!=magic) continue;
tip=OrderType();
if (tip==4||tip==5) OrderDelete(OrderTicket());
}
}
}
//--------------------------------------------------------------------
void TrailingStop(int trailing)
{
double StLo,OSL,OOP;
int tip;
bool error=true;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS))
{
tip = OrderType();
if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
{
OSL = NormalizeDouble(OrderStopLoss(),Digits);
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
if (tip==0)
{
StLo = NormalizeDouble(Bid - trailing*Point,Digits);
if (StLo < OOP) continue;
if (StLo > OSL)
error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);
}
if (tip==1)
{
StLo = NormalizeDouble(Ask + trailing*Point,Digits);
if (StLo > OOP) continue;
if (StLo < OSL || OSL==0 )
error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);
}
if (!error) Alert("Error TrailingStop ",GetLastError()," ",Symbol()," SL ",StLo);
}
}
}
}
//------------------------------------------------------------------+
double LOT()
{
double MINLOT = MarketInfo(Symbol(),MODE_MINLOT);
double LOT = AccountFreeMargin()*risk/100/MarketInfo(Symbol(),MODE_MARGINREQUIRED)/15;
if (LOT>MarketInfo(Symbol(),MODE_MAXLOT)) LOT = MarketInfo(Symbol(),MODE_MAXLOT);
if (LOT<MINLOT) LOT = MINLOT;
if (MINLOT<0.1) LOT = NormalizeDouble(LOT,2); else LOT = NormalizeDouble(LOT,1);
return(LOT);
}
//------------------------------------------------------------------+
void No_Loss(int NoLoss)
{
double OOP,OSL;
int tip;
bool error=true;
color col;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS))
{
tip = OrderType();
if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()!=magic)
{
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
OSL = NormalizeDouble(OrderStopLoss(),Digits);
if (tip==0)
{
if ((Bid-OOP)/Point>=NoLoss && OOP > OSL)
error=OrderModify(OrderTicket(),OOP,OOP,OrderTakeProfit(),0,White);
}
if (tip==1)
{
if ((OOP-Ask)/Point>=NoLoss && (OOP < OSL || OSL ==0))
error=OrderModify(OrderTicket(),OOP,OOP,OrderTakeProfit(),0,White);
}
if (!error) Alert("Error No_Loss ",GetLastError()," ",Symbol());
}
}
}
}
//------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol
if(CalculateCurrentOrders(Symbol())<=2) CheckForOpen();
}
//----
//+------------------------------------------------------------------+
МА растет и стоха ниже уровня перепроданности — покупаем. МА убывает и стох выше уровня перекупленности — продаем.
AM2