Download MetaTrader 5

how to add pips for set orders ?

To add comments, please log in or register
NewTT1
28
NewTT1  

Hello Guys


I have an EA and that going to open trades at the signals call.

I want to add some pips more than price that signal coming.

For example indicator signal is at 1.10000 price and EA try to open position on that, BUT i want add some more pips above for BUY signals and below of SELL signals.

What should i do?



Thanks

NewTT1
28
NewTT1  
guys please help me !!!
JD4
1101
JD4  
People here are willing to help you solve YOUR problems when you show what it is YOU did to try to solve it already, by posting your code using the SRC button on this page when you enter your post.  If you want someone to code it for you, you can pay someone at the freelance section.
Sherif Hasan
7388
Sherif Hasan  

Try Pending Stop Orders with offset instead of instant orders.

Remeber that your offset value(gap) should be >Ask+spread

NewTT1
28
NewTT1  
input string StartTime      = "00:00";
input string EndTime        = "23:00"; 
input int    Diff           = 150;   
input int    TakeProfit     = 150;   
input int    Stoploss       = 150;
input int    AddPips        = 50;
input double Lotsize        = 0.1; 
input double Multiply       = 2; 
input int    Max_Cycle      = 3;
input bool   BrokerIsECN    = false;
input int    Magic_Number   = 12345;

input string             com1       = "****** Indicator Settings ******";
input int                Shift = 20;

string gs_comment = "SSA";
datetime gd_close_time = TimeCurrent();
bool gd_close_all;
datetime time_bar;
int gd_signal;


my tick functions


void OnTick()
  {
//--    
  int gd_last_tp=-1; 
  if(!gd_close_all && Hit_TP(gd_last_tp,gd_close_time)) {
  gd_close_all = true; 
  }
  
  if(gd_close_all) {
     CloseAll();
     if(orderCount(-1,Magic_Number)<1) gd_close_all = false;
     return;
  }
       
  double buy_lots=0, sell_lots=0;  
  double buy_sl=0, sell_sl=0;  
  int cnt_trade=0, cnt_buy=0, cnt_sell=0, cnt_bstop=0, cnt_sstop=0;
  datetime last_time=0;
  int last_type =-1;
  double buy_pip_sl=0, sell_pip_sl=0;  
  double buy_pip_tp=0, sell_pip_tp=0;  
  int last_level=0;
  for(int cnt=0;cnt<OrdersTotal();cnt++)  {
   int select =  OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
   if(OrderSymbol()!=Symbol()) continue;
   if(OrderMagicNumber() == Magic_Number) {
      cnt_trade++;
      if(OrderType()<2&&OrderOpenTime() > last_time )  {
        last_time = OrderOpenTime() ;
        last_type =OrderType();
      }
      if(OrderType()==OP_BUY) {
      cnt_buy++;
      buy_lots = OrderLots();
      buy_sl = OrderStopLoss();
      buy_pip_sl = OrderOpenPrice() - OrderStopLoss();
      buy_pip_tp = OrderTakeProfit() - OrderOpenPrice();
      }
      if(OrderType()==OP_SELL) {
      cnt_sell++;
      sell_lots = OrderLots();
      sell_sl = OrderStopLoss();
      sell_pip_tp = OrderOpenPrice() - OrderTakeProfit();
      sell_pip_sl = OrderStopLoss() - OrderOpenPrice();
      }
      if(OrderType()==OP_BUYSTOP) cnt_bstop++;
      if(OrderType()==OP_SELLSTOP) cnt_sstop++;
      last_level = get_number(OrderComment());
      }
  }
  
  double gd_lotsize = CheckLots(Multiply*MathMax(buy_lots,sell_lots));
  
  if(last_level>=Max_Cycle) return;
  
  if(last_type==1 && cnt_bstop < 1) {
  int send = PendingOrder(Symbol(),OP_BUYSTOP,gd_lotsize,sell_sl,sell_sl-sell_pip_sl-AddPips*Point,sell_sl+sell_pip_tp+AddPips*Point,gs_comment+(string)(last_level+1),Magic_Number);
  
  }
  
  if(last_type==0 && cnt_sstop <1 )   {
  int send = PendingOrder(Symbol(),OP_SELLSTOP,gd_lotsize,buy_sl,buy_sl+buy_pip_sl+AddPips*Point,buy_sl-buy_pip_tp-AddPips*Point,gs_comment+(string)(last_level+1),Magic_Number);
  }
  
   if(Time[0]>time_bar && WorkingHour(StartTime,EndTime) ) {
     if(cnt_trade>0) { time_bar = Time[0]; gd_signal =0; }
     else {
     gd_signal = Cal_Signal();
     if(gd_signal>0) time_bar = Time[0];
     }
  }
  
  if( gd_signal==1 && cnt_trade <1 ) {
     
     int send = MarketOrder(Symbol(),OP_BUY,Lotsize,Stoploss,TakeProfit,gs_comment+"1",Magic_Number);
     if( send >0 ) gd_signal =0;
  }

  if( gd_signal==2 && cnt_trade <1 ) {
     int send = MarketOrder(Symbol(),OP_SELL,Lotsize,Stoploss,TakeProfit,gs_comment+"1",Magic_Number);
     if( send >0 ) gd_signal =0;
  }
     if( gd_signal==2 && cnt_trade <1 ) {
     double price_stop;
     if((High[1]-Lowest(10)>=Diff*Point) && (High[1]-Lowest(10)<11*Point)) price_stop =Low[1]-Diff*Point-Shift*Point; else price_stop = Low[1]-Shift*Point;
     double sl =0, tp =0;
     if(Stoploss>0) sl = price_stop + Stoploss*Point;
     if(TakeProfit>0) tp = price_stop - TakeProfit*Point;
     int send = PendingOrder(Symbol(),OP_SELLSTOP,Lotsize,price_stop,sl,tp,gs_comment+"1",Magic_Number);
     if( send >0 ) gd_signal =0;
  }  
  }

NewTT1
28
NewTT1  

part 3


int MarketOrder(string a_symbol_0, int a_cmd_8, double a_lots_12, double a_stoploss_28, double a_takeprofit_36,string a_comment, int a_magic) {
   int l_error_64; int l_ticket_60; int l_slippage_68 = 8;
   double a_point = MarketInfo(a_symbol_0,MODE_POINT);
   double a_stoplevel = MarketInfo(a_symbol_0,MODE_STOPLEVEL); 
   double a_price_20 = MarketInfo(a_symbol_0,MODE_ASK);
   color l_color_92 = clrGreen;
   double sl = 0, tp  = 0;
   if( a_stoploss_28 > 0 ) sl  = MathMin(a_price_20 - a_stoploss_28*a_point,a_price_20 - a_stoplevel*a_point);
   if( a_takeprofit_36 > 0 ) tp  = MathMax(a_price_20 + a_takeprofit_36*a_point,a_price_20 + a_stoplevel*a_point);
   if (a_cmd_8 == OP_SELL) { 
   l_color_92 = clrRed; 
   a_price_20 = MarketInfo(a_symbol_0,MODE_BID); 
   if( a_stoploss_28 > 0 ) sl = MathMax(a_price_20+a_stoploss_28*a_point,a_price_20 + a_stoplevel*a_point);
   if( a_takeprofit_36 > 0 ) tp  = MathMin(a_price_20 - a_takeprofit_36*a_point,a_price_20 - a_stoplevel*a_point);
   }   
   if (BrokerIsECN) {
   l_ticket_60 = OrderSend(a_symbol_0, a_cmd_8, a_lots_12, a_price_20, l_slippage_68, 0, 0, a_comment, a_magic, 0, l_color_92);
   if (l_ticket_60 > 0 && (sl != 0 || tp !=0 )) int gi_modify = OrderModify(l_ticket_60, OrderOpenPrice(), sl, tp , 0,l_color_92);
   } else {
   l_ticket_60 = OrderSend(a_symbol_0, a_cmd_8, a_lots_12, a_price_20, l_slippage_68, sl, tp, a_comment, a_magic, 0, l_color_92);
   }
   if (l_ticket_60 <= 0) {
      l_error_64 = GetLastError();
      return (0);
   }
   return (l_ticket_60);}

