ModStopReverse Alligator

Author: Copyright © 2019, Vladimir Karputov
Price Data Components
Series array that contains tick volumes of each bar
Orders Execution
Checks for the total of open orders
Indicators Used
FractalsBill Williams Alligator
Miscellaneous
It issuies visual alerts to the screen
0 Views
0 Downloads
0 Favorites
ModStopReverse Alligator
ÿþ//+------------------------------------------------------------------+

//|                                     ModStopReverse Alligator.mq5 |

//|                              Copyright © 2019, Vladimir Karputov |

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

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

#property copyright "Copyright © 2019, Vladimir Karputov"

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

#property version   "1.000"

/*

   barabashkakvn Trading engine 3.018

*/

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

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;

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

//| Enum Lor or Risk                                                 |

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

enum ENUM_LOT_OR_RISK

  {

   lots_min=0, // Lots Min

   lot=1,      // Constant lot

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

  };

//--- input parameters

input ushort   InpTrailingFrequency = 10;          // Trailing, in seconds (< "10" -> only on a new bar)

input ushort   InpSignalsFrequency  = 10;          // Search signals, in seconds (< "10" -> only on a new bar)

input ushort   InpTrailingStop      = 25;          // 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 InpLotOrRisk = lots_min;    // Money management: Lot OR Risk

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

//--- 

input uchar    InpSwipeRange        = 30;          // Fractals: Swipe Range, in bars

input uchar    InpNearest           = 7;           // Fractals: Nearest, in bars

input bool     InpTimeControl       = true;        // Use time control

input uchar    InpStartHour         = 10;          // Start Hour 

input uchar    InpStartMinute       = 01;          // Start Minute 

input uchar    InpEndHour           = 15;          // End Hour 

input uchar    InpEndMinute         = 02;          // End Minute 

input double   InpProfitMinimum     = 10;          // Minimum profit

input ushort   InpIndent            = 30;          // Indent (not a constant value), in pips (1.00045-1.00055=1 pips)

input uchar    InpNumber            = 3;           // Number of pending orders in the series

input double   InpLotCoefficient    = 1.51;        // Lot coefficient in series 

//--- indicators

input int                  Inp_Alligator_jaw_period      = 13;             // Alligator: period for the calculation of jaws 

input int                  Inp_Alligator_jaw_shift       = 8;              // Alligator: horizontal shift of jaws 

input int                  Inp_Alligator_teeth_period    = 8;              // Alligator: period for the calculation of teeth 

input int                  Inp_Alligator_teeth_shift     = 5;              // Alligator: horizontal shift of teeth 

input int                  Inp_Alligator_lips_period     = 5;              // Alligator: period for the calculation of lips 

input int                  Inp_Alligator_lips_shift      = 3;              // Alligator: horizontal shift of lips 

input ENUM_MA_METHOD       Inp_Alligator_ma_method       = MODE_SMMA;      // Alligator: type of smoothing 

input ENUM_APPLIED_PRICE   Inp_Alligator_applied_price   = PRICE_MEDIAN;   // Alligator: type of price 

//---

input bool     InpPrintLog          = false;       // Print log

input ulong    InpMagic             = 143110280;   // Magic number Master (only for closing positions)

input ulong    InpMagicBuy          = 143110281;   // Magic number BUY, BUY_LIMIT and BUY_STOP

input ulong    InpMagicSell         = 143110282;   // Magic number SELL, SELL_LIMIT and SELL_STOP

//---

ulong  ExtSlippage=10;              // Slippage



double ExtTrailingStop  = 0.0;      // Trailing Stop  -> double

double ExtTrailingStep  = 0.0;      // Trailing Step  -> double

double ExtIndent        = 0.0;      // Indent         -> double



int    handle_iFractals;                     // variable for storing the handle of the iFractals indicator

int    handle_iAlligator;                    // variable for storing the handle of the iAlligator indicator



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

bool     ExtNeedCloseAll         = false;    //

datetime ExtLastTrailing         = 0;        // "0" -> D'1970.01.01 00:00';

datetime ExtLastSignals          = 0;        // "0" -> D'1970.01.01 00:00';

datetime ExtPrevBars             = 0;        // "0" -> D'1970.01.01 00:00';

bool     ExtNeedDeleteAll        = false;    // delete all pending orders

bool     ExtNeedDeleteBuy        = false;    // delete all Buy limit and Buy stop pending orders

bool     ExtNeedDeleteSell       = false;    // delete all Sell limit and Sell stop pending orders

bool     ExtWaitingPendingOrder=false;       // waiting for a pending order

//--- B0:B8:0 B0:0O: 4;O ?>78F89 65AB:> >BA;568205< @57C;LB0B,

//---    0 >B;>65==K5 >@45@0 (5A;8 ?@>H;0 ?@>25@:0 ?> A?@54C) 

//---    ?@>AB> 2KAB@5;8205< 8 >1=C;O5< <0AA82K AB@C:BC@

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

//| Structure Need Positions                                         |

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

struct STRUCT_NEED_POSITION

  {

   ENUM_POSITION_TYPE pos_type;              // position type

   double            volume;                 // position volume (if "0.0" -> the lot is "Money management")

   double            lot_coefficient;        // lot coefficient

   double            stop_loss;              // position stop loss, in pips * ExtAdjustedPoint (if "0.0" -> the ExtStopLoss)

   double            take_profit;            // position take profit, in pips * ExtAdjustedPoint (if "0.0" -> the ExtTakeProfit)

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

   ulong             waiting_order_ticket;   // waiting order ticket, ticket of the expected order

   bool              transaction_confirmed;  // transaction confirmed, "true" -> transaction confirmed

   ulong             magic;                  // magic

   //--- Constructor 

                     STRUCT_NEED_POSITION()

     {

      pos_type                   = WRONG_VALUE;

      volume                     = 0.0;

      lot_coefficient            = 0.0;

      stop_loss                  = 0.0;

      take_profit                = 0.0;

      waiting_transaction        = false;

      waiting_order_ticket       = 0;

      transaction_confirmed      = false;

      magic                      = 0;

     }

  };

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

