adding simple grid to market orders

 

Hi there,

 

I am looking now to add a simple grid to my market orders, but they i am writing it is not working at all ...

 

input double         gridshift                  = 0.001;
input double         maxpendingorders           = 2 //2 buypending 2 sellpending

for(int cnt = 0 ;cnt<OrdersTotal();cnt++)
   {
      //PENDING ORDERS
      if(OrderType()==OP_BUY||OrderType()==OP_SELL)
      {
            openOrder(getLots(),MagicNumber,OP_BUYSTOP,Bid + gridshift, _sl,_tp);
            openOrder(getLots(),MagicNumber,OP_SELLLIMIT,Ask - gridshift, _sl,_tp);
      }
} 

 What i want is that every time an order is opened it opens a grid of 2 buystop and 2 sellstop "gridshift" pips from market order and tht i can setup a maximum of pending orders to open

 

Help please, thanks 

 

I allways get confused with this buystop or buylimit

 

I don't want to open a pending buy below market i want to open a pending buy (buystop or buy limit the one it fits) above my current market order opened with ea and open a pending sell (sellstop or sell limit) below this same market order opened with ea

 

ahh ok, i mistaken there, but still not working i update post 

 
daniel1983:

I allways get confused with this buystop or buylimit

 

I don't want to open a pending buy below market i want to open a pending buy (buystop or buy limit the one it fits) above my current market order opened with ea and open a pending sell (sellstop or sell limit) below this same market order opened with ea

 

ahh ok, i mistaken there, but still not working i update post 

Do you understand where to place a Stop Loss for a Buy Order? Above or below price?

It used to be (and possibly still is with some brokers) that you didn't have stop losses as such, but closed a Buy position with a Sell order.

To protect your Buy position, you would open a ticket to sell at (or below) a certain price.

That is effectively a Sell Stop.

So if you can't remember whether a stop goes above or below price, just think where would you put a stoploss for an opposite position .

So if you want to open a pending Buy, think where would I place a stoploss for a Sell, above or below current price. Obviously, it's above price. So if you are opening a pending Buy above current price, it will be a BuyStop. 

I've probably confused you more now ;) 

 

Actually you cleared it all out, thank you, i will use it while my manual trading,

 

i don't know how to write the "Shift" into the line of the code, i think it is not written well, i have look at 3 different grid EA but it's a little bit confusing because not all of them use the same code, and this way trying to understand every code structure for opening different pending orders at different times, this has make me confuse more than enough..

 

This is why i'm finally  here ... asking you guys

 i found for example an EA code that just opens market orders, but the structure is different, as in this EA, there are no conditions for triggering market orders following certain rules like the one i created (i'm not a coder, just trying to learn a little bit more of how my EA is doing what i need to be done, modifiying my EA's). In my structure i have conditions, then some "if" for closing positions trailing stop, etc, and i think here can i create some "if" for the pending orders conditions as they are only related to "if Buy then ..." or "if Sell then...", so...

 

How do i write the code for including a "shift" or number of pips above current market order:

- Buy (Buy Stop - Xpips - BUY- Xpips - Sell Limit

- Sell (Buy Limit - Xpips - SELL - Xpips - Sell Stop)

 

And how could i write this to setup a number of pending buy and pending sell for this current market order... 

Thanks 

 
daniel1983:

- Buy (Buy Stop - Xpips - BUY- Xpips - Sell Buy Limit) 

- Sell (Buy Sell Limit - Xpips - SELL - Xpips - Sell Stop)

Limit is always that price or better. Better means lower for a buy or higher for a sell.
 

i tell you in picture what i'm looking for:

 

 

 

I found this code for an EA that makes the same but it is used for opening the pending orders at a certain price, what should i change to adapt this to open the pending orders at current market order opened by my EA?? wich one are the important parameters i will need?

 

//+------------------------------------------------------------------+
//|                                               PendingOrderEA.mq4 |
//|                                       Copyright © 2006, firedave | 
//|                    Partial Function Copyright © 2006, codersguru | 
//|                        Partial Function Copyright © 2006, pengie |
//|                                        http://www.fx-review.com/ | 
//|                                        https://www.forex-tsd.com/ | 
//+------------------------------------------------------------------+

#property copyright "Copyright © 2006, firedave"
#property link      "http://www.fx-review.com"


//----------------------- INCLUDES
#include <stdlib.mqh>


//----------------------- EA PARAMETER
extern string  
         Expert_Name       = "---------- Pending Order EA v1",
         Expert_Name2      = "---------- For current price set EntryLevel = 0";
extern double 
         EntryLevel        = 1.8600,
         Distance          = 100,
         StopLoss          = 50,
         TakeProfit        = 50,
         TrailingStop      = 50;

extern string  
         Order_Setting     = "---------- Order Setting";
extern int
         NumberOfTries     = 5,
         Slippage          = 5,
         MagicNumber       = 1234;

extern string  
         MM_Parameters     = "---------- Money Management";
extern double 
         Lots              = 1;
extern bool 
         MM                = false, //Use Money Management or not
         AccountIsMicro    = false; //Use Micro-Account or not
extern int 
         Risk              = 10; //10%

extern string  
         Testing_Parameters= "---------- Back Test Parameter";
extern bool
         Show_Settings     = true;


//----------------------- GLOBAL VARIABLE
static int 
         TimeFrame         = 0;
string
         TicketComment     = "PendingOrderEA v2",
         LastTrade;
bool
         TradeAllow        = true,
         EntryAllow        = true;         



//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{

//----------------------- GENERATE MAGIC NUMBER AND TICKET COMMENT
//----------------------- SOURCE : PENGIE
   MagicNumber    = subGenerateMagicNumber(MagicNumber, Symbol(), Period());
        TicketComment  = StringConcatenate(TicketComment, "-", Symbol(), "-", Period());

//----------------------- SHOW EA SETTING ON THE CHART
//----------------------- SOURCE : CODERSGURU
   if(Show_Settings) subPrintDetails();
   else Comment("");
   
   return(0);
}

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
 
