← К каталогу
Исходный код · ID 2391

corders.mqh

Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Библиотека исходного кода для MetaTrader 4, предоставляющая класс COrders для управления торговыми ордерами. Библиотека включает функции открытия и закрытия ордеров, проверки условий для новых сделок, а также расчёта размера лота с различными режимами управления рисками. Поддерживаются три режима расчёта лота: фиксированный размер, фиксированная сумма и процент от баланса счёта. Библиотека использует вспомогательные модули COrder, AnalyseSymbol и CUtils для работы с ценами, символами и нормализацией лота.

Настройки программы

НастройкаОписание
MoneyManagement Тип управления деньгами — Выбор режима расчёта размера лота: фиксированный лот, фиксированная сумма или процент от баланса счёта.
FixedLotSize Фиксированный размер лота — Размер лота, используемый при режиме управления FixedLotSize.
FixedAmount Фиксированная сумма — Сумма в денежных единицах для расчёта лота при режиме управления FixedAmount.
RiskPercentage Процент риска — Процент от баланса счёта, используемый для расчёта размера лота при режиме управления риском.
MagicNumberBuy Магический номер покупки — Магический номер, присваиваемый открытым покупательским ордерам для их идентификации.
MagicNumberSell Магический номер продажи — Магический номер, присваиваемый открытым продавческим ордерам для их идентификации.
BuyComment Комментарий покупки — Текстовый комментарий, добавляемый к открываемым покупательским ордерам.
SellComment Комментарий продажи — Текстовый комментарий, добавляемый к открываемым продавческим ордерам.
MaxSpreadInPips Максимальный спред в пунктах — Допустимый максимальный спред в пунктах для открытия нового ордера.
MaxOpenTrades Максимум открытых сделок — Максимальное количество открытых ордеров, при превышении которого новые сделки не открываются.

Состав библиотеки

Классов: 1 · методов: 12 · конструкторов: 1 · деструкторов: 0 · отдельных функций: 0

Классы
Класс class COrders

Класс для управления торговыми ордерами: открытие, закрытие, проверка условий и расчёт размера лота.

Методы и конструкторы
Конструктор · COrders COrders(string symbol)

Конструктор класса COrders, инициализирующий работу с указанным символом.

Метод · COrders bool CanOpenNewOrder()

Проверяет, можно ли открыть новый ордер, сравнивая текущее количество ордеров с допустимым максимумом.

Метод · COrders double IsSpreadOk()

Проверяет, не превышает ли текущий спред на символе заданный максимальный уровень.

Метод · COrders int GetOrderCount()

Возвращает количество открытых ордеров на текущем символе с подходящими магическими номерами.

Метод · COrders int GetGlobalOrderCount()

Возвращает общее количество открытых ордеров на всех символах с подходящими магическими номерами.

Метод · COrders bool IsBuy(int orderType)

Определяет, является ли указанный тип ордера покупательским (OP_BUY, OP_BUYLIMIT, OP_BUYSTOP).

Метод · COrders bool CloseOrderByTicket(int ticket)

Закрывает ордер по его тикету, используя текущую рыночную цену.

Метод · COrders void CloseOrderByType(int orderType)

Закрывает все ордера указанного типа на текущем символе с подходящими магическими номерами.

Метод · COrders int OpenBuyOrder(double lotSize, double sl, double tp)

Открывает покупательский ордер на заданном символе с указанным размером лота, стоп-лоссом и тейк-профитом.

Метод · COrders int OpenSellOrder(double lotSize, double sl, double tp)

Открывает продавческий ордер на заданном символе с указанным размером лота, стоп-лоссом и тейк-профитом.

Метод · COrders double GetLotSize(double stopLossPrice, int orderType)

Возвращает рассчитанный размер лота в зависимости от выбранного режима управления и цены стоп-лосса.

Метод · COrders double CalcLotSize(double amountToRisk,double stopLossPrice,int orderType,bool returnNormalizedLots)

Рассчитывает размер лота на основе заданной суммы риска, цены стоп-лосса и типа ордера с учётом типа символа.

Метод · COrders COrder* GetLastClosedOrder()

Возвращает информацию о последнем закрытом ордере для текущего символа с подходящими магическими номерами.

Получить полный код

Поиск по коду файла

#property strict

#include <COrder.mqh>
#include <AnalyseSymbol.mqh>
#include <CUtils.mqh>

enum MoneyManagementType 
{
   UseFixedLotSize,
   UseFixedAmount,
   UsePercentageOfAccountBalance,
};

extern string               __Orders__          = "----- Money management settings------";;
extern MoneyManagementType MoneyManagement      = UseFixedLotSize;      
extern double              FixedLotSize         = 0.01;              
extern double              FixedAmount          = 100;                         
extern double              RiskPercentage       = 2;             
extern int                 MagicNumberBuy       = 1122;
extern int                 MagicNumberSell      = 2211;
extern string              BuyComment           = "buy";
extern string              SellComment          = "sell";
extern int                 MaxSpreadInPips      = 8;
extern int                 MaxOpenTrades        = 100;

class COrders
{
private:
   string _symbol;

public:

   COrders(string symbol)
   {  
      _symbol=symbol;
   }

   bool CanOpenNewOrder()
   {
     return GetGlobalOrderCount() < MaxOpenTrades;
   }

   double IsSpreadOk()
   {
      RefreshRates();
      if (_utils.Spread(_symbol) > MaxSpreadInPips) return false;
      return true;
   }