//| Structure Need Pending                                           |

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

struct STRUCT_NEED_PENDING

  {

   ENUM_ORDER_TYPE   pending_type;           // pending type

   double            volume;                 // volume

   double            price;                  // price

   ulong             magic;                  // magic

   //--- Constructor 

                     STRUCT_NEED_PENDING()

     {

      pending_type               = WRONG_VALUE;

      volume                     = 0.0;

      price                      = 0.0;

      magic                      = 0;

     }

  };

STRUCT_NEED_POSITION SNeedPosition[];

STRUCT_NEED_PENDING SNeedPending[];

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

//| Expert initialization function                                   |

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

int OnInit()

  {

//---

   if(InpTrailingStop!=0 && InpTrailingStep==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);

        }

     }

//---

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

      return(INIT_FAILED);

   RefreshRates();

//---

   m_trade.SetExpertMagicNumber(InpMagic);

   m_trade.SetMarginMode();

   m_trade.SetTypeFillingBySymbol(m_symbol.Name());

   m_trade.SetDeviationInPoints(ExtSlippage);

//--- tuning for 3 or 5 digits

   int digits_adjust=1;

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

      digits_adjust=10;

   ExtAdjustedPoint=m_symbol.Point()*digits_adjust;



   ExtTrailingStop   = InpTrailingStop    * ExtAdjustedPoint;

   ExtTrailingStep   = InpTrailingStep    * ExtAdjustedPoint;

   ExtIndent         = InpIndent          * ExtAdjustedPoint;

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

   string err_text="";

   if(InpLotOrRisk==lot)

     {

      if(!CheckVolumeValue(InpVolumeLotOrRisk,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(InpLotOrRisk==risk)

     {

      if(m_money!=NULL)

         delete m_money;

      m_money=new CMoneyFixedMargin;

      if(m_money!=NULL)

        {

         if(InpVolumeLotOrRisk<1 || InpVolumeLotOrRisk>100)

           {

            Print("The value for \"Money management\" (",DoubleToString(InpVolumeLotOrRisk,2),") -> invalid parameters");

            Print("   parameter must be in the range: from 1.00 to 100.00");

            return(INIT_FAILED);

           }

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

            return(INIT_FAILED);

         m_money.Percent(InpVolumeLotOrRisk);

        }

      else

        {

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

         return(INIT_FAILED);

        }

     }

//--- create handle of the indicator iFractals

   handle_iFractals=iFractals(m_symbol.Name(),Period());

//--- if the handle is not created 

   if(handle_iFractals==INVALID_HANDLE)

     {

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

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

                  m_symbol.Name(),

                  EnumToString(Period()),

                  GetLastError());

      //--- the indicator is stopped early 

      return(INIT_FAILED);

     }

//--- create handle of the indicator iAlligator

   handle_iAlligator=iAlligator(m_symbol.Name(),Period(),

                                Inp_Alligator_jaw_period,Inp_Alligator_jaw_shift,

                                Inp_Alligator_teeth_period,Inp_Alligator_teeth_shift,

                                Inp_Alligator_lips_period,Inp_Alligator_lips_shift,

                                MODE_SMMA,PRICE_MEDIAN);

//--- if the handle is not created 

   if(handle_iAlligator==INVALID_HANDLE)

     {

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

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

                  m_symbol.Name(),

                  EnumToString(Period()),

                  GetLastError());

      //--- the indicator is stopped early 

      return(INIT_FAILED);

     }

//---

   return(INIT_SUCCEEDED);

  }

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

//| Expert deinitialization function                                 |

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

void OnDeinit(const int reason)

  {

//---

   if(m_money!=NULL)

      delete m_money;

  }

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

//| Expert tick function                                             |

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