//----------------------- PREVENT RE-COUNTING WHILE USER CHANGING TIME FRAME
//----------------------- SOURCE : CODERSGURU
   TimeFrame=Period(); 
   return(0);
}


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
{
   double 
         BuyLevel,
         SellLevel;
                   
   int   
         cnt,
         ticket,
         total;
         

//----------------------- SET BUY and SELL PRICE
   if(EntryLevel==0) EntryLevel = Bid;
   
   BuyLevel  = EntryLevel + Distance*Point;
   SellLevel = EntryLevel - Distance*Point;
   
   if((BuyLevel-Ask)<10*Point || (Bid-SellLevel)<10*Point)
   {
      Comment("Invalid Entry Price or Distance");
      return(0);
   }


//----------------------- ADJUST LOTS IF USING MONEY MANAGEMENT
   if(MM) Lots = subLotSize();


//----------------------- ENTRY
//----------------------- TOTAL ORDER BASE ON MAGICNUMBER AND SYMBOL
   total = subTotalTrade();


//----------------------- SET THE ORDER ONLY 1 TIME
   if(TradeAllow)
   {
     
//----------------------- IF NO TRADE
      if(total<1 && EntryAllow) 
      {
         ticket = OrderSend(Symbol(),OP_SELLSTOP,Lots,SellLevel,Slippage,SellLevel+StopLoss*Point,SellLevel-TakeProfit*Point,TicketComment,MagicNumber,0,Red);
         ticket = OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyLevel,Slippage,BuyLevel-StopLoss*Point,BuyLevel+TakeProfit*Point,TicketComment,MagicNumber,0,Green);
         EntryAllow = false;
         return(0);
      }
      
      if(total==1)
      {
         subDeleteOrder();
         TradeAllow = false;
      }
   }      
   
//----------------------- TRAILING STOP SECTION
   if(TrailingStop>0 && subTotalTrade()>0)
   {
      total = OrdersTotal();
      for(cnt=0;cnt<total;cnt++)
      {
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

         if(OrderType()<=OP_SELL &&
            OrderSymbol()==Symbol() &&
            OrderMagicNumber()==MagicNumber)
         {
            subTrailingStop(OrderType());
            return(0);
         }
      }
   }            
   return(0);
}

//----------------------- END PROGRAM

//+------------------------------------------------------------------+
//| FUNCTION DEFINITIONS
//+------------------------------------------------------------------+

//----------------------- MONEY MANAGEMENT FUNCTION  
//----------------------- SOURCE : CODERSGURU
double subLotSize()
{
     double lotMM = MathCeil(AccountFreeMargin() *  Risk / 1000) / 100;
          
          if(AccountIsMicro==false) //normal account
          {
             if(lotMM < 0.1)                  lotMM = Lots;
             if((lotMM > 0.5) && (lotMM < 1)) lotMM = 0.5;
             if(lotMM > 1.0)                  lotMM = MathCeil(lotMM);
             if(lotMM > 100)                  lotMM = 100;
          }
          else //micro account
          {
             if(lotMM < 0.01)                 lotMM = Lots;
             if(lotMM > 1.0)                  lotMM = MathCeil(lotMM);
             if(lotMM > 100)                  lotMM = 100;
          }
          
          return (lotMM);
}