   int GetOrderCount()
   {
      int cnt=0;
      for (int i=0; i < OrdersTotal();++i)
      {
         if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == _symbol)
            {
               if (OrderMagicNumber() == MagicNumberBuy || OrderMagicNumber() == MagicNumberSell) cnt++;
            }
         }
      }
      return cnt;
   }

   int GetGlobalOrderCount()
   {
      int cnt=0;
      for (int i=0; i < OrdersTotal();++i)
      {
         if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
           if (OrderMagicNumber() == MagicNumberBuy || OrderMagicNumber() == MagicNumberSell) cnt++;
         }
      }
      return cnt;
   }

   bool IsBuy(int orderType)
   {
      return (orderType  == OP_BUY ||  orderType== OP_BUYLIMIT || orderType== OP_BUYSTOP);
   }

    bool CloseOrderByTicket(int ticket)
    {
      Print("  COrders:CloseOrderByTicket #", ticket);
      bool success = false;
      if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
      {
         Print("  order selected : closetime:", OrderCloseTime() );
         RefreshRates();
         double price   = _utils.AskPrice(OrderSymbol());
         int orderType  = OrderType();
         if (IsBuy(orderType)) price = _utils.BidPrice(OrderSymbol());

         Print("  market price:",price, " OpenPrice:", OrderOpenPrice());
         Print("Closing order ", OrderSymbol(),"  #",OrderTicket(), " lots:", OrderLots(), " price:", price);
         success = OrderClose(OrderTicket(), OrderLots(), price, 3, Red);
         if (success)
         {
            Print("  order #", ticket, " closed");
            if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY))
            {
            }
            else Print("------ UNABLE TO FIND ORDER IN HISTORY AFTER CLOSE --------");
         }
         else 
         {
            Print("------ UNABLE TO CLOSE ORDER -------- err:", GetLastError());
         }
      }
      else 
      {
         Print("------ UNABLE TO FIND ORDER TO CLOSE --------");
      }
      return success;
    }

    void CloseOrderByType(int orderType)
    {
      bool orderClosed;
      int  cnt=0;
      do
      {
         orderClosed=false;
         for (int i=0; i < OrdersTotal(); i++)
         {
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
               if (OrderSymbol() == _symbol && orderType == OrderType() )
               {
                  if (OrderMagicNumber() == MagicNumberBuy || OrderMagicNumber() == MagicNumberSell)
                  {
                     double price = _utils.AskPrice(OrderSymbol());
                     if (IsBuy(orderType))  price = _utils.BidPrice(OrderSymbol());

                     Print("Closing order ", OrderSymbol(),"  #",OrderTicket(), " lots:", OrderLots(), " price", price);
                     bool success = OrderClose(OrderTicket(), OrderLots(), price, 3, Red);
                     orderClosed=true;
                     cnt++;
                     break;
                  }
               }
             }
          }
       } while (orderClosed);
    }

    int OpenBuyOrder(double lotSize, double sl=0, double tp=0)
    {
      RefreshRates();
      double price  = _utils.AskPrice(_symbol);
      Print(_symbol, " Open buy order lots:", lotSize, " price:", price,"  sl:",sl, " tp:",tp);
      int ticket    = OrderSend(_symbol, OP_BUY, lotSize, price, 3, sl, tp, BuyComment, MagicNumberBuy);
      if (ticket < 0)
      {
         int ErrNumber = GetLastError();
         Print("  buy order failed err# ",ErrNumber, " symbol:", _symbol, " lots:", lotSize, " price:", price, " sl:", sl, "  tp:",tp);
      }
      return ticket;
    }

    int OpenSellOrder(double lotSize, double sl=0, double tp=0)
    {
      RefreshRates();
      double price  = _utils.BidPrice(_symbol);
      Print(_symbol, " Open sell order for lots:", lotSize, " price:", price,"  sl:",sl, " tp:",tp);
      int ticket    = OrderSend(_symbol, OP_SELL, lotSize, price, 3, sl,tp, SellComment, MagicNumberSell);
      if (ticket < 0)
      {
         int ErrNumber = GetLastError();
         Print("  sell order failed err# ",ErrNumber, " symbol:", _symbol, " lots:", lotSize, " price:", price, " sl:", sl, "  tp:",tp);
      }
      return ticket;
    }

   double GetLotSize(double stopLossPrice, int orderType)
   {
      double lotSize=0;
      double amount=0;

      switch (MoneyManagement)
      {
         case UseFixedLotSize:
            Print("COrders:GetLotSize() Use fixed lot size:",  FixedLotSize);
            return _utils.NormalizeLotSize(_symbol, FixedLotSize);
         break;

         case UseFixedAmount:
            if (FixedAmount <=0)
            {
               Print("COrders:GetLotSize() Use FixedAmount, but fixed amount <=0-> return fixed lotsize: ",  FixedLotSize);
               return _utils.NormalizeLotSize(_symbol, FixedLotSize);
            }
            Print("COrders:GetLotSize() Use FixedAmount ",  FixedAmount, "  lots:", lotSize);
            lotSize = CalcLotSize(FixedAmount, stopLossPrice, orderType);
            return lotSize;
         break;

         case UsePercentageOfAccountBalance:
            if (RiskPercentage <=0)
            {
               Print("COrders:GetLotSize() Use Risk

Показано первые 50% кода (символов: 8530)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
853₽ ≈ $10.43