newgrid_2009_11_15_floating_center_thorup_with_trenddetection_001

Author: Expert for tests
Price Data Components
Series array that contains close prices for each barSeries array that contains the lowest prices of each barSeries array that contains the highest prices of each bar
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reachedIt can change open orders parameters, due to possible stepping strategyIt Closes Orders by itself
Indicators Used
Moving average indicator
0 Views
0 Downloads
0 Favorites
newgrid_2009_11_15_floating_center_thorup_with_trenddetection_001
#property copyright "Expert for tests"

extern int MagicNumberBuy = 11;
extern int MagicNumberSell = 12;
extern int Keltner = 100;
extern int MovingAverage = 9;
extern int Timeperiod = 30;
extern string cmt = "FixedCenter = 0 gives dynamic grid";
extern double FixedCenter = 0;
extern double Lots = 0.1 ;
extern bool MM = true;
extern double Balancefactor = 10000;
extern bool microlots = false;
extern int max_trades = 100 ;
extern int grid_lines = 100 ;
extern double grid_separation = 0.001 ;
extern double TP_absolute = 0.0015 ;
extern double AccountEquityPercent = 100.001;
extern bool FIFO = true;
extern int LookBackDays = 90;
extern int slip = 3 ;
extern double pipvalue = 0.1;
   
