Equity trailing stop advisor v.1.1

Author: R0MAN
Orders Execution
Checks for the total of open ordersIt Closes Orders by itself
0 Views
0 Downloads
0 Favorites
Equity trailing stop advisor v.1.1
ÿþ//+---------------------------------------------------------------------------------+

//|30.01.2025 B@>9=>9 B@59;8=3 AB>?

// A25B;>9 ?0<OB8 5>=840 ?>A2OI05BAO leonid553 leonid553@ya.ru

//+---------------------------------------------------------------------------------+

#property copyright "R0MAN"

#property link      "rshiredchenko@mail.ru"



#define BEGIN_PROFIT 0        // 0G0;L=K9 ?@>D8B

//------- =5H=85 ?0@0<5B@K M:A?5@B0 -------------------------------------------+

#property strict



input string  Symbol1Name    = "EURUSD";

input string  Symbol2Name    = "US500";    // ! " B> 45;0BL (sy=="0") || (sy==" ") || (sy=="")

input string  Symbol3Name    = "USDInd";   // ! " B> 45;0BL (sy="0



input  int    MagicNumber = 0;       // 45=B8D8:0B>@ ?>78F89



input string  ____TR_____ = "=== 0@0<5B@K "@59;8=3AB>?0 ===";

input double Trailing_Stop   = 100;    // $8:A8@>20==K9 @07<5@ B@0;0 2 20;NB5 45?>78B0

input double Trailing_Step   = 10;     // (03 B@0;0 2 20;NB5 45?>78B0



input string  ____CLOSE____ = "=== 0:@KB85 ?> ?@>D8BC/C1KB:C ===";

input double     CloseProfit = 500;//70405< AC<<0@=K9 ?@>D8B 70:@KB8O 2 20;NB5 45?>78B0

input double     CloseLoss = -5000;//70405< AC<<0@=K9 C1KB>: 70:@KB8O 2 20;NB5 45?>78B0



input    int NumberOfTry   = 5;               // >;8G5AB2> ?>?KB>:

input   int Slippage      = 150;             // @>A:0;L7K20=85 F5=K

double gdProfit      = BEGIN_PROFIT;    // !C<<0@=K9 ?@>D8B 2K1@0==KE ?>78F89

bool  gbNoInit       = false;           // $;03 =5C40G=>9 8=8F80;870F88

bool   gbDisabled    = false;           // ;>:8@>2:0

double pr_up=0;



//------- >4:;NG5=85 2=5H=8E <>4C;59 -----------------------------------------+

//-- >4:;NG05<K5 <>4C;8 --

#include <stdlib.mqh>          // !B0=40@B=0O 181;8>B5:0 "4

#include <stderror.mqh>        // !B0=40@B=0O 181;8>B5:0 "4



int OnInit()  //DC=:F8O 8=8F80;870F88 A>25B=8:0

  {

//- 0 2AO:89 A;CG09 =0?><=8< ?>;L7>20B5;N, 5A;8 >= 701K; :

   gbNoInit=false;

   if(!IsTradeAllowed())

     {

      Message(";O =>@<0;L=>9 @01>BK A>25B=8:0 =5>1E>48<>\n"+

              " 07@5H8BL A>25B=8:C B>@3>20BL");

      gbNoInit=true;

      return(0);

     }

   if(!IsLibrariesAllowed())

     {

      Message(";O =>@<0;L=>9 @01>BK A>25B=8:0 =5>1E>48<>\n"+

              " 07@5H8BL 8<?>@B 87 2=5H=8E M:A?5@B>2");

      gbNoInit=true;

      return(0);

     }



   return(INIT_SUCCEEDED);

  } // ========= :>=5F DC=:F88  int init()





//============================= $C=:F8O !" " =====================================+

void OnTick()

  {



   Comment("MagicNumber = ",MagicNumber,  "\n",

           "!8<2>;K B@59;8=30 ?>78F89: ",Symbol1Name," & ",Symbol2Name," & ",Symbol3Name,"\n",

           "!C<<0@=K9 ?@>D8B 70:@KB8O = ","$",CloseProfit,"\n",

           "!C<<0@=K9 C1KB>: 70:@KB8O = ","$",CloseLoss,"\n",

           ""5:CI89 AC<<0@=K9 ?@>D8B = ",pr_up,"\n",

           ""@59;8=3_!B>? = ",Trailing_Stop,  "\n",

           "#@>25=L 70:@KB8O =",  gdProfit);

//---------------------------------------------------

//----------------------------------------- "@0;8=3 AB>?   ---------------------------------------



   if(!ExistPositions(Symbol1Name,-1,MagicNumber)) // 5A;8 =5B ?>78F89 ?@>D8B AB0@B>2K9 70=C;O5<

     {

      gdProfit=BEGIN_PROFIT;

      pr_up = 0;

     }



//-------------------  0:@KB85 ?>78F89 ?> 7040==><C AC<<0@=><C ?@>D8BC/C1KB:C --------------------------------

   if(((GetProfitOpenPosInCurrency(Symbol1Name,-1,MagicNumber) +

        GetProfitOpenPosInCurrency(Symbol2Name,-1,MagicNumber) +

        GetProfitOpenPosInCurrency(Symbol3Name,-1, MagicNumber) >= CloseProfit))    ||

      ((GetProfitOpenPosInCurrency(Symbol1Name,-1,MagicNumber) +

        GetProfitOpenPosInCurrency(Symbol2Name,-1,MagicNumber) +

        GetProfitOpenPosInCurrency(Symbol3Name,-1, MagicNumber) <= CloseLoss)))

     {

      ClosePosFirstProfit(Symbol1Name,-1,MagicNumber);

      ClosePosFirstProfit(Symbol2Name,-1,MagicNumber);

      ClosePosFirstProfit(Symbol3Name,-1,MagicNumber);

     }



//------------------------------ "@>9=>9 B@59;8=3 AB>? ---------------------------------------

//2KG8A;O5< AC<<0@=K9 B5:CI89 ?@>D8B MB8E ?>78F89 2 20;NB5 45?>78B0 :

   pr_up = (GetProfitOpenPosInCurrency(Symbol1Name,-1,MagicNumber) + // 28@BC0;L=K9 B@59;8=3 AB>?

            GetProfitOpenPosInCurrency(Symbol2Name,-1,MagicNumber) +

            GetProfitOpenPosInCurrency(Symbol3Name,-1,MagicNumber));







   if(ExistPositions(Symbol1Name,-1,MagicNumber)) // 5A;8 5ABL E>BO 1K >4=0 ?>78F8O 4;O B@59;8=30

     {

      if(pr_up-Trailing_Stop>0)   //5A;8 AC<<0@=K9 ?@>D8B

        {

         //1>;LH5 7040==>3> 2> 2=5H=8E ?0@0<5B@0E 7=0G5=8O Trailing_Stop

         if(gdProfit<pr_up-Trailing_Stop-Trailing_Step)

            gdProfit=pr_up-Trailing_Stop;

        }// - ?>4BO=C;8  28@BC0;L=K9 B@59;8=3

     }





   if(gdProfit > pr_up && pr_up > 0 && gdProfit > 0) // :>340 B5:CI89 ?@>D8B ?0405B (AB0=>28BAO <5=LH5 ?@>B@0;5==>3>), B> 70:@K205<

     {

      for(int i=0; i<NumberOfTry; i++)

        {

         if(ExistPositions(Symbol1Name,-1,MagicNumber))

            ClosePosFirstProfit(Symbol1Name,-1, MagicNumber);

         if(ExistPositions(Symbol2Name,-1,MagicNumber))

            ClosePosFirstProfit(Symbol2Name,-1,MagicNumber);

         if(ExistPositions(Symbol3Name,-1,MagicNumber))

            ClosePosFirstProfit(Symbol3Name,-1,MagicNumber);

         Sleep(1000);

        }



     }

//=============== :>=5F 1;>:0 ""@>9=>9 B@59;8=3 AB>?" ====================



  }//=========================== :>=5F DC=:F88 !" "  ==========================



//-------------------- ,",! $#& ----------------------------------



//+----------------------------------------------------------------------------+

//|  2B>@    : 8< 3>@L . aka KimIV,  http://www.kimiv.ru                   |

//+----------------------------------------------------------------------------+

//|  5@A8O   : 06.03.2008                                                     |

//|    sy - =08<5=>20=85 8=AB@C<5=B0   (""   - ;N1>9 A8<2>;,                   |

//|                                     NULL - B5:CI89 A8<2>;)                 |

//|    op - >?5@0F8O                   (-1   - ;N10O ?>78F8O)                  |

//|    mn - MagicNumber                (-1   - ;N1>9 <038:)                    |

//|    ot - 2@5<O >B:@KB8O             ( 0   - ;N1>5 2@5<O >B:@KB8O)           |

//+----------------------------------------------------------------------------+

bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0)

  {

   int i, k=OrdersTotal();



   for(i=0; i<k; i++)

     {

      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

        {

         if(OrderSymbol()==sy || sy=="")

           {

            if(OrderType()==OP_BUY || OrderType()==OP_SELL)

              {

               if(op<0 || OrderType()==op)

                 {

                  if(mn<0 || OrderMagicNumber()==mn)

                    {

                     if(ot<=OrderOpenTime())

                        return(true);

                    }

                 }

              }

           }

        }

     }

   return(false);

  }

//+----------------------------------------------------------------------------+

//|  2B>@    : 8< 3>@L . aka KimIV,  http://www.kimiv.ru                   |

//+----------------------------------------------------------------------------+

//|  5@A8O   : 01.09.2005                                                     |

//|  ?8A0=85 : >72@0I05B =08<5=>20=85 B>@3>2>9 >?5@0F88                      |

//|    op - 845=B8D8:0B>@ B>@3>2>9 >?5@0F88                                    |

//+----------------------------------------------------------------------------+

string GetNameOP(int op)

  {

   switch(op)

     {

      case OP_BUY      :

         return("Buy");

      case OP_SELL     :

         return("Sell");

      case OP_BUYLIMIT :

         return("BuyLimit");

      case OP_SELLLIMIT:

         return("SellLimit");

      case OP_BUYSTOP  :

         return("BuyStop");

      case OP_SELLSTOP :

         return("SellStop");

      default          :

         return("Unknown Operation");

     }

  }//:>=5F DC=:F88

//+----------------------------------------------------------------------------+

//|  2B>@    : 8< 3>@L . aka KimIV,  http://www.kimiv.ru                   |

//+----------------------------------------------------------------------------+

//|  5@A8O   : 01.09.2005                                                     |

//|  ?8A0=85 : >72@0I05B =08<5=>20=85 B09<D@59<0                             |

//|    TimeFrame - B09<D@59< (:>;8G5AB2> A5:C=4)      (0 - B5:CI89 "$)         |

//+----------------------------------------------------------------------------+

string GetNameTF(int TimeFrame=0)

  {

   if(TimeFrame==0)

      TimeFrame=Period();

   switch(TimeFrame)

     {

      case PERIOD_M1:

         return("M1");

      case PERIOD_M5:

         return("M5");

      case PERIOD_M15:

         return("M15");

      case PERIOD_M30:

         return("M30");

      case PERIOD_H1:

         return("H1");

      case PERIOD_H4:

         return("H4");

      case PERIOD_D1:

         return("Daily");

      case PERIOD_W1:

         return("Weekly");

      case PERIOD_MN1:

         return("Monthly");

      default:

         return("UnknownPeriod");

     }

  } //:>=5F DC=:F88

//+----------------------------------------------------------------------------+

//|  2B>@    : 8< 3>@L . aka KimIV,  http://www.kimiv.ru                   |

//+----------------------------------------------------------------------------+

//|  5@A8O   : 01.09.2005                                                     |

//|  ?8A0=85 : K2>4 A>>1I5=8O 2 :><<5=B 8 2 6C@=0;                           |

//|  0@0<5B@K:   m - B5:AB A>>1I5=8O                                          |

//+----------------------------------------------------------------------------+

void Message(string m)

  {

   Comment(m);

   if(StringLen(m)>0)

      Print(m);

  }

  



//+----------------------------------------------------------------------------+

//|  2B>@    : 8< 3>@L . aka KimIV,  http://www.kimiv.ru/                  |

//+----------------------------------------------------------------------------+

//|  5@A8O   : 19.02.2008                                                     |

//|  ?8A0=85 : >72@0I05B :>;8G5AB2> ?>78F89.                                 |

//|    sy - =08<5=>20=85 8=AB@C<5=B0   (""   - ;N1>9 A8<2>;,                   |

//|                                     NULL - B5:CI89 A8<2>;)                 |

//|    op - >?5@0F8O                   (-1   - ;N10O ?>78F8O)                  |

//|    mn - MagicNumber                (-1   - ;N1>9 <038:)                    |

//+----------------------------------------------------------------------------+

int NumberOfPositions(string sy="", int op=-1, int mn=-1)

  {

   int i, k=OrdersTotal(), kp=0;

   for(i=0; i<k; i++)

     {

      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

        {

         if(OrderSymbol()==sy || sy=="")

           {

            if(OrderType()==OP_BUY || OrderType()==OP_SELL)

              {

               if(op<0 || OrderType()==op)

                 {

                  if(mn<0 || OrderMagicNumber()==mn)

                     kp++;

                 }

              }

           }

        }

     }

   return(kp);

  }

//+----------------------------------------------------------------------------+

//|  2B>@    : 8< 3>@L . aka KimIV,  http://www.kimiv.ru                   |

//+----------------------------------------------------------------------------+

//|  5@A8O   : 19.02.2008                                                     |

//|  ?8A0=85 : >72@0I05B AC<<0@=K9 ?@>D8B >B:@KBKE ?>78F89 2 20;NB5 45?>78B0 |

//|    sy - =08<5=>20=85 8=AB@C<5=B0   (""   - ;N1>9 A8<2>;,                   |

//|                                     NULL - B5:CI89 A8<2>;)                 |

