// Стартовый период.mq4
// © 2003-2006 Mandor ®
// E-mail:
mandorr@gmail.com// Используется только период H1
// Первый стартовый период 05-08 GMT, отложенные ордера устанавливаются в 09 GMT
// Второй стартовый период 09-12 GMT, отложенные ордера устанавливаются в 13 GMT
// Отложенные ордера устанавливаются в течении часа только 1 раз
// LossFree: прибыль, при которой стоп лосс передвигается в точку безубыточности
// ShiftGMT: время торгового сервера минус время по Гринвичу
extern double Lots = 0.1;
// Для GBPUSD
// extern int TakeProfit = 120;
// extern int StopLoss = 70;
// extern int LossFree = 40;
// Для EURUSD
extern int TakeProfit = 80;
extern int StopLoss = 50;
extern int LossFree = 30;
extern int ShiftGMT = 1;
extern int MinStop = 11;
int nBuyStopSetting;
int nSellStopSetting;
// Основная функция
// Вызывается после прихода очередного тика
void start()
{
if (Bars<100 || IsTradeAllowed()==false || Period()!=PERIOD_H1) return;
if (ShiftGMT<-23 || ShiftGMT>23) return;
int nTime=Time[0]-ShiftGMT*3600;
int nHour=TimeHour(nTime);
int nDayOfWeek=TimeDayOfWeek(nHour);
if (nDayOfWeek==5) {if (nHour==22 || nHour<9) {CloseOrders(); return;}}
else {if (nHour==23 || nHour<9) {CloseOrders(); return;}}
if (SetStopLoss() >0) return;
if (SetTakeProfit()>0) return;
if (nHour==9 || nHour==13) SetOrders();
else {nBuyStopSetting=0; nSellStopSetting=0;}
}
// Закрытие всех ордеров
void CloseOrders()
{
int i, nTicket, nPrice, nSlippage;
double dLots;
nTicket=0; dLots=0; nPrice=0; nSlippage=2;
for(i=0;i<OrdersTotal();i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if (OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUY ) {nTicket=OrderTicket(); dLots=OrderLots(); nPrice=MathRound(Bid/Point); break;}
if (OrderType()==OP_SELL) {nTicket=OrderTicket(); dLots=OrderLots(); nPrice=MathRound(Ask/Point); break;}
}
if (nTicket>0) {OrderClose(nTicket,dLots,nPrice*Point,nSlippage); return;}
for(i=0;i<OrdersTotal();i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if (OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUYSTOP ) {nTicket=OrderTicket(); break;}
if (OrderType()==OP_SELLSTOP) {nTicket=OrderTicket(); break;}
}
if (nTicket>0) OrderDelete(nTicket);
}
// установка стоп лосс ордеров Buy и Sell
int SetStopLoss()
{
int i, nPrice, nBid, nAsk, nOrderType, nTicket, nOpenPrice, nStopLoss, nTakeProfit;
nTicket=0;
for (i=0;i<OrdersTotal();i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if (OrderSymbol()!=Symbol()) continue;
nOrderType=OrderType();
if (nOrderType==OP_BUY || nOrderType==OP_SELL)
{
nTicket=OrderTicket();
nOpenPrice=MathRound(OrderOpenPrice()/Point);
nStopLoss=MathRound(OrderStopLoss()/Point);
nTakeProfit=MathRound(OrderTakeProfit()/Point);
break;
}
}
if (nTicket==0) return(0);
nPrice=nStopLoss;
if (nOrderType==OP_BUY)
{
nBid=MathRound(Bid/Point);
if (nBid>nOpenPrice+LossFree)
{if (nStopLoss<nOpenPrice) nPrice=nOpenPrice;}
else if (nBid>nOpenPrice-StopLoss+MinStop)
{if (nStopLoss<nOpenPrice-StopLoss) nPrice=nOpenPrice-StopLoss;}
else
{if (nStopLoss<nBid-MinStop) nPrice=nBid-MinStop;}
}
else if (nOrderType==OP_SELL)
{
nAsk=MathRound(Ask/Point);
if (nAsk<nOpenPrice-LossFree)
{if (nStopLoss==0 || nStopLoss>nOpenPrice) nPrice=nOpenPrice;}
else if (nAsk<nOpenPrice+StopLoss-MinStop)
{if (nStopLoss==0 || nStopLoss>nOpenPrice+StopLoss) nPrice=nOpenPrice+StopLoss;}
else
{if (nStopLoss==0 || nStopLoss>nAsk+MinStop) nPrice=nAsk+MinStop;}
}
if (nStopLoss==nPrice) return(0);
OrderModify(nTicket,nOpenPrice*Point,nPrice*Point,nTakeProfit*Point,0);
return(nTicket);
}
// установка тайк профит ордеров Buy и Sell
int SetTakeProfit()
{
int i, nPrice, nBid, nAsk, nOrderType, nTicket, nOpenPrice, nStopLoss, nTakeProfit;
nTicket=0;
for (i=0;i<OrdersTotal();i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if (OrderSymbol()!=Symbol()) continue;
nOrderType=OrderType();
if (nOrderType==OP_BUY || nOrderType==OP_SELL)
{
nTicket=OrderTicket();
nOpenPrice=MathRound(OrderOpenPrice()/Point);
nStopLoss=MathRound(OrderStopLoss()/Point);
nTakeProfit=MathRound(OrderTakeProfit()/Point);
break;
}
}
if (nTicket==0) return(0);
nPrice=nTakeProfit;
if (nOrderType==OP_BUY)
{
nAsk=MathRound(Ask/Point);
if (nAsk<nOpenPrice+TakeProfit-MinStop)
{if (nTakeProfit>nOpenPrice+TakeProfit) nPrice=nOpenPrice+TakeProfit;}
else
{if (nTakeProfit>nAsk+MinStop) nPrice=nAsk+MinStop;}
}
else if (nOrderType==OP_SELL)
{
if (nBid>nOpenPrice-TakeProfit+MinStop)
{if (nTakeProfit<nOpenPrice-TakeProfit) nPrice=nOpenPrice-TakeProfit;}
else
{if (nTakeProfit<nBid-MinStop) nPrice=nBid-MinStop;}
}
if (nTakeProfit==nPrice) return(0);
OrderModify(nTicket,nOpenPrice*Point,nStopLoss*Point,nPrice*Point,0);
return(nTicket);
}
// Установка и корректировка отложенных ордеров
void SetOrders()
{
int nBid, nAsk, nSpread;
int nTicket, nOpenPrice, nMagic;
int nHighStop, nLowStop, nPrice;
int i;
string sText;
nMagic=TimeHour(Time[0]);
// количество ордеров текущего часа
int nTotalBuyStop=0,nTotalSellStop=0;
for (i=0;i<OrdersTotal();i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if (OrderSymbol()!=Symbol()) continue;
if (OrderMagicNumber( )!=nMagic) continue;
{
if (OrderType()==OP_BUYSTOP) nTotalBuyStop++;
if (OrderType()==OP_SELLSTOP) nTotalSellStop++;
}
}
// уровни для отложенных ордеров
nAsk=MathRound(Ask/Point);
nBid=MathRound(Bid/Point);
nSpread=nAsk-nBid;
nHighStop=MathRound(High[Highest(NULL,0,MODE_HIGH,4,1)]/Point)+nSpread;
nLowStop =MathRound(Low [Lowest (NULL,0,MODE_LOW ,4,1)]/Point);
nHighStop=nHighStop+5;
nLowStop =nLowStop -5;
if (nTotalBuyStop==0)
{
// установка ордера Buy Stop
if (nBuyStopSetting>0) return;
nPrice=nHighStop; if (nHighStop<nAsk+MinStop) nPrice=nAsk+MinStop;
sText="Open in "+DoubleToStr(nMagic,0)+" hour";
nTicket=OrderSend(Symbol(),OP_BUYSTOP,Lots,nPrice*Point,0,0,0,sText,nMagic,0);
return;
}
else
{
nBuyStopSetting=1;
// корректировка цены ордеров Buy Stop
nPrice=nHighStop; if (nHighStop<nAsk+MinStop) nPrice=nAsk+MinStop;
nTicket=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) continue;
nOpenPrice=MathRound(OrderOpenPrice()/Point);
if(nOpenPrice<=nPrice) continue;
nTicket=OrderTicket();
break;
}
if (nTicket>0)
{
OrderModify(nTicket,nPrice*Point,0,0,0);
return;
}
}
if (nTotalSellStop==0)
{
// установка ордера Sell Stop
if (nSellStopSetting>0) return;
nPrice=nLowStop; if (nLowStop>nBid-MinStop) nPrice=nBid-MinStop;
sText="Open in "+DoubleToStr(nMagic,0)+" hour";
nTicket=OrderSend(Symbol(),OP_SELLSTOP,Lots,nPrice*Point,0,0,0,sText,nMagic,0);
return;
}
else
{
// корректировка цены ордеров Sell Stop
nSellStopSetting=1;
nPrice=nLowStop; if (nLowStop>nBid-MinStop) nPrice=nBid-MinStop;
nTicket=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) continue;
nOpenPrice=MathRound(OrderOpenPrice()/Point);
if(nOpenPrice>=nPrice) continue;
nTicket=OrderTicket();
break;
}
if(nTicket>0)
{
OrderModify(nTicket,nPrice*Point,0,0,0);
return;
}
}
}