cm ea RSI GrId

Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategyIt automatically opens orders when conditions are reached
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
cm ea RSI GrId
ÿþ//+------------------------------------------------------------------+

//|                               Copyright © 2020, %;KAB>2 ;048<8@ |

//|                                                cmillion@narod.ru |

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

#property copyright "Copyright © 2020, http://cmillion.ru"

#property link      "cmillion@narod.ru"

#property strict

#property description "!>25B=8: >B:@K205B ?5@2CN ?>78F8N ?> 8=48:0B>@C RSI"

#property description "@8 ?@>1>5 7040==>3> 7=0G5=8O RSI >B:@K205BAO ?5@2K9 >@45@."

#property description "0;55 ?> E>4C F5=K A H03>< 8 :>MDD8F85=B>< >B:@K20NBAO =>2K5 >@45@0."

#property description "!B>? ;>AA 4;O ?5@2>3> >@45@0 @025= @07<5@C H030."

#property description "AB>? ?>A;54CNI8E % >B ?@>945==>3>@0AAB>O=8O F5=>9 >B ?5@2>3> >@45@0."

#property description ""59:-?@>D8B AG8B05BAO >B ?5@2>3> >@45@0."



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

input int    Magic            = 0;//<038:

input ENUM_TIMEFRAMES TF_RSI  = 0;//TF 8=48:0B>@0 RSI 

input int    period_RSI       = 17;//5@8>4 8=48:0B>@0 RSI 

input int    RSI_level_BUY    = 30;//@>18B85 RSI A=87C 4;O Buy

input int    RSI_level_SELL   = 70;//@>18B85 RSI A25@EC 4;O Sell

input int    MinStep          = 100;//H03

input double K_Lot            = 1.0;//>MDD8F85=B ;>B0

input int    StopLossPercent  = 30;//!B>? %

input int    Takeprofit       = 2000;//"59:

input double FixLot           = 0.01;//$8:A8@>20==K9 =0G0;L=K9 ;>B

input double LotPercent       = 0.1;//?@>F5=B >B 10;0=A0 4;O @0AG5B0 ?5@2>3> ;>B0   

 int    slippage         = 40;//?@>A:0;L7K20=85 F5=K ?@8 >B:@KB88



int  DigitsLot = 2;

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

double MINLOT,MAXLOT;

double STOPLEVEL;

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

int OnInit()

{

   MINLOT=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);

   MAXLOT=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);

   string val=" "+AccountInfoString(ACCOUNT_CURRENCY);



   RectLabelCreate(0,"cmrl BalanceW",0,195,10,195,65);

   DrawLABEL("cm Balance",DoubleToString(0,2),40,20,clrBlack);

   DrawLABEL("cm Equity",DoubleToString(AccountInfoDouble(ACCOUNT_EQUITY),2),40,35,clrBlack);

   DrawLABEL("cm FreeMargin",DoubleToString(AccountInfoDouble(ACCOUNT_MARGIN_FREE),2),40,50,clrBlack);



   DrawLABEL("cmrl Balance","Balance",190,20,clrBlack,ANCHOR_LEFT);

   DrawLABEL("cmrl Equity","Equity",190,35,clrBlack,ANCHOR_LEFT);

   DrawLABEL("cmrl FreeMargin","FreeMargin",190,50,clrBlack,ANCHOR_LEFT);

   DrawLABEL("cmrl Profit","Profit",190,65,clrBlack,ANCHOR_LEFT);



   DrawLABEL("cmrl val Balance",val,5,20,clrBlack);

   DrawLABEL("cmrl val Equity",val,5,35,clrBlack);

   DrawLABEL("cmrl val FreeMargin",val,5,50,clrBlack);

   DrawLABEL("cm Take","",5,65,clrBlack);

   

   return(INIT_SUCCEEDED);

}

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

void OnTick()

