cm partial closing position

Author: Copyright © 2021, Vladimir Hlystov
Orders Execution
It automatically opens orders when conditions are reachedChecks for the total of open orders
0 Views
0 Downloads
0 Favorites
cm partial closing position
ÿþ#property copyright "Copyright © 2021, Vladimir Hlystov"

#property link      "cmillion@narod.ru"

#property version   "1.2"

#property strict

#property description "1.A>25B=8: >BA;568205B >B:@KBK5 ?>78F88 ?> 2A5< 8;8 7040==><C 8=AB@C<5=BC."

#property description "2 ?@8 4>AB865=88 C:070==>9 ?@81K;8 70:@K205B G0ABL ?>78F88"

#property description "3 ?@8 ?5@2>< G0AB8G=>< 70:@KB88 ?5@52>48B ?>78F8N 2 157C1KB>: + NoLoss ?C=:B>2 ?@81K;8"

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

//|                                                                  |

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

enum tt 

{

   //tr2=0,    //?> B5:CI59 20;NB5

   //tr1=1,    //?> 2A5< A8<2>;0<

   tr2=0, //for the current currency

   tr1=1, //for all currency

};



input tt       Symb>l       = 1;

//K1>@ ?> 2A5< 20;NB0< @01>B0BL 8;8 B>;L:> ?> B>9, =0 :>B>@>9 CAB0=>2;5= A>25B=8:

input int     MagicNumber             =  -1;

// 038: >@45@>2 A :>B>@K<8 @01>B05B M:A?5@B. -1 - 2A5 <038:8.

input int  CloseLevel1              =  50;

input int  CloseLevel2              =  100;

input int  CloseLevel3              =  150;

input int  CloseLevel4              =  250;

// #@>2=8 70:@KB8O. 0?@8<5@, ?@8 ?0@0<5B@0E 50/100/150/250 ?5@2>5 70:@KB85 2K?>;=O5BAO ?@8 4>AB865=88 >@45@>< ?@81K;8 2 50 ?C=:B>2, 70B5< 5I5 G5@57 100 ?C=:B>2 8 5I5 G5@57 150 ?C=:B>2.

input int  Percents1                =  50;

input int  Percents2                =  30;

input int  Percents3                =  10;

input int  Percents4                =  10;

// @>F5=B 70:@KB8O (G5@57 @0745;8B5;L "/") 4;O A>>B25BAB2CNI53> C@>2=O. 45AL >BAG5B 845B >B ;>B0 ?5@2>3> >@45@0. A;8 8AE>4=K9 >@45@ >B:@KB A ;>B>< 1.0 ;>B, 70:@K205BAO 50% - 0.5, 70B5< 30% >B 1.0 - 0.3 ... 0,1 8 =0:>=5F 0.1

input int  MinProfitNoLoss          =  0;

// 5@52>4 2 157C1KB>: ?@8 ?5@2>< G0AB8G=>< 70:@KB88

sinput int     Slippage              =  3;

// >?CAB8<>5 >B:;>=5=85 >B 70?@>H5==>9 F5=K

sinput double  scale        = 1.2;  

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

//|                                                                  |

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

string AC,GVp;

int NoLoss,Magic,LevelClose[4];

int PercentClose[4];

bool SymbolAll=false,LANGUAGE;

double Bid,Ask;

MqlTick tick;

MqlTradeRequest request;

MqlTradeResult result;

MqlTradeCheckResult check;

ENUM_ORDER_TYPE_FILLING FillingMode=ORDER_FILLING_RETURN;

int FREEZE_LEVEL=0;

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

//|                                                                  |

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

int OnInit()