//----------------------- NUMBER OF ORDER BASE ON SYMBOL AND MAGICNUMBER FUNCTION
int subTotalTrade()
{
   int
      cnt, 
      total = 0;

   for(cnt=0;cnt<OrdersTotal();cnt++)
   {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL &&
         OrderSymbol()==Symbol() &&
         OrderMagicNumber()==MagicNumber) total++;
   }
   return(total);
}


//----------------------- DELETE ORDER FUNCTION
void subDeleteOrder()
{
   int
      cnt, 
      total = 0;

   total = OrdersTotal();
   for(cnt=total-1;cnt>=0;cnt--)
   {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

      if(OrderSymbol()==Symbol() &&
         OrderMagicNumber()==MagicNumber)
      {
         switch(OrderType())
         {
            case OP_BUYLIMIT :
            case OP_BUYSTOP  :
            case OP_SELLLIMIT:
            case OP_SELLSTOP :
               OrderDelete(OrderTicket());
         }
      }
   }      
}

//----------------------- TRAILING STOP FUNCTION
//----------------------- SOURCE   : CODERSGURU
//----------------------- MODIFIED : FIREDAVE
void subTrailingStop(int Type)
{
   if(Type==OP_BUY)   // buy position is opened   
   {
      if(Bid-OrderOpenPrice()>Point*TrailingStop &&
         OrderStopLoss()<Bid-Point*TrailingStop)
      {
         OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
         return(0);
      }
   }

   if(Type==OP_SELL)   // sell position is opened   
   {
      if(OrderOpenPrice()-Ask>Point*TrailingStop)
      {
      if(OrderStopLoss()>Ask+Point*TrailingStop || OrderStopLoss()==0)
      {
         OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
         return(0);
      }
      }
   }
}



//----------------------- GENERATE MAGIC NUMBER BASE ON SYMBOL AND TIME FRAME FUNCTION
//----------------------- SOURCE   : PENGIE
//----------------------- MODIFIED : FIREDAVE
int subGenerateMagicNumber(int MagicNumber, string symbol, int timeFrame)
{
   int isymbol = 0;
   if (symbol == "EURUSD")       isymbol = 1;
   else if (symbol == "GBPUSD")  isymbol = 2;
   else if (symbol == "USDJPY")  isymbol = 3;
   else if (symbol == "USDCHF")  isymbol = 4;
   else if (symbol == "AUDUSD")  isymbol = 5;
   else if (symbol == "USDCAD")  isymbol = 6;
   else if (symbol == "EURGBP")  isymbol = 7;
   else if (symbol == "EURJPY")  isymbol = 8;
   else if (symbol == "EURCHF")  isymbol = 9;
   else if (symbol == "EURAUD")  isymbol = 10;
   else if (symbol == "EURCAD")  isymbol = 11;
   else if (symbol == "GBPUSD")  isymbol = 12;
   else if (symbol == "GBPJPY")  isymbol = 13;
   else if (symbol == "GBPCHF")  isymbol = 14;
   else if (symbol == "GBPAUD")  isymbol = 15;
   else if (symbol == "GBPCAD")  isymbol = 16;
   else                          isymbol = 17;
   if(isymbol<10) MagicNumber = MagicNumber * 10;
   return (StrToInteger(StringConcatenate(MagicNumber, isymbol, timeFrame)));
}


//----------------------- PRINT COMMENT FUNCTION
//----------------------- SOURCE : CODERSGURU
void subPrintDetails()
{
   string sComment   = "";
   string sp         = "----------------------------------------\n";
   string NL         = "\n";

   sComment = sp;
   sComment = sComment + "TakeProfit=" + DoubleToStr(TakeProfit,0) + " | ";
   sComment = sComment + "TrailingStop=" + DoubleToStr(TrailingStop,0) + " | ";
   sComment = sComment + "StopLoss=" + DoubleToStr(StopLoss,0) + NL; 
   sComment = sComment + sp;
   sComment = sComment + "Lots=" + DoubleToStr(Lots,2) + " | ";
   sComment = sComment + "MM=" + subBoolToStr(MM) + " | ";
   sComment = sComment + "Risk=" + DoubleToStr(Risk,0) + "%" + NL;
   sComment = sComment + sp;
  
   Comment(sComment);
}


//----------------------- BOOLEN VARIABLE TO STRING FUNCTION
//----------------------- SOURCE : CODERSGURU
string subBoolToStr ( bool value)
{
   if(value) return ("True");
   else return ("False");
}


//----------------------- END FUNCTION
 

No body can help¿¿??

 

Does anybody understand what i need? 

Reason: