Multicurrency iMA Trend 2

Author: Copyright © 2018, Vladimir Karputov
Price Data Components
Series array that contains tick volumes of each bar
Indicators Used
Moving average indicatorParabolic Stop and Reverse system
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
Multicurrency iMA Trend 2
ÿþ//+------------------------------------------------------------------+

//|                                    Multicurrency iMA Trend 2.mq5 |

//|                              Copyright © 2018, Vladimir Karputov |

//|                                           http://wmua.ru/slesar/ |

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

#property copyright "Copyright © 2018, Vladimir Karputov"

#property link      "http://wmua.ru/slesar/"

#property version   "2.003"

/*

   "2.000": 

      add iSAR

      add manual input of Symbols

      delete "Reverse"

*/

//---

#include <Trade\SymbolInfo.mqh>  

CSymbolInfo    m_symbol;                     // symbol info object



#include <Arrays\ArrayObj.mqh>

CArrayObj      m_array_obj;                  // CArrayObj object

//---

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

//| Enum Lor or Risk                                                 |

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

enum ENUM_LOT_OR_RISK

  {

   lot=0,   // Constant lot

   risk=1,  // Risk in percent for a deal

  };

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

//| Enum Type Traiding                                               |

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

enum ENUM_TYPE_TRADING

  {

   buy      = 0,  // Only BUY 

   sell     = 1,  // Only SELL 

   buy_sell = 2,  // BUY and SELL 

  };

//--- input parameters

input ushort   InpStopLoss       = 50;       // Stop Loss, in pips (1.00045-1.00055=1 pips)

input ushort   InpTakeProfit     = 140;      // Take Profit, in pips (1.00045-1.00055=1 pips)

input ushort   InpTrailingStop   = 15;       // Trailing Stop (min distance from price to Stop Loss, in pips

input ushort   InpTrailingStep   = 5;        // Trailing Step, in pips (1.00045-1.00055=1 pips)

input ENUM_LOT_OR_RISK IntLotOrRisk=risk;    // Money management: Lot OR Risk

input double   InpVolumeLotOrRisk=3.0;       // The value for "Money management"

//--- MA

input ENUM_TIMEFRAMES      Inp_MA_period        = PERIOD_CURRENT; // MA: timeframe 

input int                  Inp_MA_ma_period     = 12;             // MA: averaging period 

input int                  Inp_MA_ma_shift      = 3;              // MA: horizontal shift 

input ENUM_MA_METHOD       Inp_MA_ma_method     = MODE_LWMA;      // MA: smoothing type 

input ENUM_APPLIED_PRICE   Inp_MA_applied_price = PRICE_WEIGHTED; // MA: type of price 

//--- SAR

input ENUM_TIMEFRAMES      Inp_SAR_period       = PERIOD_CURRENT; // SAR: timeframe 

input double               Inp_SAR_step         = 0.02;           // SAR: price increment step - acceleration factor 

input double               Inp_SAR_maximum      = 0.2;            // SAR: maximum value of step

//---

input string               InpSymbols="EURUSD,USDJPY";// Symbols

//---

input ENUM_TYPE_TRADING    InpTypeTraiding=buy_sell;       // Type traiding

input bool     InpOnlyOne        = false;    // Only one positions 

input bool     InpCloseOpposite  = false;    // Close opposite

input bool     InpPrintLog       = false;    // Print log

input ulong    InpMagic=407936490;           // Magic number

//---

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

//| Expert initialization function                                   |

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

int OnInit()

  {

//---

   string to_split=InpSymbols;   // a string to split into substrings 

   StringTrimLeft(to_split);

   StringTrimRight(to_split);



   string sep=",";               // a separator as a character 

   ushort u_sep;                 // the code of the separator character 

   string result[];              // an array to get strings 

//--- get the separator code 

   u_sep=StringGetCharacter(sep,0);

//--- split the string to substrings 

   int k=StringSplit(to_split,u_sep,result);



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

     {

      if(!m_symbol.Name(result[i])) // sets symbol name

         return(INIT_FAILED);



      CMultiiMATrend *multi=new CMultiiMATrend;

      if(multi==NULL)

        {

         Print("Object CMultiiMATrend create error");

         return(INIT_FAILED);

        }

      m_array_obj.Add(multi);

      int init=multi.OnInit(result[i],

                            InpStopLoss,           // Stop Loss, in pips (1.00045-1.00055=1 pips)

                            InpTakeProfit,         // Take Profit, in pips (1.00045-1.00055=1 pips)

                            InpTrailingStop,       // Trailing Stop (min distance from price to Stop Loss, in pips

                            InpTrailingStep,       // Trailing Step, in pips (1.00045-1.00055=1 pips)

                            IntLotOrRisk,          // Money management: Lot OR Risk

                            InpVolumeLotOrRisk,    // The value for "Money management"

                            Inp_MA_period,         // MA: timeframe 

                            Inp_MA_ma_period,      // MA: averaging period 

                            Inp_MA_ma_shift,       // MA: horizontal shift 

                            Inp_MA_ma_method,      // MA: smoothing type 

                            Inp_MA_applied_price,  // MA: type of price

                            Inp_SAR_period,        // SAR: timeframe 

                            Inp_SAR_step,          // SAR: price increment step - acceleration factor 

                            Inp_SAR_maximum,       // SAR: maximum value of step

                            InpTypeTraiding,       // Type traiding

                            InpOnlyOne,            // Only one positions 

                            InpCloseOpposite,      // Close opposite

                            InpPrintLog,           // Print log

                            InpMagic               // Magic number

                            );

      if(init!=INIT_SUCCEEDED)

         return(init);

     }

//---

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

//---

   for(int i=0;i<m_array_obj.Total();i++)

     {

      CMultiiMATrend *multi=m_array_obj.At(i);

      if(multi==NULL)

        {

         //--- Error reading from array 

         Print("Object CMultiiMATrend create error");

         return;

        }

      multi.OnDeinit(reason);

     }

  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

//---

   for(int i=0;i<m_array_obj.Total();i++)

     {

      CMultiiMATrend *multi=m_array_obj.At(i);

      if(multi==NULL)

        {

         //--- Error reading from array 

         Print("Object CMultiiMATrend create error");

         return;

        }

      multi.OnTick();

     }

  }

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

//| TradeTransaction function                                        |

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

void OnTradeTransaction(const MqlTradeTransaction &trans,

                        const MqlTradeRequest &request,

                        const MqlTradeResult &result)

  {

//---

   for(int i=0;i<m_array_obj.Total();i++)

     {

      CMultiiMATrend *multi=m_array_obj.At(i);

      if(multi==NULL)

        {

         //--- Error reading from array 

         Print("Object CMultiiMATrend create error");

         return;

        }

      multi.OnTradeTransaction(trans,request,result);

     }

  }

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

//|                                                MultiiMATrend.mqh |

//|                              Copyright © 2018, Vladimir Karputov |

//|                                           http://wmua.ru/slesar/ |

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

#property copyright "Copyright © 2018, Vladimir Karputov"

#property link      "http://wmua.ru/slesar/"

#property version   "2.001"

//---

#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\MoneyFixedMargin.mqh>

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

//| Class CMultiiMATrend.                                            |

//| Appointment: Class Expert Advisor.                               |

//|              Derives from class CObject.                         |

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

class CMultiiMATrend : public CObject

  {

protected:

   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

   CMoneyFixedMargin *m_money;

   //---

   ulong             m_magic;                      // magic number

   ulong             m_slippage;                   // slippage

   double            ExtStopLoss;

   double            ExtTakeProfit;

   double            ExtTrailingStop;

   double            ExtTrailingStep;

   ENUM_LOT_OR_RISK  ExtLotOrRisk;                 // Money management: Lot OR Risk

   double            ExtVolumeLotOrRisk;           // The value for "Money management"

   ENUM_TYPE_TRADING ExtTypeTraiding;              // Type traiding

   bool              ExtOnlyOne;                   // Only one positions 

   bool              ExtCloseOpposite;             // Close opposite

   bool              ExtPrintLog;                  // Print log

   int               handle_iMA;                   // variable for storing the handle of the iMA indicator

   int               handle_iSAR;                  // variable for storing the handle of the iSAR indicator

   double            m_adjusted_point;             // point value adjusted for 3 or 5 points

   bool              m_need_open_buy;

   bool              m_need_open_sell;

   bool              m_waiting_transaction;        // "true" -> it's forbidden to trade, we expect a transaction

   ulong             m_waiting_order_ticket;       // ticket of the expected order

   bool              m_transaction_confirmed;      // "true" -> transaction confirmed

   datetime          PrevBars;

   //---

   //--- Refreshes the symbol quotes data

   bool              RefreshRates(void);

   //--- Check the correctness of the position volume

   bool              CMultiiMATrend::CheckVolumeValue(double volume,string &error_description);

   //--- Check Freeze and Stops levels

   bool              CMultiiMATrend::FreezeStopsLevels(double &level);

   //--- Open position

   void              CMultiiMATrend::OpenPosition(const ENUM_POSITION_TYPE pos_type,const double level);

   //--- Open Buy position

   void              CMultiiMATrend::OpenBuy(double sl,double tp);

   //---  Open Sell position

   void              CMultiiMATrend::OpenSell(double sl,double tp);

   //--- Print CTrade result

   void              CMultiiMATrend::PrintResultTrade(CTrade &trade,CSymbolInfo &symbol);

   //--- Get value of buffers

   double            CMultiiMATrend::iGetArray(const int handle,const int buffer,const int start_pos,const int count,double &arr_buffer[]);

   //--- Trailing

   void              CMultiiMATrend::Trailing(const double stop_level);

   //--- Print CTrade result

   void              CMultiiMATrend::PrintResultModify(CTrade &trade,CSymbolInfo &symbol,CPositionInfo &position);

   //--- Close positions

   void              CMultiiMATrend::ClosePositions(const ENUM_POSITION_TYPE pos_type);

   //--- Calculate all positions

   void              CMultiiMATrend::CalculateAllPositions(int &count_buys,double &volume_buys,double &volume_biggest_buys,

                                                           int &count_sells,double &volume_sells,double &volume_biggest_sells);



private:



public:

                     CMultiiMATrend();

                    ~CMultiiMATrend();

   //--- expert initialization function

   int               OnInit(string                 EASymbolName,

                            ushort                 StopLoss,         // Stop Loss, in pips (1.00045-1.00055=1 pips)

                            ushort                 TakeProfit,       // Take Profit, in pips (1.00045-1.00055=1 pips)

                            ushort                 TrailingStop,     // Trailing Stop (min distance from price to Stop Loss, in pips

                            ushort                 TrailingStep,     // Trailing Step, in pips (1.00045-1.00055=1 pips)

                            ENUM_LOT_OR_RISK       LotOrRisk,        // Money management: Lot OR Risk

                            double                 VolumeLotOrRisk,  // The value for "Money management"

                            ENUM_TIMEFRAMES        MA_period,        // MA: timeframe 

                            int                    MA_ma_period,     // MA: averaging period 

                            int                    MA_ma_shift,      // MA: horizontal shift 

                            ENUM_MA_METHOD         MA_ma_method,     // MA: smoothing type 

                            ENUM_APPLIED_PRICE     MA_applied_price, // MA: type of price

                            ENUM_TIMEFRAMES        SAR_period,       // SAR: timeframe 

                            double                 SAR_step,         // SAR: price increment step - acceleration factor 

                            double                 SAR_maximum,      // SAR: maximum value of step

                            ENUM_TYPE_TRADING      TypeTraiding,     // Type traiding

                            bool                   OnlyOne,          // Only one positions 

                            bool                   CloseOpposite,    // Close opposite

                            bool                   PrintLog,         // Print log

                            ulong                  Magic             // Magic number

                            );

   //--- expert deinitialization function

   void              OnDeinit(const int reason);

   //--- expert tick function

   void              OnTick();

   //--- tradeTransaction function

   void              OnTradeTransaction(const MqlTradeTransaction &trans,

                                        const MqlTradeRequest &request,

                                        const MqlTradeResult &result);

  };

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

//| Constructor                                                      |

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

CMultiiMATrend::CMultiiMATrend(void) : m_magic(0),

                                       m_slippage(10),

                                       ExtStopLoss(0.0),

                                       ExtTakeProfit(0.0),

                                       ExtTrailingStop(0.0),

                                       ExtTrailingStep(0.0),

                                       ExtLotOrRisk(risk),

                                       ExtVolumeLotOrRisk(1.0),

                                       ExtTypeTraiding(buy_sell),

                                       ExtOnlyOne(false),

                                       ExtCloseOpposite(false),

                                       ExtPrintLog(false),

                                       handle_iMA(INVALID_HANDLE),

                                       handle_iSAR(INVALID_HANDLE),

                                       m_adjusted_point(0.0001),

                                       m_need_open_buy(false),

                                       m_need_open_sell(false),

                                       m_waiting_transaction(false),

                                       m_waiting_order_ticket(0),

                                       m_transaction_confirmed(false),

                                       PrevBars(0)

  {

  }

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

//| Destructor                                                       |

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

CMultiiMATrend::~CMultiiMATrend()

  {

  }

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

//| Expert initialization function                                   |

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

int CMultiiMATrend::OnInit(string               EASymbolName,

                           ushort               StopLoss,         // Stop Loss, in pips (1.00045-1.00055=1 pips)

                           ushort               TakeProfit,       // Take Profit, in pips (1.00045-1.00055=1 pips)

                           ushort               TrailingStop,     // Trailing Stop (min distance from price to Stop Loss, in pips

                           ushort               TrailingStep,     // Trailing Step, in pips (1.00045-1.00055=1 pips)

                           ENUM_LOT_OR_RISK     LotOrRisk,        // Money management: Lot OR Risk

                           double               VolumeLotOrRisk,  // The value for "Money management"

                           ENUM_TIMEFRAMES      MA_period,        // MA: timeframe 

                           int                  MA_ma_period,     // MA: averaging period 

                           int                  MA_ma_shift,      // MA: horizontal shift 

                           ENUM_MA_METHOD       MA_ma_method,     // MA: smoothing type 

                           ENUM_APPLIED_PRICE   MA_applied_price, // MA: type of price 

                           ENUM_TIMEFRAMES      SAR_period,       // SAR: timeframe 

                           double               SAR_step,         // SAR: price increment step - acceleration factor 

                           double               SAR_maximum,      // SAR: maximum value of step

                           ENUM_TYPE_TRADING    TypeTraiding,     // Type traiding

                           bool                 OnlyOne,          // Only one positions 

                           bool                 CloseOpposite,    // Close opposite

                           bool                 PrintLog,         // Print log

                           ulong                Magic             // Magic number

                           )

  {

//---

   if(TrailingStop!=0 && TrailingStep==0)

     {

      string err_text=(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")?

                      ""@59;8=3 =52>7<>65=: ?0@0<5B@ \"Trailing Step\" @025= =C;N!":

                      "Trailing is not possible: parameter \"Trailing Step\" is zero!";

      //--- when testing, we will only output to the log about incorrect input parameters

      if(MQLInfoInteger(MQL_TESTER))

        {

         Print(__FUNCTION__,", ERROR: ",err_text);

         return(INIT_FAILED);

        }

      else // if the Expert Advisor is run on the chart, tell the user about the error

        {

         Alert(__FUNCTION__,", ERROR: ",err_text);

         return(INIT_PARAMETERS_INCORRECT);

        }

     }

   ExtLotOrRisk      = LotOrRisk;

   ExtVolumeLotOrRisk= VolumeLotOrRisk;

   ExtTypeTraiding   = TypeTraiding;

   ExtOnlyOne        = OnlyOne;

   ExtCloseOpposite  = CloseOpposite;

   ExtPrintLog       = PrintLog;

//---

   if(!m_symbol.Name(EASymbolName)) // sets symbol name

      return(INIT_FAILED);

   RefreshRates();

//---

   m_magic=Magic;

   m_trade.SetExpertMagicNumber(m_magic);

   m_trade.SetMarginMode();

   m_trade.SetTypeFillingBySymbol(m_symbol.Name());

   m_trade.SetDeviationInPoints(m_slippage);

//--- tuning for 3 or 5 digits

   int digits_adjust=1;

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

      digits_adjust=10;

   m_adjusted_point=m_symbol.Point()*digits_adjust;



   ExtStopLoss       = StopLoss           * m_adjusted_point;

   ExtTakeProfit     = TakeProfit         * m_adjusted_point;

   ExtTrailingStop   = TrailingStop       * m_adjusted_point;

   ExtTrailingStep   = TrailingStep       * m_adjusted_point;

//--- check the input parameter "Lots"

   string err_text="";

   if(ExtLotOrRisk==lot)

     {

      if(!CheckVolumeValue(ExtVolumeLotOrRisk,err_text))

        {

         //--- when testing, we will only output to the log about incorrect input parameters

         if(MQLInfoInteger(MQL_TESTER))

           {

            Print(__FUNCTION__,", ERROR: ",err_text);

            return(INIT_FAILED);

           }

         else // if the Expert Advisor is run on the chart, tell the user about the error

           {

            Alert(__FUNCTION__,", ERROR: ",err_text);

            return(INIT_PARAMETERS_INCORRECT);

           }

        }

     }

   else

     {

      if(m_money!=NULL)

         delete m_money;

      m_money=new CMoneyFixedMargin;

      if(m_money!=NULL)

        {

         if(!m_money.Init(GetPointer(m_symbol),Period(),m_symbol.Point()*digits_adjust))

            return(INIT_FAILED);

         m_money.Percent(ExtVolumeLotOrRisk);

        }

      else

        {

         Print(__FUNCTION__,", ERROR: Object CMoneyFixedMargin is NULL");

         return(INIT_FAILED);

        }

     }

//--- create handle of the indicator iMA

   handle_iMA=iMA(m_symbol.Name(),MA_period,MA_ma_period,

                  MA_ma_shift,MA_ma_method,MA_applied_price);

//--- if the handle is not created 

   if(handle_iMA==INVALID_HANDLE)

     {

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

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

                  m_symbol.Name(),

                  EnumToString(MA_period),

                  GetLastError());

      //--- the indicator is stopped early 

      return(INIT_FAILED);

     }

//--- create handle of the indicator iSAR

   handle_iSAR=iSAR(m_symbol.Name(),SAR_period,SAR_step,SAR_maximum);

//--- if the handle is not created 

   if(handle_iSAR==INVALID_HANDLE)

     {

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

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

                  m_symbol.Name(),

                  EnumToString(SAR_period),

                  GetLastError());

      //--- the indicator is stopped early 

      return(INIT_FAILED);

     }