{

   if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)) 

      Alert("@>25@LB5 2 =0AB@>9:0E B5@<8=0;0 @07@5H5=85 =0 02B><0B8G5A:CN B>@3>2;N!"); 

   else 

   { 

      if(!MQLInfoInteger(MQL_TRADE_ALLOWED)) 

         Alert("2B><0B8G5A:0O B>@3>2;O 70?@5I5=0 2 A2>9AB20E ?@>3@0<<K 4;O ",__FILE__); 

   }

   if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT)) 

      Alert("2B><0B8G5A:0O B>@3>2;O 70?@5I5=0 4;O AG5B0 ",AccountInfoInteger(ACCOUNT_LOGIN), 

      " =0 AB>@>=5 B>@3>2>3> A5@25@0");

      

   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED)) 

      Comment("">@3>2;O 70?@5I5=0 4;O AG5B0 ",AccountInfoInteger(ACCOUNT_LOGIN), 

      ".\n >7<>6=>, ?>4:;NG5=85 : B>@3>2><C AG5BC ?@>872545=> ?> 8=25AB ?0@>;N.", 

      "\n @>25@LB5 6C@=0; B5@<8=0;0, 5ABL ;8 B0< B0:0O 70?8AL:", 

      "\n\'",AccountInfoInteger(ACCOUNT_LOGIN),"\': trading has been disabled - investor mode.");



   if(AccountInfoInteger(ACCOUNT_TRADE_MODE)==ACCOUNT_TRADE_MODE_REAL && !IsTesting() && AccountNumber()!=3707228)

   {

      if (TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")

      {

         Comment(" 01>B0 A>25B=8:0 =0 @50;L=>< AG5B5 70?@5I5=0!, >1@0B8B5AL : @07@01>BG8:C 70 :;NG5< cmillion@narod.ru");

         Alert(" 01>B0 A>25B=8:0 =0 @50;L=>< AG5B5 70?@5I5=0!, >1@0B8B5AL : @07@01>BG8:C 70 :;NG5< cmillion@narod.ru");

      }

      else

      {

         Comment ("Advisor Work on a real account is prohibited! please contact the developer for the key cmillion@narod.ru");

         Alert ("Advisor Work on a real account is prohibited! please contact the developer for the key cmillion@narod.ru");

      }

      return;

   }



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



   double OSL,OTP,OOP,Profit=0,ProfitB=0,ProfitS=0;

   int i,b=0,s=0;

   long tip;

   //----

   double MaxOrderBuy=0,MinOrderSell=0,MinOrderBuy=0,MaxOrderSell=0,OL=0;

   double MinLotB=0,MinLotS=0;

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

   {    

      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

      { 

         if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())

         { 

            tip = OrderType(); 

            OOP = NormalizeDouble(OrderOpenPrice(),Digits);

            OL = OrderLots(); 

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

            if (tip==OP_BUY)             

            {  

               if (MinLotB>OL || MinLotB==0) MinLotB=OL;

               b++;

               if (MaxOrderBuy < OOP || MaxOrderBuy==0) MaxOrderBuy = OOP;

               if (MinOrderBuy > OOP || MinOrderBuy==0) MinOrderBuy = OOP;

               ProfitB += Profit; 

            }                                         

            if (tip==OP_SELL)        

            {

               if (MinLotS>OL || MinLotS==0) MinLotS=OL;

               s++;

               if (MinOrderSell > OOP || MinOrderSell==0) MinOrderSell = OOP;

               if (MaxOrderSell < OOP || MaxOrderSell==0) MaxOrderSell = OOP;

               ProfitS += Profit; 

            } 

         }  

      }  

   }

   //----

   Profit = ProfitB + ProfitS;

   double AB = AccountInfoDouble(ACCOUNT_BALANCE);

   double Drawdown=100*Profit/AB;

   //---

   ObjectSetString(0,"cm Balance"   ,OBJPROP_TEXT,DoubleToString(AB,2));

   ObjectSetString(0,"cm Equity"    ,OBJPROP_TEXT,DoubleToString(AccountInfoDouble(ACCOUNT_EQUITY),2));

   ObjectSetString(0,"cm FreeMargin",OBJPROP_TEXT,DoubleToString(AccountInfoDouble(ACCOUNT_MARGIN_FREE),2));

   ObjectSetString(0,"cm Take"        ,OBJPROP_TEXT,DoubleToString(Profit,2)+" "+DoubleToString(Drawdown,2)+"%");

   ObjectSetInteger(0,"cm Take"      ,OBJPROP_COLOR,Profit>0?clrGreen:clrRed);

   

   //---

   

   double TPb=0,TPs=0;

   if (Takeprofit>0)

   {

      if (b>0) TPb = NormalizeDouble(MinOrderBuy+Takeprofit*_Point,_Digits);

      if (s>0) TPs = NormalizeDouble(MaxOrderSell-Takeprofit*_Point,_Digits);

   }

   

   //---

   

   double SLb=0,SLs=0;

   if (b>0) 

   {

      if (b==1) SLb = NormalizeDouble(MinOrderBuy - MinStep*_Point,_Digits);

      else SLb = NormalizeDouble(Ask-(Ask-MinOrderBuy)/100*StopLossPercent,_Digits);

   }

   if (s>0) 

   {

      if (s==1) SLs = NormalizeDouble(MaxOrderSell + MinStep*_Point,_Digits);

      else SLs = NormalizeDouble(Bid+(MaxOrderSell-Bid)/100*StopLossPercent,_Digits);

   }

   

   DrawArrow("cm SL Buy",  SLb, iTime(NULL,0,0), clrBlue);

   DrawArrow("cm SL Sell", SLs, iTime(NULL,0,0), clrRed);



   //---



   if (b+s > 0) 

   {

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

      {    

         if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))

         { 

            if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())

            { 

               tip = OrderType(); 

               OSL = NormalizeDouble(OrderStopLoss(),Digits);

               OTP = NormalizeDouble(OrderTakeProfit(),Digits);

               OOP = NormalizeDouble(OrderOpenPrice(),Digits);

               if (tip==OP_BUY)             

               {  

                  if (SLb > OSL || TPb != OTP)

                  {  

                     if (!OrderModify(OrderTicket(),OOP,SLb,TPb,0,clrNONE)) 

                        Print("Error OrderModify <<",(GetLastError()),">> ");

                  }

               }                                         

               if (tip==OP_SELL)        

               {

                  if (SLs < OSL || TPs != OTP)

                  {  

                     if (!OrderModify(OrderTicket(),OOP,SLs,TPs,0,clrNONE)) 

                        Print("Error OrderModify <<",(GetLastError()),">> ");

                  }

               } 

            }

         }

      }

   }   

   //---

   ObjectSetString(0,"cmkn close Buy",OBJPROP_TEXT,DoubleToString(ProfitB,2)+" Close Buy");

   ObjectSetString(0,"cmkn close Sell",OBJPROP_TEXT,DoubleToString(ProfitS,2)+" Close Sell");

   ObjectSetString(0,"cmkn close All",OBJPROP_TEXT,DoubleToString(Profit,2)+" Close All");



   ObjectSetInteger(0,"cmkn close Buy",OBJPROP_COLOR,ProfitB<0?clrRed:clrGreen);

   ObjectSetInteger(0,"cmkn close Sell",OBJPROP_COLOR,ProfitS<0?clrRed:clrGreen);

   ObjectSetInteger(0,"cmkn close All",OBJPROP_COLOR,Profit<0?clrRed:clrGreen);



   //---

   

   double Lots=0,RSI1=0,RSI0=0;

   //---

   if (b==0 || s==0)

   {

      RSI0= iRSI (NULL,TF_RSI,period_RSI,PRICE_CLOSE,0);

      RSI1= iRSI (NULL,TF_RSI,period_RSI,PRICE_CLOSE,1);

   }

   //---

   if ((MaxOrderBuy+MinStep*Point<=Ask && b>0) || (RSI1<=RSI_level_BUY && RSI0>RSI_level_BUY  && b==0))

   {

      if (b==0) 

      {

         Lots=LOT();

      }

      else

      {

         Lots=NormalizeDouble(MinLotB*MathPow(K_Lot,b),DigitsLot);

      }

   

      SendOrder(OP_BUY, Lots, NormalizeDouble(Ask,Digits)); 

   }

   //---

   if ((MinOrderSell-MinStep*Point>=Bid && s>0) || (RSI1>=RSI_level_SELL && RSI0<RSI_level_SELL && s==0))

   {

      if (s==0) 

      {

         Lots=LOT();

      }

      else

      {

         Lots=NormalizeDouble(MinLotS*MathPow(K_Lot,s),DigitsLot);

      }



      SendOrder(OP_SELL, Lots, NormalizeDouble(Ask,Digits)); 

   }

}

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

