Master_MM_Droid

Author: Copyright © 2013, Musa Esmagambetov
Price Data Components
Series array that contains the lowest prices of each barSeries array that contains open prices of each barSeries array that contains the highest prices of each bar
Orders Execution
Checks for the total of open orders
Indicators Used
Relative strength index
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
Master_MM_Droid
ÿþ//---

//|                     Master_MM_Droid(barabashkakvn's edition).mq5 |

//|     C1;8G=0O 15A?;0B=0O 25@A8O 2.4 4;O http://codebase.mql4.com |

//|                              Copyright © 2013, Musa Esmagambetov |

//|                                                   cocaine@nxt.ru |

//---

#property copyright "Copyright © 2013, Musa Esmagambetov"

#property link      "cocaine@nxt.ru"

#property version   "1.001"

#define MODE_LOW 1

#define MODE_HIGH 2



#include <Trade\PositionInfo.mqh>

#include <Trade\Trade.mqh>

#include <Trade\SymbolInfo.mqh>  

#include <Trade\AccountInfo.mqh>

#include <Trade\DealInfo.mqh>

#include <Trade\OrderInfo.mqh>

#include <Expert\Money\MoneyFixedRisk.mqh>

CPositionInfo  m_position;                   // trade position object

CTrade         m_trade;                      // trading object

CSymbolInfo    m_symbol;                     // symbol info object

CAccountInfo   m_account;                    // account info wrapper

CDealInfo      m_deal;                       // deals object

COrderInfo     m_order;                      // pending orders object

CMoneyFixedRisk m_money;

//--- :>=D83C@0F8O C?@02;5=8O :0?8B0;>< ():

#define mm_math_sqrt       1                 // :204@0B=K9 :>@5=L >B 45?>78B0

#define mm_percent         2                 // ?@>F5=B 45?>78B0

#define mm_martingale      3                 // <0@B8=359;

#define mm_antimartingale  4                 // 0=B8<0@B8=359;

#define mm_rajan_jones     5                 // <5B>4  090=0 6>=A0

#define mm_larry_williams  6                 // <5B>4 0@@8 8;LO<A0

#define mm_second_chance   7                 // 70I8I5==K9 ("! A;8205B)

#define mm_f2stop          8                 // 2%

#define mm_test            9                 // B5AB>2K9 @568< 4;O =>2KE <5B>4>2

//input int mm_user_mode = 1;                // 2K1>@ ?>;L7>20B5;5< @568<0 

input int time_shift       = 2;              // 2@5<5==>9 A4283 :>B8@>2>: 1@>:5@0 >B GMT

int       start_hour       = 0;              // AB0@B>2K9 G0A

//---

input int Inp_mm_rsi_mode      = 1;              // @568<  4;O "! "RSI"

input int Inp_mm_boxes_mode    = 1;              // @568<  4;O "! "@>@K2 :>@>1:8"

input int Inp_mm_weekly_mode   = 1;              // @568<  4;O "! "5=82K9 B@5945@"

input int Inp_mm_gap_mode      = 1;              // @568<  4;O "! "M? ?>=545;L=8:0"

//---

string mm_names[]=

  {

   " >B:;NG5=, B>@38 <8=8<0;L=K< ;>B><","20% :204@0B=>3> :>@=O >B 45?>78B0",

   "?@>F5=B >B 45?>78B0","<0@B8=359;","0=B8<0@B8=359;","?>  090=C 6>=AC","<5B>4 0@@8 8;LO<A0","70I8I5==K9 ("! A;8205B)",

   "2 ?@>F5=B0","B5AB"

  };

//--- AG5BG8:8 4;O @0AG5B>2  ?> <0@B8=359;C, 0=B8<0@B8=359;C 8 <5B>4C  090=0 6>=A0

int martingale_count=1,antimartingale_count=0,rajan_jones_count=0;

//---

double risk=0.05;           // C@>25=L @8A:0 4;O @0AG5B>2  ?> 0@@8 8;LO<A0 8 ?@>F5=BC >B 45?>78B0

double delta_rj=500;            // 45;LB0 4;O @0AG5B>2  ?> <5B>4C  090=0 6>=A0

//---

double start_virtual_balance[4];             // <0AA82 =0G0;L=KE 10;0=A>2 4;O 70?CA:0 @0AG5B>2 

//---

double rajan_jones_level;                    // 10;0=A 4;O @0AG5B>2  ?> <5B>4C  090=0 6>=A0

double martingale_balance;                   // 10;0=A 4;O @0AG5B>2  <0@B8=359;0

double antimartingale_balance;               // 10;0=A 4;O @0AG5B>2  0=B8<0@B8=359;0

double virtual_deposit;                      // 28@BC0;L=K9 45?>78B, 48=0<8G5A:89 8A?>;L7C5BAO 2 @0AG5B0E  4;O :064>9 "!

double balance_separator   = 0.25;           // @0745;8B5;L @50;L=>3> 10;0=A0 =0 4 28@BC0;L=KE

//---

#define rsi_magic          50                // <038G5A:89 =><5@ 8 B@59;8=3 AB>? "! "RSI"

#define boxes_magic        35                // <038G5A:89 =><5@ 8 B@59;8=3 AB>? "! "@>@K2 :>@>1:8"

#define weekly_magic       100               // <038G5A:89 =><5@ 8 B@59;8=3 AB>? "! "5=82K9 B@5945@"

#define gap_magic          115               // <038G5A:89 =><5@ 8 B@59;8=3 AB>? "! "M? ?>=545;L=8:0"

//---

int orders_limit           = 3;              // :>;8G5AB2> >@45@>2 4;O "! "RSI"

int dif                    = 15;             // A<5I5=85 2 ?C=:B0E 4;O "! "RSI"

double min_lot             = 0.1;            // <8=8<0;L=K9 ;>B, 7=0G5=85 AC3C1> 4;O 8=8F80;870F88, 745AL =5 <5=OBL!

//--- B>@3>2K5 A83=0;K 

#define sell_signal        -11               // A83=0; =0 ?@>406C

#define buy_signal          11               // A83=0; =0 ?>:C?:C

#define no_signal           0                // A83=0; 2=5 @K=:0, 70?CA:05B B@59;8=3

#define close_buy           22               // A83=0; =0 70:@KB85 ?>:C?>:

#define close_sell         -22               // A83=0; =0 70:@KB85 ?@>406

#define error_signal        33               // A83=0; > =0;8G88 >H81:8

#define clear_signal        44               // A83=0; C40;5=8O =5A@01>B02H8E >@45@>2

#define set_stops           55               // A83=0; 2KAB02;5=8O >@45@>2 =0 3@0=8F0E :>@>1:8

#define weekly_open         66               // A83=0; 2KAB02;5=8O >@45@>2 =0 3@0=8F0E :>@>1:8