bool WorkingHour(string a_starthour , string a_endhour) {
  
  datetime gi_time_01 = StrToTime(TimeToStr(iTime(NULL,PERIOD_D1,0), TIME_DATE) + " " + a_starthour);
  datetime gi_time_02 = StrToTime(TimeToStr(iTime(NULL,PERIOD_D1,0), TIME_DATE) + " " + a_endhour);
 
  if( gi_time_01 > gi_time_02 && TimeCurrent() < gi_time_02 )
  gi_time_01 = StrToTime(TimeToStr(iTime(NULL,PERIOD_D1,1), TIME_DATE) + " " + a_starthour);
    
  datetime datetime_0 = TimeCurrent();
  if ( gi_time_01 < gi_time_02 && gi_time_01 <= datetime_0 && datetime_0 <= gi_time_02 ) return (true);
  if ( gi_time_01 > gi_time_02 && datetime_0 >= gi_time_01 ) return (true);
  
  return (false);
}




int PendingOrder( string a_symbol, int a_type, double a_lots, double a_price, double a_stoploss, double a_takeprofit,string a_comment, int a_magic ) {
  double a_ask = MarketInfo(a_symbol,MODE_ASK);
  double a_bid = MarketInfo(a_symbol,MODE_BID);
  double a_point = MarketInfo(a_symbol,MODE_POINT);
  int a_stoplevel = (int)MarketInfo(a_symbol,MODE_STOPLEVEL);
  datetime expirationTime = 0;
  color  a_color = clrBlue;
  if(a_type==OP_SELLSTOP||a_type==OP_SELLLIMIT ) {
     a_color = clrRed;
  }  
  int ticket;
  ticket=OrderSend(a_symbol,a_type,a_lots,a_price,0,a_stoploss,a_takeprofit,a_comment,a_magic,expirationTime,clrNONE);
  if(ticket==-1) Print("Error " + (string) GetLastError() +" when sending order.");
  return (ticket);
}
NewTT1
28
NewTT1  

I fixed the marketorder to pendingorder like this:


if( gd_signal==1 && cnt_trade <1 ) {
     double price_stop;
     if(Highest(10)-High[1]<=Diff*Point) price_stop =High[1]+Diff*Point+Shift*Point; else price_stop = High[1]+Shift*Point;
     double sl =0, tp =0;
     if(Stoploss>0) sl = price_stop - Stoploss*Point;
     if(TakeProfit>0) tp = price_stop + TakeProfit*Point;
     int send = PendingOrder(Symbol(),OP_BUYSTOP,Lotsize,price_stop,sl,tp,gs_comment+"1",Magic_Number);
     if( send >0 ) gd_signal =0;
  }

  if( gd_signal==2 && cnt_trade <1 ) {
     double price_stop;
     if((High[1]-Lowest(10)>=Diff*Point) && (High[1]-Lowest(10)<11*Point)) price_stop =Low[1]-Diff*Point-Shift*Point; else price_stop = Low[1]-Shift*Point;
     double sl =0, tp =0;
     if(Stoploss>0) sl = price_stop + Stoploss*Point;
     if(TakeProfit>0) tp = price_stop - TakeProfit*Point;
     int send = PendingOrder(Symbol(),OP_SELLSTOP,Lotsize,price_stop,sl,tp,gs_comment+"1",Magic_Number);
     if( send >0 ) gd_signal =0;



BUT


I have new problem and that is : when signal called and pending order did set, if pending order get not reach and open, EA dose not delete that and dose not set new pending order for new signal.

What should i do now?

NewTT1
28
NewTT1  
some body please help me
NewTT1
28
NewTT1  
anyone gonna help please????
NewTT1
28
NewTT1  

why nobody answer me? always here is like this?

newbie people like me asking and nobody answer?

Olumide Samson
91
Olumide Samson  
NewT:

I fixed the  pendingorder like this:




BUT


I have new problem and that is : when signal called and pending order did set, if pending order get not reach and open, EA dose not delete that and dose not set new pending order for new signal.

What should i do now?




Ea won't delete the previous order until you tell it to do so... If signal come every hour. 
Use
static datetime timeprev;
static datetime newsignaltime;
 if(timeprev!=Time[0] && newsignaltime != prevsignaltime)
OrderDelete(OrderTicket(),blahblah);
 static prevsignaltime =newsignaltime;

Sort the rest out yaself...
Am 5% sure this might be what you need.
12
To add comments, please log in or register