void OnTick()

  {

   if(ExtNeedDeleteBuy || ExtNeedDeleteSell)

     {

      int count_buy_limits=0; int count_sell_limits=0;

      int count_buy_stops=0;  int count_sell_stops=0;

      CalculateAllPendingOrders(count_buy_limits,count_sell_limits,

                                count_buy_stops,count_sell_stops);

      bool delete_buy=false;

      bool delete_sell=false;

      if(ExtNeedDeleteBuy)

        {

         if(count_buy_limits+count_buy_stops>0)

            delete_buy=true;

         else

            ExtNeedDeleteBuy=false;

        }

      if(ExtNeedDeleteSell)

        {

         if(count_sell_limits+count_sell_stops>0)

            delete_sell=true;

         else

            ExtNeedDeleteSell=false;

        }

      //--- delete pending orders

      if(delete_buy && delete_sell)

        {

         double level;

         if(FreezeStopsLevels(level))

           {

            DeleteAllPendingOrders(level);  return;

           }

         else

            return;

        }

      else if(delete_buy)

        {

         double level;

         if(FreezeStopsLevels(level))

           {

            DeleteOrders(ORDER_TYPE_BUY,level);  return;

           }

         else

            return;

        }

      else if(delete_sell)

        {

         double level;

         if(FreezeStopsLevels(level))

           {

            DeleteOrders(ORDER_TYPE_SELL,level);  return;

           }

         else

            return;

        }

     }

//---

   if(ExtNeedCloseAll)

     {

      if(IsPositionExists())

        {

         double level;

         if(FreezeStopsLevels(level))

           {

            CloseAllPositions(level);  return;

           }

         else

            return;

        }

      else

         ExtNeedCloseAll=false;

     }

//---

   if(ExtNeedDeleteAll)

     {

      if(IsPendingOrdersExists())

        {

         double level;

         if(FreezeStopsLevels(level))

           {

            DeleteAllPendingOrders(level);  return;

           }

         else

            return;

        }

      else

         ExtNeedDeleteAll=false;

     }

//--- close all positions, delete all pending orders if Profit >= "Minimum profit"

   double profit_all=ProfitAllPositions();

   if(profit_all>=InpProfitMinimum)

     {

      ExtNeedCloseAll=true;

      ExtNeedDeleteAll=true;

      ArrayFree(SNeedPosition);

      ArrayFree(SNeedPending);

     }

//---

   int size_need_position=ArraySize(SNeedPosition);

   if(size_need_position>0)

     {

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

        {

         if(SNeedPosition[i].waiting_transaction)

           {

            if(!SNeedPosition[i].transaction_confirmed)

              {

               Print("transaction_confirmed: ",SNeedPosition[i].transaction_confirmed);   return;

              }

            else if(SNeedPosition[i].transaction_confirmed)

              {

               ArrayRemove(SNeedPosition,i,1);  return;

              }

           }

         if(SNeedPosition[i].pos_type==POSITION_TYPE_BUY)

           {

            double level;

            if(FreezeStopsLevels(level))

              {

               SNeedPosition[i].waiting_transaction=true;

               OpenPosition(i,POSITION_TYPE_BUY,

                            SNeedPosition[i].volume,SNeedPosition[i].lot_coefficient,

                            SNeedPosition[i].stop_loss,SNeedPosition[i].take_profit,

                            level,SNeedPosition[i].magic);

              }

            return;

           }

         if(SNeedPosition[i].pos_type==POSITION_TYPE_SELL)

           {

            double level;

            if(FreezeStopsLevels(level))

              {

               SNeedPosition[i].waiting_transaction=true;

               OpenPosition(i,POSITION_TYPE_SELL,

                            SNeedPosition[i].volume,SNeedPosition[i].lot_coefficient,

                            SNeedPosition[i].stop_loss,SNeedPosition[i].take_profit,

                            level,SNeedPosition[i].magic);

              }

            return;

           }

        }

     }

//---

   int size_need_pending=ArraySize(SNeedPending);

   if(size_need_pending>0)

     {

      //if(IsPendingOrdersExists())

      //  {

      //   ExtNeedDeleteAll=true;  return;

      //  }

      if(!ExtWaitingPendingOrder)

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

           {

            double level;

            if(FreezeStopsLevels(level))

              {

               ExtWaitingPendingOrder=true;

               PlaceOrders(i,SNeedPending[i].pending_type,level,SNeedPending[i].magic);

              }

           }

      return;

     }

//---

   if(InpTrailingFrequency>=10) // trailing no more than once every 10 seconds

     {

      datetime time_current=TimeCurrent();

      if(time_current-ExtLastTrailing>10)

        {

         double level;

         if(FreezeStopsLevels(level))

            Trailing(level);

         else

            return;

         ExtLastTrailing=time_current;

        }

     }

   if(InpSignalsFrequency>=10) // search for trading signals no more than once every 10 seconds

     {

      datetime time_current=TimeCurrent();

      if(time_current-ExtLastSignals>10)

        {

         //--- search for trading signals

         if(!RefreshRates())

           {

            ExtPrevBars=0; return;

           }

         if(!SearchTradingSignals())

           {

            ExtPrevBars=0; return;

           }

         ExtLastSignals=time_current;

        }

     }

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

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

   if(time_0==ExtPrevBars)

      return;

   ExtPrevBars=time_0;

   if(InpTrailingFrequency<10) // trailing only at the time of the birth of new bar

     {

      double level;

      if(FreezeStopsLevels(level))

         Trailing(level);

     }

   if(InpSignalsFrequency<10) // search for trading signals only at the time of the birth of new bar

     {

      if(!RefreshRates())

        {

         ExtPrevBars=0; return;

        }

      //--- search for trading signals

      if(!SearchTradingSignals())

        {

         ExtPrevBars=0; return;

        }

     }

//---

  }

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

//| 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_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;

      ENUM_DEAL_ENTRY enum_deal_entry=(ENUM_DEAL_ENTRY)deal_entry;

      if(deal_symbol==m_symbol.Name() && (deal_magic==InpMagicBuy || deal_magic==InpMagicSell))

        {

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

           {

            int size_need_position=ArraySize(SNeedPosition);

            if(size_need_position>0)

              {

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

                 {

                  if(SNeedPosition[i].waiting_transaction)

                     if(SNeedPosition[i].waiting_order_ticket==deal_order)

                       {

                        Print(__FUNCTION__," Transaction confirmed");

                        SNeedPosition[i].transaction_confirmed=true;

                        break;

                       }

                 }

              }

           }

        }

     }

  }

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

//| Refreshes the symbol quotes data                                 |

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

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

  }

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

//| Lot Check                                                        |

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

double LotCheck(double lots)

  {

//--- calculate maximum volume

   double volume=NormalizeDouble(lots,2);

   double stepvol=m_symbol.LotsStep();

   if(stepvol>0.0)

      volume=stepvol*MathFloor(volume/stepvol);

//---

   double minvol=m_symbol.LotsMin();

   if(volume<minvol)

      volume=0.0;

//---

   double maxvol=m_symbol.LotsMax();

   if(volume>maxvol)

      volume=maxvol;

   return(volume);

  }

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

