e_Breakeven_v4

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_v4
//+------------------------------------------------------------------+
//|                                         Óñòàíîâèòü Áåçóáûòîê.mq4 |
//|                                          Copyright © 2011, Corp. |
//|                                                   todem5@mail.ru |
//+------------------------------------------------------------------+
#property link      "blog forex"
#property show_inputs
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+

extern string a1 ="æåëàòåëüíî ÷òîá Delta=TrailingStop";
extern int Delta =20;
extern int MG    =0;
extern int TrailingStop=18;
extern int TrailingStep=3;
bool     bezubitok    = true;
color    clModifyBuy  = Red;        // Öâåò çíà÷êà ìîäèôèêàöèè ïîêóïêè
color    clModifySell = Red;        // Öâåò çíà÷êà ìîäèôèêàöèè ïðîäàæè
bool     UseSound     = True;
bool     gbNoInit     = False;           // Ôëàã íåóäà÷íîé èíèöèàëèçàöèè
string   SoundSuccess = "ok.wav";        // Çâóê óñïåõà
string   SoundError   = "timeout.wav";   // Çâóê îøèáêè
int      NumberOfTry  = 3;  
int      B,S,BS,SS;
double   Pr, Uroven,marketask,marketbid;
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int init()
{ // ïðîâåðêà öèôð ïîñëå çàïÿòîé
   if (TrailingStop<MarketInfo(Symbol(),MODE_STOPLEVEL))
      {
      TrailingStop=MarketInfo(Symbol(),MODE_STOPLEVEL);
      }
}

int OrdCon(int nap, int MGV)
  {
    int result=0;
    for (int i=0;i<OrdersTotal();i++) {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderType()==nap && OrderSymbol() == Symbol() && OrderMagicNumber() == MGV) {
        result=result+1;  // îòêðûò îðäåð áàéñòîï 
      }
    }
    return(result); // 0 means we have no trades
  }

int Flag() {
   int z1=0;
   int i, k=OrdersTotal();
   for (i=0; i<k; i++) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
         if (OrderSymbol() != Symbol())         continue;
         if (OrderMagicNumber() != MG)          continue;
         if (OrderType()<2) {
            if (OrderProfit()<0) z1++;
            }
         }
      }
   return(z1);
}

int start()
   {
   BS=OrdCon(OP_BUYSTOP, MG);
   SS=OrdCon(OP_SELLSTOP, MG);
   B=OrdCon(OP_BUY, MG);
   S=OrdCon(OP_SELL, MG);
   Pr =GetProfit(Symbol(), -1, MG);
   
   if ((B>=1 || S>=1) && Pr>0) {
      Uroven=BEZ();
      marketask=MarketInfo(Symbol(),MODE_ASK);
      marketbid=MarketInfo(Symbol(),MODE_BID);
      if (B>S && Uroven<=marketbid) {SimpleTrailing(Symbol(),MG);}
      if (S>B && Uroven>=marketask) {SimpleTrailing(Symbol(),MG);}
   }
   
   if (B>0 && S==0 && Flag()==0) {SimpleTrailing(Symbol(),MG);}
   if (S>0 && B==0 && Flag()==0) {SimpleTrailing(Symbol(),MG);}
     
   if ((bezubitok) && (B>=1 || S>=1) && Pr<-0.1) {BEZmain();}
   
   return(0);
   }
//+----------------------------Ôóíêöèÿ --------------------------------------+
//+---------------- Ôóíêöèÿ ïîäñ÷¸òà áåçóáûòêà  -------------------------------------------+
void BEZmain()   {
   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("Óðîâåíü áåçóáûòêà ",DoubleToStr(M,Digits),"+",Delta,"\n","Íàäî ïðîéòè  ",DoubleToStr(MathAbs(M-Bid)/Point,0)," Ëîò=",LL," ëîò",
        "\n","Îáùèé ïðîôèò  ",Prof);
       
if (LL==0 && B>0 && S>0)//Åñëè áîëüøå SELL Òî áåçóáûòîê - Delta íèæå Bid è íàîáîðîò
{
      for( r=0;r<OrdersTotal();r++) //   
      { 
      if(OrderSelect(r,SELECT_BY_POS,MODE_TRADES)==false)    continue; 
      if(OrderSymbol()==Symbol() ) 
      { 
     if (OrderType()<2 && OrderTakeProfit()!=NormalizeDouble(MM,Digits))
        ModifyOrder(-1,0,0);
}}}

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),0);
    
      //Äëÿ SELL-Ñåðèè
     if (OrderType()==OP_SELL && OrderTakeProfit()!=NormalizeDouble(MM,Digits)) 
        ModifyOrder(-1,0,0); 
}}}
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,0,0);
    
      //Äëÿ SELL-Ñåðèè
     if (OrderType()==OP_SELL && OrderTakeProfit()!=NormalizeDouble(MM,Digits)) 
        ModifyOrder(-1,NormalizeDouble(MM,Digits),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);
}

double GetProfit(string sy="", int op=-1, int mn=-1)
{
  double p=0;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            //if (dt<OrderCloseTime()) {
              p+=OrderProfit()+OrderCommission()+OrderSwap();
            //}
          }
        }
      }
    }
  }
  return(p);
}

void SimpleTrailing(string sy="", int mn=-1) {
  double po, pp;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        po=MarketInfo(OrderSymbol(), MODE_POINT);
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            pp=MarketInfo(OrderSymbol(), MODE_BID);
            if (pp-OrderOpenPrice()>TrailingStop*po) {
              if (OrderStopLoss()<pp-(TrailingStop+TrailingStep-1)*po) {
                ModifyOrder(-1, pp-TrailingStop*po, -1);
              }
            }
          }
          if (OrderType()==OP_SELL) {
            pp=MarketInfo(OrderSymbol(), MODE_ASK);
            if (OrderOpenPrice()-pp>TrailingStop*po) {
              if (OrderStopLoss()>pp+(TrailingStop+TrailingStep-1)*po || OrderStopLoss()==0) {
                ModifyOrder(-1, pp+TrailingStop*po, -1);
              }
            }
          }
        }
      }
    }
  }
}

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