color Color(bool P,color a,color b)

{

   if (P) return(a);

   else return(b);

}

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

void DrawLABEL(string name, string Name, int X, int Y, color clr,ENUM_ANCHOR_POINT align=ANCHOR_RIGHT)

{

   if (ObjectFind(0,name)==-1)

   {

      ObjectCreate(0,name, OBJ_LABEL, 0, 0, 0);

      ObjectSetInteger(0,name,OBJPROP_CORNER, CORNER_RIGHT_UPPER);

      ObjectSetInteger(0,name,OBJPROP_XDISTANCE, X);

      ObjectSetInteger(0,name,OBJPROP_YDISTANCE, Y);

      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);

      ObjectSetInteger(0,name,OBJPROP_SELECTED,false);

      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);

      ObjectSetInteger(0,name,OBJPROP_ANCHOR,align); 

      ObjectSetInteger(0,name,OBJPROP_COLOR,clr); 

      ObjectSetString(0,name,OBJPROP_FONT,"Arial"); 

      ObjectSetInteger(0,name,OBJPROP_FONTSIZE,8); 

      ObjectSetDouble(0,name,OBJPROP_ANGLE,0); 

   }

   ObjectSetString(0,name,OBJPROP_TEXT,Name); 

}

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

void OnDeinit(const int reason)

