Mandor





// Ñòàðòîâûé ïåðèîä.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;
         }
      }
   }



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains the highest prices of each bar


Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders

It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy
It automatically opens orders when conditions are reached

Other Features:

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:3.18 Total Net Profit:598.60

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:1.60 Total Net Profit:124.46

BackTest : EURUSD on H1

From 2010-03-01 to 2010-03-27 Profit Factor:0.09 Total Net Profit:-156.66

BackTest : EURUSD on H1

From 2010-04-01 to 2010-04-30 Profit Factor:1.74 Total Net Profit:81.08

BackTest : EURUSD on H1

From 2010-06-01 to 2010-06-30 Profit Factor:5.62 Total Net Profit:389.48

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:0.72 Total Net Profit:-157.74

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-04-16 Profit Factor:0.16 Total Net Profit:-3123.57

BackTest : USDCAD on H1

From 2009-01-01 to 2010-01-01 Profit Factor:0.46 Total Net Profit:-3631.96

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.36 Total Net Profit:-544.91

BackTest : USDCHF on H1

From 2009-12-01 to 2010-01-01 Profit Factor:2.28 Total Net Profit:273.64

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:1.33 Total Net Profit:74.25

Request Backtest for Mandor


From : (yyyy/mm/dd) To: (yyyy/mm/dd)

Pair: Period: