NarrowBreakout__GBPM30

Price Data Components
Series array that contains open time of each bar
Orders Execution
Checks for the total of open ordersIt Closes Orders by itself It can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reached
0 Views
0 Downloads
0 Favorites

Profitability Reports

AUD/USD Oct 2024 - Jan 2025
0.00 %
Total Trades 0
Won Trades 0
Lost trades 0
Win Rate 0.0 %
Expected payoff 0.00
Gross Profit 0.00
Gross Loss 0.00
Total Net Profit 0.00
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
0.00 %
Total Trades 0
Won Trades 0
Lost trades 0
Win Rate 0.0 %
Expected payoff 0.00
Gross Profit 0.00
Gross Loss 0.00
Total Net Profit 0.00
-100%
-50%
0%
50%
100%
NarrowBreakout__GBPM30
//+------------------------------------------------------------------+
//|                                            NarrowBreakout_GBPM30 |
//|                                   Copyright © 2006, Lingyu Jiang |
//+------------------------------------------------------------------+
extern string    Broker="Alpari";                                  // you can also set "FXDD", "IBFX" here

//---- common parameters
extern bool      UseMM=true;
extern double    LotsIfNoMM=1.0;
extern double    MMRiskFactor=0.2;
extern int       Spread=4;
extern int       Start=9;
extern int       EOD=17;

//---- input parameters for narrow range breakout
extern int       NLookbackBars=4;
extern int       NPips=10;
extern int       NStopLoss=45;
extern int       NBreakEven=15;
extern int       NTakeProfit=0;
extern int       NRangeMax=43; 

//---- global variables
double Lots=1.0;
int    MagicNumber2=2;
double EntryLong2=0,EntryShort2=0;

int init()
{
   if (Broker == "FXDD") {
      Spread=3;
      Start=10;
      EOD=18;
      NLookbackBars=4;
      NPips=10;
      NStopLoss=45;
      NBreakEven=16;
      NTakeProfit=0;
      NRangeMax=42;
   } 
   else if (Broker == "IBFX") {
      Spread=4;
      Start=8;
      EOD=16;
      NLookbackBars=4;
      NPips=10;
      NStopLoss=45;
      NBreakEven=15;
      NTakeProfit=0;
      NRangeMax=43;
   }
   return (0);
}

//--- MM calculation
double CalculateMMLot()
{
   double lot_min =MarketInfo(Symbol(),MODE_MINLOT);
   double lot_max =MarketInfo(Symbol(),MODE_MAXLOT);
   double lot_step=MarketInfo(Symbol(),MODE_LOTSTEP);
   double lot;
   //--- check data
   if(lot_min<0 || lot_max<=0.0 || lot_step<=0.0) {
      Print("CalculateMMLot: invalid MarketInfo() results [",lot_min,",",lot_max,",",lot_step,"]");
      return(0);
   }
   if(AccountLeverage()<=0) {
      Print("CalculateMMLot: invalid AccountLeverage() [",AccountLeverage(),"]");
      return(0);
   }
   //--- basic formula
   lot=NormalizeDouble((AccountBalance())*MMRiskFactor/AccountLeverage()/10.0,2);
   lot=NormalizeDouble(lot/lot_step,0)*lot_step;
   if(lot<lot_min) lot=lot_min;
   if(lot>lot_max) lot=lot_max;
   //---
   return(lot);
  }

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   //---- 
   int i,Ticket,LastOrderTime,StartTime,StartTime1,StartTime2,EODTime;

   if (UseMM) Lots=CalculateMMLot(); else Lots=LotsIfNoMM;

   //Count time
   if(CurTime()>=StrToTime(Start+":00")-60){
      StartTime1=StrToTime(Start+":00");
      if(DayOfWeek()==5)   EODTime=MathMin(StrToTime("22:55"),StrToTime(EOD+":00")-60);
      else if (EOD==24)    EODTime=StrToTime("23:59");
      else                 EODTime=StrToTime(EOD+":00")-60;
   }
   
   // Set narrow range breakout orders
   if(TimeHour(CurTime()) >= Start && TimeHour(CurTime())<EOD) {
      SetNarrowRangeBreakoutOrders(MagicNumber2);
   }
   
   //Manage of open orders
   for (i=0;i<OrdersTotal();i++){
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderMagicNumber()!=MagicNumber2) continue;
      if(CurTime()<=GlobalVariableGet("LastOrderTime")+10) Sleep(10000);
      if(CurTime()>=EODTime){     //close open positions at EOD
         if(OrderSymbol()==Symbol() && OrderType()==OP_BUY)      OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);
         if(OrderSymbol()==Symbol() && OrderType()==OP_SELL)     OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
         if(OrderSymbol()==Symbol() && OrderType()==OP_BUYSTOP)  OrderDelete(OrderTicket());
         if(OrderSymbol()==Symbol() && OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket());
         GlobalVariableSet("LastOrderTime",CurTime());
      }   
      else {
         double OpenPrice = 0;
         // manage narrow range breakout orders
         if (OrderMagicNumber() == MagicNumber2) {
            OpenPrice = 0;
            //move at BE if profit>BE
            if(OrderSymbol()==Symbol() && OrderType()==OP_BUY){
               if (EntryLong2 != 0) {
                  OpenPrice = EntryLong2;
               } else {
                  OpenPrice = OrderOpenPrice();
               }
               if(High[1]-OpenPrice>=NBreakEven*Point && High[0]-OpenPrice>=NBreakEven*Point && OrderStopLoss()<OpenPrice+5*Point){
                  OrderModify(OrderTicket(),OrderOpenPrice(),OpenPrice+5*Point,OrderTakeProfit(),0,Green);
                  GlobalVariableSet("LastOrderTime",CurTime());
               }   
            }   
            if(OrderSymbol()==Symbol() && OrderType()==OP_SELL){
               if (EntryShort2 != 0) {
                  OpenPrice = EntryShort2;
               } else {
                  OpenPrice = OrderOpenPrice();
               }
               if(OpenPrice-Low[1]-Spread*Point>=NBreakEven*Point && OpenPrice-Low[0]-Spread*Point>=NBreakEven*Point && OrderStopLoss()>OpenPrice-5*Point){
                  OrderModify(OrderTicket(),OrderOpenPrice(),OpenPrice-5*Point,OrderTakeProfit(),0,Green);
                  GlobalVariableSet("LastOrderTime",CurTime());
               }
            }
         }   
      }
   }
   
   //Reset global variables at EOD
   if(CurTime()>=EODTime) GlobalVariablesDeleteAll();
   
   return(0);
  }

//+------------------------------------------------------------------+
int SetNarrowRangeBreakoutOrders(int MN) {
   int i,Ticket,LastOrderTime,Bought=0,Sold=0,ShiftToStart,ShiftToBeginOfRange;
   double SLLong,SLShort,TPLong,TPShort;

   //Check Orders
   for (i=0;i<OrdersTotal();i++){
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()==Symbol() && (OrderType()==OP_BUYSTOP || OrderType()==OP_BUY) && OrderMagicNumber()==MN) Bought++;
      if(Bought>1){ //more than 1 buy order
         if(CurTime()<=GlobalVariableGet("LastOrderTime")+10) Sleep(10000);
         if(OrderSymbol()==Symbol() && OrderType()==OP_BUY)      OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);
         if(OrderSymbol()==Symbol() && OrderType()==OP_BUYSTOP)  OrderDelete(OrderTicket());
      }
      if(OrderSymbol()==Symbol() && (OrderType()==OP_SELLSTOP || OrderType()==OP_SELL) && OrderMagicNumber()==MN) Sold++;
      if(Sold>1){ //more than 1 sell order
         if(CurTime()<=GlobalVariableGet("LastOrderTime")+10) Sleep(10000);
         if(OrderSymbol()==Symbol() && OrderType()==OP_SELL)     OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
         if(OrderSymbol()==Symbol() && OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket());
      }
   }
   
   if(Bought==0 && Sold==0){ //no buy order
      // determine range
      EntryLong2   =High[Highest(NULL,PERIOD_M30,MODE_HIGH,NLookbackBars,1)]+(NPips+Spread)*Point;
      EntryShort2  =Low[Lowest (NULL,PERIOD_M30,MODE_LOW, NLookbackBars,1)]-NPips*Point;
      SLLong      =MathMax(EntryLong2-NStopLoss*Point,EntryShort2);
      SLShort     =MathMin(EntryShort2+NStopLoss*Point,EntryLong2);
      if (NTakeProfit!=0) {
         TPLong      =EntryLong2+NTakeProfit*Point;
         TPShort     =EntryShort2-NTakeProfit*Point;
      } else {
         TPLong      =0;
         TPShort     =0;
      }
   
      if (EntryLong2-EntryShort2>=NRangeMax*Point) { //So we can filter out large ranges
         // Ensures that no trades will be opened
         Bought=1;
         Sold=1;
         return (0);
      }

      if(CurTime()<=GlobalVariableGet("LastOrderTime")+10) Sleep(10000);
      Ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,EntryLong2,3,SLLong,TPLong,NULL,MN,0,Green);
      if(Ticket<0 && GetLastError()==130 && High[0]+Spread*Point>=EntryLong2 && Ask <= EntryLong2+3*Point && Ask>=EntryLong2-3*Point)
         Ticket=OrderSend(Symbol(),OP_BUY,Lots,EntryLong2,3,SLLong,TPLong,NULL,MN,0,Green);
      GlobalVariableSet("LastOrderTime",OrderOpenTime()); 


      if(CurTime()<=GlobalVariableGet("LastOrderTime")+10) Sleep(10000);
      Ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,EntryShort2,3,SLShort,TPShort,NULL,MN,0,Green);
      if(Ticket<0 && GetLastError()==130 && Low[0]<=EntryShort2 && Bid>=EntryShort2-3*Point && Bid<=EntryShort2+3*Point)
         Ticket=OrderSend(Symbol(),OP_SELL,Lots,EntryShort2,3,SLShort,TPShort,NULL,MN,0,Green);
      GlobalVariableSet("LastOrderTime",OrderOpenTime()); 
   }
}

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 ---