Price Data Components
Orders Execution
Indicators Used
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 Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---