{

   ObjectsDeleteAll(0,"cm");

   Comment("");

}

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

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

                     const string           name="RectLabel",         // 8<O <5B:8

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

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

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

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

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

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

                     const color            clr=clrBlack,             // F25B ?;>A:>9 3@0=8FK (Flat)

                     const ENUM_LINE_STYLE  style=STYLE_SOLID,        // AB8;L ?;>A:>9 3@0=8FK

                     const int              line_width=1,             // B>;I8=0 ?;>A:>9 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

  {

   ResetLastError();

   if (ObjectFind(chart_ID,name)==-1)

   {

      ObjectCreate(chart_ID,name,OBJ_RECTANGLE_LABEL,sub_window,0,0);

      ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_TYPE,BORDER_FLAT);

      ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER_RIGHT_UPPER);

      ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);

      ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);

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

      //ObjectSetInteger(chart_ID,name,OBJPROP_ALIGN,ALIGN_RIGHT); 

   }

   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);

   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);

   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);

   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);

   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);

   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);

   return(true);

}

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

string Error(int code)

{

   switch(code)

   {

      case 0:   return("5B >H81>:");

      case 1:   return("5B >H81:8, => @57C;LB0B =58725AB5=");                            

      case 2:   return("1I0O >H81:0");                                                   

      case 3:   return("5?@028;L=K5 ?0@0<5B@K");                                         

      case 4:   return("">@3>2K9 A5@25@ 70=OB");                                          

      case 5:   return("!B0@0O 25@A8O :;85=BA:>3> B5@<8=0;0");                            

      case 6:   return("5B A2O78 A B>@3>2K< A5@25@><");                                  

      case 7:   return("54>AB0B>G=> ?@02");                                              

      case 8:   return("!;8H:>< G0ABK5 70?@>AK");                                         

      case 9:   return("54>?CAB8<0O >?5@0F8O =0@CH0NI0O DC=:F8>=8@>20=85 A5@25@0");      

      case 64:  return("!G5B 701;>:8@>20=");                                              

      case 65:  return("5?@028;L=K9 =><5@ AG5B0");                                       

      case 128: return("AB5: A@>: >6840=8O A>25@H5=8O A45;:8");                          

      case 129: return("5?@028;L=0O F5=0");                                              

      case 130: return("5?@028;L=K5 AB>?K");                                             

      case 131: return("5?@028;L=K9 >1J5<");                                             

      case 132: return(" K=>: 70:@KB");                                                   

      case 133: return("">@3>2;O 70?@5I5=0");                                               

      case 134: return("54>AB0B>G=> 45=53 4;O A>25@H5=8O >?5@0F88");                     

      case 135: return("&5=0 87<5=8;0AL");                                                

      case 136: return("5B F5=");                                                        

      case 137: return("@>:5@ 70=OB");                                                   

      case 138: return(">2K5 F5=K");                                                     

      case 139: return("@45@ 701;>:8@>20= 8 C65 >1@010BK205BAO");                        

      case 140: return(" 07@5H5=0 B>;L:> ?>:C?:0");                                       

      case 141: return("!;8H:>< <=>3> 70?@>A>2");                                         

      case 145: return(">48D8:0F8O 70?@5I5=0, B0: :0: >@45@ A;8H:>< 1;87>: : @K=:C");    

      case 146: return(">4A8AB5<0 B>@3>2;8 70=OB0");                                     

      case 147: return("A?>;L7>20=85 40BK 8AB5G5=8O >@45@0 70?@5I5=> 1@>:5@><");         

      case 148: return(">;8G5AB2> >B:@KBKE 8 >B;>65==KE >@45@>2 4>AB83;> ?@545;0, CAB0=>2;5==>3> 1@>:5@><.");

      default:   return("H81:0 =58725AB=0");

   }

}

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

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=8,             // @07<5@ H@8DB0 

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

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

                const ENUM_BASE_CORNER corner=CORNER_RIGHT_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 

  { 

   ResetLastError(); 

   if(!ObjectCreate(chart_ID,name,OBJ_EDIT,sub_window,0,0)) 

     { 

      Print(__FUNCTION__, 

            ": =5 C40;>AL A>740BL >1J5:B ",name,"! >4 >H81:8 = ",GetLastError()); 

      return(false); 

     } 

   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x); 

   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y); 

   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width); 

   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height); 

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

   return(true); 

  } 

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