//| Check Freeze and Stops levels                                    |

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

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

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



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

      return(false);



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



   double spread=m_symbol.Spread()*ExtAdjustedPoint;

   level=(level>spread)?level:spread;

//---

   return(true);

  }

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

//| Open position                                                    |

//|   double stop_loss                                               |

//|      -> pips * ExtAdjustedPoint (if "0.0" -> the ExtStopLoss)    |

//|   double take_profit                                             |

//|      -> pips * ExtAdjustedPoint (if "0.0" -> the ExtTakeProfit)  |

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

void OpenPosition(const int index_in_structure,const ENUM_POSITION_TYPE pos_type,

                  const double volume,const double lot_coefficient,

                  const double stop_loss,const double take_profit,

                  const double level,const ulong magic)

  {

//--- buy

   if(pos_type==POSITION_TYPE_BUY)

     {

      OpenBuy(index_in_structure,volume,lot_coefficient,0.0,0.0,magic);

     }

//--- sell

   if(pos_type==POSITION_TYPE_SELL)

     {

      OpenSell(index_in_structure,volume,lot_coefficient,0.0,0.0,magic);

     }

  }

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

//| Open Buy position                                                |

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

void OpenBuy(const int index_in_structure,const double volume,

             const double lot_coefficient,double sl,double tp,const ulong magic)

  {

   m_trade.SetExpertMagicNumber(magic);



   sl=m_symbol.NormalizePrice(sl);

   tp=m_symbol.NormalizePrice(tp);



   double long_lot=0.0;

   if(volume>0.0)

      long_lot=volume;

   else

     {

      if(InpLotOrRisk==risk)

        {

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

         if(InpPrintLog)

            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)

           {

            ArrayRemove(SNeedPosition,index_in_structure,1);

            if(InpPrintLog)

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

            return;

           }

        }

      else if(InpLotOrRisk==lot)

         long_lot=InpVolumeLotOrRisk;

      else if(InpLotOrRisk==lots_min)

         long_lot=m_symbol.LotsMin();

      else

        {

         ArrayRemove(SNeedPosition,index_in_structure,1);

         return;

        }

     }

   if(lot_coefficient>0.0)

     {

      long_lot=LotCheck(long_lot*lot_coefficient);

      if(long_lot==0)

        {

         ArrayRemove(SNeedPosition,index_in_structure,1);

         if(InpPrintLog)

            Print(__FUNCTION__,", ERROR: LotCheck returned the 0.0");

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

        {

         ArrayRemove(SNeedPosition,index_in_structure,1);

         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

              {

               SNeedPosition[index_in_structure].waiting_transaction=true;

               SNeedPosition[index_in_structure].waiting_order_ticket=m_trade.ResultOrder();

              }

            else

              {

               SNeedPosition[index_in_structure].waiting_transaction=false;

               if(InpPrintLog)

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

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

              }

            if(InpPrintLog)

               PrintResultTrade(m_trade,m_symbol);

           }

         else

           {

            if(m_trade.ResultRetcode()==10009)

              {

               SNeedPosition[index_in_structure].waiting_transaction=true;

               SNeedPosition[index_in_structure].waiting_order_ticket=m_trade.ResultOrder();

              }

            else

              {

               SNeedPosition[index_in_structure].waiting_transaction=false;

               if(InpPrintLog)

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

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

              }

            if(InpPrintLog)

               PrintResultTrade(m_trade,m_symbol);

           }

        }

      else

        {

         SNeedPosition[index_in_structure].waiting_transaction=false;

         if(InpPrintLog)

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

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

         if(InpPrintLog)

            PrintResultTrade(m_trade,m_symbol);

        }

     }

   else

     {

      ArrayRemove(SNeedPosition,index_in_structure,1);

      if(InpPrintLog)

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

      return;

     }

//---

  }

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

//| Open Sell position                                               |

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

void OpenSell(const int index_in_structure,const double volume,

              const double lot_coefficient,double sl,double tp,const ulong magic)

  {

   m_trade.SetExpertMagicNumber(magic);



   sl=m_symbol.NormalizePrice(sl);

   tp=m_symbol.NormalizePrice(tp);



   double short_lot=0.0;

   if(volume>0.0)

      short_lot=volume;

   else

     {

      if(InpLotOrRisk==risk)

        {

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

         if(InpPrintLog)

            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)

           {

            ArrayRemove(SNeedPosition,index_in_structure,1);

            if(InpPrintLog)

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

            return;

           }

        }

      else if(InpLotOrRisk==lot)

         short_lot=InpVolumeLotOrRisk;

      else if(InpLotOrRisk==lots_min)

         short_lot=m_symbol.LotsMin();

      else

        {

         ArrayRemove(SNeedPosition,index_in_structure,1);

         return;

        }

     }

   if(lot_coefficient>0.0)

     {

      short_lot=LotCheck(short_lot*lot_coefficient);

      if(short_lot==0)

        {

         ArrayRemove(SNeedPosition,index_in_structure,1);

         if(InpPrintLog)

            Print(__FUNCTION__,", ERROR: LotCheck returned the 0.0");

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

        {

         ArrayRemove(SNeedPosition,index_in_structure,1);

         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

              {

               SNeedPosition[index_in_structure].waiting_transaction=true;

               SNeedPosition[index_in_structure].waiting_order_ticket=m_trade.ResultOrder();

              }

            else

              {

               SNeedPosition[index_in_structure].waiting_transaction=false;

               if(InpPrintLog)

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

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

              }

            if(InpPrintLog)

               PrintResultTrade(m_trade,m_symbol);

           }

         else

           {

            if(m_trade.ResultRetcode()==10009)

              {

               SNeedPosition[index_in_structure].waiting_transaction=true;

               SNeedPosition[index_in_structure].waiting_order_ticket=m_trade.ResultOrder();

              }

            else

              {

               SNeedPosition[index_in_structure].waiting_transaction=false;

               if(InpPrintLog)

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

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

              }

            if(InpPrintLog)

               PrintResultTrade(m_trade,m_symbol);

           }

        }

      else

        {

         SNeedPosition[index_in_structure].waiting_transaction=false;

         if(InpPrintLog)

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

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

         if(InpPrintLog)

            PrintResultTrade(m_trade,m_symbol);

        }

     }

   else

     {

      ArrayRemove(SNeedPosition,index_in_structure,1);

      if(InpPrintLog)

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

      return;

     }

//---

  }

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

//| Print CTrade result                                              |

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

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

  }

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

//| Get value of buffers                                             |

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

double 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 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(InpTrailingStop==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()==InpMagic)

           {

            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 PrintResultModify(CTrade &trade,CSymbolInfo &symbol,CPositionInfo &position)

  {

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

   Print("Freeze Level: "+DoubleToString(symbol.FreezeLevel(),0),", Stops Level: "+DoubleToString(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()));

  }

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

//| Close positions                                                  |

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

void ClosePositions(const ENUM_POSITION_TYPE pos_type,const double level)

  {

   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()==InpMagicBuy || m_position.Magic()==InpMagicSell))

            if(m_position.PositionType()==pos_type)

              {

               if(m_position.PositionType()==POSITION_TYPE_BUY)

                  if(MathAbs(m_symbol.Bid()-m_position.PriceOpen())>=level)

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

               if(m_position.PositionType()==POSITION_TYPE_SELL)

                  if(MathAbs(m_symbol.Ask()-m_position.PriceOpen())>=level)

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

              }

  }

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

//| Calculate all positions                                          |

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

void 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()==InpMagicBuy || m_position.Magic()==InpMagicSell))

           {

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

              }

           }

  }

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

//| Search trading signals                                           |

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

bool SearchTradingSignals(void)

  {

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



   int count_buy_limits=0; int count_sell_limits=0;

   int count_buy_stops=0;  int count_sell_stops=0;

   CalculateAllPendingOrders(count_buy_limits,count_sell_limits,

                             count_buy_stops,count_sell_stops);



   if(count_buys==0 || count_sells==0)

     {

      //--- Fractals: Swipe Range

      double upper[],lower[];

      ArraySetAsSeries(upper,true);

      ArraySetAsSeries(lower,true);

      int start_pos=0,count=4+InpSwipeRange;

      if(count<InpNearest+1)

         count=InpNearest+1;

/*

   #10#9 #8 #7 #6 #5 #4 #3 #2 #1 #0   

   

   InpSwipeRange=1

   -  -  -  -  -  -  +  +  +  +  +

   count=4+InpSwipeRange=5

   

   InpNearest=5

   -  -  -  -  -  +  -  -  -  -  -

   count<InpNearest+1 -> count=InpNearest+1 -> count=6

   

   #10#9 #8 #7 #6 #5 #4 #3 #2 #1 #0

*/

      if(!iGetArray(handle_iFractals,UPPER_LINE,start_pos,count,upper) || 

         !iGetArray(handle_iFractals,LOWER_LINE,start_pos,count,lower))

        {

         return(false);

        }

      double swipe_range=0.0;

      double sum_upper=0.0;

      double sum_lower=0.0;

      int count_upper=0;

      int count_lower=0;

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

        {

         if(upper[i]!=0.0 && upper[i]!=EMPTY_VALUE)

           {

            sum_upper+=upper[i]; count_upper++;

           }

         if(lower[i]!=0.0 && lower[i]!=EMPTY_VALUE)

           {

            sum_lower+=lower[i]; count_lower++;

           }

        }

      if(count_upper==0 || count_lower==0)

         return(true);

      swipe_range=(sum_upper/count_upper-sum_lower/count_lower);

      if(swipe_range<ExtIndent)

         swipe_range=ExtIndent;

      //--- >?@545;8BL ?> Alligator A83=0;

      double jaw[],teeth[],lips[];

      ArraySetAsSeries(jaw,true);

      ArraySetAsSeries(teeth,true);

      ArraySetAsSeries(lips,true);

      start_pos=0; count=3;

      if(!iGetArray(handle_iAlligator,GATORJAW_LINE,start_pos,count,jaw) || 

         !iGetArray(handle_iAlligator,GATORTEETH_LINE,start_pos,count,teeth) || 

         !iGetArray(handle_iAlligator,GATORLIPS_LINE,start_pos,count,lips))

        {

         return(false);

        }



      double fractal_nearest_upper=0.0;

      double fractal_nearest_lower=0.0;

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

        {

         if(fractal_nearest_upper==0.0)

            if(upper[i]!=0.0 && upper[i]!=EMPTY_VALUE)

              {

               fractal_nearest_upper=upper[i];

              }

         if(fractal_nearest_lower==0.0)

            if(lower[i]!=0.0 && lower[i]!=EMPTY_VALUE)

              {

               fractal_nearest_lower=lower[i];

              }

        }

      //--- signal generation

      if(count_buys==0)

        {

         if(count_buy_limits+count_buy_stops>0)

           {

            ExtNeedDeleteBuy=true;

            ExtPrevBars=0;

            ExtLastSignals=0;

            return(true);

           }

         if(fractal_nearest_upper!=0.0)

            if((jaw[1]>fractal_nearest_upper) && (teeth[1]<fractal_nearest_upper))

              {

               int size_need_position=ArraySize(SNeedPosition);

               ArrayResize(SNeedPosition,size_need_position+1);

               SNeedPosition[size_need_position].pos_type= POSITION_TYPE_BUY;

               SNeedPosition[size_need_position].magic   = InpMagicBuy;



               int size_need_pending=ArraySize(SNeedPending);

               ArrayResize(SNeedPending,size_need_pending+InpNumber);

               int j=1;

               for(int i=size_need_pending;i<size_need_pending+InpNumber;i++)

                 {

                  SNeedPending[i].pending_type           = ORDER_TYPE_BUY_STOP;

                  SNeedPending[i].price                  = m_symbol.Ask()+j*swipe_range;

                  SNeedPending[i].magic                  = InpMagicBuy;

                  j++;

                 }

               int d=0;

              }

        }



      if(count_sells==0)

        {

         if(count_sell_limits+count_sell_stops>0)

           {

            ExtNeedDeleteSell=true;

            ExtPrevBars=0;

            ExtLastSignals=0;

            return(true);

           }

         if(fractal_nearest_lower!=0.0)

            if((jaw[1]<fractal_nearest_lower) && (teeth[1]>fractal_nearest_lower))

              {

               int size_need_position=ArraySize(SNeedPosition);

               ArrayResize(SNeedPosition,size_need_position+1);

               SNeedPosition[size_need_position].pos_type= POSITION_TYPE_SELL;

               SNeedPosition[size_need_position].magic   = InpMagicSell;



               int size_need_pending=ArraySize(SNeedPending);

               ArrayResize(SNeedPending,size_need_pending+InpNumber);

               int j=1;

               for(int i=size_need_pending;i<size_need_pending+InpNumber;i++)

                 {

                  SNeedPending[i].pending_type           = ORDER_TYPE_SELL_STOP;

                  SNeedPending[i].price                  = m_symbol.Bid()-j*swipe_range;

                  SNeedPending[i].magic                  = InpMagicSell;

                  j++;

                 }

               int d=0;

              }

        }

     }

/*

   double bulls[],bears[],dema[];

   ArraySetAsSeries(bulls,true);

   ArraySetAsSeries(bears,true);

   ArraySetAsSeries(dema,true);

   int start_pos=0,count=6;

   if(!iGetArray(handle_iBullsPower,0,start_pos,count,bulls) || 

      !iGetArray(handle_iBearsPower,0,start_pos,count,bears) || 

      !iGetArray(handle_iDEMA,0,start_pos,count,dema))

     {

      return(false);

     }



   int size_need_position=ArraySize(SNeedPosition);

   if(dema[0]>dema[1] && dema[1]>dema[3])

     {

      if(bears[0]>bears[1] && bears[1]>bears[3] && bears[0]<0.0)

        {

         ArrayResize(SNeedPosition,size_need_position+1);

         SNeedPosition[size_need_position].pos_type=POSITION_TYPE_BUY;

         return(true);

        }

     }

   if(dema[0]<dema[1] && dema[1]<dema[3])

     {

      if(bulls[0]<bulls[1] && bulls[1]<bulls[3] && bulls[0]>0.0)

        {

         ArrayResize(SNeedPosition,size_need_position+1);

         SNeedPosition[size_need_position].pos_type=POSITION_TYPE_SELL;

         return(true);

        }

     }

*/

//---

   return(true);

  }

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

//| Delete Orders                                                    |

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

void DeleteOrders(const ENUM_ORDER_TYPE order_type,const 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

*/

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

      if(m_order.SelectByIndex(i))     // selects the pending order by index for further access to its properties

         if(m_order.Symbol()==m_symbol.Name() && (m_order.Magic()==InpMagicBuy || m_order.Magic()==InpMagicSell))

           {

            if(order_type==ORDER_TYPE_BUY && 

               (m_order.OrderType()==ORDER_TYPE_BUY_LIMIT || m_order.OrderType()==ORDER_TYPE_BUY_STOP))

              {

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

                  continue;

               if(m_order.OrderType()==ORDER_TYPE_BUY_LIMIT)

                 {

                  if(m_symbol.Ask()-m_order.PriceOpen()>=level)

                     m_trade.OrderDelete(m_order.Ticket());

                  continue;

                 }

               if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)

                 {

                  if(m_order.PriceOpen()-m_symbol.Ask()>=level)

                     m_trade.OrderDelete(m_order.Ticket());

                  continue;

                 }

              }

            if(order_type==ORDER_TYPE_SELL && 

               (m_order.OrderType()==ORDER_TYPE_SELL_LIMIT || m_order.OrderType()==ORDER_TYPE_SELL_STOP))

              {

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

                  continue;

               if(m_order.OrderType()==ORDER_TYPE_SELL_LIMIT)

                 {

                  if(m_order.PriceOpen()-m_symbol.Bid()>=level)

                     m_trade.OrderDelete(m_order.Ticket());

                  continue;

                 }

               if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)

                 {

                  if(m_symbol.Bid()-m_order.PriceOpen()>=level)

                     m_trade.OrderDelete(m_order.Ticket());

                  continue;

                 }

              }

           }

  }

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

//| Delete all pending orders                                        |

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

void DeleteAllPendingOrders(const double level)

  {

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

      if(m_order.SelectByIndex(i))     // selects the pending order by index for further access to its properties

         if(m_order.Symbol()==m_symbol.Name() && (m_order.Magic()==InpMagicBuy || m_order.Magic()==InpMagicSell))

           {

            if(m_order.OrderType()==ORDER_TYPE_BUY_LIMIT)

              {

               if(m_symbol.Ask()-m_order.PriceOpen()>=level)

                  m_trade.OrderDelete(m_order.Ticket());

               continue;

              }

            if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)

              {

               if(m_order.PriceOpen()-m_symbol.Ask()>=level)

                  m_trade.OrderDelete(m_order.Ticket());

               continue;

              }

            if(m_order.OrderType()==ORDER_TYPE_SELL_LIMIT)

              {

               if(m_order.PriceOpen()-m_symbol.Bid()>=level)

                  m_trade.OrderDelete(m_order.Ticket());

               continue;

              }

            if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)

              {

               if(m_symbol.Bid()-m_order.PriceOpen()>=level)

                  m_trade.OrderDelete(m_order.Ticket());

               continue;

              }

           }

  }

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

//| Is pendinf orders exists                                         |

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

bool IsPendingOrdersExists(void)

  {

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

      if(m_order.SelectByIndex(i))     // selects the pending order by index for further access to its properties

         if(m_order.Symbol()==m_symbol.Name() && (m_order.Magic()==InpMagicBuy || m_order.Magic()==InpMagicSell))

            return(true);

//---

   return(false);

  }

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

//| Place Orders                                                     |

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

void PlaceOrders(const int index_in_structure,const ENUM_ORDER_TYPE order_type,const double level,const ulong magic)

  {

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

*/

   double price=0.0,sl=0.0,tp=0.0;

//--- buy limit

   if(order_type==ORDER_TYPE_BUY_LIMIT)

     {

      price=SNeedPending[index_in_structure].price;

      if(m_symbol.Ask()-price<level) // check price

         price=m_symbol.Ask()-level;



      PendingOrder(ORDER_TYPE_BUY_LIMIT,price,sl,tp,magic);

      ArrayRemove(SNeedPending,index_in_structure,1);

      ExtWaitingPendingOrder=false;

     }

//--- sell limit

   if(order_type==ORDER_TYPE_SELL_LIMIT)

     {

      price=SNeedPending[index_in_structure].price;

      if(price-m_symbol.Bid()<level) // check price

         price=m_symbol.Bid()+level;



      PendingOrder(ORDER_TYPE_SELL_LIMIT,price,sl,tp,magic);

      ArrayRemove(SNeedPending,index_in_structure,1);

      ExtWaitingPendingOrder=false;

     }

//--- buy stop

   if(order_type==ORDER_TYPE_BUY_STOP)

     {

      price=SNeedPending[index_in_structure].price;

      if(price-m_symbol.Ask()<level) // check price

         price=m_symbol.Ask()+level;



      PendingOrder(ORDER_TYPE_BUY_STOP,price,sl,tp,magic);

      ArrayRemove(SNeedPending,index_in_structure,1);

      ExtWaitingPendingOrder=false;

     }

//--- sell stop

   if(order_type==ORDER_TYPE_SELL_STOP)

     {

      price=SNeedPending[index_in_structure].price;

      if(m_symbol.Bid()-price<level) // check price

         price=m_symbol.Bid()-level;



      PendingOrder(ORDER_TYPE_SELL_STOP,price,sl,tp,magic);

      ArrayRemove(SNeedPending,index_in_structure,1);

      ExtWaitingPendingOrder=false;

     }

  }

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

//| Pending order                                                    |

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

bool PendingOrder(const ENUM_ORDER_TYPE order_type,double price,double sl,double tp,const ulong magic)

  {

   m_trade.SetExpertMagicNumber(magic);



   sl=m_symbol.NormalizePrice(sl);

   tp=m_symbol.NormalizePrice(tp);

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

   ENUM_ORDER_TYPE check_order_type=-1;

   switch(order_type)

     {

      case  ORDER_TYPE_BUY:

         check_order_type=ORDER_TYPE_BUY;

         break;

      case ORDER_TYPE_SELL:

         check_order_type=ORDER_TYPE_SELL;

         break;

      case ORDER_TYPE_BUY_LIMIT:

         check_order_type=ORDER_TYPE_BUY;

         break;

      case ORDER_TYPE_SELL_LIMIT:

         check_order_type=ORDER_TYPE_SELL;

         break;

      case ORDER_TYPE_BUY_STOP:

         check_order_type=ORDER_TYPE_BUY;

         break;

      case ORDER_TYPE_SELL_STOP:

         check_order_type=ORDER_TYPE_SELL;

         break;

      default:

         return(false);

         break;

     }

//---

   double long_lot=0.0;

   double short_lot=0.0;

   if(InpLotOrRisk==risk)

     {

      bool error=false;

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

      if(InpPrintLog)

         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)

        {

         if(InpPrintLog)

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

         error=true;

        }

      //---

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

      if(InpPrintLog)

         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)

        {

         if(InpPrintLog)

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

         error=true;

        }

      //---

      if(error)

         return(false);

     }

   else if(InpLotOrRisk==lot)

     {

      long_lot=InpVolumeLotOrRisk;

      short_lot=InpVolumeLotOrRisk;

     }

   else if(InpLotOrRisk==lots_min)

     {

      long_lot=m_symbol.LotsMin();

      short_lot=m_symbol.LotsMin();

     }

   else

      return(false);

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

   double check_price=0;

   double check_lot=0;

   if(check_order_type==ORDER_TYPE_BUY)

     {

      check_price=m_symbol.Ask();

      check_lot=long_lot;

     }

   else

     {

      check_price=m_symbol.Bid();

      check_lot=short_lot;

     }

