/*
2 ордера в сутки.mq4
© 2003-2006 Mandor ®
E-mail:
mandorr@gmail.comРезультат работы советника не зависит от используемого периода
В начале часа StartHour устанавливаются новые отложенные ордера
Range: расстояние от текущей цены до цены отложенного ордера
OrderExpirationDays: время жизни отложенного ордера в днях
UseMM: использовать Money Management. Рекомендуется включить (UseMM=true)
PercentMM: процент от свободных средств для вычисления новой позиции
MinLots: минимально допустимый размер позиции у дилера
MinStop: минимально допустимое расстояние от текущей цены до отложенного ордера, стоп лосса или тейк профита у дилера
ShiftGMT: время дилера минус время по Гринвичу (для Alpari = 1, для FXTeam = 2, для FIBO = 1, для LiteForex = 2)
*/
// Parametres
extern int StartHour=13;
extern int Range=40;
extern int TakeProfit=90;
extern int StopLoss=200;
extern double Lots=0.1;
extern double OrderExpirationDays=7;
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 hour;
int set_buy_stop=0;
int set_sell_stop=0;
double volume;
double range;
double price;
double loss;
double profit;
// When new quotations are received this function is executed
void start()
{
if (Bars<100 || IsTradeAllowed()==false) return;
if (Range<=0 || ShiftGMT<-23 || ShiftGMT>23) return;
if (DeleteOldOrders()>0) return;
hour=Hour()-ShiftGMT;
if (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;
}
}
// Deleting of old pending orders
int DeleteOldOrders()
{
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 && OrderType()!=OP_SELLSTOP) continue;
if (CurTime()-OrderOpenTime()<86400*OrderExpirationDays) continue;
{
if (OrderDelete(OrderTicket())) result=1;
else {err=GetLastError(); Print("Delete of pending order failed with error #",err);}
break;
}
}
return(result);
}
// 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);
}
// 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 (TimeDay(OrderOpenTime())!=Day()) 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 (TimeDay(OrderOpenTime())!=Day()) 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