string Text(bool P,string a,string b)

{

   if (P) return(a);

   else return(b);

}

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

double LOT()

{

   if (FixLot!=0) return(FixLot);

   double LOT = NormalizeDouble(AccountInfoDouble(ACCOUNT_BALANCE)*LotPercent/10000,DigitsLot);

   if (LOT>MAXLOT) LOT = MAXLOT;

   if (LOT<MINLOT) LOT = MINLOT;

   return(LOT);

}

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

bool DrawArrow(const string          name="RightPrice", // 8<O F5=>2>9 <5B:8 

               double                price=0,           // F5=0 B>G:8 ?@82O7:8 

               datetime              time=0,            // 2@5<O B>G:8 ?@82O7:8 

               const color           clr=clrRed,        // F25B F5=>2>9 <5B:8 

               const ENUM_LINE_STYLE style=STYLE_SOLID, // AB8;L >:09<;ONI59 ;8=88 

               const int             width=1,           // @07<5@ F5=>2>9 <5B:8 

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

               const bool            selection=true,    // 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 

  { 

   if(ObjectFind(0,name)<0)

   { 

      if(!ObjectCreate(0,name,OBJ_ARROW_RIGHT_PRICE,0,time,price)) 

      { 

         return(false); 

      } 

      ObjectSetInteger(0,name,OBJPROP_COLOR,clr); 

      ObjectSetInteger(0,name,OBJPROP_STYLE,style); 

      ObjectSetInteger(0,name,OBJPROP_WIDTH,width); 

      ObjectSetInteger(0,name,OBJPROP_BACK,back); 

      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,selection); 

      ObjectSetInteger(0,name,OBJPROP_SELECTED,selection); 

      ObjectSetInteger(0,name,OBJPROP_HIDDEN,hidden); 

      ObjectSetInteger(0,name,OBJPROP_ZORDER,z_order); 

   }

   ObjectSetInteger(0,name,OBJPROP_TIME,time); 

   ObjectSetDouble(0,name,OBJPROP_PRICE,price); 

   return(true); 

  } 

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

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

  }

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

double CheckVolumeValue(double volume)

  {

   double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);

   if(volume<min_volume)

     {

      return(min_volume);

     }



   double max_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);

   if(volume>max_volume)

     {

      return(max_volume);

     }



   double volume_step=SymbolInfoDouble(Symbol(),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 SendOrder(int tip, double lots, double price, double sl=0, double tp=0)

{

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

   lots=CheckVolumeValue(lots);

   if(lots>MAXLOT) lots = MAXLOT;

   if(lots<MINLOT) lots = MINLOT;

   if (tip<2)

   {

      if (AccountFreeMarginCheck(Symbol(),tip,lots)<0)

      {

         Alert("54>AB0B>G=> A@54AB2");

         return(false);

      }

   }

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

   {    

      if (OrderSend(Symbol(),tip, lots,price,slippage,sl,tp,NULL,Magic,0,clrNONE)!=-1) return(true);

         Alert(" ?>?KB:0 ",i," H81:0 >B:@KB8O >@45@0 ",Strtip(tip)," <<",Error(GetLastError()),">>  lot=",lots,"  pr=",price," sl=",sl," tp=",tp);

      Sleep(500);

      RefreshRates();

      if (IsStopped()) return(false);

   }

   return(false);

}

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

string Strtip(int tip)

{

   switch(tip) 

   { 

   case OP_BUY:      return("BUY"); 

   case OP_SELL:     return("SELL"); 

   case OP_BUYSTOP:  return("BUYSTOP"); 

   case OP_SELLSTOP: return("SELLSTOP"); 

   case OP_BUYLIMIT: return("BUYLIMIT"); 

   case OP_SELLLIMIT:return("SELLLIMIT"); 

   }

   return("error"); 

}

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

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