//---

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void CMultiiMATrend::OnDeinit(const int reason)

  {

//---

   if(m_money!=NULL)

      delete m_money;

  }

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

//| Expert tick function                                             |

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

void CMultiiMATrend::OnTick()

  {

//---

   if(m_waiting_transaction)

     {

      if(!m_transaction_confirmed)

        {

         Print("m_transaction_confirmed: ",m_transaction_confirmed);

         return;

        }

      else if(m_transaction_confirmed)

        {

         m_need_open_buy            = false;    // "true" -> need to open BUY

         m_need_open_sell           = false;    // "true" -> need to open SELL

         m_waiting_transaction      = false;    // "true" -> it's forbidden to trade, we expect a transaction

         m_waiting_order_ticket     = 0;        // ticket of the expected order

         m_transaction_confirmed    = false;    // "true" -> transaction confirmed

        }

     }

   if(m_need_open_buy)

     {

      if(ExtCloseOpposite || ExtOnlyOne)

        {

         int count_buys=0;    double volume_buys=0.0;    double volume_biggest_buys=0.0;

         int count_sells=0;   double volume_sells=0.0;   double volume_biggest_sells=0.0;

         CalculateAllPositions(count_buys,volume_buys,volume_biggest_buys,

                               count_sells,volume_sells,volume_biggest_sells);

         if(ExtCloseOpposite)

           {

            if(count_sells>0)

              {

               ClosePositions(POSITION_TYPE_SELL);

               return;

              }

           }

         if(ExtOnlyOne)

           {

            if(count_buys+count_sells==0)

              {

               double level;

               if(FreezeStopsLevels(level))

                 {

                  m_waiting_transaction=true;

                  OpenPosition(POSITION_TYPE_BUY,level);

                 }

              }

            else

               m_need_open_buy=false;

            //---

            return;

           }

        }

      //---

      double level;

      if(FreezeStopsLevels(level))

        {

         m_waiting_transaction=true;

         OpenPosition(POSITION_TYPE_BUY,level);

        }

      //---

      return;

     }

   if(m_need_open_sell)

     {

      if(ExtCloseOpposite || ExtOnlyOne)

        {

         int count_buys=0;    double volume_buys=0.0;    double volume_biggest_buys=0.0;

         int count_sells=0;   double volume_sells=0.0;   double volume_biggest_sells=0.0;

         CalculateAllPositions(count_buys,volume_buys,volume_biggest_buys,

                               count_sells,volume_sells,volume_biggest_sells);

         if(ExtCloseOpposite)

           {

            if(count_buys>0)

              {

               ClosePositions(POSITION_TYPE_BUY);

               return;

              }

           }

         if(ExtOnlyOne)

           {

            if(count_buys+count_sells==0)

              {

               double level;

               if(FreezeStopsLevels(level))

                 {

                  m_waiting_transaction=true;

                  OpenPosition(POSITION_TYPE_SELL,level);

                 }

              }

            else

               m_need_open_sell=false;

            //---

            return;

           }

        }

      //---

      double level;

      if(FreezeStopsLevels(level))

        {

         m_waiting_transaction=true;

         OpenPosition(POSITION_TYPE_SELL,level);

        }

      //---

      return;

     }

//--- we work only at the time of the birth of new bar

   datetime time_0=iTime(m_symbol.Name(),Period(),0);

   if(time_0==PrevBars)

      return;

   PrevBars=time_0;

   if(!RefreshRates())

     {

      PrevBars=0;

      return;

     }

   double level;

   if(FreezeStopsLevels(level))

      Trailing(level);

//--- get data from the indicator

   double ma[],sar[];

   ArraySetAsSeries(ma,true);

   ArraySetAsSeries(sar,true);

   int start_pos=0,count=3;

   if(!iGetArray(handle_iMA,0,start_pos,count,ma) || 

      !iGetArray(handle_iSAR,0,start_pos,count,sar))

     {

      PrevBars=0;

      return;

     }

//--- 

   if(m_symbol.Ask()>ma[1] && (ExtTypeTraiding==buy || ExtTypeTraiding==buy_sell))

     {

      if(sar[0]<m_symbol.Ask())

        {

         m_need_open_buy=true;

         return;

        }

     }

   if(m_symbol.Bid()<ma[1] && (ExtTypeTraiding==sell || ExtTypeTraiding==buy_sell))

     {

      if(sar[0]>m_symbol.Bid())

        {

         m_need_open_sell=true;

         return;

        }

     }

//---



  }

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

//| TradeTransaction function                                        |

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

void CMultiiMATrend::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_ticket       =0;

      long     deal_order        =0;

      long     deal_time         =0;

      long     deal_time_msc     =0;

      long     deal_type         =-1;

      long     deal_entry        =-1;

      long     deal_magic        =0;

      long     deal_reason       =-1;

      long     deal_position_id  =0;

      double   deal_volume       =0.0;

      double   deal_price        =0.0;

      double   deal_commission   =0.0;

      double   deal_swap         =0.0;

      double   deal_profit       =0.0;

      string   deal_symbol       ="";

      string   deal_comment      ="";

      string   deal_external_id  ="";

      if(HistoryDealSelect(trans.deal))

        {

         deal_ticket       =HistoryDealGetInteger(trans.deal,DEAL_TICKET);

         deal_order        =HistoryDealGetInteger(trans.deal,DEAL_ORDER);

         deal_time         =HistoryDealGetInteger(trans.deal,DEAL_TIME);

         deal_time_msc     =HistoryDealGetInteger(trans.deal,DEAL_TIME_MSC);

         deal_type         =HistoryDealGetInteger(trans.deal,DEAL_TYPE);

         deal_entry        =HistoryDealGetInteger(trans.deal,DEAL_ENTRY);

         deal_magic        =HistoryDealGetInteger(trans.deal,DEAL_MAGIC);

         deal_reason       =HistoryDealGetInteger(trans.deal,DEAL_REASON);

         deal_position_id  =HistoryDealGetInteger(trans.deal,DEAL_POSITION_ID);



         deal_volume       =HistoryDealGetDouble(trans.deal,DEAL_VOLUME);

         deal_price        =HistoryDealGetDouble(trans.deal,DEAL_PRICE);

         deal_commission   =HistoryDealGetDouble(trans.deal,DEAL_COMMISSION);

         deal_swap         =HistoryDealGetDouble(trans.deal,DEAL_SWAP);

         deal_profit       =HistoryDealGetDouble(trans.deal,DEAL_PROFIT);



         deal_symbol       =HistoryDealGetString(trans.deal,DEAL_SYMBOL);

         deal_comment      =HistoryDealGetString(trans.deal,DEAL_COMMENT);

         deal_external_id  =HistoryDealGetString(trans.deal,DEAL_EXTERNAL_ID);

        }

      else

         return;

      if(deal_symbol==m_symbol.Name() && deal_magic==m_magic)

         if(deal_entry==DEAL_ENTRY_IN)

            if(deal_type==DEAL_TYPE_BUY || deal_type==DEAL_TYPE_SELL)

              {

               if(m_waiting_transaction)

                  if(m_waiting_order_ticket==deal_order)

                    {

                     Print(__FUNCTION__," Transaction confirmed");

                     m_transaction_confirmed=true;

                    }

              }

     }

  }

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

//| Refreshes the symbol quotes data                                 |

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

bool CMultiiMATrend::RefreshRates(void)

  {

//--- refresh rates

   if(!m_symbol.RefreshRates())

     {

      Print("RefreshRates error");

      return(false);

     }

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

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

      return(false);

//---

   return(true);

  }

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

//| Check the correctness of the position volume                     |

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

bool CMultiiMATrend::CheckVolumeValue(double volume,string &error_description)

  {

//--- minimal allowed volume for trade operations

   double min_volume=m_symbol.LotsMin();

   if(volume<min_volume)

     {

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

         error_description=StringFormat("1J5< <5=LH5 <8=8<0;L=> 4>?CAB8<>3> SYMBOL_VOLUME_MIN=%.2f",min_volume);

      else

         error_description=StringFormat("Volume is less than the minimal allowed SYMBOL_VOLUME_MIN=%.2f",min_volume);

      return(false);

     }

//--- maximal allowed volume of trade operations

   double max_volume=m_symbol.LotsMax();

   if(volume>max_volume)

     {

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

         error_description=StringFormat("1J5< 1>;LH5 <0:A8<0;L=> 4>?CAB8<>3> SYMBOL_VOLUME_MAX=%.2f",max_volume);

      else

         error_description=StringFormat("Volume is greater than the maximal allowed SYMBOL_VOLUME_MAX=%.2f",max_volume);

      return(false);

     }

//--- get minimal step of volume changing

   double volume_step=m_symbol.LotsStep();

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

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

     {

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

         error_description=StringFormat("1J5< =5 :@0B5= <8=8<0;L=><C H03C SYMBOL_VOLUME_STEP=%.2f, 1;8609H89 ?@028;L=K9 >1J5< %.2f",

                                        volume_step,ratio*volume_step);

      else

         error_description=StringFormat("Volume is not a multiple of the minimal step SYMBOL_VOLUME_STEP=%.2f, the closest correct volume is %.2f",

                                        volume_step,ratio*volume_step);

      return(false);

     }

   error_description="Correct volume value";

   return(true);

  }

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

//| Check Freeze and Stops levels                                    |

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

bool CMultiiMATrend::FreezeStopsLevels(double &level)

  {

//--- check Freeze and Stops levels

/*

   Type of order/position  |  Activation price  |  Check

   ------------------------|--------------------|--------------------------------------------

   Buy Limit order         |  Ask               |  Ask-OpenPrice  >= SYMBOL_TRADE_FREEZE_LEVEL

   Buy Stop order          |  Ask	            |  OpenPrice-Ask  >= SYMBOL_TRADE_FREEZE_LEVEL

   Sell Limit order        |  Bid	            |  OpenPrice-Bid  >= SYMBOL_TRADE_FREEZE_LEVEL

   Sell Stop order	      |  Bid	            |  Bid-OpenPrice  >= SYMBOL_TRADE_FREEZE_LEVEL

   Buy position            |  Bid	            |  TakeProfit-Bid >= SYMBOL_TRADE_FREEZE_LEVEL 

                           |                    |  Bid-StopLoss   >= SYMBOL_TRADE_FREEZE_LEVEL

   Sell position           |  Ask	            |  Ask-TakeProfit >= SYMBOL_TRADE_FREEZE_LEVEL

                           |                    |  StopLoss-Ask   >= SYMBOL_TRADE_FREEZE_LEVEL

                           

   Buying is done at the Ask price                 |  Selling is done at the Bid price

   ------------------------------------------------|----------------------------------

   TakeProfit        >= Bid                        |  TakeProfit        <= Ask

   StopLoss          <= Bid	                     |  StopLoss          >= Ask

   TakeProfit - Bid  >= SYMBOL_TRADE_STOPS_LEVEL   |  Ask - TakeProfit  >= SYMBOL_TRADE_STOPS_LEVEL

   Bid - StopLoss    >= SYMBOL_TRADE_STOPS_LEVEL   |  StopLoss - Ask    >= SYMBOL_TRADE_STOPS_LEVEL

*/

   if(!RefreshRates() || !m_symbol.Refresh())

      return(false);

//--- FreezeLevel -> for pending order and modification

   double freeze_level=m_symbol.FreezeLevel()*m_symbol.Point();

   if(freeze_level==0.0)

      freeze_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;

   freeze_level*=1.1;

//--- StopsLevel -> for TakeProfit and StopLoss

   double stop_level=m_symbol.StopsLevel()*m_symbol.Point();

   if(stop_level==0.0)

      stop_level=(m_symbol.Ask()-m_symbol.Bid())*3.0;

   stop_level*=1.1;



   if(freeze_level<=0.0 || stop_level<=0.0)

      return(false);



   level=(freeze_level>stop_level)?freeze_level:stop_level;

//---

   return(true);

  }

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

//| Open position                                                    |

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

void CMultiiMATrend::OpenPosition(const ENUM_POSITION_TYPE pos_type,const double level)

  {

//--- buy

   if(pos_type==POSITION_TYPE_BUY)

     {

      double price=m_symbol.Ask();



      double sl=(ExtStopLoss==0)?0.0:price-ExtStopLoss;

      if(sl!=0.0 && ExtStopLoss<level) // check sl

         sl=price-level;



      double tp=(ExtTakeProfit==0)?0.0:price+ExtTakeProfit;

      if(tp!=0.0 && ExtTakeProfit<level) // check price

         tp=price+level;



      OpenBuy(sl,tp);

     }

//--- sell

   if(pos_type==POSITION_TYPE_SELL)

     {

      double price=m_symbol.Bid();



      double sl=(ExtStopLoss==0)?0.0:price+ExtStopLoss;

      if(sl!=0.0 && ExtStopLoss<level) // check sl

         sl=price+level;



      double tp=(ExtTakeProfit==0)?0.0:price-ExtTakeProfit;

      if(tp!=0.0 && ExtTakeProfit<level) // check tp

         tp=price-level;



      OpenSell(sl,tp);

     }

  }

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

//| Open Buy position                                                |

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

void CMultiiMATrend::OpenBuy(double sl,double tp)

  {

   sl=m_symbol.NormalizePrice(sl);

   tp=m_symbol.NormalizePrice(tp);



   double long_lot=0.0;

   if(ExtLotOrRisk==risk)

     {

      long_lot=m_money.CheckOpenLong(m_symbol.Ask(),sl);

      if(ExtPrintLog)

         Print("sl=",DoubleToString(sl,m_symbol.Digits()),

               ", CheckOpenLong: ",DoubleToString(long_lot,2),

               ", Balance: ",    DoubleToString(m_account.Balance(),2),

               ", Equity: ",     DoubleToString(m_account.Equity(),2),

               ", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2));

      if(long_lot==0.0)

        {

         m_waiting_transaction=false;

         if(ExtPrintLog)

            Print(__FUNCTION__,", ERROR: method CheckOpenLong returned the value of \"0.0\"");

         return;

        }

     }

   else if(ExtLotOrRisk==lot)

      long_lot=ExtVolumeLotOrRisk;

   else

     {

      m_waiting_transaction=false;

      return;

     }

   if(m_symbol.LotsLimit()>0.0)

     {

      int count_buys=0;    double volume_buys=0.0;    double volume_biggest_buys=0.0;

      int count_sells=0;   double volume_sells=0.0;   double volume_biggest_sells=0.0;

      CalculateAllPositions(count_buys,volume_buys,volume_biggest_buys,

                            count_sells,volume_sells,volume_biggest_sells);

      if(volume_buys+volume_sells+long_lot>m_symbol.LotsLimit())

        {

         Print("#0 Buy, Volume Buy (",DoubleToString(volume_buys,2),

               ") + Volume Sell (",DoubleToString(volume_sells,2),

               ") + Volume long (",DoubleToString(long_lot,2),

               ") > Lots Limit (",DoubleToString(m_symbol.LotsLimit(),2),")");

         return;

        }

     }

//--- check volume before OrderSend to avoid "not enough money" error (CTrade)

   double free_margin_check= m_account.FreeMarginCheck(m_symbol.Name(),ORDER_TYPE_BUY,long_lot,m_symbol.Ask());

   double margin_check     = m_account.MarginCheck(m_symbol.Name(),ORDER_TYPE_SELL,long_lot,m_symbol.Bid());

   if(free_margin_check>margin_check)

     {

      if(m_trade.Buy(long_lot,m_symbol.Name(),m_symbol.Ask(),sl,tp)) // CTrade::Buy -> "true"

        {

         if(m_trade.ResultDeal()==0)

           {

            if(m_trade.ResultRetcode()==10009) // trade order went to the exchange

              {

               m_waiting_transaction=true;  // "true" -> it's forbidden to trade, we expect a transaction

               m_waiting_order_ticket=m_trade.ResultOrder();

              }

            else

               m_waiting_transaction=false;

            if(ExtPrintLog)

               Print("#1 Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),

                     ", description of result: ",m_trade.ResultRetcodeDescription());

            if(ExtPrintLog)

               PrintResultTrade(m_trade,m_symbol);

           }

         else

           {

            if(m_trade.ResultRetcode()==10009)

              {

               m_waiting_transaction=true;  // "true" -> it's forbidden to trade, we expect a transaction

               m_waiting_order_ticket=m_trade.ResultOrder();

              }

            else

               m_waiting_transaction=false;

            if(ExtPrintLog)

               Print("#2 Buy -> true. Result Retcode: ",m_trade.ResultRetcode(),

                     ", description of result: ",m_trade.ResultRetcodeDescription());

            if(ExtPrintLog)

               PrintResultTrade(m_trade,m_symbol);

           }

        }

      else

        {

         m_waiting_transaction=false;

         if(ExtPrintLog)

            Print("#3 Buy -> false. Result Retcode: ",m_trade.ResultRetcode(),

                  ", description of result: ",m_trade.ResultRetcodeDescription());

         if(ExtPrintLog)

            PrintResultTrade(m_trade,m_symbol);

        }

     }

   else

     {

      m_waiting_transaction=false;

      m_need_open_buy=false;

      if(ExtPrintLog)

         Print(__FUNCTION__,", ERROR: method CAccountInfo::FreeMarginCheck returned the value ",DoubleToString(free_margin_check,2));

      return;

     }

//---

  }

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

//| Open Sell position                                               |

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

void CMultiiMATrend::OpenSell(double sl,double tp)

  {

   sl=m_symbol.NormalizePrice(sl);

   tp=m_symbol.NormalizePrice(tp);



   double short_lot=0.0;

   if(ExtLotOrRisk==risk)

     {

      short_lot=m_money.CheckOpenShort(m_symbol.Bid(),sl);

      if(ExtPrintLog)

         Print("sl=",DoubleToString(sl,m_symbol.Digits()),

               ", CheckOpenLong: ",DoubleToString(short_lot,2),

               ", Balance: ",    DoubleToString(m_account.Balance(),2),

               ", Equity: ",     DoubleToString(m_account.Equity(),2),

               ", FreeMargin: ", DoubleToString(m_account.FreeMargin(),2));

      if(short_lot==0.0)

        {

         m_waiting_transaction=false;

         if(ExtPrintLog)

            Print(__FUNCTION__,", ERROR: method CheckOpenShort returned the value of \"0.0\"");

         return;

        }

     }

   else if(ExtLotOrRisk==lot)

      short_lot=ExtVolumeLotOrRisk;

   else

     {

      m_waiting_transaction=false;

      return;

     }

   if(m_symbol.LotsLimit()>0.0)

     {

      int count_buys=0;    double volume_buys=0.0;    double volume_biggest_buys=0.0;

      int count_sells=0;   double volume_sells=0.0;   double volume_biggest_sells=0.0;

      CalculateAllPositions(count_buys,volume_buys,volume_biggest_buys,

                            count_sells,volume_sells,volume_biggest_sells);

      if(volume_buys+volume_sells+short_lot>m_symbol.LotsLimit())

         Print("#0 Buy, Volume Buy (",DoubleToString(volume_buys,2),

               ") + Volume Sell (",DoubleToString(volume_sells,2),

               ") + Volume short (",DoubleToString(short_lot,2),

               ") > Lots Limit (",DoubleToString(m_symbol.LotsLimit(),2),")");

      return;

     }

//--- check volume before OrderSend to avoid "not enough money" error (CTrade)

   double free_margin_check= m_account.FreeMarginCheck(m_symbol.Name(),ORDER_TYPE_SELL,short_lot,m_symbol.Bid());

   double margin_check     = m_account.MarginCheck(m_symbol.Name(),ORDER_TYPE_SELL,short_lot,m_symbol.Bid());

   if(free_margin_check>margin_check)

     {

      if(m_trade.Sell(short_lot,m_symbol.Name(),m_symbol.Bid(),sl,tp)) // CTrade::Sell -> "true"

        {

         if(m_trade.ResultDeal()==0)

           {

            if(m_trade.ResultRetcode()==10009) // trade order went to the exchange

              {

               m_waiting_transaction=true;  // "true" -> it's forbidden to trade, we expect a transaction

               m_waiting_order_ticket=m_trade.ResultOrder();

              }

            else

               m_waiting_transaction=false;

            if(ExtPrintLog)

               Print("#1 Sell -> false. Result Retcode: ",m_trade.ResultRetcode(),

                     ", description of result: ",m_trade.ResultRetcodeDescription());

            if(ExtPrintLog)

               PrintResultTrade(m_trade,m_symbol);

           }

         else

           {

            if(m_trade.ResultRetcode()==10009)

              {

               m_waiting_transaction=true;  // "true" -> it's forbidden to trade, we expect a transaction

               m_waiting_order_ticket=m_trade.ResultOrder();

              }

            else

               m_waiting_transaction=false;

            if(ExtPrintLog)

               Print("#2 Sell -> true. Result Retcode: ",m_trade.ResultRetcode(),

                     ", description of result: ",m_trade.ResultRetcodeDescription());

            if(ExtPrintLog)

               PrintResultTrade(m_trade,m_symbol);

           }

        }

      else

        {

         m_waiting_transaction=false;

         if(ExtPrintLog)

            Print("#3 Sell -> false. Result Retcode: ",m_trade.ResultRetcode(),

                  ", description of result: ",m_trade.ResultRetcodeDescription());

         if(ExtPrintLog)

            PrintResultTrade(m_trade,m_symbol);

        }

     }

   else

     {

      m_waiting_transaction=false;

      m_need_open_sell=false;

      if(ExtPrintLog)

         Print(__FUNCTION__,", ERROR: method CAccountInfo::FreeMarginCheck returned the value ",DoubleToString(free_margin_check,2));

      return;

     }

//---

  }

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

//| Print CTrade result                                              |

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

void CMultiiMATrend::PrintResultTrade(CTrade &trade,CSymbolInfo &symbol)

  {

   Print("File: ",__FILE__,", symbol: ",symbol.Name());

   Print("Code of request result: "+IntegerToString(trade.ResultRetcode()));

   Print("code of request result as a string: "+trade.ResultRetcodeDescription());

   Print("Deal ticket: "+IntegerToString(trade.ResultDeal()));

   Print("Order ticket: "+IntegerToString(trade.ResultOrder()));

   Print("Volume of deal or order: "+DoubleToString(trade.ResultVolume(),2));

   Print("Price, confirmed by broker: "+DoubleToString(trade.ResultPrice(),symbol.Digits()));

   Print("Current bid price: "+DoubleToString(symbol.Bid(),symbol.Digits())+" (the requote): "+DoubleToString(trade.ResultBid(),symbol.Digits()));

   Print("Current ask price: "+DoubleToString(symbol.Ask(),symbol.Digits())+" (the requote): "+DoubleToString(trade.ResultAsk(),symbol.Digits()));

   Print("Broker comment: "+trade.ResultComment());

   int d=0;

  }

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

//| Get value of buffers                                             |

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

double CMultiiMATrend::iGetArray(const int handle,const int buffer,const int start_pos,const int count,double &arr_buffer[])

  {

   bool result=true;

   if(!ArrayIsDynamic(arr_buffer))

     {

      Print("This a no dynamic array!");

      return(false);

     }

   ArrayFree(arr_buffer);

//--- reset error code 

   ResetLastError();

//--- fill a part of the iBands array with values from the indicator buffer

   int copied=CopyBuffer(handle,buffer,start_pos,count,arr_buffer);

   if(copied!=count)

     {

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

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

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

      return(false);

     }

   return(result);

  }

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

//| Trailing                                                         |

//|   InpTrailingStop: min distance from price to Stop Loss          |

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

void CMultiiMATrend::Trailing(const double stop_level)

  {

/*

     Buying is done at the Ask price                 |  Selling is done at the Bid price

   ------------------------------------------------|----------------------------------

   TakeProfit        >= Bid                        |  TakeProfit        <= Ask

   StopLoss          <= Bid	                     |  StopLoss          >= Ask

   TakeProfit - Bid  >= SYMBOL_TRADE_STOPS_LEVEL   |  Ask - TakeProfit  >= SYMBOL_TRADE_STOPS_LEVEL

   Bid - StopLoss    >= SYMBOL_TRADE_STOPS_LEVEL   |  StopLoss - Ask    >= SYMBOL_TRADE_STOPS_LEVEL

*/

   if(ExtTrailingStop==0)

      return;

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

      if(m_position.SelectByIndex(i))

         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)

           {

            if(m_position.PositionType()==POSITION_TYPE_BUY)

              {

               if(m_position.PriceCurrent()-m_position.PriceOpen()>ExtTrailingStop+ExtTrailingStep)

                  if(m_position.StopLoss()<m_position.PriceCurrent()-(ExtTrailingStop+ExtTrailingStep))

                     if(ExtTrailingStop>=stop_level)

                       {

                        if(!m_trade.PositionModify(m_position.Ticket(),

                           m_symbol.NormalizePrice(m_position.PriceCurrent()-ExtTrailingStop),

                           m_position.TakeProfit()))

                           Print("Modify ",m_position.Ticket(),

                                 " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),

                                 ", description of result: ",m_trade.ResultRetcodeDescription());

                        RefreshRates();

                        m_position.SelectByIndex(i);

                        PrintResultModify(m_trade,m_symbol,m_position);

                        continue;

                       }

              }

            else

              {

               if(m_position.PriceOpen()-m_position.PriceCurrent()>ExtTrailingStop+ExtTrailingStep)

                  if((m_position.StopLoss()>(m_position.PriceCurrent()+(ExtTrailingStop+ExtTrailingStep))) || 

                     (m_position.StopLoss()==0))

                     if(ExtTrailingStop>=stop_level)

                       {

                        if(!m_trade.PositionModify(m_position.Ticket(),

                           m_symbol.NormalizePrice(m_position.PriceCurrent()+ExtTrailingStop),

                           m_position.TakeProfit()))

                           Print("Modify ",m_position.Ticket(),

                                 " Position -> false. Result Retcode: ",m_trade.ResultRetcode(),

                                 ", description of result: ",m_trade.ResultRetcodeDescription());

                        RefreshRates();

                        m_position.SelectByIndex(i);

                        PrintResultModify(m_trade,m_symbol,m_position);

                       }

              }



           }

  }

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

//| Print CTrade result                                              |

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

void CMultiiMATrend::PrintResultModify(CTrade &trade,CSymbolInfo &symbol,CPositionInfo &position)

  {

   Print("File: ",__FILE__,", symbol: ",m_symbol.Name());

   Print("Code of request result: "+IntegerToString(trade.ResultRetcode()));

   Print("code of request result as a string: "+trade.ResultRetcodeDescription());

   Print("Deal ticket: "+IntegerToString(trade.ResultDeal()));

   Print("Order ticket: "+IntegerToString(trade.ResultOrder()));

   Print("Volume of deal or order: "+DoubleToString(trade.ResultVolume(),2));

   Print("Price, confirmed by broker: "+DoubleToString(trade.ResultPrice(),symbol.Digits()));

   Print("Current bid price: "+DoubleToString(symbol.Bid(),symbol.Digits())+" (the requote): "+DoubleToString(trade.ResultBid(),symbol.Digits()));

   Print("Current ask price: "+DoubleToString(symbol.Ask(),symbol.Digits())+" (the requote): "+DoubleToString(trade.ResultAsk(),symbol.Digits()));

   Print("Broker comment: "+trade.ResultComment());

   Print("Freeze Level: "+DoubleToString(m_symbol.FreezeLevel(),0),", Stops Level: "+DoubleToString(m_symbol.StopsLevel(),0));

   Print("Price of position opening: "+DoubleToString(position.PriceOpen(),symbol.Digits()));

   Print("Price of position's Stop Loss: "+DoubleToString(position.StopLoss(),symbol.Digits()));

   Print("Price of position's Take Profit: "+DoubleToString(position.TakeProfit(),symbol.Digits()));

   Print("Current price by position: "+DoubleToString(position.PriceCurrent(),symbol.Digits()));

   int d=0;

  }

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

//| Close positions                                                  |

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

void CMultiiMATrend::ClosePositions(const ENUM_POSITION_TYPE pos_type)

  {

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

      if(m_position.SelectByIndex(i))     // selects the position by index for further access to its properties

         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)

            if(m_position.PositionType()==pos_type) // gets the position type

               m_trade.PositionClose(m_position.Ticket()); // close a position by the specified symbol

  }

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

//| Calculate all positions                                          |

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

void CMultiiMATrend::CalculateAllPositions(int &count_buys,double &volume_buys,double &volume_biggest_buys,

                                           int &count_sells,double &volume_sells,double &volume_biggest_sells)

  {

   count_buys  =0;   volume_buys   = 0.0; volume_biggest_buys  = 0.0;

   count_sells =0;   volume_sells  = 0.0; volume_biggest_sells = 0.0;

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

      if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties

         if(m_position.Symbol()==m_symbol.Name() && m_position.Magic()==m_magic)

           {

            if(m_position.PositionType()==POSITION_TYPE_BUY)

              {

               count_buys++;

               volume_buys+=m_position.Volume();

               if(m_position.Volume()>volume_biggest_buys)

                  volume_biggest_buys=m_position.Volume();

               continue;

              }

            else if(m_position.PositionType()==POSITION_TYPE_SELL)

              {

               count_sells++;

               volume_sells+=m_position.Volume();

               if(m_position.Volume()>volume_biggest_sells)

                  volume_biggest_sells=m_position.Volume();

              }

           }

  }

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

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