#define weekly_close        77               // A83=0; =0 70:@KB85 ?>:C?>: 8 C40;5=85 =5A@01>B02H8E >@45@>2

#define gap_clear           88               // A83=0; C40;5=8O =5A@01>B02H8E >@45@>2

#define gap_open            99               // A83=0; 2KAB02;5=8O >@45@>2 =0 3@0=8F0E :>@>1:8

//---   

string   my_comment="Master_MM_Droid, v 2.4"; // ><<5=B0@89

int      error_number      = 0;              // :>4 >H81:8

int      rsi_sl            = 35;             // AB>? ;>AA "! "RSI"

int      ts_step           = 5;              // H03 B@59;8=30

//---

int slippage               = 5;              // A;8?5946

ulong magics[4];                             // <0AA82 <038G5A:8E =><5@>2

int enter                  = 6;              // >BABC? >B F5=K 4;O CAB0=>2:8 >B;>65==KE >@45@>2 "! @>@K2 :>@>1:8

int weekly_enter           = 15;             // >BABC? >B F5=K 4;O CAB0=>2:8 >B;>65==KE >@45@>2 "! 5=82K9 B@5945@

int gap_stop               = 105;            // AB>? ;>AA "! M? ?>=545;L=8:0

//--- D;038 :@0E0 "! 4;O ?>4A8AB5<K 70I8BK 45?>78B0

bool ts_rsi_on             = true;

bool ts_weekly_on          = true;

bool ts_gap_on             = true;

bool ts_box_on             = true;

//---

string my_symbol;

int rebalance_index[]={0,0,0,0};

//---

ENUM_ACCOUNT_MARGIN_MODE m_margin_mode;

int    handle_iRSI;                          // variable for storing the handle of the iRSI indicator

int Ext_mm_rsi_mode      = 0;

int Ext_mm_boxes_mode    = 0;

int Ext_mm_weekly_mode   = 0;

int Ext_mm_gap_mode      = 0;



double prev_prev_lastprofit=0.0;

double prev_lastprofit=0.0;

double lastprofit=0.0;

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

//| Expert initialization function                                   |

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

int OnInit()

  {

   SetMarginMode();

   if(!IsHedging())

     {

      Print("Hedging only!");

      return(INIT_FAILED);

     }

//--- create handle of the indicator iRSI

   handle_iRSI=iRSI(Symbol(),Period(),14,PRICE_CLOSE);

//--- if the handle is not created 

   if(handle_iRSI==INVALID_HANDLE)

     {

      //--- tell about the failure and output the error code 

      PrintFormat("Failed to create handle of the iRSI indicator for the symbol %s/%s, error code %d",

                  Symbol(),

                  EnumToString(Period()),

                  GetLastError());

      //--- the indicator is stopped early 

      return(INIT_FAILED);

     }

//---

   m_symbol.Name(Symbol());                  // sets symbol name

   if(!RefreshRates())

     {

      Print("Error RefreshRates. Bid=",DoubleToString(m_symbol.Bid(),Digits()),

            ", Ask=",DoubleToString(m_symbol.Ask(),Digits()));

      return(INIT_FAILED);

     }

   m_symbol.Refresh();

//---

   my_symbol=m_symbol.Name();



   magics[0] = rsi_magic;

   magics[1] = boxes_magic;

   magics[2] = weekly_magic;

   magics[3] = gap_magic;



   if(m_symbol.Digits()==5 || m_symbol.Digits()==3)

     {

      gap_stop       *=10;

      enter          *=10;

      slippage       *= 10;

      ts_step        *= 10;

      rsi_sl         *= 10;

      weekly_enter   *=10;

      dif            *=10;

     }



   if(balance_separator==0)

     {

      balance_separator=1;

     }

   else

     {

      double t_blnc=balance_separator*m_account.Balance();

      rajan_jones_level=t_blnc;

      martingale_balance=t_blnc;

      antimartingale_balance=t_blnc;

      virtual_deposit=t_blnc;

      //---   

      start_virtual_balance[0] = t_blnc;

      start_virtual_balance[1] = t_blnc;

      start_virtual_balance[2] = t_blnc;

      start_virtual_balance[3] = t_blnc;

     }

   min_lot=MathMax(NormalizeDouble(virtual_deposit/100000,2),m_symbol.LotsMin());

//---

   Ext_mm_rsi_mode      = Inp_mm_rsi_mode;

   Ext_mm_boxes_mode    = Inp_mm_boxes_mode;

   Ext_mm_weekly_mode   = Inp_mm_weekly_mode;

   Ext_mm_gap_mode      = Inp_mm_gap_mode;

//---

   prev_prev_lastprofit=0.0;

   prev_lastprofit=0.0;

   lastprofit=0.0;

//---

   return(INIT_SUCCEEDED);

  }

//---

//| Expert deinitialization function                                 |

//---

void OnDeinit(const int reason)

  {

   info();

  }

//---

//| Expert tick function                                             |

//---

void OnTick()

  {

   if(IsTradeAllowed()==false || iTickVolume(0)>1)

      return;

   for(int main_count=0; main_count<4; main_count++)

     {

      ulong magic_number=magics[main_count];

      switch(scan_market(my_symbol,magic_number))

        {

         case sell_signal:

            if(ts_rsi_on==true)

            sell_routine(Ext_mm_rsi_mode,my_symbol,magic_number,rsi_sl);

            break;

         case buy_signal:

            if(ts_rsi_on==true)

            buy_routine(Ext_mm_rsi_mode,my_symbol,magic_number,rsi_sl);

            break;

         case clear_signal:

            close_all(my_symbol,magic_number);

            break;

         case set_stops:

            if(ts_box_on==true)

            set_stop_orders(Ext_mm_boxes_mode,my_symbol,magic_number);

            break;

         case weekly_open:

            if(ts_weekly_on==true)

            weekly_orders(Ext_mm_weekly_mode,my_symbol,magic_number);

            break;

         case weekly_close:

            close_all(my_symbol,magic_number);

            break;

         case gap_clear:

            close_all(my_symbol,magic_number);

            break;

         case gap_open:

            if(ts_gap_on==true)

            gap_weekly(Ext_mm_gap_mode,my_symbol,magic_number);

            break;

         case no_signal:

            trailing(my_symbol,magic_number);

            break;

         case error_signal:

            Print(error_func(error_number));

            error_number=0;

            break;

        }

     }

   return;

  }

//---

//| "@59;8=3                                                         |

//---

void trailing(string symbol,ulong mn)

  {

   ulong ts=mn;

   if(m_symbol.Digits()==5 || m_symbol.Digits()==3)

      ts*=10;



   while(!IsTradeAllowed())

      Sleep(100);

   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions

      if(m_position.SelectByIndex(i))

         if(m_position.Symbol()==symbol && m_position.Magic()==mn)

            trail_position(m_position.Ticket(),(int)ts);

   return;

  }