//|    op - >?5@0F8O                   (-1   - ;N10O ?>78F8O)                  |

//|    mn - MagicNumber                (-1   - ;N1>9 <038:)                    |

//+----------------------------------------------------------------------------+

double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1)

  {

   double p=0;

   int    i, k=OrdersTotal();



   if((sy=="0") || (sy==" ") || (sy=="")) // 5A;8 =5B B>@3>2 ?> A8<2>;C 2KE>4

      return(p);

   for(i=0; i<k; i++)

     {

      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

        {

         if((OrderSymbol()==sy) && (op<0 || OrderType()==op))

           {

            if(OrderType()==OP_BUY || OrderType()==OP_SELL)

              {

               if(mn<0 || OrderMagicNumber()==mn)

                 {

                  p+=OrderProfit()+OrderCommission()+OrderSwap();

                 }

              }

           }

        }

     }

   return(p);

  }

//+----------------------------------------------------------------------------+

//|  2B>@    : 8< 3>@L . aka KimIV,  http://www.kimiv.ru                   |

//+----------------------------------------------------------------------------+

//|  5@A8O  : 19.02.2008                                                      |

//|  ?8A0=85: 0:@KB85 >4=>9 ?@5420@8B5;L=> 2K1@0==>9 ?>78F88                 |

//+----------------------------------------------------------------------------+

void ClosePosBySelect()

  {

   bool fc;

   color clClose;

   double ll, pa, pb, pp;

   int  err, it;

   if(OrderType()==OP_BUY || OrderType()==OP_SELL)

     {

      for(it=1; it<=NumberOfTry; it++)

        {

         if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))

            break;

         while(!IsTradeAllowed())

            Sleep(5000);

         RefreshRates();

         pa=MarketInfo(OrderSymbol(), MODE_ASK);

         pb=MarketInfo(OrderSymbol(), MODE_BID);

         if(OrderType()==OP_BUY)

           {

            pp=pb;

            clClose=clrGray;

           }

         else

           {

            pp=pa;

            clClose=clrGray;

           }

         ll=OrderLots();

         fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);

         if(fc)

           {



           }

         else

           {

            err=GetLastError();

            if(err==146)

               while(IsTradeContextBusy())

                  Sleep(1000*11);

            Print("Error(",err,") Close ",GetNameOP(OrderType())," ",

                  ErrorDescription(err),", try ",it);

            Print(OrderTicket(),"  Ask=",pa,"  Bid=",pb,"  pp=",pp);

            Print("sy=",OrderSymbol(),"  ll=",ll,"  sl=",OrderStopLoss(),

                  "  tp=",OrderTakeProfit(),"  mn=",OrderMagicNumber());

            Sleep(1000*5);

           }

        }

     }

   else

      Print("5:>@@5:B=0O B>@3>20O >?5@0F8O. Close ",GetNameOP(OrderType()));

  }

//+----------------------------------------------------------------------------+

//|  2B>@    : 8< 3>@L . aka KimIV,  http://www.kimiv.ru                   |

//+----------------------------------------------------------------------------+

//|  5@A8O   : 19.02.2008                                                     |

//|  ?8A0=85 : 0:@KB85 ?>78F89 ?> @K=>G=>9 F5=5 A=0G0;0 ?@81K;L=KE           |

//|    sy - =08<5=>20=85 8=AB@C<5=B0   (""   - ;N1>9 A8<2>;,                   |

//|                                     NULL - B5:CI89 A8<2>;)                 |

//|    op - >?5@0F8O                   (-1   - ;N10O ?>78F8O)                  |

//|    mn - MagicNumber                (-1   - ;N1>9 <038:)                    |

//+----------------------------------------------------------------------------+

void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1)

  {

   int i, k=OrdersTotal();



   for(i=k-1; i>=0; i--)

     {

      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

        {

         if((OrderSymbol()==sy) && (op<0 || OrderType()==op))

           {

            if(OrderType()==OP_BUY || OrderType()==OP_SELL)

              {

               if(mn<0 || OrderMagicNumber()==mn)

                 {

                  if(OrderProfit()+OrderSwap()>0)

                     ClosePosBySelect();

                 }

              }

           }

        }

     }  // >B>< 2A5 >AB0;L=K5 :

   k=OrdersTotal();

   for(i=k-1; i>=0; i--)

     {

      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

        {

         if((OrderSymbol()==sy) && (op<0 || OrderType()==op))

           {

            if(OrderType()==OP_BUY || OrderType()==OP_SELL)

              {

               if(mn<0 || OrderMagicNumber()==mn)

                  ClosePosBySelect();

              }

           }

        }

     }

  }//:>=5F DC=:F88



//+------------------------------------------------------------------+

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