{

   //account_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);

   int FILLING_MODE=(int)SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);

   if ((SYMBOL_FILLING_IOC & FILLING_MODE)==SYMBOL_FILLING_IOC) FillingMode=ORDER_FILLING_IOC;// A5 8;8 G0AB8G=>

   if ((SYMBOL_FILLING_FOK & FILLING_MODE)==SYMBOL_FILLING_FOK) FillingMode=ORDER_FILLING_FOK;//<>65B 1KBL 8A?>;=5= 8A:;NG8B5;L=> 2 C:070==>< >1J5<5

   Comment("");

   AC=AccountInfoString(ACCOUNT_CURRENCY);

   GVp="cm partial closing position ";

   if(MQLInfoInteger(MQL_TESTER)) GVp=GVp+" Testing ";

   if(AccountInfoInteger(ACCOUNT_TRADE_MODE)!=ACCOUNT_TRADE_MODE_REAL)    GVp=GVp+" Demo ";



   if(MQLInfoInteger(MQL_TESTER)) GlobalVariablesDeleteAll(GVp);



   LevelClose[0]=CloseLevel1;

   LevelClose[1]=CloseLevel2;

   LevelClose[2]=CloseLevel3;

   LevelClose[3]=CloseLevel4;



   PercentClose[0]=Percents1;

   PercentClose[1]=Percents2;

   PercentClose[2]=Percents3;

   PercentClose[3]=Percents4;



   LANGUAGE=TerminalInfoString(TERMINAL_LANGUAGE)=="Russian";

   int Y=20;

   SymbolAll=Symb>l==1;

   Magic=MagicNumber;

   NoLoss=MinProfitNoLoss;

   ButtonCreate(0,"cm PCP Symb>l"   ,0,205,Y,200,20,CORNER_RIGHT_UPPER,SymbolAll?"All Symbol":Symbol(),"Arial",12,clrBlack,clrLightGray,clrNONE,SymbolAll,false,false,true,0,LANGUAGE?"K1>@ ?> 2A5< 20;NB0< @01>B0BL 8;8 B>;L:> ?> B>9, =0 :>B>@>9 CAB0=>2;5= A>25B=8:":"The choice to work for all currencies or only for the one on which the Expert Advisor is installed");Y+=19;

   EditCreate(0,"cm PCP Magic_"      ,0,205,Y,101,20,"Magic"      ,"Arial",12,ALIGN_CENTER,true,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"Magic (@8 CAB0=>2:5 7=0G5=8O -1 A>25B=8: 2848B 2A5 <038:8)":"Magic  (When setting the value -1, the Expert Advisor sees all the magics)");Y+=19;

   EditCreate(0,"cm PCP CloseLevel_" ,0,205,Y,101,20,"Close Level"              ,"Arial",12,ALIGN_CENTER,true,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"#@>2=8 70:@KB8O":"Closing Levels");Y+=19;

   EditCreate(0,"cm PCP Percents_"   ,0,205,Y,101,20,"% close"                  ,"Arial",12,ALIGN_CENTER,true,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"@>F5=B 70:@KB8O":"Closing percentage");Y+=19;

   EditCreate(0,"cm PCP NoLoss_"     ,0,205,Y,101,20,"Min profit no loss"       ,"Arial",12,ALIGN_CENTER,true,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"<8=8<0;L=0O ?@81K;L ?@8 ?5@52>45 2 157C1KB>:":"minimum profit when transferring to breakeven");Y=39;



   EditCreate(0,"cm PCP Magic"      ,0,105,Y,100,20,IntegerToString(Magic),"Arial",12,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"Magic (@8 CAB0=>2:5 7=0G5=8O -1 A>25B=8: 2848B 2A5 <038:8)":"Magic  (When setting the value -1, the Expert Advisor sees all the magics)");Y+=19;

   EditCreate(0,"cm PCP CloseLevel1",0,105,Y,26,20,IntegerToString(CloseLevel1),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"#@>2=8 70:@KB8O. =>A8< =5A:>;L:> C@>2=59 G5@57 @0745;8B5;L /":"Closing Levels. Adding several levels through the separator /");

   EditCreate(0,"cm PCP CloseLevel2",0, 80,Y,26,20,IntegerToString(CloseLevel2),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"#@>2=8 70:@KB8O. =>A8< =5A:>;L:> C@>2=59 G5@57 @0745;8B5;L /":"Closing Levels. Adding several levels through the separator /");

   EditCreate(0,"cm PCP CloseLevel3",0, 55,Y,26,20,IntegerToString(CloseLevel3),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"#@>2=8 70:@KB8O. =>A8< =5A:>;L:> C@>2=59 G5@57 @0745;8B5;L /":"Closing Levels. Adding several levels through the separator /");

   EditCreate(0,"cm PCP CloseLevel4",0, 30,Y,25,20,IntegerToString(CloseLevel4),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"#@>2=8 70:@KB8O. =>A8< =5A:>;L:> C@>2=59 G5@57 @0745;8B5;L /":"Closing Levels. Adding several levels through the separator /");Y+=19;

   EditCreate(0,"cm PCP Percents1"  ,0,105,Y,26,20,IntegerToString(Percents1),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"@>F5=B 70:@KB8O. =>A8< =5A:>;L:> C@>2=59 G5@57 @0745;8B5;L /":"Closing percentage. Adding several levels through the separator /");

   EditCreate(0,"cm PCP Percents2"  ,0, 80,Y,26,20,IntegerToString(Percents2),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"@>F5=B 70:@KB8O. =>A8< =5A:>;L:> C@>2=59 G5@57 @0745;8B5;L /":"Closing percentage. Adding several levels through the separator /");

   EditCreate(0,"cm PCP Percents3"  ,0, 55,Y,26,20,IntegerToString(Percents3),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"@>F5=B 70:@KB8O. =>A8< =5A:>;L:> C@>2=59 G5@57 @0745;8B5;L /":"Closing percentage. Adding several levels through the separator /");

   EditCreate(0,"cm PCP Percents4"  ,0, 30,Y,25,20,IntegerToString(Percents4),"Arial",11,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"@>F5=B 70:@KB8O. =>A8< =5A:>;L:> C@>2=59 G5@57 @0745;8B5;L /":"Closing percentage. Adding several levels through the separator /");Y+=19;

   EditCreate(0,"cm PCP NoLoss"     ,0,105,Y,100,20,IntegerToString(NoLoss)     ,"Arial",12,ALIGN_CENTER,false,CORNER_RIGHT_UPPER,clrBlack,clrWhite,clrGray,false,false,true,0,LANGUAGE?"<8=8<0;L=0O ?@81K;L ?@8 ?5@52>45 2 157C1KB>:":"minimum profit when transferring to breakeven");Y+=19;

   OnTick();

   return(0);

}

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