//---

//| "@59;8=3 ?>78F89                                                 |

//---

void trail_position(ulong ticket,int treil_stop)

  {

   if(!RefreshRates())

      return;



   if(m_position.PositionType()==POSITION_TYPE_BUY)

     {

      if(m_symbol.Bid()-treil_stop*m_symbol.Point()>m_position.StopLoss()+ts_step*m_symbol.Point())

         trail_routine(ticket,NormalizeDouble(m_symbol.Bid()-treil_stop*m_symbol.Point(),m_symbol.Digits()));

     }

   if(m_position.PositionType()==POSITION_TYPE_SELL)

     {

      if(m_symbol.Ask()+treil_stop*m_symbol.Point()<m_position.StopLoss()-ts_step*m_symbol.Point())

         trail_routine(ticket,NormalizeDouble(m_symbol.Ask()+treil_stop*m_symbol.Point(),m_symbol.Digits()));

     }

//---

   return;

  }

//---

//|  CB8=0 B@59;8=30                                                 |

//---

void trail_routine(ulong ticket,double price)

  {

   int count=0;

   if(m_position.SelectByTicket(ticket))

      while(m_trade.PositionModify(ticket,price,0.0)==false)

        {

         Sleep(30000);

         //RefreshRates();

         count++;

         if(count>5)

            break;

        }

   return;

  }

//---

//| 0:@KB85 2A5E ?>78F89 8 C40;5=85 2A5E >B;>65==KE >@45@>2         |

//---

void close_all(string symbol,ulong mn)

  {

   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders

      if(m_order.SelectByIndex(i))

         if(m_order.Symbol()==symbol && m_order.Magic()==mn)

            close_order(m_order.Ticket());



   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions

      if(m_position.SelectByIndex(i))

         if(m_position.Symbol()==symbol && m_position.Magic()==mn)

            close_position(m_position.Ticket());



   return;

  }

//---

//|  CB8=0 4;O C40;5=8O >B;>65==KE >@45@>2                           |

//---

void close_order(ulong ticket)

  {

   bool temp = false;

   int count = 0;

   while(!IsTradeAllowed())

      Sleep(100);

   if(m_order.Select(ticket))

      while(temp==false)

        {

         temp=m_trade.OrderDelete(ticket);

         if(!temp)

           {

            Sleep(30000);

            count++;

            if(count>5)

               break;

           }

        }

   return;

  }

//---

//|  CB8=0 4;O 70:@KB8O ?>78F89                                      |

//---

void close_position(ulong ticket)

  {

   bool temp = false;

   int count = 0;

   while(!IsTradeAllowed())

      Sleep(100);

   if(m_position.SelectByTicket(ticket))

      while(temp==false)

        {

         temp=m_trade.PositionClose(ticket);

         if(!temp)

           {

            Sleep(30000);

            count++;

            if(count>5)

               break;

           }

        }

   return;

  }

//---

//| >4AG5B >B;>65==KE >@45@>2                                       |

//---

int calculate_orders(string symbol,ENUM_ORDER_TYPE cmd,ulong mn)

  {

   int count=0;

   for(int i=OrdersTotal()-1;i>=0;i--) // returns the number of current orders

      if(m_order.SelectByIndex(i))

         if(m_order.Symbol()==symbol && m_order.Magic()==mn && m_order.OrderType()==cmd)

            count++;

   return (count);

  }

//---

//| >4AG5B ?>78F89                                                  |

//---

int calculate_positions(string symbol,ENUM_POSITION_TYPE cmd,ulong mn)

  {

   int count=0;

   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of current orders

      if(m_position.SelectByIndex(i))

         if(m_position.Symbol()==symbol && m_position.Magic()==mn && m_position.PositionType()==cmd)

            count++;

   return (count);

  }

//---

//| >8A: A83=0;>2                                                   |

//---

int scan_market(string symbol,ulong magic)

  {

   if(!RefreshRates())

      return (error_signal);

   MqlDateTime str1;

   TimeToStruct(TimeCurrent(),str1);

//error_number=GetLastError();

//if(error_number!=0)

//   return (error_signal);

   int b_positions = calculate_positions(symbol,POSITION_TYPE_BUY, magic);

   int s_positions = calculate_positions(symbol,POSITION_TYPE_SELL, magic);

   int t_positions=s_positions+b_positions;

   int st_orders=stop_orders(symbol,magic);



   switch((int)magic)

     {

      case rsi_magic:

        {

         double open_price=0;

         double r1 = iRSIGet(1);

         double r2 = iRSIGet(2);

         //--- =C6=> ?>;CG8BL F5=C >B:@KB8O ?>A;54=59 ?>78F88  

         //--- "total-1" M;5<5=B - MB> 1C45B ?>A;54=OO >B:@KB0O ?>78F88O 

         int total=PositionsTotal();

         for(int i=total-1;i>=0;i--)

           {

            if(m_position.SelectByIndex(i))

               if(m_position.Symbol()==symbol && m_position.Magic()==rsi_magic)

                 {

                  open_price=m_position.PriceOpen();

                  break;

                 }

           }

         //--- :@8B5@88 ?>:C?:8      

         if((r2<30 && r1>30 && b_positions==0) || 

            (b_positions>0 && b_positions<orders_limit && m_symbol.Bid()>open_price+dif*m_symbol.Point()))

            return (buy_signal);

         //--- :@8B5@88 ?@>4068      

         if((r2>70 && r1<70 && s_positions==0) || 

            (s_positions>0 && s_positions<orders_limit && m_symbol.Ask()<open_price-dif*m_symbol.Point()))

            return (sell_signal);

         break;

        }

      case boxes_magic:

        {

         int fgfg=0; // 4;O D>@<0B8@>20=8O :>40 AB8;870B>@0 :)

         //---- :@8B5@88    

         if(str1.hour==(0+time_shift) || str1.hour==(10+time_shift) || str1.hour==(16+time_shift))

            return (clear_signal);

         if((str1.hour==(6+time_shift) || str1.hour==(12+time_shift) || str1.hour==(20+time_shift)) && st_orders==0)

            return (set_stops);

         break;

        }

      case weekly_magic:

        {

         int fgfg=0; // 4;O D>@<0B8@>20=8O :>40 AB8;870B>@0 :)

         //--- :@8B5@88          

         if(str1.day_of_week==1 && str1.hour>(start_hour+time_shift) && 

            str1.hour<(6+time_shift) && t_positions==0 && st_orders==0)

            return (weekly_open);

         if(str1.day_of_week==5 && str1.hour>(18+time_shift) && t_positions>=0)

            return(weekly_close);

         break;

        }

      case gap_magic:

        {

         int fgfg=0; // 4;O D>@<0B8@>20=8O :>40 AB8;870B>@0 :)

         //--- :@8B5@88  

         //--- 5ABL 5ABL A0<K9 AB0@K9 >B;>65==K9 >@45@ (53> 8=45:A "0") 8

         //--- 8=45:A 10@0 PERIOD_D1, =0 :>B>@>< 53> 2KAB028;8 >=1

         if(m_order.SelectByIndex(0))

            if(iBarsOpen(symbol,PERIOD_D1,m_order.TimeSetup())>=1)

               return (gap_clear);

         if(t_positions==0 && str1.hour==0)

            return(gap_open);

         break;

        }

     }

   return(no_signal);

  }

//---

//|                                                                  |

//---

int stop_orders(string symbol,ulong mn)

  {

   return(calculate_orders(symbol,ORDER_TYPE_SELL_STOP, mn) + calculate_orders(symbol, ORDER_TYPE_BUY_STOP, mn));

  }

//---

//| >:C?:0, 2>72@0I05B B8:5B                                        |

//---

int gap_weekly(int mm,string symbol,ulong magic)

  {

   while(!IsTradeAllowed())

      Sleep(100);



   if(!RefreshRates())

      return(0);



   double buy_sl  = NormalizeDouble(m_symbol.Ask()-gap_stop*m_symbol.Point(), m_symbol.Digits());

   double sell_sl = NormalizeDouble(m_symbol.Bid()+gap_stop*m_symbol.Point(), m_symbol.Digits());

   int stop=(int)((buy_sl-sell_sl)/m_symbol.Point());

   int count=0;

   double lot=mm_func(mm,symbol,magic,stop);

   if(lot==0)

     {

      Print(""! 545;L=K9 3M? >B:;NG5=0 87-70 A;820");

      ts_gap_on=false;

      return(0);

     }



   if(iOpen(symbol,PERIOD_D1,0)<iLow(symbol,PERIOD_D1,1))

     {

      m_trade.SetExpertMagicNumber(magic);

      while(!m_trade.Buy(lot,symbol,m_symbol.Ask(),buy_sl,0.0,my_comment))

        {

         Sleep(30000);

         if(!RefreshRates())

            return(0);

         count++;

         if(count>10)

            break;

        }

      count=0;

     }

   else

   if(iOpen(symbol,PERIOD_D1,0)>iHigh(symbol,PERIOD_D1,1))

     {

      m_trade.SetExpertMagicNumber(magic);

      while(!m_trade.Sell(lot,symbol,m_symbol.Bid(),sell_sl,0.0,my_comment))

        {

         Sleep(30000);

         if(!RefreshRates())

            return(0);

         count++;

         if(count>10)

            break;

        }

      count=0;

     }

   return(0);

  }

//---

//| >:C?:0, 2>72@0I05B B8:5B                                        |

//---

int weekly_orders(int mm,string symbol,ulong magic)

  {

   while(!IsTradeAllowed())

      Sleep(100);

   double high=iHigh(symbol,PERIOD_M5,iHighest(symbol,PERIOD_M5,MODE_HIGH,(start_hour+time_shift)*16,0));

   double low=iLow(symbol,PERIOD_M5,iLowest(symbol,PERIOD_M5,MODE_LOW,(start_hour+time_shift)*16,0));

   double buy  = NormalizeDouble(high + weekly_enter*m_symbol.Point(), m_symbol.Digits());

   double sell = NormalizeDouble(low - weekly_enter*m_symbol.Point(), m_symbol.Digits());

   int stop=(int)((buy-sell)/m_symbol.Point());

   int count=0;

   double lot=mm_func(mm,symbol,magic,stop);

   if(lot==0)

     {

      Print(""! 5=82K9 B@5945@ >B:;NG5=0 87-70 A;820");

      ts_weekly_on=false;

      return (0);

     }



   if(!RefreshRates())

      return(0);



   m_trade.SetExpertMagicNumber(magic);



   while(!m_trade.BuyStop(lot,buy,symbol,sell,0.0,0,0,my_comment))

     {

      Sleep(30000);

      if(!RefreshRates())

         return(0);

      count++;

      if(count>10)

         break;

     }

   count=0;



   if(!RefreshRates())

      return(0);



   while(!m_trade.SellStop(lot,sell,symbol,buy,0.0,0,0,my_comment))

     {

      Sleep(30000);

      if(!RefreshRates())

         return(0);

      count++;

      if(count>10)

         break;

     }

   return (0);

  }

//---

//| >:C?:0                                                          |

//---

int set_stop_orders(int mm,string symbol,ulong magic)

  {

   while(!IsTradeAllowed())

      Sleep(100);

   double high = iHigh(symbol, PERIOD_H1,1);

   double low  = iLow(symbol, PERIOD_H1,1);



   double buy  = NormalizeDouble(high + enter*m_symbol.Point(), m_symbol.Digits());

   double sell = NormalizeDouble(low - enter*m_symbol.Point(), m_symbol.Digits());

   int stop=(int)((buy-sell)/m_symbol.Point());

   double lot=mm_func(mm,symbol,magic,stop);

   if(lot==0)

     {

      Print(""! @>@K2 :>@>1:8 >B:;NG5=0 87-70 A;820");

      ts_box_on=false;

      return (0);

     }

   int count=0;



   if(!RefreshRates())

      return(0);



   m_trade.SetExpertMagicNumber(magic);



   while(!m_trade.BuyStop(lot,buy,symbol,sell,0.0,0,0,my_comment))

     {

      Sleep(30000);

      if(!RefreshRates())

         return(0);

      count++;

      if(count>5)

         break;

     }



   count=0;



   if(!RefreshRates())

      return(0);



   while(!m_trade.SellStop(lot,sell,symbol,buy,0.0,0,0,my_comment))

     {

      Sleep(30000);

      if(!RefreshRates())

         return(0);

      count++;

      if(count>5)

         break;

     }



   return (0);

  }

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

//| >:C?:0                                                          |

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

void buy_routine(int mm,string symbol,ulong magic,int sl)

  {

   while(!IsTradeAllowed())

      Sleep(100);

   int count=0;

   int i=-1;

   double lot=mm_func(mm,symbol,magic,35);

   if(lot==0)

     {

      Print(""! RSI >B:;NG5=0 87-70 A;820");

      ts_rsi_on=false;

      return;

     }



   if(!RefreshRates())

      return;



   m_trade.SetExpertMagicNumber(magic);

   while(!m_trade.Buy(lot,symbol,m_symbol.Ask(),m_symbol.Ask()-sl*m_symbol.Point(),0.0,my_comment))

     {

      Sleep(30000);

      if(!RefreshRates())

         return;

      count++;

      if(count>5)

         break;

     }

   return;

  }

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

//| @>4060                                                          |

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

void sell_routine(int mm,string symbol,ulong magic,int sl)

  {

   while(!IsTradeAllowed())

      Sleep(100);

   int count=0;

   int i=-1;

   double lot=mm_func(mm,symbol,magic,35);

   if(lot==0)

     {

      Print(""! RSI >B:;NG5=0 87-70 A;820");

      ts_rsi_on=false;

      return;

     }



   if(!RefreshRates())

      return;



   m_trade.SetExpertMagicNumber(magic);

   while(!m_trade.Sell(lot,symbol,m_symbol.Bid(),m_symbol.Bid()+sl*m_symbol.Point(),0.0,my_comment))

     {

      Sleep(30000);

      if(!RefreshRates())

         return;

      count++;

      if(count>5)

         break;

     }



   return;

  }

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

//| MM                                                               |

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

double mm_func(int mm_mode,string symbol,ulong mn,int stop)

  {

   double lot=0;

   rebalance(get_balance(mn));

//--- 

   if(m_symbol.Digits()==5 || m_symbol.Digits()==3)

     {

      stop*=10;

     }

//---  510;0=A8@>2:0 :0?8B0;0, ?5@5@0A?@545;5=85 ?@81K;8 

   virtual_deposit=virtual_balance(symbol,mn,get_rebalance_index(mn));

//---

   switch(mm_mode)

     {

      case mm_math_sqrt: //1

         lot=math_sqrt(virtual_deposit);

         break;

      case mm_percent:  //2

         lot=percent(virtual_deposit);

         break;

      case mm_martingale: //3

         lot=martingale(virtual_deposit);

         break;

      case mm_antimartingale: //4

         lot=antimartingale(virtual_deposit);

         break;

      case mm_rajan_jones: //5

         lot=rajan_jones(virtual_deposit,mn);

         break;

      case mm_larry_williams: //6     

         lot=larry_williams(virtual_deposit,5);

         break;

      case mm_second_chance: //7

         lot=min_lot;

         break;

      case mm_f2stop: //8 

         lot=quasi_lots(symbol,stop,risk,virtual_deposit);

         break;

      case mm_test: //9

         //lot = virtual_deposit / ((stop*MarketInfo(symbol, MODE_TICKVALUE)) / risk);

         lot=crazy(virtual_deposit);

         break;

      default: lot=0.1;

      break;

     }

//---

   double lot_step=m_symbol.LotsStep();

   lot=MathRound(lot/lot_step)*lot_step;

//---

   lot=MathMin(MathMax(lot,min_lot),m_symbol.LotsMax());

   Comment(" 0?@>A : @568<C  ",mm_names[mm_mode],"\n !8<2>; 70?@>A0: ",symbol," \n ",ts_name(mn),

           "  \n 8@BC0;L=K9 45?>78B: ",virtual_deposit," \n  50;L=K9 10;0=A: ",m_account.Balance(),

           " \n 0?@>H5==K9 ;>B: ",NormalizeDouble(lot,2));

//---

   double safe_level=virtual_deposit-margin_to_lot(symbol,lot);

   if(safe_level>0)

     {

      return(NormalizeDouble(lot, 2));

     }

   else if(safe_level<=0)

     {

      return(second_chance(symbol, lot, virtual_deposit, mm_mode, mn));

     }

//---

   return(NormalizeDouble(lot, 2));

  }

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

//|                                                                  |

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

double second_chance(string symbol,double lot,double deposit,int mm,ulong mn)

  {

//---

   Print(" 5 E20B05B 28@BC0;L=>9 <0@68, @568< : (",mm_names[mm],"), A8<2>;: ",symbol);

   Print(" "@51C5<0O 28@BC0;L=0O <0@60 4;O 70?@>H5==>3> ;>B0: ",margin_to_lot(symbol,lot));

   Print(" 0?@>H5==K9 ;>B: ",lot);

   Print(" AB0B>: 28@BC0;L=>3> 45?>78B0: ",deposit);

//---       

   double temp=m_account.Balance()-min_lot*400;

//---

   if(temp<=0 || mm==mm_second_chance)

     {

      Print("  ?>;=>ABLN >B:;NG5=, "!: ",ts_name(mn)," A;8;0 28@BC0;L=K9 45?>78B: ",deposit);

      return(0);

     }

//---

   else if(temp>=0 && mm!=mm_second_chance)

     {

      //start_virtual_balance += margin_to_lot(symbol, MarketInfo(Symbol(), MODE_MINLOT)*3);

      deposit+=MathAbs(deposit)+margin_to_lot(symbol,min_lot*50);

      //---

      Print(" :;NG5= @568< ?>A;54=53> H0=A0, C25;8G5= 45?>78B =0 50 <8=8<0;L=KE ;>B>2: ",deposit);

      //---                        

      switch((int)mn)

        {

         case 35:

            //""! @>@K2 :>@>1:8";

            Ext_mm_boxes_mode=mm_second_chance;

            break;

         case 50:

            //""! RSI";

            Ext_mm_rsi_mode=mm_second_chance;

            break;

         case 100:

            //""! 5=82K9 B@5945@";

            Ext_mm_weekly_mode=mm_second_chance;

            break;

         case 115:

            //""! M? ?>=545;L=8:0";

            Ext_mm_gap_mode=mm_second_chance;

            break;

        }

      //---

      Print(" "5:CI0O "!: ",ts_name(mn)," 5@5:;NG5= @568<  =0: ",mm_names[mm_second_chance]);

      return(min_lot);

     }

//---

   return(0);

  }

//---

double get_balance(ulong mn)

  {

   double virt_balance=0.0;

   switch((int)mn)

     {

      case 35:

         //""! @>@K2 :>@>1:8";

         virt_balance=start_virtual_balance[0];

         break;

      case 50:

         //""! RSI";

         virt_balance=start_virtual_balance[1];

         break;

      case 100:

         //""! 5=82K9 B@5945@";

         virt_balance=start_virtual_balance[2];

         break;

      case 115:

         //""! M? ?>=545;L=8:0";

         virt_balance=start_virtual_balance[3];

         break;

     }

   return(virt_balance);

  }

//---

void set_balance(int mn,double balance)

  {

   switch(mn)

     {

      case 35:

         //""! @>@K2 :>@>1:8";

         start_virtual_balance[0]=balance;

         break;

      case 50:

         //""! RSI";

         start_virtual_balance[1]=balance;

         break;

      case 100:

         //""! 5=82K9 B@5945@";

         start_virtual_balance[2]=balance;

         break;

      case 115:

         //""! M? ?>=545;L=8:0";

         start_virtual_balance[3]=balance;

         break;

     }

  }

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

//|                                                                  |

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

int get_rebalance_index(ulong mn)

  {

   int reb_index=-1;

   switch((int)mn)

     {

      case 35:

         //""! @>@K2 :>@>1:8";

         reb_index=rebalance_index[0];

         break;

      case 50:

         //""! RSI";

         reb_index=rebalance_index[1];

         break;

      case 100:

         //""! 5=82K9 B@5945@";

         reb_index=rebalance_index[2];

         break;

      case 115:

         //""! M? ?>=545;L=8:0";

         reb_index=rebalance_index[3];

         break;

     }

   return(reb_index);

  }

//---

void set_rebalance_index(int mn,int s)

  {

   switch(mn)

     {

      case 35:

         //""! @>@K2 :>@>1:8";

         rebalance_index[0]=s;

         break;

      case 50:

         //""! RSI";

         rebalance_index[1]=s;

         break;

      case 100:

         //""! 5=82K9 B@5945@";

         rebalance_index[2]=s;

         break;

      case 115:

         //""! M? ?>=545;L=8:0";

         rebalance_index[3]=s;

         break;

     }

  }

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

//|                                                                  |

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

double virtual_balance(string symbol,ulong mn,int seek=0)

  {

   double balance=get_balance(mn);

//--- 70?@>A8BL 8AB>@8N (?>A;54=85 10 4=59)

   HistorySelect(TimeCurrent()-86400*10,TimeCurrent()+86400);

//--- ?5@5<5==K5 4;O ?>;CG5=8O 7=0G5=89 87 A2>9AB2 A45;:8 

   uint     d_total=HistoryDealsTotal();

   ulong    d_ticket=0;

   long     d_entry=0;

   string   d_symbol="";

   long     d_magic=0;

   double   d_profit=0.0;

//--- for all deals 

   for(uint i=0;i<d_total;i++)

     {

      //--- try to get deals ticket 

      if((d_ticket=HistoryDealGetTicket(i))>0)

        {

         //--- get deals properties 

         d_entry =HistoryDealGetInteger(d_ticket,DEAL_ENTRY);

         d_symbol=HistoryDealGetString(d_ticket,DEAL_SYMBOL);

         d_magic=HistoryDealGetInteger(d_ticket,DEAL_MAGIC);

         d_profit=HistoryDealGetDouble(d_ticket,DEAL_PROFIT);

         //--- only for current symbol 

         if(d_entry==DEAL_ENTRY_OUT && d_symbol==symbol && d_magic==mn)

            balance+=d_profit;

        }

     }

//---

   return (balance);

  }

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

//|                                                                  |

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

int count_history(string symbol,int mn)

  {

   int t=0;

//--- 70?@>A8BL 8AB>@8N (?>A;54=85 10 4=59)

   HistorySelect(TimeCurrent()-86400*10,TimeCurrent()+86400);

//--- ?5@5<5==K5 4;O ?>;CG5=8O 7=0G5=89 87 A2>9AB2 A45;:8 

   uint     d_total=HistoryDealsTotal();

   ulong    d_ticket=0;

   long     d_entry=0;

   string   d_symbol="";

   long     d_magic=0;

//--- for all deals 

   for(uint i=0;i<d_total;i++)

     {

      //--- try to get deals ticket 

      if((d_ticket=HistoryDealGetTicket(i))>0)

        {

         //--- get deals properties 

         d_entry =HistoryDealGetInteger(d_ticket,DEAL_ENTRY);

         d_symbol=HistoryDealGetString(d_ticket,DEAL_SYMBOL);

         d_magic=HistoryDealGetInteger(d_ticket,DEAL_MAGIC);

         //--- only for current symbol 

         if(d_entry==DEAL_ENTRY_OUT && d_symbol==symbol && d_magic==mn)

            t++;

        }

     }

   return (t+1);

  }

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

//|                                                                  |

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

string ts_name(ulong mn)

  {

   string name;

   switch((int)mn)

     {

      case 35:

         name=" "! @>@K2 :>@>1:8";

         break;

      case 50:

         name=" "! RSI";

         break;

      case 100:

         name=" "! 5=82K9 B@5945@";

         break;

      case 115:

         name=" "! M? ?>=545;L=8:0";

         break;

     }

   return (name);

  }

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

//|                                                                  |

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

double margin_to_lot(string symbol,double lot_to_check)

  {

   if(!RefreshRates())

      return(0);

   double margin_check=m_account.MarginCheck(symbol,ORDER_TYPE_BUY,1.0,m_symbol.Ask());

   return (NormalizeDouble(lot_to_check * margin_check,2));

  }

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

//|                                                                  |

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

double math_sqrt(double deposit)

  {

   double lot=0.2*MathSqrt(deposit/1000);

   return (lot);

  }

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

//|                                                                  |

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

double percent(double deposit)

  {

   if(!RefreshRates())

      return(0);

   double margin_check=m_account.MarginCheck(m_symbol.Name(),ORDER_TYPE_BUY,1.0,m_symbol.Ask());

   double lot=virtual_deposit*risk/margin_check;// B>65 A0<>5   

   return (lot);

  }

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

//|                                                                  |

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

double crazy(double deposit)

  {

   double lot=0;



//--- prev_prev_lastprofit, prev_lastprofit 8 lastprofit ?>;CG05< 2 OnTradeTransaction

   lot=NormalizeDouble(m_account.FreeMargin()*risk/1000.0,1);

   if(lastprofit<0 && prev_lastprofit<0 && prev_prev_lastprofit<0)

      return(lot);

   return(min_lot);

  }

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

//|                                                                  |

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

double quasi_lots(string symbol,int stop,double ts_risk,double deposit)

  {

   double bet=deposit*ts_risk;

//double pip_price = NormalizeDouble(bet/stop,2);

//double contract_size = NormalizeDouble((pip_price / MarketInfo(symbol, MODE_POINT)/100000),2);



   double step=m_symbol.LotsStep();

   double stop_value=stop*m_symbol.TickValue();

   double contract_size=NormalizeDouble(bet/stop_value,2);

   contract_size=MathFloor(contract_size/step)*step;

   return(contract_size);

  }

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

//|                                                                  |

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

double antimartingale(double deposit)

  {

   double lot;

   if(antimartingale_balance>deposit)

     {

      antimartingale_count --;

     }

   if(antimartingale_balance<=deposit)

     {

      antimartingale_count++;

     }

   lot=antimartingale_count*min_lot;

   antimartingale_balance=deposit;

   return (lot);

  }

//---

double martingale(double deposit)

  {

   double lot;

   if(martingale_balance<=deposit)

     {

      martingale_count=1; //min_lot = NormalizeDouble(virtual_deposit/100000,2);

     }

   if(martingale_balance>deposit)

     {

      martingale_count+=martingale_count;

     }

   lot=martingale_count*min_lot;

   martingale_balance=deposit;

   return (lot);

  }

//---

//| rajan_jones                                                      |

//---

double rajan_jones(double deposit,ulong mn)

  {

   double lot;

//[(G8A;> :>=B@0:B>2 E G8A;> :>=B@0:B>2 - G8A;> :>=B@0:B>2)/2] E 45;LB0 = <8=8<0;L=K9 C@>25=L ?@81K;8

   while(rajan_jones_level>deposit && rajan_jones_count>=1)

     {

      rajan_jones_count --;

      //if (rajan_jones_count <= 1) {rajan_jones_level = start_virtual_balance; lot = min_lot; break;}

      if(rajan_jones_count<=1) {rajan_jones_level=get_balance(mn); lot=min_lot; break;}

      rajan_jones_level=(((rajan_jones_count*rajan_jones_count-rajan_jones_count)/2)*delta_rj);

     }



   while(deposit-rajan_jones_level>delta_rj)

     {

      rajan_jones_count++;

      rajan_jones_level=(((rajan_jones_count*rajan_jones_count-rajan_jones_count)/2)*delta_rj);

     }



   lot=min_lot*rajan_jones_count;

   return (lot);

  }

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

//| Larry Williams                                                   |

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

double larry_williams(double deposit,double lw_risk)

  {

   return (deposit * (lw_risk / 100) / deposit);

  }

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

//|  510;0=A8@>2:0 :0?8B0;0, ?5@5@0A?@545;5=85 ?@81K;8               |

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

void rebalance(double balance)

  {

   if(NormalizeDouble(virtual_deposit/balance,0)>3)

     {

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

        {

         set_rebalance_index((int)magics[i],count_history(m_symbol.Name(),(int)magics[i]));

         set_balance((int)magics[i],balance_separator*m_account.Balance());

        }

     }

  }

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

//|                                                                  |

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

int get_mm_name(int mn)

  {

   switch(mn)

     {

      case 35:

         //" "! @>@K2 :>@>1:8";

         return (Ext_mm_boxes_mode);

         break;

      case 50:

         //" "! RSI";

         return (Ext_mm_rsi_mode);

         break;

      case 100:

         //" "! 5=82K9 B@5945@";

         return (Ext_mm_weekly_mode);

         break;

      case 115:

         //" "! M? ?>=545;L=8:0";

         return (Ext_mm_gap_mode);

         break;

     }

   return(-1);

  }

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

//|                                                                  |

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

int info()

  {

   Print(" @50;L=K9 45?>78B: ",m_account.Balance());

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

     {

      int temp=(int)magics[i];

      Print(ts_name(temp),", 28@BC0;L=K9 45?>78B: ",

            NormalizeDouble(virtual_balance(m_symbol.Name(),temp,get_rebalance_index(temp)),2),

            " 8=45:A: ",get_rebalance_index(temp),

            " @568< : ",mm_names[get_mm_name(temp)]);

     }

   return(0);

  }

//----------------------->1@01>BG8: >H81>:   

string error_func(int error)

  {

   switch(error)

     {

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

      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 >1JQ<");

      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, B.:. >@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 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@><");

      case(149): return(">?KB:0 >B:@KBL ?@>B82>?>;>6=CN ?>78F8N : C65 ACI5AB2CNI59 2 A;CG05, 5A;8 E5468@>20=85 70?@5I5=>");

      case(150): return(">?KB:0 70:@KBL ?>78F8N ?> 8=AB@C<5=BC 2 ?@>B82>@5G88 A ?@028;>< FIFO");

      case(4000): return("    5B >H81:8");

      case(4001): return("    5?@028;L=K9 C:070B5;L DC=:F88");

      case(4002): return("=45:A <0AA820 - 2=5 480?07>=0");

      case(4003): return("5B ?0<OB8 4;O AB5:0 DC=:F89");

      case(4004): return("5@5?>;=5=85 AB5:0 ?>A;5 @5:C@A82=>3> 2K7>20");

      case(4005): return("0 AB5:5 =5B ?0<OB8 4;O ?5@540G8 ?0@0<5B@>2");

      case(4006): return("5B ?0<OB8 4;O AB@>:>2>3> ?0@0<5B@0");

      case(4007): return("5B ?0<OB8 4;O 2@5<5==>9 AB@>:8");

      case(4008): return("58=8F80;878@>20==0O AB@>:0");

      case(4009): return("58=8F80;878@>20==0O AB@>:0 2 <0AA825");

      case(4010): return("5B ?0<OB8 4;O AB@>:>2>3> <0AA820");

      case(4011): return("!;8H:>< 4;8==0O AB@>:0");

      case(4012): return("AB0B>: >B 45;5=8O =0 =>;L");

      case(4013): return("5;5=85 =0 =>;L");

      case(4014): return("58725AB=0O :><0=40");

      case(4015): return("5?@028;L=K9 ?5@5E>4");

      case(4016): return("58=8F80;878@>20==K9 <0AA82");

      case(4017): return("K7>2K DLL =5 @07@5H5=K");

      case(4018): return("52>7<>6=> 703@C78BL 181;8>B5:C");

      case(4019): return("52>7<>6=> 2K720BL DC=:F8N");

      case(4020): return("K7>2K 2=5H=8E 181;8>B5G=KE DC=:F89 =5 @07@5H5=K");

      case(4021): return("54>AB0B>G=> ?0<OB8 4;O AB@>:8, 2>72@0I05<>9 87 DC=:F88");

      case(4022): return("!8AB5<0 70=OB0");

      case(4050): return("5?@028;L=>5 :>;8G5AB2> ?0@0<5B@>2 DC=:F88");

      case(4051): return("54>?CAB8<>5 7=0G5=85 ?0@0<5B@0 DC=:F88");

      case(4052): return("=CB@5==OO >H81:0 AB@>:>2>9 DC=:F88");

      case(4053): return("H81:0 <0AA820");

      case(4054): return("5?@028;L=>5 8A?>;L7>20=85 <0AA820-B09<A5@88");

      case(4055): return("H81:0 ?>;L7>20B5;LA:>3> 8=48:0B>@0");

      case(4056): return("0AA82K =5A>2<5AB8<K");

      case(4057): return("H81:0 >1@01>B:8 3;>10;L=K5E ?5@5<5==KE");

      case(4058): return(";>10;L=0O ?5@5<5==0O =5 >1=0@C65=0");

      case(4059): return("$C=:F8O =5 @07@5H5=0 2 B5AB>2>< @568<5");

      case(4060): return("$C=:F8O =5 @07@5H5=0");

      case(4061): return("H81:0 >B?@02:8 ?>GBK");

      case(4062): return("68405BAO ?0@0<5B@ B8?0 string");

      case(4063): return("68405BAO ?0@0<5B@ B8?0 integer");

      case(4064): return("68405BAO ?0@0<5B@ B8?0 double");

      case(4065): return(" :0G5AB25 ?0@0<5B@0 >68405BAO <0AA82");

      case(4066): return("0?@>H5==K5 8AB>@8G5A:85 40==K5 2 A>AB>O=88 >1=>2;5=8O");

      case(4067): return("H81:0 ?@8 2K?>;=5=88 B>@3>2>9 >?5@0F88");

      case(4099): return(">=5F D09;0");

      case(4100): return("H81:0 ?@8 @01>B5 A D09;><");

      case(4101): return("5?@028;L=>5 8<O D09;0");

      case(4102): return("!;8H:>< <=>3> >B:@KBKE D09;>2");

      case(4103): return("52>7<>6=> >B:@KBL D09;");

      case(4104): return("5A>2<5AB8<K9 @568< 4>ABC?0 : D09;C");

      case(4105): return("8 >48= >@45@ =5 2K1@0=");

      case(4106): return("58725AB=K9 A8<2>;");

      case(4107): return("5?@028;L=K9 ?0@0<5B@ F5=K 4;O B>@3>2>9 DC=:F88");

      case(4108): return("525@=K9 =><5@ B8:5B0");

      case(4109): return("">@3>2;O =5 @07@5H5=0. 5>1E>48<> 2:;NG8BL >?F8N -*-  07@5H8BL A>25B=8:C B>@3>20BL -*- 2 A2>9AB20E M:A?5@B0.");

      case(4110): return(";8==K5 ?>78F88 =5 @07@5H5=K. 5>1E>48<> ?@>25@8BL A2>9AB20 M:A?5@B0.");

      case(4111): return(">@>B:85 ?>78F88 =5 @07@5H5=K. 5>1E>48<> ?@>25@8BL A2>9AB20 M:A?5@B0.");

      case(4200): return("1J5:B C65 ACI5AB2C5B");

      case(4201): return("0?@>H5=> =58725AB=>5 A2>9AB2> >1J5:B0");

      case(4202): return("1J5:B =5 ACI5AB2C5B");

      case(4203): return("58725AB=K9 B8? >1J5:B0");

      case(4204): return("5B 8<5=8 >1J5:B0");

      case(4205): return("H81:0 :>>@48=0B >1J5:B0");

      case(4206): return("5 =0945=> C:070==>5 ?>4>:=>");

      case(4207): return("H81:0 ?@8 @01>B5 A >1J5:B><");

      default:   return("5@0A?>7=0==0O >H81:0");

     }

  }

//---

//|                                                                  |

//---

void SetMarginMode(void)

  {

   m_margin_mode=(ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);

  }

//---

//|                                                                  |

//---

bool IsHedging(void)

  {

   return(m_margin_mode==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);

  }

//---

//| Refreshes the symbol quotes data                                 |

//---

bool RefreshRates()

  {

//--- refresh rates

   if(!m_symbol.RefreshRates())

      return(false);

//--- protection against the return value of "zero"

   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)

      return(false);

//---

   return(true);

  }

//---

//| Gets the information about permission to trade                   |

//---

bool IsTradeAllowed()

  {

   if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))

     {

      Alert("Check if automated trading is allowed in the terminal settings!");

      return(false);

     }

   if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))

     {

      Alert("Check if automated trading is allowed in the terminal settings!");

      return(false);

     }

   else

     {

      if(!MQLInfoInteger(MQL_TRADE_ALLOWED))

        {

         Alert("Automated trading is forbidden in the program settings for ",__FILE__);

         return(false);

        }

     }

   if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))

     {

      Alert("Automated trading is forbidden for the account ",AccountInfoInteger(ACCOUNT_LOGIN),

            " at the trade server side");

      return(false);

     }

   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))

     {

      Comment("Trading is forbidden for the account ",AccountInfoInteger(ACCOUNT_LOGIN),

              ".\n Perhaps an investor password has been used to connect to the trading account.",

              "\n Check the terminal journal for the following entry:",

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

      return(false);

     }

//---

   return(true);

  }

