Quick_deals_EA

Author: Copyright 2018, MetaQuotes Software Corp.
Orders Execution
Checks for the total of open orders
Miscellaneous
It opens Message Boxes to the user
0 Views
0 Downloads
0 Favorites
Quick_deals_EA
ÿþ//+------------------------------------------------------------------+

//|                                                  Quick_deals.mq5 |

//|                        Copyright 2018, MetaQuotes Software Corp. |

//|                                             https://www.mql5.com |

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

#property copyright "Copyright 2018, MetaQuotes Software Corp."

#property link      "https://www.mql5.com/ru/users/s22aa"

#property version   "1.5"

#property description  "@0255 ?>A;54=53> 10@0, =865 F5=K Ctrl+  - OpenSell"

#property description  "@0255 ?>A;54=53> 10@0, 2KH5 F5=K Ctrl+  - OpenBuy"



#property description  "5255  ?>A;54=53> 10@0, =865 F5=K Ctrl+  - OpenBuyLimit"

#property description  "5255  ?>A;54=53> 10@0, 2KH5 F5=K Ctrl+  - OpenSellLimit"



#property description  "5255  ?>A;54=53> 10@0, =865 F5=K Shift+ - OpenSellStop"

#property description  "5255  ?>A;54=53> 10@0, 2KH5 F5=K Shift+ - OpenBuyStop"



#property description  "Tab+ - Revers"

#property description  "CapsLock+ - CloseAll"



#include <Trade\PositionInfo.mqh>

#include <Trade\Trade.mqh>

#include <Trade\OrderInfo.mqh>

CPositionInfo  m_position;

CTrade         m_trade;

COrderInfo     m_order;



input double   _TP       = 0;        // Take profit

input double   _SL       = 0;        // Stop loss

input double   InpLots   = 1.0;      // Lots

enum name

  {

   P_O,       // PositionClose and OrderDelete

   O_P,       // Only PositionClose

   O_O        // Only OrderDelete

  };

input name Select;

enum Filling

  {

   a, //SYMBOL_FILLING_FOK

   b, //SYMBOL_FILLING_IOC

   c, //ORDER_FILLING_RETURN

   d  //02B><0B8G5A:8

  };

input Filling m_Filling      = d;       //2K1>@ 70?>;=5=8O >@45@0

double TP, SL;

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

int OnInit()

  {

   string err_text = "";

   if(!CheckVolumeValue(InpLots, err_text))

     {

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

      MessageBox(err_text);

      return(INIT_PARAMETERS_INCORRECT);

     }



   switch(m_Filling)

     {

      case  a:

         m_trade.SetTypeFilling(ORDER_FILLING_FOK);

         break;

      case  b:

         m_trade.SetTypeFilling(ORDER_FILLING_IOC);

         break;

      case  c:

         m_trade.SetTypeFilling(ORDER_FILLING_RETURN);

         break;

      case  d:

         m_trade.SetTypeFillingBySymbol(Symbol());

         break;

     }



   SL = _SL * _Point;

   TP = _TP * _Point;



   return(INIT_SUCCEEDED);

  }

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