//|                                                                  |

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

void OnDeinit(const int r)

{

   if(MQLInfoInteger(MQL_TESTER)) GlobalVariablesDeleteAll(GVp);

   ObjectsDeleteAll(0,"cm PCP");



   return;

}

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

//|                                                                  |

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

string txt=NULL;

int N=0;

void OnTick()

{

   if (NoLoss!=(int)StringToInteger(ObjectGetString(0,"cm PCP NoLoss",OBJPROP_TEXT)))

   {

      NoLoss=(int)StringToInteger(ObjectGetString(0,"cm PCP NoLoss",OBJPROP_TEXT));

      txt=StrCon(txt,LANGUAGE?"7<5=5=":"Changed"," NoLoss = ",IntegerToString(NoLoss),"\n");

   }

   if (Magic!=(int)StringToInteger(ObjectGetString(0,"cm PCP Magic",OBJPROP_TEXT)))

   {

      Magic=(int)StringToInteger(ObjectGetString(0,"cm PCP Magic",OBJPROP_TEXT));

      txt=StrCon(txt,LANGUAGE?"7<5=5=":"Changed"," Magic = ",IntegerToString(Magic),"\n");

   }

   if (LevelClose[0]!=(int)StringToInteger(ObjectGetString(0,"cm PCP CloseLevel1",OBJPROP_TEXT)))

   {

      LevelClose[0]=(int)StringToInteger(ObjectGetString(0,"cm PCP CloseLevel1",OBJPROP_TEXT));

      txt=StrCon(txt,LANGUAGE?"7<5=5=":"Changed"," LevelClose 1 = ",IntegerToString(LevelClose[0]),"pips\n");

   }

   if (LevelClose[1]!=(int)StringToInteger(ObjectGetString(0,"cm PCP CloseLevel2",OBJPROP_TEXT)))

   {

      LevelClose[1]=(int)StringToInteger(ObjectGetString(0,"cm PCP CloseLevel2",OBJPROP_TEXT));

      txt=StrCon(txt,LANGUAGE?"7<5=5=":"Changed"," LevelClose 2 = ",IntegerToString(LevelClose[1]),"pips\n");

   }

   if (LevelClose[2]!=(int)StringToInteger(ObjectGetString(0,"cm PCP CloseLevel3",OBJPROP_TEXT)))

   {

      LevelClose[2]=(int)StringToInteger(ObjectGetString(0,"cm PCP CloseLevel3",OBJPROP_TEXT));

      txt=StrCon(txt,LANGUAGE?"7<5=5=":"Changed"," LevelClose 3 = ",IntegerToString(LevelClose[2]),"pips\n");

   }

   if (LevelClose[3]!=(int)StringToInteger(ObjectGetString(0,"cm PCP CloseLevel4",OBJPROP_TEXT)))

   {

      LevelClose[3]=(int)StringToInteger(ObjectGetString(0,"cm PCP CloseLevel4",OBJPROP_TEXT));

      txt=StrCon(txt,LANGUAGE?"7<5=5=":"Changed"," PercentClose 4 = ",IntegerToString(PercentClose[3]),"pips\n");

   }

   //---

   if (PercentClose[0]!=(int)StringToInteger(ObjectGetString(0,"cm PCP Percents1",OBJPROP_TEXT)))

   {

      PercentClose[0]=(int)StringToInteger(ObjectGetString(0,"cm PCP Percents1",OBJPROP_TEXT));

      txt=StrCon(txt,LANGUAGE?"7<5=5=":"Changed"," PercentClose 1 = ",IntegerToString(PercentClose[0]),"%\n");

   }

   if (PercentClose[1]!=(int)StringToInteger(ObjectGetString(0,"cm PCP Percents2",OBJPROP_TEXT)))

   {

      PercentClose[1]=(int)StringToInteger(ObjectGetString(0,"cm PCP Percents2",OBJPROP_TEXT));

      txt=StrCon(txt,LANGUAGE?"7<5=5=":"Changed"," PercentClose 2 = ",IntegerToString(PercentClose[1]),"%\n");

   }

   if (PercentClose[2]!=(int)StringToInteger(ObjectGetString(0,"cm PCP Percents3",OBJPROP_TEXT)))

   {

      PercentClose[2]=(int)StringToInteger(ObjectGetString(0,"cm PCP Percents3",OBJPROP_TEXT));

      txt=StrCon(txt,LANGUAGE?"7<5=5=":"Changed"," PercentClose 3 = ",IntegerToString(PercentClose[2]),"%\n");

   }

   if (PercentClose[3]!=(int)StringToInteger(ObjectGetString(0,"cm PCP Percents4",OBJPROP_TEXT)))

   {

      PercentClose[3]=(int)StringToInteger(ObjectGetString(0,"cm PCP Percents4",OBJPROP_TEXT));

      txt=StrCon(txt,LANGUAGE?"7<5=5=":"Changed"," PercentClose 4 = ",IntegerToString(PercentClose[3]),"%\n");

   }

   //---

   if (SymbolAll != ObjectGetInteger(0,"cm PCP Symb>l",OBJPROP_STATE))

   {

      SymbolAll = ObjectGetInteger(0,"cm PCP Symb>l",OBJPROP_STATE);

      ObjectSetString(0,"cm PCP Symb>l",OBJPROP_TEXT,SymbolAll?"All Symbol":Symbol());

   }

   double POINT,BID,ASK,OOP,OTP,OSL,SL,LotsClose;

   int Ticket,i,DIGITS;

   int NO=0;

   double TekLot,OL;

   bool SS=false;

   int OT,n=0;

   string OrdSym;

   

   

         //string          txt1=NULL;



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

   {

      OrdSym=PositionGetSymbol(i);

      if (OrdSym!=NULL)

      {

         if ((int)PositionGetInteger(POSITION_MAGIC)==Magic || Magic==-1)

         {

            OT=0;

            if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY ) OT= 1;

            if (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL) OT=-1;

            TekLot=PositionGetDouble(POSITION_VOLUME);

            Ticket  = (int)PositionGetInteger(POSITION_TICKET);

            DIGITS=(int)SymbolInfoInteger(OrdSym,SYMBOL_DIGITS);

            OOP = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),DIGITS);

            OSL = NormalizeDouble(PositionGetDouble(POSITION_SL),DIGITS);

            OTP = NormalizeDouble(PositionGetDouble(POSITION_TP),DIGITS);



            if(OrdSym==Symbol() || SymbolAll)

            {

               OL=TekLot;

               int STOPLEVEL=(int)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL);

               POINT=SymbolInfoDouble(OrdSym,SYMBOL_POINT);

               BID=NormalizeDouble(SymbolInfoDouble(OrdSym,SYMBOL_BID),DIGITS);

               ASK=NormalizeDouble(SymbolInfoDouble(OrdSym,SYMBOL_ASK),DIGITS);

               NO=0;

               if(GlobalVariableCheck(StrCon(GVp,IntegerToString(Ticket)," ",OrdSym," Num")))

               {

                  NO=((int)GlobalVariableGet(StrCon(GVp,IntegerToString(Ticket)," ",OrdSym," Num")))+1;

               }

               if(GlobalVariableCheck(StrCon(GVp,IntegerToString(Ticket)," ",OrdSym," Lots")))

               {

                  OL=GlobalVariableGet(StrCon(GVp,IntegerToString(Ticket)," ",OrdSym," Lots"));

               }

               if(NO<0) NO=0;

               if(NO>=ArraySize(LevelClose)) NO=ArraySize(LevelClose)-1;



               if(OT==1)

               {

                  n++;

                  if(NormalizeDouble(BID-OOP,DIGITS)>=NormalizeDouble(POINT*LevelClose[0],DIGITS))

                  {

                  //txt1=StrCon(txt1,IntegerToString(Ticket)," ",OrdSym," B ",DoubleToString((BID-OOP)/POINT,0)," ",DoubleToString(OL,2)," ",DoubleToString(TekLot,2),"\n");

                     SL=NormalizeDouble(OOP+NoLoss*POINT,DIGITS);

                     if (OSL!=SL && BID>SL+STOPLEVEL*POINT)

                     {

                        if (Modify_SL_TP(Ticket, OOP, SL, OTP))

                           txt=StrCon(txt,"NoLoss ",IntegerToString(Ticket)," ",OrdSym," B ",DoubleToString(OSL,DIGITS)," -> ",DoubleToString(SL,DIGITS),"\n");

                     }

                  }

                  if(NormalizeDouble(BID-OOP,DIGITS)>=NormalizeDouble(POINT*LevelClose[NO],DIGITS))

                  {

                     LotsClose=CheckVolumeValue(PercentClose[NO]/100.0*OL,OrdSym);

                     if(LotsClose>0)

                     {

                        LotsClose=MathMin(LotsClose,TekLot);

                        if(CloseTiket(Ticket, LotsClose))

                        {

                           SS=true;

                           txt=StrCon(txt,"close ",IntegerToString(Ticket)," ",OrdSym," B ",DoubleToString(LotsClose,2)," (",DoubleToString(OL,2),") ",IntegerToString(NO),"\n");

                           GlobalVariableSet(StrCon(GVp,IntegerToString(Ticket)," ",OrdSym," Num"),NO);

                           GlobalVariableSet(StrCon(GVp,IntegerToString(Ticket)," ",OrdSym," Lots"),OL-LotsClose);

                        }

                     }

                  }

               }

               if(OT==-1)

               {

                  n++;

                  if(NormalizeDouble(OOP-ASK,DIGITS)>=NormalizeDouble(POINT*LevelClose[0],DIGITS))

                  {

                  //txt1=StrCon(txt1,IntegerToString(Ticket)," ",OrdSym," S ",DoubleToString((OOP-ASK)/POINT,0)," ",NO," ",DoubleToString(OL,2)," ",DoubleToString(TekLot,2),"\n");

                     SL=NormalizeDouble(OOP-NoLoss*POINT,DIGITS);

                     if (OSL!=SL && ASK<SL-STOPLEVEL*POINT && OL<TekLot)

                     {

                        if (Modify_SL_TP(Ticket, OOP, SL, OTP))

                         txt=StrCon(txt,"NoLoss ",IntegerToString(Ticket)," ",OrdSym," S ",DoubleToString(OSL,DIGITS)," -> ",DoubleToString(SL,DIGITS),"\n");

                     }

                  }

                  if(NormalizeDouble(OOP-ASK,DIGITS)>=NormalizeDouble(POINT*LevelClose[NO],DIGITS))

                  {

                     LotsClose=CheckVolumeValue(PercentClose[NO]/100.0*OL,OrdSym);

                     if(LotsClose>0)

                     {

                        LotsClose=MathMin(LotsClose,TekLot);

                        if(CloseTiket(Ticket, LotsClose))

                        {

                           SS=true;

                           txt=StrCon(txt,"close ",IntegerToString(Ticket)," ",OrdSym," S ",DoubleToString(LotsClose,2)," (",DoubleToString(OL,2),") ",IntegerToString(NO),"\n");

                           GlobalVariableSet(StrCon(GVp,IntegerToString(Ticket)," ",OrdSym," Num"),NO);

                           GlobalVariableSet(StrCon(GVp,IntegerToString(Ticket)," ",OrdSym," Lots"),OL-LotsClose);

                        }

                     }

                  }

               }

            }

         }

      }

   }

   if(MQLInfoInteger(MQL_TESTER) && n<2)

   {

      double Lot=CheckVolumeValue(0.1);

      if (CheckMoneyForTrade(Symbol(),Lot, 1))

         SendOrder(1, 0,Lot,0,0);

      if (CheckMoneyForTrade(Symbol(),Lot,-1))

         SendOrder(-1,0,Lot,0,0);

   }

  

   Comment(txt);

}

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