//--- 

//| Get TickVolume for specified bar index                           | 

//--- 

long iTickVolume(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)

  {

   if(symbol==NULL)

      symbol=Symbol();

   if(timeframe==0)

      timeframe=Period();

   long TickVolume[1];

   long tickvolume=0;

   int copied=CopyTickVolume(symbol,timeframe,index,1,TickVolume);

   if(copied>0) tickvolume=TickVolume[0];

   return(tickvolume);

  }

//---

//| Get value of buffers for the iRSI                                |

//---

double iRSIGet(const int index)

  {

   double RSI[1];

//--- reset error code 

   ResetLastError();

//--- fill a part of the iRSI array with values from the indicator buffer that has 0 index 

   if(CopyBuffer(handle_iRSI,0,index,1,RSI)<0)

     {

      //--- if the copying fails, tell the error code 

      PrintFormat("Failed to copy data from the iRSI indicator, error code %d",GetLastError());

      //--- quit with zero result - it means that the indicator is considered as not calculated 

      return(0.0);

     }

   return(RSI[0]);

  }

//---

//| Bar number on which the order/position is open                   |

//---

int iBarsOpen(string symbol,

              ENUM_TIMEFRAMES timeframe,

              datetime time)

  {

   if(time<0)

      return(-1);

   datetime Arr[],time1;

   CopyTime(symbol,timeframe,0,1,Arr);

   time1=Arr[0];

   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)

     {

      if(ArraySize(Arr)>1)

         return(ArraySize(Arr));

      if(time<time1)

         return(1);

      else

         return(0);

     }

   else

      return(-1);

  }

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

//| TradeTransaction function                                        |

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

void OnTradeTransaction(const MqlTradeTransaction &trans,

                        const MqlTradeRequest &request,

                        const MqlTradeResult &result)

  {

//--- get transaction type as enumeration value 

   ENUM_TRADE_TRANSACTION_TYPE type=trans.type;

//--- if transaction is result of addition of the transaction in history

   if(type==TRADE_TRANSACTION_DEAL_ADD)

     {

      long     deal_entry        =0;

      double   deal_profit       =0.0;

      if(HistoryDealSelect(trans.deal))

        {

         deal_entry=HistoryDealGetInteger(trans.deal,DEAL_ENTRY);

         deal_profit=HistoryDealGetDouble(trans.deal,DEAL_PROFIT);

        }

      else

         return;

      if(deal_entry==DEAL_ENTRY_OUT)

        {

         prev_prev_lastprofit=prev_lastprofit;

         prev_lastprofit=lastprofit;

         lastprofit=deal_profit;

        }

     }

  }

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

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