int BarCount;
int Current;
bool TickCheck = False;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init() {
   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit() {
   GlobalVariableDel("next_level_"+Symbol());
   GlobalVariableDel("test_next_level_"+Symbol());
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
   { 
   int Entertradebuy =0 ;
   int Entertradesell =0 ;
   double next_level_,test_next_level_,i ;
   double Ticket1, Ticket2,Closed1,Closed2,error;
   double pips_risked=0,money_risked=0;
   int iOrders=0;
   double lots=LotsOptimized();
   double RangeMid_center=RangeMid();
   double KeltnerHigh=iCustom(Symbol(),Timeperiod,"KeltnerChannel2",Keltner,Keltner,0,0), KeltnerLow=iCustom(Symbol(),Timeperiod,"KeltnerChannel2",Keltner,Keltner,1,0);
   double MAHigh=iMA(Symbol(),Timeperiod,MovingAverage,0,1,2,0),MALow=iMA(Symbol(),Timeperiod,MovingAverage,0,1,3,0);
   if(IsTesting()==true)
      {
      if(OrdersTotal()<max_trades)
         {
         for (i = 1; i<grid_lines; i++) 
            {
            if ((Ask <= (RangeMid_center - grid_separation*i)+0.0001 && Ask >= (RangeMid_center - grid_separation*i)-0.0001) && Bid > KeltnerLow && Ask < KeltnerHigh)
               {
               Entertradebuy=1 ;
               }
            if ((Bid <= (RangeMid_center + grid_separation*i)+0.0001 && Bid >= (RangeMid_center + grid_separation*i)-0.0001) && Ask < KeltnerHigh && Bid > KeltnerLow)
               {
               Entertradesell=1 ; 
               }
            }
         }
      iOrders = OrdersTotal()-1;
      for (i = iOrders; i>=0; i--)
         {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if ((OrderOpenPrice() <= Ask+grid_separation-0.0002 && OrderOpenPrice() >= Ask-grid_separation+0.0002 && OrderMagicNumber()==MagicNumberBuy) || MALow < KeltnerLow)
            {
            Entertradebuy=0  ;
            }
          if((OrderOpenPrice() <= Bid+grid_separation-0.0002 && OrderOpenPrice() >= Bid-grid_separation+0.0002 && OrderMagicNumber()==MagicNumberSell) || MAHigh > KeltnerHigh)
            { 
            Entertradesell=0 ;
            }
         } 
      if(FIFO==false)
         {
         if(Entertradebuy==1)
            {
            Ticket1 = OrderSend(Symbol(), OP_BUY, lots, Ask, slip, 0, 0, "Buy(#" + MagicNumberBuy + ")", MagicNumberBuy, 0, DodgerBlue) ;
            }
         if(Entertradesell==1)
            {
            Ticket2 = OrderSend(Symbol(), OP_SELL, lots, Bid, slip, 0, 0, "Sell(#" + MagicNumberSell + ")", MagicNumberSell, 0, DeepPink) ;
            }
         for(i=0;i<OrdersTotal();i++)
            {
            OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
            if(OrderType()<=OP_SELL&&OrderTakeProfit()==0)
               {
               if(OrderType()==OP_BUY&&OrderMagicNumber()==MagicNumberBuy)
                  {
                  OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()+TP_absolute,0,CLR_NONE);
                  }
               else
                  {
                  if(OrderMagicNumber()==MagicNumberSell)  
                  OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()-TP_absolute,0,CLR_NONE);
                  }
               }
            }      
         for (i = 1; i<grid_lines; i++)
            {
            if(Ask - (RangeMid_center - grid_separation*i) < grid_separation)
            GlobalVariableSet("test_next_level_"+Symbol(), RangeMid_center - grid_separation*i) ;
            if(RangeMid_center + grid_separation*i - Bid < grid_separation)
            GlobalVariableSet("test_next_level_"+Symbol(), RangeMid_center + grid_separation*i) ;
            }
         test_next_level_=GlobalVariableGet("test_next_level_"+Symbol()) ;
         for (i = 1; i<grid_lines-1; i++)
            {
            pips_risked = pips_risked+(((RangeMid_center+grid_separation*grid_lines)-(RangeMid_center-grid_separation*(grid_lines-i))));
            money_risked = (pips_risked*100000*lots)/2 ;
            }
         if(OrdersTotal() < max_trades)
         Comment("I am trading a grid from ", RangeMid_center-grid_separation*grid_lines, " to ", RangeMid_center+grid_separation*grid_lines, "\n",
                 "closest grid line to enter trade is ", test_next_level_ , "\n", 
                 "distance between grid lines is ", grid_separation*10000, " pips", "\n",
                 "number of grid lines is ", grid_lines, "\n",
                 "maximum number of trades is ", max_trades, "\n",
                 "TP is ", TP_absolute, "\n",
                 "---------------------------------------------------",  "\n",
                 "You are risking a potential ", money_risked, "USD")  ;     
         if(OrdersTotal() >= max_trades)
         Comment("I am full, I have ", max_trades, " positions opened");
         return(0);
         }
      else
         {   
         if(Entertradebuy==1)
            {
            Ticket1 = OrderSend(Symbol(), OP_BUY, lots, Ask, slip, 0, 0, "Buy(#" + MagicNumberBuy + ")", MagicNumberBuy, 0, DodgerBlue) ;         
            }
         if(Entertradesell==1)
            {
            Ticket2 = OrderSend(Symbol(), OP_SELL, lots, Bid, slip, 0, 0, "Sell(#" + MagicNumberSell + ")", MagicNumberSell, 0, DeepPink) ;
            }
         for (i = 1; i<grid_lines; i++)
            {
            if(Ask - (RangeMid_center - grid_separation*i) < grid_separation)
            GlobalVariableSet("test_next_level_"+Symbol(), RangeMid_center - grid_separation*i) ;
            if(RangeMid_center + grid_separation*i - Bid < grid_separation)
            GlobalVariableSet("test_next_level_"+Symbol(), RangeMid_center + grid_separation*i) ;
            }
         test_next_level_=GlobalVariableGet("test_next_level_"+Symbol()) ;
         for (i = 1; i<grid_lines-1; i++)
            {
            pips_risked = pips_risked+(((RangeMid_center+grid_separation*grid_lines)-(RangeMid_center-grid_separation*(grid_lines-i))));
            money_risked = (pips_risked*100000*lots)/2 ;
            }
         if(OrdersTotal() < max_trades)
         Comment("I am trading a grid from ", RangeMid_center-grid_separation*grid_lines, " to ", RangeMid_center+grid_separation*grid_lines, "\n",
                 "closest grid line to enter trade is ", test_next_level_ , "\n", 
                 "distance between grid lines is ", grid_separation*10000, " pips", "\n",
                 "number of grid lines is ", grid_lines, "\n",
                 "maximum number of trades is ", max_trades, "\n",
                 "AccountEquityPercent is ", AccountEquity()/AccountBalance()*100, "\n",
                 "---------------------------------------------------",  "\n",
                 "You are risking a potential ", money_risked, "USD")  ;     
         if(OrdersTotal() >= max_trades)
         Comment("I am full, I have ", max_trades, " positions opened", "\n",
                 "AccountEquityPercent is ", AccountEquity()/AccountBalance()*100);
         if(AccountEquity()/AccountBalance()*100>=AccountEquityPercent)
            {
            for(i=0;i<OrdersTotal();i++)
               {
               OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
               if(OrderType() <= OP_SELL)
                  {
                  if(OrderType() == OP_BUY)
                     {
                     Closed1=OrderClose(OrderTicket(),OrderLots(),Bid,slip,Yellow);
                     if(Closed1==false)
                        {
                        error=GetLastError();
                        Print("Error = " + error);
                        }
                     }
                  else
                     {
                     if(OrderType() == OP_SELL)
                        {
                        Closed2=OrderClose(OrderTicket(),OrderLots(),Ask,slip,Yellow);
                        if(Closed2==false)
                           {
                           error=GetLastError();
                           Print("Error = " + error);
                           }
                        }
                     }
                  }   
               RefreshRates();
               i--;
               }
            }
         return(0);
         }
      }
   else
      {   
      if(OrdersTotal()<max_trades)
         {
         for (i = 1; i<grid_lines; i++) 
            {
            if ((Ask <= (RangeMid_center - grid_separation*i)+0.0001 && Ask >= (RangeMid_center - grid_separation*i)-0.0001) && Bid > KeltnerLow && Ask < KeltnerHigh)
               {
               Entertradebuy=1 ;
               }
            if ((Bid <= (RangeMid_center + grid_separation*i)+0.0001 && Bid >= (RangeMid_center + grid_separation*i)-0.0001) && Ask < KeltnerHigh && Bid > KeltnerLow)
               {
               Entertradesell=1 ; 
               }
            }
         }
      iOrders = OrdersTotal()-1;
      for (i = iOrders; i>=0; i--)
         {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if ((OrderOpenPrice() <= Ask+grid_separation-0.0002 && OrderOpenPrice() >= Ask-grid_separation+0.0002 && OrderMagicNumber()==MagicNumberBuy) || MALow < KeltnerLow)
            {
            Entertradebuy=0  ;
            }
          if((OrderOpenPrice() <= Bid+grid_separation-0.0002 && OrderOpenPrice() >= Bid-grid_separation+0.0002 && OrderMagicNumber()==MagicNumberSell) || MAHigh > KeltnerHigh)
            { 
            Entertradesell=0 ;
            }
         } 
      if(FIFO==false)
         {
         if(Entertradebuy==1)
            {
            Ticket1 = OrderSend(Symbol(), OP_BUY, lots, Ask, slip, 0, 0, "Buy(#" + MagicNumberBuy + ")", MagicNumberBuy, 0, DodgerBlue) ;
            }
         if(Entertradesell==1)
            {
            Ticket2 = OrderSend(Symbol(), OP_SELL, lots, Bid, slip, 0, 0, "Sell(#" + MagicNumberSell + ")", MagicNumberSell, 0, DeepPink) ;
            }
         for(i=0;i<OrdersTotal();i++)
            {
            OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
            if(OrderType()<=OP_SELL&&OrderTakeProfit()==0)
               {
               if(OrderType()==OP_BUY&&OrderMagicNumber()==MagicNumberBuy)
                  {
                  OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()+TP_absolute,0,CLR_NONE);
                  }
               else
                  {
                  if(OrderMagicNumber()==MagicNumberSell)   
                  OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderOpenPrice()-TP_absolute,0,CLR_NONE);
                  }
               }
            }      
         for (i = 1; i<grid_lines; i++)
            {
            if(Ask - (RangeMid_center - grid_separation*i) < grid_separation)
            GlobalVariableSet("next_level_"+Symbol(), RangeMid_center - grid_separation*i) ;
            if(RangeMid_center + grid_separation*i - Bid < grid_separation)
            GlobalVariableSet("next_level_"+Symbol(), RangeMid_center + grid_separation*i) ;
            }
         next_level_=GlobalVariableGet("next_level_"+Symbol()) ;
         for (i = 1; i<grid_lines-1; i++)
            {
            pips_risked = pips_risked+(((RangeMid_center+grid_separation*grid_lines)-(RangeMid_center-grid_separation*(grid_lines-i))));
            money_risked = (pips_risked*100000*lots)/2 ;
            }
         if(OrdersTotal() < max_trades)
         Comment("I am trading a grid from ", RangeMid_center-grid_separation*grid_lines, " to ", RangeMid_center+grid_separation*grid_lines, "\n",
                 "closest grid line to enter trade is ", next_level_ , "\n", 
                 "distance between grid lines is ", grid_separation*10000, " pips", "\n",
                 "number of grid lines is ", grid_lines, "\n",
                 "maximum number of trades is ", max_trades, "\n",
                 "TP is ", TP_absolute, "\n",
                 "---------------------------------------------------",  "\n",
                 "You are risking a potential ", money_risked, "USD")  ;     
         if(OrdersTotal() >= max_trades)
         Comment("I am full, I have ", max_trades, " positions opened");
         return(0);
         }
      else
         {   
         if(Entertradebuy==1)
            {
            Ticket1 = OrderSend(Symbol(), OP_BUY, lots, Ask, slip, 0, 0, "Buy(#" + MagicNumberBuy + ")", MagicNumberBuy, 0, DodgerBlue) ;
            }
         if(Entertradesell==1)
            {
            Ticket2 = OrderSend(Symbol(), OP_SELL, lots, Bid, slip, 0, 0, "Sell(#" + MagicNumberSell + ")", MagicNumberSell, 0, DeepPink) ;
            }
         for (i = 1; i<grid_lines; i++)
            {
            if(Ask - (RangeMid_center - grid_separation*i) < grid_separation)
            GlobalVariableSet("next_level_"+Symbol(), RangeMid_center - grid_separation*i) ;
            if(RangeMid_center + grid_separation*i - Bid < grid_separation)
            GlobalVariableSet("next_level_"+Symbol(), RangeMid_center + grid_separation*i) ;
            }
         next_level_=GlobalVariableGet("next_level_"+Symbol()) ;
         for (i = 1; i<grid_lines-1; i++)
            {
            pips_risked = pips_risked+(((RangeMid_center+grid_separation*grid_lines)-(RangeMid_center-grid_separation*(grid_lines-i))));
            money_risked = (pips_risked*100000*lots)/2 ;
            }
         if(OrdersTotal() < max_trades)
         Comment("I am trading a grid from ", RangeMid_center-grid_separation*grid_lines, " to ", RangeMid_center+grid_separation*grid_lines, "\n",
                 "closest grid line to enter trade is ", next_level_ , "\n", 
                 "distance between grid lines is ", grid_separation*10000, " pips", "\n",
                 "number of grid lines is ", grid_lines, "\n",
                 "maximum number of trades is ", max_trades, "\n",
                 "AccountEquityPercent is ", AccountEquity()/AccountBalance()*100, "\n",
                 "---------------------------------------------------",  "\n",
                 "You are risking a potential ", money_risked, "USD")  ;     
         if(OrdersTotal() >= max_trades)
         Comment("I am full, I have ", max_trades, " positions opened", "\n",
                 "AccountEquityPercent is ", AccountEquity()/AccountBalance()*100);
         if(AccountEquity()/AccountBalance()*100>=AccountEquityPercent)
            {
            for(i=0;i<OrdersTotal();i++)
               {
               OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
               if(OrderType() == OP_BUY)
                  {
                  Closed1=OrderClose(OrderTicket(),OrderLots(),Bid,slip,Yellow);
                  if(Closed1==false)
                     {
                     error=GetLastError();
                     Print("Error = " + error);
                     }
                  }
               else
                  {
                  if(OrderType() == OP_SELL)
                     {
                     Closed2=OrderClose(OrderTicket(),OrderLots(),Ask,slip,Yellow);
                     if(Closed2==false)
                        {
                        error=GetLastError();
                        Print("Error = " + error);
                        }
                     }
                  }
               RefreshRates();
               i--;
               }
            }
         return(0);
         }
      }
   }   