//|                                                                  |

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

double CheckVolumeValue(double volume, string Sim=NULL)

{

   double min_volume=SymbolInfoDouble(Sim,SYMBOL_VOLUME_MIN);

   if(volume<min_volume) return(min_volume);

   double max_volume=SymbolInfoDouble(Sim,SYMBOL_VOLUME_MAX);

   if(volume>max_volume) return(max_volume);

   double volume_step=SymbolInfoDouble(Sim,SYMBOL_VOLUME_STEP);

   int ratio=(int)MathRound(volume/volume_step);

   if(MathAbs(ratio*volume_step-volume)>0.0000001) return(ratio*volume_step);

   return(volume);

}

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

//|                                                                  |

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

bool EditCreate(const long             chart_ID=0,               // ID 3@0D8:0 

                const string           name="Edit",              // 8<O >1J5:B0 

                const int              sub_window=0,             // =><5@ ?>4>:=0 

                const int              x=0,                      // :>>@48=0B0 ?> >A8 X 

                const int              y=0,                      // :>>@48=0B0 ?> >A8 Y 

                const int              width=50,                 // H8@8=0 

                const int              height=18,                // 2KA>B0 

                const string           text="Text",              // B5:AB 

                const string           font="Arial",             // H@8DB 

                const int              font_size=10,             // @07<5@ H@8DB0 

                const ENUM_ALIGN_MODE  align=ALIGN_CENTER,       // A?>A>1 2K@02=820=8O 

                const bool             read_only=false,          // 2>7<>6=>ABL @540:B8@>20BL 

                const ENUM_BASE_CORNER corner=CORNER_LEFT_UPPER, // C3>; 3@0D8:0 4;O ?@82O7:8 

                const color            clr=clrBlack,             // F25B B5:AB0 

                const color            back_clr=clrWhite,        // F25B D>=0 

                const color            border_clr=clrNONE,       // F25B 3@0=8FK 

                const bool             back=false,               // =0 704=5< ?;0=5 

                const bool             selection=false,          // 2K45;8BL 4;O ?5@5<5I5=89 

                const bool             hidden=true,              // A:@KB 2 A?8A:5 >1J5:B>2 

                const long             z_order=0,// ?@8>@8B5B =0 =060B85 <KHLN 

                const string           podskazka="")                

  { 

   if(ObjectFind(chart_ID,name)==0)

   {

      ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);

      ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 

      ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); 

   }

   else

   {

      if(!ObjectCreate(chart_ID,name,OBJ_EDIT,sub_window,0,0)) return(false); 

      ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,(int)(x*scale)); 

      ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,(int)(y*scale)); 

      ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,(int)(width*scale)); 

      ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,(int)(height*scale)); 

      ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); 

      ObjectSetString(chart_ID,name,OBJPROP_FONT,font); 

      ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); 

      ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,align); 

      ObjectSetInteger(chart_ID,name,OBJPROP_READONLY,read_only); 

      ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); 

      ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 

      ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); 

      ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr); 

      ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 

      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 

      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 

      ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 

      ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 

      ObjectSetString(chart_ID,name,OBJPROP_TOOLTIP,podskazka);

   }

   return(true); 

  } 

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

