/*
Система на неделю.mq4
© 2003-2006 Mandor ®
E-mail: mandorr@gmail.com
Результат работы советника не зависит от используемого периода
Во вторник в начале часа 2 GMT выставляются отложенные ордера
Цена открытия ордера Buy Stop равна текущей цене плюс 50 пипсов
Цена открытия ордера Sell Stop равна текущей цене минус 50 пипсов
Стоп лосс ордеров Buy Stop и Sell Stop равно 100 пипсов
Перенос стоп лосса на 30 пипсов от текущей цены перед важными новостями -> пока вручную
Во пятницу в начале часа 21 GMT все ордера ракрываются (для FIBO Groupe Ltd. в начале часа 20 GMT)
UseMM: использовать Money Management
PercentMM: процент от свободных средств для вычисления новой позиции
MinLots: минимально допустимый размер позиции у дилера
MinStop: минимально допустимое расстояние от текущей цены до отложенного ордера, стоп лосса или тейк профита у дилера
ShiftGMT: время дилера минус время по Гринвичу (для Alpari = +1, для FXTeam = +2, для FIBO = +1, для LiteForex = +2)
*/
// Parametres
extern int StartDayOfWeek=2;
extern int StartHour=2;
extern int StopDayOfWeek=5;
extern int StopHour=21;
extern int Range=50;
extern int TakeProfit=0;
extern int StopLoss=100;
extern double Lots=0.1;
extern bool UseMM=false;
extern int PercentMM=20;
extern double MinLots=0.1;
extern int MinStop=11;
extern int ShiftGMT=1;
// Variables
int result;
int err;
int i;
int time;
int hour;
int day_of_week;
int set_buy_stop=0;
int set_sell_stop=0;
double range;
double volume;
double price;
double loss;
double profit;
// New quotations are received
void start()
{
if (Bars<100 || IsTradeAllowed()==false) return;
if (Range<=0 || ShiftGMT<-23 || ShiftGMT>23) return;
if (StartDayOfWeek<1 || StartDayOfWeek>5 || StartHour<=0 || StartHour>23) return;
if (StopDayOfWeek<1 || StopDayOfWeek>5 || StopHour<=0 || StopHour>23) return;
time=CurTime()-ShiftGMT*3600;
hour=TimeHour(time);
day_of_week=TimeDayOfWeek(time);
if (day_of_week==StartDayOfWeek && hour==StartHour)
{
if (set_buy_stop==0 && TotalBuyStop()==0)
{
if (SetBuyStop()>0) {set_buy_stop=1; return;}
}
if (set_sell_stop==0 && TotalSellStop()==0)
{
if (SetSellStop()>0) {set_sell_stop=1; return;}
}
}
else
{
set_buy_stop=0;
set_sell_stop=0;
}
if (day_of_week==StopDayOfWeek && hour==StopHour)
{
if (CloseAllOrders()>0) return;
}
}
// Set a Buy Stop order
int SetBuyStop()
{
result=0;
volume=LotsCounting();
if (Range<MinStop) range=MinStop*Point; else range=Range*Point;
price=Ask+range;
loss=0; if (StopLoss>0) loss=price-StopLoss*Point;
profit=0; if (TakeProfit>0) profit=price+TakeProfit*Point;
if (OrderSend(Symbol(),OP_BUYSTOP,volume,price,0,loss,profit,"Open by expert",0,0)>0) result=1;
else {err=GetLastError(); Print("Set a pending order failed with error #",err);}
return(result);
}
// Set a Sell Stop order
int SetSellStop()
{
result=0;
volume=LotsCounting();
if (Range<MinStop) range=MinStop*Point; else range=Range*Point;
price=Bid-range;
loss=0; if (StopLoss>0) loss=price+StopLoss*Point;
profit=0; if (TakeProfit>0) profit=price-TakeProfit*Point;
if (OrderSend(Symbol(),OP_SELLSTOP,volume,price,0,loss,profit,"Open by expert",0,0)>0) result=1;
else {err=GetLastError(); Print("Set a pending order failed with error #",err);}
return(result);
}
// Close opened positions & deleting of pending orders
int CloseAllOrders()
{
result=0;
for (i=0;i<OrdersTotal();i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if (OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUY)
{
if (OrderClose(OrderTicket(),OrderLots(),Bid,2)) result=1;
else {err=GetLastError(); Print("Close of opened order failed with error #",err);}
break;
}
if (OrderType()==OP_SELL)
{
if (OrderClose(OrderTicket(),OrderLots(),Ask,2)) result=1;
else {err=GetLastError(); Print("Close of opened order failed with error #",err);}
break;
}
if (OrderType()==OP_BUYSTOP || OrderType()==OP_SELLSTOP)
{
if (OrderDelete(OrderTicket())) result=1;
else {err=GetLastError(); Print("Delete of pending order failed with error #",err);}
break;
}
}
return(result);
}
// Buy Stop count
int TotalBuyStop()
{
result=0;
for(i=0;i<OrdersTotal();i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if (OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUYSTOP ) result++;
}
return(result);
}
// Sell Stop count
int TotalSellStop()
{
result=0;
for(i=0;i<OrdersTotal();i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if (OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_SELLSTOP) result++;
}
return(result);
}
// Account lots
double LotsCounting()
{
volume=Lots;
if (UseMM) volume=NormalizeDouble((PercentMM*AccountFreeMargin()/100000),1);
if (volume<MinLots) volume=MinLots;
return(volume);
}
// End