double LotsOptimized()
   {
   double lot = Lots;
   if(MM==true)
      {
      if(microlots==true)
         {
         lot = NormalizeDouble(MathFloor(AccountBalance()/Balancefactor)*0.01-0.005,2);
         if(lot < 0.01) lot = 0.01;
         if(lot > MarketInfo(Symbol(),MODE_MAXLOT)) lot = MarketInfo(Symbol(),MODE_MAXLOT);
         return(lot);
         }
      else
         {    
         lot = NormalizeDouble(MathFloor(AccountBalance()/Balancefactor)*0.01-0.05, 1);
         if(lot < 0.1) lot = 0.1;
         if(lot > MarketInfo(Symbol(),MODE_MAXLOT)) lot = MarketInfo(Symbol(),MODE_MAXLOT);
         return(lot);
         }
      }
   else
      {
      lot=Lots;
      }
   return(lot);         
   }
double RangeMid()
   {
   if(FixedCenter == 0)
      {
      if(iBars(Symbol(),1440)<LookBackDays+1)
         {
         Print("Not enough Bars in D1");
         Sleep(86400000);
         return(0);
         }
      double rangemid = 0;
      double lowest = 100000;
      lowest = iLow(Symbol(), PERIOD_D1, 0);
      for (int i = 0; i <= LookBackDays; i++)
         {
         if (iLow(Symbol(), PERIOD_D1, i) < lowest) lowest = iLow(Symbol(), PERIOD_D1, i);
         }
      double highest = 0;
      highest = iHigh(Symbol(), PERIOD_D1, 0);
      for (i = 1; i <= LookBackDays; i++)
         {
         if (iHigh(Symbol(), PERIOD_D1, i) > highest) highest = iHigh(Symbol(), PERIOD_D1, i);
         }
      rangemid = (highest + lowest) / 2.0;
      rangemid = NormalizeDouble(rangemid, 2);
      return(rangemid);
      }
   else
      {
      rangemid = FixedCenter;
      return(rangemid);
      }   
   }   
   //+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---