class COrders
Класс для управления торговыми ордерами: открытие, закрытие, проверка условий и расчёт размера лота.
Сообщите нам, если считаете, что материал размещён без разрешения.
Обращение по товару «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(string symbol)
Конструктор класса COrders, инициализирующий работу с указанным символом.
bool CanOpenNewOrder()
Проверяет, можно ли открыть новый ордер, сравнивая текущее количество ордеров с допустимым максимумом.
double IsSpreadOk()
Проверяет, не превышает ли текущий спред на символе заданный максимальный уровень.
int GetOrderCount()
Возвращает количество открытых ордеров на текущем символе с подходящими магическими номерами.
int GetGlobalOrderCount()
Возвращает общее количество открытых ордеров на всех символах с подходящими магическими номерами.
bool IsBuy(int orderType)
Определяет, является ли указанный тип ордера покупательским (OP_BUY, OP_BUYLIMIT, OP_BUYSTOP).
bool CloseOrderByTicket(int ticket)
Закрывает ордер по его тикету, используя текущую рыночную цену.
void CloseOrderByType(int orderType)
Закрывает все ордера указанного типа на текущем символе с подходящими магическими номерами.
int OpenBuyOrder(double lotSize, double sl, double tp)
Открывает покупательский ордер на заданном символе с указанным размером лота, стоп-лоссом и тейк-профитом.
int OpenSellOrder(double lotSize, double sl, double tp)
Открывает продавческий ордер на заданном символе с указанным размером лота, стоп-лоссом и тейк-профитом.
double GetLotSize(double stopLossPrice, int orderType)
Возвращает рассчитанный размер лота в зависимости от выбранного режима управления и цены стоп-лосса.
double CalcLotSize(double amountToRisk,double stopLossPrice,int orderType,bool returnNormalizedLots)
Рассчитывает размер лота на основе заданной суммы риска, цены стоп-лосса и типа ордера с учётом типа символа.
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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.