Download MetaTrader 5

EA which will take only one trade at a time ?

To add comments, please log in or register
Interested in earning money via MQL5 Cloud Network? Enter your profile!
Mimi
501
Mimi 2016.03.22 04:52 

Hello members,

Looking for a help for making an EA.

I have Ea which opens buy order if last candle closes above Trade level.

It opens sell order if last candle closes below the trade level.

Suppose I run this on an hourly chart, then every time this condition satisfies it opens buy or sell order on each hour. But I want only one trade to open.

There should not be any new order until current buy/sell order get closed?

How can I do that?

Plus in the code below..it takes only buy order no sell order.. 

  // Orders-----------------------------in start function
      if(TimeCurrent() == Dat_DtTm)
      {
       double T1 = L1;
       
       //---Buy Orders//------
    
       if(Close[1]> T1 ) BC();
        
       //---Sell Order //---------
        
       if(Close[1]< T1 ) SC();    
        
      }

//------------------------------------------------------------
void BC()
{
       double BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       double BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green); 
       return;
}

void SC()
{
       double SellStopLoss = Bid - (StopLoss * CalcPoint1);
       double SellTakeProfit = Bid + (TakeProfit *  CalcPoint1);
       SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red); 
       return;
}

void OnTick(){
   static datetime timeCur;
   datetime timePre = timeCur; timeCur=Time[0]; 
   bool isNewBar = timeCur != timePre;
   
   if(isNewBar){ 
     timePre=timeCur;  //Do what you want at each new bar // Once per bar
     BC();
     SC();
    } 
     
    return; //every tick
   
Keith Watford
Moderator
9603
Keith Watford 2016.03.22 05:31  
       double SellStopLoss = Bid - (StopLoss * CalcPoint1);
       double SellTakeProfit = Bid + (TakeProfit *  CalcPoint1);

Swap the + and -

Mimi
501
Mimi 2016.03.22 05:46  
GumRai:

Swap the + and -



Thank you for rectifying it.

I changed it but now its creating one buy & one sell order on each bar from same level?

Keith Watford
Moderator
9603
Keith Watford 2016.03.22 06:53  
 bool can_buy=true;
 bool can_sell=true;
 for(int x=OrdersTotal()-1;x>=0;x--)
    {
    if(OrderSelect(x,SELECT_BY_POS) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
          {
          if(OrderType()==OP_BUY)
             can_buy=false;
          if(OrderType()==OP_SELL)
             can_sell=false;
          }
    }
  
  if(can_buy)
     {
     //Check whether to place order
     }
     
  if(can_sell)
     {
     //Check whether to place order
     }

It is not clear what you want. The above code or modification of it should help you.


  // Orders-----------------------------in start function

Do you have both start() and OnTick in your code??

whroeder1
14472
whroeder1 2016.03.23 00:50  
cashcube: But I want only one trade to open. There should not be any new order until current buy/sell order get closed? How can I do that?
Then you must check if there is already an open order. Search "OrderSelect loop."
Mimi
501
Mimi 2016.03.23 05:19  
GumRai:

It is not clear what you want. The above code or modification of it should help you.


Do you have both start() and OnTick in your code??



Thank GumRai for sharing the code. I will apply it today..

But yes I have both start & Ontick function in my code..I really confuse about the ontick function...Previously I added buy sell orders inside the start() function..but was creating buy sell order on each tick...That's why I created separated ontick function .

Keith Watford
Moderator
9603
Keith Watford 2016.03.23 07:58  
I don't know what conflicts may occur by having both. In my opinion it is best just to use OnTick
Mimi
501
Mimi 2016.03.24 04:36  
GumRai:
I don't know what conflicts may occur by having both. In my opinion it is best just to use OnTick

In the start function it need to run tick by tick cause it fetches data from a csv file.

I am here sharing the whole code..please help me to make it working...Currently it stuck after taking one trade.

int init()
{

int CalcDigits = (int)MarketInfo(Symbol(),MODE_DIGITS);

if(CalcDigits == 2 || CalcDigits == 4) CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;      


if(CalcDigits == 2 || CalcDigits == 3) CalcPoint1 = 0.01;
else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint1 = 0.0001;
      
UsePoint = CalcPoint;
UseSlippage = (int) CalcSlippage; 
return (0);
}
//-------------------------------------------------------------------
int start()                            // Spec. function start()
  {
//--------------------------------------------------------------- 2 --
   int Handle;                          // File descriptor
   string File_Name="H.csv",          // Name of the file            
          D1,                           // Data           
          Str_DtTm;                    // Date and time of the event (line)
   datetime Dat_DtTm;                  // Date and time of the event (date)
   double  DD1;      // Data Converted 
//--------------------------------------------------------------- 3 --
   Handle=FileOpen(File_Name,FILE_CSV|FILE_READ,",");// File opening
   if(Handle<0)                        // File opening fails
     {
      if(GetLastError()==4103)         // If the file does not exist,..
         Alert("No file named ",File_Name);//.. inform trader
      else                             // If any other error occurs..
         Alert("Error while opening file ",File_Name);//..this message
      PlaySound("Bzrrr.wav");          // Sound accompaniment
      return(0);                          // Exit start()      
     }
//--------------------------------------------------------------- 4 --
   while(FileIsEnding(Handle)==false)  // While the file pointer..
     {                                 // ..is not at the end of the file
      //--------------------------------------------------------- 5 --
      Str_DtTm =FileReadString(Handle);// Date and time of the event (date)
      D1     =FileReadString(Handle);     
      
      if(FileIsEnding(Handle)==true)   // File pointer is at the end
         break;                        // Exit reading and drawing
      //--------------------------------------------------------- 6 --
      Dat_DtTm =StrToTime(Str_DtTm);   // Transformation of data type
           
      DD1 = floor(StrToDouble(D1)); 
          
      //------------------------------------------------------ Pricing    
     
      double CalcDigits = MarketInfo(Symbol(),MODE_DIGITS);
      {
      if(CalcDigits == 2 || CalcDigits == 3) CalcPoint = 100;
      else if (CalcDigits == 4 || CalcDigits == 5) CalcPoint = 10000;
      }
      
      double j =  iOpen(Symbol(), PERIOD_D1, iBarShift(Symbol(),PERIOD_D1, Dat_DtTm));
      double SK = floor((36*Scale));
      double k = floor(round((j*CalcPoint))/SK);
     
      double L1 = ((k * SK)+ floor((DD1 * Scale)))/CalcPoint;
 
     
  // Orders-----------------------------
      if(TimeCurrent() == Dat_DtTm)
      {
       double T1 = L1;
       
       
       for(int x=OrdersTotal()-1;x>=0;x--)
      {
         if(OrderSelect(x,SELECT_BY_POS) && OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol())
          {
          if(OrderType()==OP_BUY)
             can_buy=false;
          if(OrderType()==OP_SELL)
             can_sell=false;
          }
      }
  //----------------------------------------
     if(can_buy)
     {
     
     if(Close[1]> T1 ) 
       
       {
       
       double BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       double BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green); 
       
       }
     
     
     }
 //--------------------      
    if(can_sell)
     {
    
       if(Close[1]< T1 ) 
       
       {
       double SellStopLoss = Bid + (StopLoss * CalcPoint1);
       double SellTakeProfit = Bid - (TakeProfit *  CalcPoint1);
       SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);     
       
       }   
    
     }
  ///------------------------          
        
      }
//-----------------end of orders
           
      }
    
    //--------------------------------------------------------------- 8 --
   FileClose( Handle );                // Close file
   PlaySound("bulk.wav");              // Sound accompaniment
   WindowRedraw();                     // Redraw object
   return(0);                             // Exit start()
  }

//------------------------------------------------------------
Keith Watford
Moderator
9603
Keith Watford 2016.03.24 07:03  
cashcube:

In the start function it need to run tick by tick cause it fetches data from a csv file.

I am here sharing the whole code..please help me to make it working...Currently it stuck after taking one trade.

 

You're fortunate that it takes 1 trade

if(TimeCurrent() == Dat_DtTm)

If there are irregular ticks this may never be true.

If it is true and a trade is opened, it will not be true again unless the value is changed in the file. So no 2nd trade opened.

Mimi
501
Mimi 2016.03.25 04:12  
GumRai:

You're fortunate that it takes 1 trade

if(TimeCurrent() == Dat_DtTm)

If there are irregular ticks this may never be true.

If it is true and a trade is opened, it will not be true again unless the value is changed in the file. So no 2nd trade opened.

I added that code because on my CSV file there are two column: One is Date & 2nd one is Data (with which we will be calculating level for entries).

If Current date get matches with with CSV data "Date column" then it takes the "Data" & calculate the level for trade entries & trades it.

Then how can I do this?

Thanks.. 

Mimi
501
Mimi 2016.03.29 14:12  

Any Highlight on this thread...?

I declared  them locally. 

bool can_buy=true;
 bool can_sell=true;

How to compare two dates on mql4. Current date with the date fetched from csv file? 

12
To add comments, please log in or register