void OnChartEvent(const int id,          // 845=B8D8:0B>@ A>1KB8O

                  const long & lparam,   // ?0@0<5B@ A>1KB8O B8?0 long

                  const double & dparam, // ?0@0<5B@ A>1KB8O B8?0 double

                  const string & sparam  // ?0@0<5B@ A>1KB8O B8?0 string

                 )

  {

   long param = 0;

   int sub_window = 0;

   datetime time = 0.0;

   double price = 0.0;



   if(TerminalInfoInteger(TERMINAL_KEYSTATE_CONTROL) < 0)

      if(id == CHARTEVENT_CLICK)

        {

         long _time = SymbolInfoInteger(_Symbol, SYMBOL_TIME);

         double Ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

         double Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

         ChartXYToTimePrice(0, (int)lparam, (int)dparam, sub_window, time, price);

         if(price > Ask && time > _time)

            m_trade.Buy(InpLots, _Symbol, Ask, SL == 0 ? 0 : IsNormalizePrice(Ask - SL), TP == 0 ? 0 : IsNormalizePrice(Ask + TP));

         else

            if(price < Bid && time > _time)

               m_trade.Sell(InpLots, _Symbol, Bid, SL == 0 ? 0 : IsNormalizePrice(Bid + SL), TP == 0 ? 0 : IsNormalizePrice(Bid - TP));



         if(price > Ask && time < _time)

            m_trade.SellLimit(InpLots, IsNormalizePrice(price), _Symbol, SL == 0 ? 0 : IsNormalizePrice(price + SL), TP == 0 ? 0 : IsNormalizePrice(price - TP), 0, 0);

         else

            if(price < Bid && time < _time && price != 0 && time != 0)

               m_trade.BuyLimit(InpLots, IsNormalizePrice(price), _Symbol, SL == 0 ? 0 : IsNormalizePrice(price - SL), TP == 0 ? 0 : IsNormalizePrice(price + TP), 0, 0);

        }



   if(TerminalInfoInteger(TERMINAL_KEYSTATE_SHIFT) < 0)

      if(id == CHARTEVENT_CLICK)

        {

         long _time = SymbolInfoInteger(_Symbol, SYMBOL_TIME);

         double Ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

         double Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

         ChartXYToTimePrice(0, (int)lparam, (int)dparam, sub_window, time, price);

         if(price > Ask && time < _time)

            m_trade.BuyStop(InpLots, IsNormalizePrice(price), _Symbol, SL == 0 ? 0 : IsNormalizePrice(price - SL), TP == 0 ? 0 : IsNormalizePrice(price + TP), 0, 0);

         else

            if(price < Bid  && time < _time && price != 0 && time != 0)

               m_trade.SellStop(InpLots, IsNormalizePrice(price), _Symbol, SL == 0 ? 0 : IsNormalizePrice(price + SL), TP == 0 ? 0 : IsNormalizePrice(price - TP), 0, 0);

        }



   if(TerminalInfoInteger(TERMINAL_KEYSTATE_TAB) < 0)

      if(id == CHARTEVENT_CLICK)

         Revers();



   if(TerminalInfoInteger(TERMINAL_KEYSTATE_CAPSLOCK) < 0)

      if(id == CHARTEVENT_CLICK)

         switch(Select)

           {

            case P_O :

               IsPositionClose();

               IsOrderDelite();

               break;

            case O_P :

               IsPositionClose();

               break;

            case O_O :

               IsOrderDelite();

               break;

           }

  }

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

void Revers()

  {

   ENUM_ACCOUNT_MARGIN_MODE margin_mode = (ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE);

   if(margin_mode != ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)

      if(m_position.Select(_Symbol))

         if(m_position.PositionType() == POSITION_TYPE_SELL)

           {

            if(m_trade.PositionClose(m_position.Ticket()))

              {

               double Ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

               m_trade.Buy(InpLots, _Symbol, Ask, SL == 0 ? 0 : IsNormalizePrice(Ask - SL), TP == 0 ? 0 : IsNormalizePrice(Ask + TP));

              }

           }

         else

           {

            if(m_trade.PositionClose(m_position.Ticket()))

              {

               double Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

               m_trade.Sell(InpLots, _Symbol, Bid, SL == 0 ? 0 : IsNormalizePrice(Bid + SL), TP == 0 ? 0 : IsNormalizePrice(Bid - TP));

              }

           }

  }

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

void IsOrderDelite()

  {

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

      if(m_order.SelectByIndex(i))

         if(m_order.Symbol() == _Symbol)

            m_trade.OrderDelete(m_order.Ticket());

  }

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

void IsPositionClose()

  {

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

      if(m_position.SelectByIndex(i))

         if(m_position.Symbol() == _Symbol)

            m_trade.PositionClose(m_position.Ticket());

  }

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

double IsNormalizePrice(double price)

  {

   double tick_size = 0;

   SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE, tick_size);

   return(NormalizeDouble(MathRound(price / tick_size) * tick_size, _Digits));

  }

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

bool CheckVolumeValue(double volume, string & description)

  {

//--- <8=8<0;L=> 4>?CAB8<K9 >1J5< 4;O B>@3>2KE >?5@0F89

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

   if(volume < min_volume)

     {

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

      return(false);

     }

//--- <0:A8<0;L=> 4>?CAB8<K9 >1J5< 4;O B>@3>2KE >?5@0F89

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

   if(volume > max_volume)

     {

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

      return(false);

     }

//--- ?>;CG8< <8=8<0;L=CN 3@040F8N >1J5<0

   double volume_step = SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP);

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

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

     {

      description = StringFormat("1J5< =5 O2;O5BAO :@0B=K< <8=8<0;L=>9 3@040F88 SYMBOL_VOLUME_STEP=%.2f, 1;8609H89 :>@@5:B=K9 >1J5< %.2f",

                                 volume_step, ratio * volume_step);

      return(false);

     }

   description = ">@@5:B=>5 7=0G5=85 >1J5<0";

   return(true);

  }

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

Comments