class CPair
Класс-менеджер торговой пары, инкапсулирующий логику обработки сигналов, управления ордерами и алертами для одной валютной пары.
Сообщите нам, если считаете, что материал размещён без разрешения.
Обращение по товару «cpair.mqh» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
CPair — это библиотека для MetaTrader 4, реализующая класс-менеджер одной торговой пары. Она интегрирует получение торговых сигналов через стратегию, проверку новостного и временного фильтров, а также управление жизненным циклом ордеров.
Класс обеспечивает отображение сигнальной панели, отправку алертов, открытие и закрытие ордеров, управление трейлинг-стопом и установку стоп-лоссов на открытые позиции. Все торговые операции контролируются набором внешних параметров.
Библиотека предназначена для использования как include-файл в составе более крупной торговой системы, где несколько экземпляров CPair обрабатывают разные валютные пары параллельно.
| Настройка | Описание |
|---|---|
| __trading | Разделитель настроек торговли и алертов — Разделитель-группировка настроек торговли и алертов. |
| allowTrading | Разрешить торговлю — Включает или отключает возможность открытия реальных торговых ордеров. |
| sendAlerts | Отправлять алерты — Включает или отключает отправку уведомлений о торговых сигналах. |
| emailAlerts | Алерты по email — Включает отправку алертов по электронной почте. |
| stopLossAtZigZagArrow | Стоп-лосс по ZigZag-стрелке — Определяет, используется ли уровень стоп-лосса по ZigZag-стрелке вместо стандартного расчёта. |
| minsBetween2TradesOnSamePair | Минуты между сделками на одной паре — Минимальное количество минут между двумя сделками на одной паре. |
| AllowReEntriesOnSamePair | Разрешить повторный вход на ту же пару — Разрешает повторный вход в торговую пару без ожидания интервала между сделками. |
| SignalInvalidAfterHours | Часы до недействительности сигнала — Часы после которых сигнал считается недействительным. |
| SignalInvalidAfterPips | Пипсы до недействительности сигнала — Пипсы отклонения после которых сигнал считается недействительным. |
| TradePairs | Торговые пары — Список торговых пар, разделённых пробелами, которые могут обрабатываться системой. |
Классов: 1 · методов: 13 · конструкторов: 1 · деструкторов: 1 · отдельных функций: 0
class CPair
Класс-менеджер торговой пары, инкапсулирующий логику обработки сигналов, управления ордерами и алертами для одной валютной пары.
CPair(string symbol, IStrategy* strategy, CNewsFilter* newsFilter, CUtils* utils)
Конструктор класса; инициализирует менеджер пары с указанным символом, стратегией, фильтром новостей и утилитами.
~CPair()
Деструктор; освобождает выделенные объекты ордеров, фильтров и стратегии.
int SignalCount()
Возвращает количество текущих действительных условий сигнала.
int GetMaxSignalCount()
Возвращает максимальное количество условий, необходимых для признания сигнала действительным.
void DrawHeader()
Отрисовывает заголовок панели отображения сигналов.
void Draw(int line)
Отрисовывает строку статуса сигнала на указанной линии.
void Trail()
Запускает управление трейлинг-стопом для открытых позиций.
string GetSymbol()
Возвращает имя символа, управляемого данным экземпляром.
double GetStoploss(int ticket)
Возвращает уровень стоп-лосса для указанного ордера.
double GetRiskReward(int ticket)
Возвращает соотношение риск/прибыль для указанного ордера.
void Refresh()
Обновляет торговый сигнал и инициирует обработку ордеров (алерты, закрытие противоположных, открытие новых).
void SendAlerts()
Отправляет алерты о торговых сигналах при соответствующей настройке.
void CloseOppositeOrders()
Закрывает ордера в противоположном направлении при появлении нового сигнала.
void OpenNewOrder()
Открывает новый торговый ордер при выполнении всех условий.
void SetStoplossOnOpenOrder()
Устанавливает стоп-лосс на уже открытые ордера при инициализации.
extern string __trading = " ------- trading & alerts settings ------------";
extern bool allowTrading = false;
extern bool sendAlerts = false;
extern bool emailAlerts = false;
extern bool stopLossAtZigZagArrow = true;
extern int minsBetween2TradesOnSamePair = 720;
extern bool AllowReEntriesOnSamePair = false;
extern int SignalInvalidAfterHours = 12;
extern int SignalInvalidAfterPips = 30;
extern string TradePairs = "EURUSD USDJPY GBPUSD USDCHF USDCAD AUDUSD NZDUSD EURCHF EURGBP EURCAD EURAUD EURNZD EURJPY GBPJPY CHFJPY CADJPY AUDJPY NZDJPY GBPCHF GBPAUD GBPCAD GBPNZD AUDCHF AUDCAD AUDNZD CADCHF NZDCHF NZDCAD";
#include <COrders.mqh>
#include <CTrailingStop.mqh>
#include <CTimeFilter.mqh>
#include <CNewsFilter.mqh>
#include <CStrategy.mqh>
class CPair
{
private:
CNewsFilter* _newsFilter;
CTimeFilter* _timeFilter;
CTrailingStop* _trailingStop;
COrders* _orders;
CUtils* _utils;
string _symbol;
NEWS_IMPACT _impact;
bool _allowedToTradeNews;
bool _allowedToTradeTimeFilter;
IStrategy* _strategy;
CSignal* _signal;
public:
CPair(string symbol, IStrategy* strategy, CNewsFilter* newsFilter, CUtils* utils)
{
_symbol = symbol;
_utils = utils;
_trailingStop = new CTrailingStop(symbol);
_newsFilter = newsFilter;
_timeFilter = new CTimeFilter();
_orders = new COrders(symbol);
_strategy = strategy;
_signal = NULL;
SetStoplossOnOpenOrder();
}
~CPair()
{
delete _orders;
delete _timeFilter;
delete _trailingStop;
delete _strategy;
}
private:
void DrawRect(int line, int xPos,color clr, int width, int height=17, int yoff=0)
{
string id="_l"+IntegerToString(line)+"c"+IntegerToString(xPos);
ObjectCreate(0,id,OBJ_RECTANGLE_LABEL,0,0,0);
ObjectSetInteger(0, id, OBJPROP_XDISTANCE, xPos);
ObjectSetInteger(0, id, OBJPROP_YDISTANCE, line*17+22+yoff);
ObjectSetInteger(0, id, OBJPROP_BGCOLOR , clr);
ObjectSetInteger(0, id, OBJPROP_XSIZE , width);
ObjectSetInteger(0, id, OBJPROP_YSIZE , height);
ObjectSetInteger(0, id, OBJPROP_BACK , true);
ObjectSetInteger(0, id, OBJPROP_WIDTH , 0);
}
void DrawRectBg(int x, int y, int width, int height,color clr)
{
string id="_r"+IntegerToString(x)+"c"+IntegerToString(y);
ObjectCreate(0,id,OBJ_RECTANGLE_LABEL,0,0,0);
ObjectSetInteger(0, id, OBJPROP_XDISTANCE, x);
ObjectSetInteger(0, id, OBJPROP_YDISTANCE, y);
ObjectSetInteger(0, id, OBJPROP_BGCOLOR , clr);
ObjectSetInteger(0, id, OBJPROP_XSIZE , width);
ObjectSetInteger(0, id, OBJPROP_YSIZE , height);
ObjectSetInteger(0, id, OBJPROP_BACK , true);
ObjectSetInteger(0, id, OBJPROP_WIDTH , 0);
}
void DrawTextLine(int line, int column, string text, color clr, int xoff=0, int yoff=0)
{
string id="_l"+IntegerToString(line)+"c"+IntegerToString(column);
double x= column==0 ? 20 : (column*70+35);
if (line ==0 && column > 0) x=x-10;
ObjectCreate(0,id,OBJ_LABEL,0,0,0);
ObjectSetInteger(0, id, OBJPROP_XDISTANCE, ((int)x)+xoff);
ObjectSetInteger(0, id, OBJPROP_YDISTANCE, line*17+20+yoff);
ObjectSetString (0, id, OBJPROP_TEXT , text);
ObjectSetString (0, id, OBJPROP_FONT , "Courier New");
ObjectSetInteger(0, id, OBJPROP_ANCHOR , ANCHOR_LEFT_UPPER);
ObjectSetInteger(0, id, OBJPROP_FONTSIZE , 10);
ObjectSetInteger(0, id, OBJPROP_COLOR , clr);
}
void DrawText(int line, int xPos, string text, color clr, int yoff=0)
{
string id="_l"+IntegerToString(line)+"c"+IntegerToString(xPos);
ObjectCreate(0,id,OBJ_LABEL,0,0,0);
ObjectSetInteger(0, id, OBJPROP_XDISTANCE, xPos);
ObjectSetInteger(0, id, OBJPROP_YDISTANCE, line*17+20+yoff);
ObjectSetString (0, id, OBJPROP_TEXT , text);
ObjectSetString (0, id, OBJPROP_FONT , "Courier New");
ObjectSetInteger(0, id, OBJPROP_ANCHOR , ANCHOR_LEFT_UPPER);
ObjectSetInteger(0, id, OBJPROP_FONTSIZE , 10);
ObjectSetInteger(0, id, OBJPROP_COLOR , clr);
ObjectSetInteger(0, id, OBJPROP_BGCOLOR , clrBlack);
}
public:
int SignalCount()
{
int cnt =0;
if (_signal == NULL ) return 0;
if (_signal.IsBuy == false && _signal.IsSell == false) return 0;
for (int i=0; i < _strategy.GetIndicatorCount(); ++i)
{
CIndicator* ind = _strategy.GetIndicator(i);
if (ind.IsValid) cnt++;
}
if ( _allowedToTradeNews && UseNewsFilter ) cnt = cnt + 1;
if ( _allowedToTradeTimeFilter ) cnt = cnt + 1;
if (_signal.Age <= SignalInvalidAfterHours) cnt=cnt + 1;
if (_signal.PipsAway <= SignalInvalidAfterPips) cnt=cnt+1;
return cnt;
}
int GetMaxSignalCount()
{
int cnt= _strategy.GetIndicatorCount();
if (UseNewsFilter) cnt = cnt + 1;
cnt = cnt + 1; // time filter
cnt = cnt + 1; // signal age
cnt = cnt + 1; // signal pips from price
return cnt;
}
void DrawHeader()
{
double maxX = (1 + GetMaxSignalCount() ) * 60 + 140;
DrawRectBg(10, 35, (int)maxX, 20, clrGray);
DrawText(1, 20, "Time", White);
DrawText(1, 81, "Pair", White);
int x = 140;
for (int i=0; i < _strategy.GetIndicatorCount();++i)
{
CIndicator* indicator = _strategy.GetIndicator(i);
DrawText(1, x, indicator.Name, White);
x += 60;
}
if (UseNewsFilter)
{
DrawText(1, x, "News",White);
x += 60;
}
DrawText(1, x, "Time",White);
x += 60;
DrawText(1, x, "Age",White);
x += 60;
DrawText(1, x, "Pips",White);
x += 60;
DrawText(1, x, "Valid",White);
x += 60;
}
void Draw(int line)
{
if (_signal == NULL) return;
int xpos = 140;
DrawTextLine(line, 0,TimeToStr(TimeCurrent(), TIME_MINUTES), White);
DrawTextLine(line, 1, _symbol, White, -30);
color zigClr = clrGray;
if (_signal.IsBuy ) zigClr = Green;
else if (_signal.IsSell ) zigClr = Red;
for (int i=0; i < _strategy.GetIndicatorCount();++i)
{
CIndicator* indicator = _strategy.GetIndicator(i);
color clr = (indicator.IsValid ) ? zigClr : clrGray;
DrawRect(line, xpos, clr,60 ); xpos+=60;
}
if (UseNewsFilter)
{
color newsColor = _allowedToTradeNews ? zigClr : clrGray;
DrawRect(line, xpos, zigClr,60 ); xpos+=60;
}
color timeColor = _allowedToTradeTimeFilter ? zigClr : clrGray;
DrawRect(line, xpos, zigClr,60 ); xpos+=60;
color ageColor = (_signal.Age <= SignalInvalidAfterHours )? zigClr : clrGray;
DrawRect(line, xpos, ageColor,60 ); xpos+=60;
color pipsColor = (_signal.PipsAway <= SignalInvalidAfterPips )? zigClr : clrGrayПоказано первые 50% кода (символов: 9977)
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.