bool ButtonCreate(const long              chart_ID=0,               // ID 3@0D8:0 

                  const string            name="Button",            // 8<O :=>?:8 

                  const int               sub_window=0,             // =><5@ ?>4>:=0 

                  const int               x=0,                      // :>>@48=0B0 ?> >A8 X 

                  const int               y=0,                      // :>>@48=0B0 ?> >A8 Y 

                  const int               width=50,                 // H8@8=0 :=>?:8 

                  const int               height=18,                // 2KA>B0 :=>?:8 

                  const ENUM_BASE_CORNER  corner=CORNER_LEFT_UPPER, // C3>; 3@0D8:0 4;O ?@82O7:8 

                  const string            text="Button",            // B5:AB 

                  const string            font="Arial",             // H@8DB 

                  const int               font_size=10,             // @07<5@ H@8DB0 

                  const color             clr=clrBlack,             // F25B B5:AB0 

                  const color             back_clr=C'236,233,216',  // F25B D>=0 

                  const color             border_clr=clrNONE,       // F25B 3@0=8FK 

                  const bool              state=false,              // =060B0/>B60B0 

                  const bool              back=false,               // =0 704=5< ?;0=5 

                  const bool              selection=false,          // 2K45;8BL 4;O ?5@5<5I5=89 

                  const bool              hidden=true,              // A:@KB 2 A?8A:5 >1J5:B>2 

                  const long              z_order=0,// ?@8>@8B5B =0 =060B85 <KHLN 

                const string           podskazka="")                // 

  { 



   if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0)) return(false); 

   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,(int)(x*scale)); 

   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,(int)(y*scale)); 

   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,(int)(width*scale)); 

   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,(int)(height*scale)); 

   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner); 

   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text); 

   ObjectSetString(chart_ID,name,OBJPROP_FONT,font); 

   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size); 

   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 

   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr); 

   ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr); 

   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 

   ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state); 

   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 

   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 

   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 

   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 

      ObjectSetString(chart_ID,name,OBJPROP_TOOLTIP,podskazka);

   return(true); 

  } 

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

bool CheckMoneyForTrade(string symb,double lots,int type)

  {

   double volume_limit=SymbolInfoDouble(symb,SYMBOL_VOLUME_LIMIT);

   if(volume_limit>0 && lots>=volume_limit) {Print(lots," > VOLUME_LIMIT ",volume_limit);return(false);}

   if(lots>=SymbolInfoDouble(symb,SYMBOL_VOLUME_MAX)) {Print(lots," > VOLUME_MAX");return(false);}

//--- ?>;CG8< F5=C >B:@KB8O

   MqlTick mqltick;

   SymbolInfoTick(symb,mqltick);

   double price=mqltick.ask;

   if(type==-1) price=mqltick.bid;

   double margin,free_margin=AccountInfoDouble(ACCOUNT_MARGIN_FREE);

   if(!OrderCalcMargin(type==-1?ORDER_TYPE_SELL:ORDER_TYPE_BUY,symb,lots,price,margin))

     {

      Print("Error in ",__FUNCTION__," code=",GetLastError());

      return(false);

     }

   if(margin>free_margin)

     {

      return(false);

     }

   return(true);

  }

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

string StrCon(string t1=NULL,string t2=NULL,string t3=NULL,string t4=NULL,string t5=NULL,string t6=NULL,string t7=NULL,string t8=NULL,string t9=NULL,string t10=NULL,

              string t11=NULL,string t12=NULL,string t13=NULL,string t14=NULL,string t15=NULL,string t16=NULL,string t17=NULL,string t18=NULL,string t19=NULL,string t20=NULL,

              string t21=NULL,string t22=NULL)

{

   string str;

   #ifdef __MQL4__ str=StringConcatenate(#endif  

   #ifdef __MQL5__ StringConcatenate(str,#endif t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16,t17,t18,t19,t20,t21,t22);

   return(str);

}

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

bool Modify_SL_TP(int Ticket, double OOP, double SL, double TP)

{

      ZeroMemory(request);

      ZeroMemory(result);

      request.action    = TRADE_ACTION_SLTP;

      request.position  = Ticket;

      request.symbol    = _Symbol;

      request.magic     = Magic;

      request.sl        = SL;

      request.tp        = TP;

      if(!OrderSend(request,result)) Print("error modifi buy sl tp ",GetLastError());

      else return(true);

   

   return(false);

}

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

uint SendOrder(int Tip, double Price, double lot, double SumLot, int Mag, double sl=0, double tp=0, string comment="www.cmillion.ru")

{

   if(!IsNewOrderAllowed()) return(false);

   lot=CheckVolumeValue(lot);

   double limitlot=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_LIMIT);

   if(limitlot>0)

   {

      if(lot+SumLot>limitlot) return(false);

   }



   ZeroMemory(request);

   ZeroMemory(result);

   if (MathAbs(Tip)==1) request.action = TRADE_ACTION_DEAL;

   else                 request.action = TRADE_ACTION_PENDING;

   request.magic  = Mag;

   request.symbol = _Symbol;

   request.volume = lot;

   request.sl = sl;

   request.tp = tp;

   if (Tip== 1) {request.type=ORDER_TYPE_BUY;         request.price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);}

   if (Tip==-1) {request.type=ORDER_TYPE_SELL;        request.price=SymbolInfoDouble(_Symbol,SYMBOL_BID);}

   if (Tip== 2) {request.type=ORDER_TYPE_BUY_STOP;    request.price=Price;}

   if (Tip==-2) {request.type=ORDER_TYPE_SELL_STOP;   request.price=Price;}

   if (Tip== 3) {request.type=ORDER_TYPE_BUY_LIMIT;   request.price=Price;}

   if (Tip==-3) {request.type=ORDER_TYPE_SELL_LIMIT;  request.price=Price;}



   request.deviation=Slippage;

   request.comment=comment;

   request.type_filling=FillingMode;

   request.type_time=ORDER_TIME_GTC;

   request.expiration=0;



   if(OrderCheck(request,check))

   {

      if(!OrderSend(request,result))

         PrintFormat("Order Send error %d",GetLastError()," lot=",lot," price=",request.price);  // 5A;8 >B?@028BL 70?@>A =5 C40;>AL, 2K25AB8 :>4 >H81:8

   

      if(result.retcode==10016) Print(result.bid,result.ask,result.price); 

   }

   return result.retcode;

}

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

