e_Breakeven_v3

Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategy
Miscellaneous
It plays sound alerts
0 Views
0 Downloads
0 Favorites
e_Breakeven_v3
//+------------------------------------------------------------------+
//|                                         Óñòàíîâèòü Áåçóáûòîê.mq4 |
//|                                          Copyright © 2011, Corp. |
//|                                                   todem5@mail.ru |
//+------------------------------------------------------------------+
#property link      "blog forex"
#property show_inputs
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+

extern int Delta    =75;
color   clModifyBuy  = Red;        // Öâåò çíà÷êà ìîäèôèêàöèè ïîêóïêè
color   clModifySell = Red;        // Öâåò çíà÷êà ìîäèôèêàöèè ïðîäàæè
bool    UseSound     = True;
bool     gbNoInit     = False;           // Ôëàã íåóäà÷íîé èíèöèàëèçàöèè
string   SoundSuccess = "ok.wav";        // Çâóê óñïåõà
string   SoundError   = "timeout.wav";   // Çâóê îøèáêè
int      NumberOfTry  = 3;  

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
double M,MM,Prof,LL=0;
int r,ret; 
int Spr= MarketInfo(Symbol(),MODE_SPREAD);
      for( r=0;r<OrdersTotal();r++) //   
      { 
      if(OrderSelect(r,SELECT_BY_POS,MODE_TRADES)==false)    continue; 
      if(OrderSymbol()==Symbol() ) 
      {
      if (OrderType()<=2 )Prof=Prof+OrderProfit()+OrderSwap();
      if (OrderType()==OP_BUY) LL=LL+OrderLots();
      if (OrderType()==OP_SELL) LL=LL-OrderLots();
      }} 
      M=BEZ();//Óðîâåíü áåçóáûòêà äëÿ BUY
      Comment("Óðîâåíü áåçóáûòêà ",M,"+",Delta,"\n","Íàäî ïðîéòè  ",DoubleToStr(MathAbs(M-Bid)/Point,0)," Ëîò=",LL," ëîò",
        "\n","Îáùèé ïðîôèò  ",Prof);
       

if (LL<0)//Åñëè áîëüøå SELL Òî áåçóáûòîê - Delta íèæå Bid è íàîáîðîò
{
MM=M-Delta*Point;  // Åñëè áîëüøå SELL
      for( r=0;r<OrdersTotal();r++) //   
      { 
      if(OrderSelect(r,SELECT_BY_POS,MODE_TRADES)==false)    continue; 
      if(OrderSymbol()==Symbol() ) 
      { //Äëÿ BUY-Ñåðèè
     if (OrderType()==OP_BUY && OrderTakeProfit()!=NormalizeDouble(MM,Digits))
        ModifyOrder(-1,NormalizeDouble(MM,Digits),-1);
    
      //Äëÿ SELL-Ñåðèè
     if (OrderType()==OP_SELL && OrderTakeProfit()!=NormalizeDouble(MM,Digits)) 
        ModifyOrder(-1,-1,NormalizeDouble(MM,Digits)); 
}}}
if (LL>0)//Åñëè áîëüøå BUY Òî áåçóáûòîê + Delta âûøå Bid
{
MM=M+Delta*Point;     // Åñëè áîëüøå BUY
      for( r=0;r<OrdersTotal();r++) //   
      { 
      if(OrderSelect(r,SELECT_BY_POS,MODE_TRADES)==false)    continue; 
      if(OrderSymbol()==Symbol() ) 
      { //Äëÿ BUY-Ñåðèè
     if (OrderType()==OP_BUY && OrderTakeProfit()!=NormalizeDouble(MM,Digits))
        ModifyOrder(-1,-1,NormalizeDouble(MM,Digits));
    
      //Äëÿ SELL-Ñåðèè
     if (OrderType()==OP_SELL && OrderTakeProfit()!=NormalizeDouble(MM,Digits)) 
        ModifyOrder(-1,NormalizeDouble(MM,Digits),-1);
}    
}}   
//----
   return(0);
  }
//+----------------------------Ôóíêöèÿ --------------------------------------+
//+---------------- Ôóíêöèÿ ïîäñ÷¸òà áåçóáûòêà  -------------------------------------------+
double BEZ() {
  int Sp= MarketInfo(Symbol(),MODE_SPREAD);  
  double B2_B=0,B2_S=0,B2_LB=0,B2_LS=0,BSw=0,SSw=0;
      for(int b2=0;b2<OrdersTotal();b2++) //  
      {
      if(OrderSelect(b2,SELECT_BY_POS,MODE_TRADES)==false)    continue;
      if(OrderSymbol()==Symbol())
      {
           if (OrderType()==OP_BUY)
           {
           B2_B=((B2_B*B2_LB)+(OrderOpenPrice()*OrderLots()))/(B2_LB+OrderLots());
           B2_LB=B2_LB+OrderLots();
           BSw=BSw+OrderSwap();
            }
                if (OrderType()==OP_SELL)
                {
           B2_S=((B2_S*B2_LS)+(OrderOpenPrice()*OrderLots()))/(B2_LS+OrderLots());
           B2_LS=B2_LS+OrderLots();
           SSw=SSw+OrderSwap();
               }
            }}
    double M2B=0,M2S=0 ,M;           
    if (B2_LB>B2_LS)   // Èä¸ì ââåðõ
{
for(int J2=0;J2<10000;J2++)
    {
    M2B=J2*B2_LB*10;
    M2S=((B2_B-B2_S+0*Point)/Point+J2)*(B2_LS*(-10));
    if (M2B+M2S+BSw+SSw>=0) 
        {
        M=NormalizeDouble(B2_B+J2*Point,Digits);
        break;
        }}} 
if (B2_LS>B2_LB)  //  Èä¸ì âíèç
{
for(int J3=0;J3<10000;J3++)
    {
    M2S=J3*B2_LS*10;
    M2B=((B2_B-B2_S+0*Point)/Point+J3)*(B2_LB*(-10));
    if (M2S+M2B+BSw+SSw>=0) 
        {
        M=NormalizeDouble(B2_S-J3*Point,Digits);
        break;
        }}}
              
//----
   return(M);
   }
   
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  bool   fm;
  color  cl=IIFc(OrderType()==OP_BUY
              || OrderType()==OP_BUYLIMIT
              || OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell);
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;

  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);

  if (pp!=op || sl!=os || tp!=ot) {
    for (it=1; it<=NumberOfTry; it++) {
      if ((!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl);
      if (fm) {
        if (UseSound) PlaySound(SoundSuccess); break;
      } else {
        er=GetLastError();
        if (UseSound) PlaySound(SoundError);
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Sleep(1000*10);
      }
    }
  }
}

color IIFc(bool condition, color ifTrue, color ifFalse) {
  if (condition) return(ifTrue); else return(ifFalse);
}

Comments