//---

   if(m_symbol.LotsLimit()>0.0)

     {

      double volume_buys        = 0.0;   double volume_sells       = 0.0;

      double volume_buy_limits  = 0.0;   double volume_sell_limits = 0.0;

      double volume_buy_stops   = 0.0;   double volume_sell_stops  = 0.0;

      CalculateAllVolumes(volume_buys,volume_sells,

                          volume_buy_limits,volume_sell_limits,

                          volume_buy_stops,volume_sell_stops);

      if(volume_buys+volume_sells+

         volume_buy_limits+volume_sell_limits+

         volume_buy_stops+volume_sell_stops+check_lot>m_symbol.LotsLimit())

        {

         if(InpPrintLog)

            Print("#0 ,",EnumToString(order_type),", ",

                  "Volume Buy's (",DoubleToString(volume_buys,2),")",

                  "Volume Sell's (",DoubleToString(volume_sells,2),")",

                  "Volume Buy limit's (",DoubleToString(volume_buy_limits,2),")",

                  "Volume Sell limit's (",DoubleToString(volume_sell_limits,2),")",

                  "Volume Buy stops's (",DoubleToString(volume_buy_stops,2),")",

                  "Volume Sell stops's (",DoubleToString(volume_sell_stops,2),")",

                  "Check lot (",DoubleToString(check_lot,2),")",

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

         return(false);

        }

     }

//---

   double free_margin_check=m_account.FreeMarginCheck(m_symbol.Name(),check_order_type,check_lot,check_price);

   if(free_margin_check>0.0)

     {

      if(m_trade.OrderOpen(m_symbol.Name(),order_type,check_lot,0.0,

         m_symbol.NormalizePrice(price),m_symbol.NormalizePrice(sl),m_symbol.NormalizePrice(tp)))

        {

         if(m_trade.ResultOrder()==0)

           {

            if(InpPrintLog)

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

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

            if(InpPrintLog)

               PrintResultTrade(m_trade,m_symbol);

            return(false);

           }

         else

           {

            if(InpPrintLog)

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

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

            if(InpPrintLog)

               PrintResultTrade(m_trade,m_symbol);

            return(true);

           }

        }

      else

        {

         if(InpPrintLog)

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

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

         if(InpPrintLog)

            PrintResultTrade(m_trade,m_symbol);

         return(false);

        }

     }

   else

     {

      if(InpPrintLog)

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

      return(false);

     }

//---

   return(false);

  }

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

//| Calculate all volumes                                            |

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

void CalculateAllVolumes(double &volumne_buys,double &volumne_sells,

                         double &volumne_buy_limits,double &volumne_sell_limits,

                         double &volumne_buy_stops,double &volumne_sell_stops)

  {

   volumne_buys         = 0.0;   volumne_sells        = 0.0;

   volumne_buy_limits   = 0.0;   volumne_sell_limits  = 0.0;

   volumne_buy_stops    = 0.0;   volumne_sell_stops   = 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()==InpMagicBuy || m_position.Magic()==InpMagicSell))

           {

            if(m_position.PositionType()==POSITION_TYPE_BUY)

               volumne_buys+=m_position.Volume();

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

               volumne_sells+=m_position.Volume();

           }



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

      if(m_order.SelectByIndex(i)) // selects the pending order by index for further access to its properties

         if(m_order.Symbol()==m_symbol.Name() && (m_order.Magic()==InpMagicBuy || m_order.Magic()==InpMagicSell))

           {

            if(m_order.OrderType()==ORDER_TYPE_BUY_LIMIT)

               volumne_buy_limits+=m_order.VolumeInitial();

            else if(m_order.OrderType()==ORDER_TYPE_SELL_LIMIT)

               volumne_sell_limits+=m_order.VolumeInitial();

            else if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)

               volumne_buy_stops+=m_order.VolumeInitial();

            else if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)

               volumne_sell_stops+=m_order.VolumeInitial();

           }

  }

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

//| Is position exists                                               |

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

bool IsPositionExists(void)

  {

   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()==InpMagicBuy || m_position.Magic()==InpMagicSell))

            return(true);

//---

   return(false);

  }

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

//| Close all positions                                              |

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

void CloseAllPositions(const double level)

  {

   m_trade.SetExpertMagicNumber(InpMagic);



   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()==InpMagicBuy || m_position.Magic()==InpMagicSell))

           {

            if(m_position.PositionType()==POSITION_TYPE_BUY)

               if(MathAbs(m_symbol.Bid()-m_position.PriceOpen())>=level)

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

            if(m_position.PositionType()==POSITION_TYPE_SELL)

               if(MathAbs(m_symbol.Ask()-m_position.PriceOpen())>=level)

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

           }

  }

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

//| Profit all positions                                             |

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

double ProfitAllPositions(void)

  {

   double profit=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()==InpMagicBuy || m_position.Magic()==InpMagicSell))

            profit+=m_position.Commission()+m_position.Swap()+m_position.Profit();

//---

   return(profit);

  }

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

//| Calculate all pending orders                                     |

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

void CalculateAllPendingOrders(int &count_buy_limits,int &count_sell_limits,

                               int &count_buy_stops,int &count_sell_stops)

  {

   count_buy_limits  = 0;

   count_sell_limits = 0;

   count_buy_stops   = 0;

   count_sell_stops  = 0;



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

      if(m_order.SelectByIndex(i))     // selects the pending order by index for further access to its properties

         if(m_order.Symbol()==m_symbol.Name() && (m_order.Magic()==InpMagicBuy || m_order.Magic()==InpMagicSell))

           {

            if(m_order.OrderType()==ORDER_TYPE_BUY_LIMIT)

               count_buy_limits++;

            else if(m_order.OrderType()==ORDER_TYPE_SELL_LIMIT)

               count_sell_limits++;

            else if(m_order.OrderType()==ORDER_TYPE_BUY_STOP)

               count_buy_stops++;

            else if(m_order.OrderType()==ORDER_TYPE_SELL_STOP)

               count_sell_stops++;

           }

  }

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

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