#ifdef __MQL5__

bool CloseTiket(int Tiket, double lot)

{

   if (Tiket==0) return(true);

   if (!PositionSelectByTicket(Tiket)) return(true);

   ZeroMemory(request);

   ZeroMemory(result);

   request.action=TRADE_ACTION_DEAL;

   request.position = Tiket;

   string Symb=PositionGetString(POSITION_SYMBOL);

   request.symbol = Symb;

   request.volume=lot;//PositionGetDouble(POSITION_VOLUME);

   request.deviation = Slippage;

   request.magic  = PositionGetInteger(POSITION_MAGIC);

   

   

   long OT = PositionGetInteger(POSITION_TYPE);

   request.comment="";

   request.type_filling = FillingMode;



   if (OT==POSITION_TYPE_BUY) 

   {

      request.price=SymbolInfoDouble(Symb,SYMBOL_BID);

      request.type=ORDER_TYPE_SELL;

      

   }

   if (OT==POSITION_TYPE_SELL) 

   {

      request.price=SymbolInfoDouble(Symb,SYMBOL_ASK);

      request.type=ORDER_TYPE_BUY;

   }

   if(OrderSend(request,result)) return(true);

         Print("Error Close Tiket "," retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order,"   FREEZE_LEVEL ",DoubleToString(FREEZE_LEVEL,_Digits));



   return(false);

}

   #endif

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

bool IsNewOrderAllowed()

{

   int max_allowed_orders=(int)AccountInfoInteger(ACCOUNT_LIMIT_ORDERS);

   if(max_allowed_orders==0) return(true);

   if(OrdersTotal()<max_allowed_orders) return(true);

   return(false);

}

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

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