Разработка сайта для Вашего бизнеса. Веб дизайн. Дизайн логотипа, фирменного стиля, рекламная фотография . Комплексный рекламный креатив.

Ralex. We do the work.
На рынке с 1999го года. Средняя ценовая категория. Ориентация на эффективность решений.
Ознакомтесь с нашим портфолио
Узнайте больше о услугах
Свяжитесь с нами:
E-mail: [email protected]
Tel: (044) 587 - 84 - 78
Custom web design & дизайн и разработка сайта "под ключ"
Креативный, эффективный дизайн. Система управления сайтом (СУС).
Custom flexible разработка систем электронной коммерции
Система e-commerce разрабатывается под индивидуальные потребности. Гибкая функциональность.
Search Engine Optimzation & оптимизация под поисковые системы (SEO)
Постоянная оптимизация и мониторинг сайта в поисковых системах. Достигаем результата быстро и эффективно
Custom logo design & дизайн логотипа и фирменного стиля
Многолетний опыт. Огромное портфолио. Уникальное предложение и цена.
профессиональная рекламная фотография
креативно, смело, качественно
Custom logo design & рекламный креатив. дизайн рекламы
Многолетний опыт. Огромное портфолио. Уникальное предложение и цена.

Синхронізація декількох графіків по одному інструменту на різних таймфреймах

  1. Вступ З часів Елдера і до наших днів трейдери приймають торгові рішення, аналізуючи графіки на різних...
  2. 2. Організація роботи з графіками
  3. 2.1. Функція відбору графіків по інструменту
  4. 2.2. Функція виклику індикатора
  5. 3. Класи для роботи з графічними об'єктами
  6. 4. Збираємо індикатор
  7. Висновок
  8. Програми, які використовуються в статті:

Вступ

Наша взаимовыгодная связь https://banwar.org/

З часів Елдера і до наших днів трейдери приймають торгові рішення, аналізуючи графіки на різних таймфреймах. Думаю, кожному знайома ситуація, коли на графіки старших таймфреймів наносяться об'єкти, які відображатимуть глобальні тренди, а потім аналізується поведінка ціни поблизу нанесених об'єктів на молодших таймфреймах. У процесі такого аналізу раніше створені об'єкти можуть коригуватися. Існуючі засоби MetaTrader 5 дозволяють провести цю роботу на одному графіку за допомогою зміни таймфрейма зі збереженням нанесених об'єктів. Але що робити, якщо потрібно стежити за ціною одночасно на декількох графіках?

Як варіант, в таких ситуаціях можна скористатися шаблонами. Але при цьому після кожної зміни хоча б одного з об'єктів потрібно пересохранять шаблон і застосовувати його повторно до кожного з графіків. У цій статті я пропоную автоматизувати цей процес і покласти функцію синхронізації графіків на індикатор.

1. Постановка завдання

Основне завдання нашого індикатора - синхронізація відкритих в MetaTrader 5 графіків. При цьому програма повинна визначити потрібні графіки по інструменту. У той же час, програма повинна постійно відстежувати стан всіх графічних об'єктів на всіх цікавлять нас графіках. Кожна зміна об'єкта на одному з графіків програма повинна повторити на інших графіках.

Відстежувати стан графічних об'єктів можна двома способами. Перший: визначити періодичність і циклічно перевіряти і синхронізувати всі нанесені об'єкти. Перевага цього підходу - в тому, що нам вистачає одного примірника програми на одному з графіків. Але є дві проблеми:

  • затримка синхронізації, викликана періодичністю поновлення;
  • складно визначити, який стан об'єкта вважати останнім.

На перший погляд, обидва питання легко вирішуються збільшенням частоти синхронізації і збереження останньої синхронізованою інформації про об'єкти в змінних програми або в файлі на диску. Але при зростанні кількості об'єктів на графіках виросте і час виконання кожного циклу, і обсяг інформації, що зберігається. При цьому треба врахувати, що, на відміну від радників і скриптів, індикатори запускаються в загальному потоці MetaTrader 5. Тому надмірне навантаження на індикатор може привести до затримок виконання інших індикаторів і терміналу в цілому.

Другий підхід: покласти відстеження зміни об'єктів на термінал і запускати синхронізацію об'єктів щодо подій терміналу, обробляючи їх у функції OnChartEvent. Такий підхід дозволяє програмі реагувати відразу ж після створення або зміни об'єкта і таким чином максимально знизити затримку. Тому нам не потрібно ні зберігати інформацію про всі синхронізованих об'єктах, ні періодично перевіряти їх стан на всіх графіках. Це серйозно знижує завантаження програми.

Здавалося б, другий варіант нам ідеально підходить. Але і тут є невелика ложка дьогтю: функцію OnChartEvent викликають тільки події того графіка, на якому запущена програма. І це б нас не зупиняло, якщо б ми визначилися з Майстер-графіком, на якому проводили б всі зміни. Тоді вистачило б одного примірника індикатора. Але ми не хочемо бути обмежені одним графіком для зміни об'єктів. Нам потрібно запускати екземпляри індикатора на кожному графіку. Цю роботу можна виконати самостійно, а можна й автоматизувати, завдяки функції ChartIndicatorAdd.

З урахуванням усього вищесказаного, для реалізації програми я вибрав другий варіант. Таким чином, роботу нашого індикатора можна розділити на два блоки.

  1. При запуску індикатора відкриті графіки фільтруються по символу. Перевіряється наявність індикатора на відкритих графіках відповідного інструменту. Всі об'єкти поточного графіка клонуються на відібрані графіки.
  2. Всі об'єкти поточного графіка клонуються на відібрані графіки

  3. Обробка подій графіка. Коли з'являється подія створення або зміни графічного об'єкта, програма зчитує з графіка інформацію про змінений об'єкті і передає ці дані на всі графіки з раніше створеного списку.

Коли з'являється подія створення або зміни графічного об'єкта, програма зчитує з графіка інформацію про змінений об'єкті і передає ці дані на всі графіки з раніше створеного списку

В процесі роботи нашої програми користувач може відкривати і закривати графіки. Тому, щоб підтримувати актуальність списку графіків, я б запропонував запускати перший процес по таймеру з певною періодичністю.


2. Організація роботи з графіками

Перший процес - клонування індикатора на графіки. Для вирішення цього завдання створимо клас CCloneIndy. У його змінних збережемо найменування інструменту, індикатора і шлях для виклику індикатора. Публічної у класу буде одна функція для відбору потрібних графіків SearchCharts, в яку буде передаватися ідентифікатор вихідного графіка, а повертати вона буде масив відібраних графіків.

class CCloneIndy {private: string s_Symbol; string s_IndyName; string s_IndyPath; public: CCloneIndy (); ~ CCloneIndy (); bool SearchCharts (long chart, long & charts []); protected: bool AddChartToArray (const long chart, long & charts []); bool AddIndicator (const long master_chart, const long slave_chart); };

При ініціалізації класу збережемо вихідні дані в змінні і поставимо коротку назву індикатора. Воно знадобиться нам, щоб отримувати параметри, необхідні при запуску копій індикатора.

CCloneIndy :: CCloneIndy () {s_Symbol = _Symbol; s_IndyName = MQLInfoString (MQL_PROGRAM_NAME); s_IndyPath = MQLInfoString (MQL_PROGRAM_PATH); int pos = StringFind (s_IndyPath, "\\ Indicators \\", 0); if (pos> = 0) {pos + = 12; s_IndyPath = StringSubstr (s_IndyPath, pos); } IndicatorSetString (INDICATOR_SHORTNAME, s_IndyName); }

2.1. Функція відбору графіків по інструменту

Розглянемо детально, як працює функція відбору потрібних графіків. Спочатку перевіримо ідентифікатор майстер-графіка, переданого в параметрах функції. Якщо він недійсний, то функція відразу повертає false. Якщо ідентифікатор не заданий, дамо параметру ідентифікатор поточного графіка. Потім перевіримо, чи відповідає ім'я збереженого інструменту символу майстер-графіка. У разі невідповідності повторно найменування інструменту для фільтрації графіків.

bool CCloneIndy :: SearchCharts (long chart, long & charts []) {switch ((int) chart) {case - 1: return false; break; case 0: chart = ChartID (); break; default: if (s_Symbol! = ChartSymbol (chart)) s_Symbol = ChartSymbol (chart); break; }

На наступному кроці організовуємо перебір всіх відкритих графіків. Якщо ідентифікатор перевіряється графіка дорівнює ідентифікатору майстер-графіка, то переходимо до наступного.

long check_chart = ChartFirst (); while (check_chart! = - 1) {if (check_chart == chart) {check_chart = ChartNext (check_chart); continue; }

Потім перевіряємо, чи відповідає символ аналізованого графіка шуканого. Якщо інструмент не задовольняє умовам пошуку, переходимо до наступного графіку.

if (ChartSymbol (check_chart)! = s_Symbol) {check_chart = ChartNext (check_chart); continue; }

Після цього перевіряємо, чи є на підприємстві, що перевіряється графіку наш індикатор. Якщо він вже прикріплений, то зберігаємо ідентифікатор графіка в масив і переходимо до наступного.

int handl = ChartIndicatorGet (check_chart, 0, s_IndyName); if (handl! = INVALID_HANDLE) {AddChartToArray (check_chart, charts); check_chart = ChartNext (check_chart); continue; }

Якщо індикатора ще немає на підприємстві, що перевіряється графіку, то запускаємо функцію його виклику, вказавши ідентифікатори майстер-графіка і перевіряється графіка. При невдалої операції переходимо до наступного графіку, а до цього графіку спробуємо прикріпити індикатор при наступному виклику функції.

if (! AddIndicator (chart, check_chart)) {check_chart = ChartNext (check_chart); continue; }

Якщо індикатор успішно прикріпився на графік, додаємо ідентифікатор цього графіка в масив. При цьому буде запущена функція клонування всіх об'єктів з майстер-графіка на перевіряється.

AddChartToArray (check_chart, charts); check_chart = ChartNext (check_chart); } Return true; }

По завершенні циклу виходимо з функції і повертаємо результат true.

2.2. Функція виклику індикатора

Окремо зупинимося на функції прив'язки індикатора до графіку. В параметрах вона отримує ідентифікатори майстер-графіка і графіка-приймача. Їх спроможність перевіряється на початку функції: ідентифікатори повинні бути дійсними і не однаковими.

bool CCloneIndy :: AddIndicator (const long master_chart, const long slave_chart) {if (master_chart <0 || slave_chart <= 0 || master_chart == slave_chart) return false;

Потім отримуємо хендл індикатора на майстер-графіку. Якщо він буде недійсним, то виходимо з функції з результатом false.

int master_handle = ChartIndicatorGet (master_chart, 0, s_IndyName); if (master_handle == INVALID_HANDLE) return false;

При дійсному хендлом ми отримаємо параметри для виклику аналогічного індикатора на новий графік. При помилку отримання параметрів виходимо з функції з результатом false.

MqlParam params []; ENUM_INDICATOR type; if (IndicatorParameters (master_handle, type, params) <0) return false;

На наступному етапі в першу осередок масиву параметрів запишемо збережений при ініціалізації шлях для виклику індикатора, а в другу - ідентифікатор графіка, який буде обслуговувати індикатор. Дізнаємося таймфрейм графіка-приймача і викликаємо індикатор. При помилку виклику індикатора виходимо з функції з результатом false.

params [0] .string_value = s_IndyPath; params [1] .integer_value = slave_chart; ENUM_TIMEFRAMES Timeframe = ChartPeriod (slave_chart); int slave_handle = IndicatorCreate (s_Symbol, Timeframe, type, ArraySize (params), params); if (slave_handle <0) return false;

На закінчення функції додамо до графіка-приймача індикатор за отриманим хендлом.

return ChartIndicatorAdd (slave_chart, 0, slave_handle); }

Можливо, у читача виникне питання про те, чому до графіка-приймача не можна відразу прикріпити індикатор по хендлом з майстер-графіка. Відповідь на це питання проста: для цього індикатор і графік повинні відповідати по інструменту і таймфрейме. А виходячи з наших завдань, таймфрейм графіків буде відрізнятися.

Більш детально з вихідним кодом класу можна ознайомитися у вкладенні.

3. Класи для роботи з графічними об'єктами

Наступний процес нашої програми - обробка подій і передача даних про графічних об'єктах на інші графіки. Перш ніж приступити до написання коду, потрібно визначитися з технологією передачі даних між графіками.

Засоби MQL5 дозволяють програмам одного графіка створювати і змінювати об'єкти на іншому через вказівку ідентифікатора графіка у функціях роботи з графічними об'єктами. Це підходить для роботи з невеликою кількістю графіків і графічних об'єктів.

Але є й інший варіант. Раніше ми вирішили використовувати події для відстеження зміни об'єктів на графіку. Ми навіть вже написали код для додавання копій індикатора на всі нас графіки. Так чому б нам не скористатися подієвої моделлю і для того, щоб передавати дані про змінюваних об'єктах між індикаторами на різних графіках? Роботу з об'єктами ми віддамо індикатору, що знаходиться на графіку. Такий підхід дозволить нам розподілити роботу з об'єктами між усіма індикаторами і створити якусь асинхронну модель.

Звучить красиво, але, як відомо, функція OnChartEvent отримує тільки 4 параметра:

  • ідентифікатор події;
  • параметр події типу long;
  • параметр події типу double;
  • параметр події типу string.

Як же вмістити всю інформацію про об'єкт в ці 4 параметра? Ми просто будемо передавати ідентифікатор події, а всю інформацію про об'єкт запишемо в параметр типу string. Для збору інформації про об'єкт в одну змінну типу string скористаємося напрацюваннями зі статті " Використання хмарних сховищ для обміну даними між терміналами ".

Створимо клас CCloneObjects, який буде збирати дані про графічних об'єктах і потім виводити їх на графік.

class CCloneObjects {private: string HLineToString (long chart, string name, int part); string VLineToString (long chart, string name, int part); string TrendToString (long chart, string name, int part); string RectangleToString (long chart, string name, int part); bool CopySettingsToObject (long chart, string name, string & settings []); public: CCloneObjects (); ~ CCloneObjects (); string CreateMessage (long chart, string name, int part); bool DrawObjects (long chart, string message); };

Робота функцій цього класу детально описана : Думаю, немає сенсу повторювати опис тут. Однак зверніть увагу на один нюанс: при генерації користувальницького події функцією EventChartCustom довжина параметра sparam обмежена 63 символами. Тому при передачі даних про об'єкт на інші графіки ми будемо розбивати повідомлення на дві частини. Для цього в функцію створення повідомлення було додано параметр для вказівки необхідної порції даних. Як приклад нижче наведено код функції для збору інформації про трендової лінії.

string CCloneObjects :: TrendToString (long chart, string name, int part) {string result = NULL; if (ObjectFind (chart, name)! = 0) return result; switch (part) {case 0: result + = IntegerToString (ENUM_SET_TYPE_DOUBLE) + "=" + IntegerToString (OBJPROP_PRICE) + "= 0 =" + DoubleToString (ObjectGetDouble (chart, name, OBJPROP_PRICE, 0), 5) + "|" ; result + = IntegerToString (ENUM_SET_TYPE_INTEGER) + "=" + IntegerToString (OBJPROP_TIME) + "= 0 =" + IntegerToString (ObjectGetInteger (chart, name, OBJPROP_TIME, 0)) + "|" ; result + = IntegerToString (ENUM_SET_TYPE_DOUBLE) + "=" + IntegerToString (OBJPROP_PRICE) + "= 1 =" + DoubleToString (ObjectGetDouble (chart, name, OBJPROP_PRICE, 1), 5) + "|" ; result + = IntegerToString (ENUM_SET_TYPE_INTEGER) + "=" + IntegerToString (OBJPROP_TIME) + "= 1 =" + IntegerToString (ObjectGetInteger (chart, name, OBJPROP_TIME, 1)) + "|" ; result + = IntegerToString (ENUM_SET_TYPE_INTEGER) + "=" + IntegerToString (OBJPROP_RAY_LEFT) + "=" + IntegerToString (ObjectGetInteger (chart, name, OBJPROP_RAY_LEFT)) + "|" ; result + = IntegerToString (ENUM_SET_TYPE_INTEGER) + "=" + IntegerToString (OBJPROP_RAY_RIGHT) + "=" + IntegerToString (ObjectGetInteger (chart, name, OBJPROP_RAY_RIGHT)) + "|" ; break; default: result + = IntegerToString (ENUM_SET_TYPE_INTEGER) + "=" + IntegerToString (OBJPROP_COLOR) + "=" + IntegerToString (ObjectGetInteger (chart, name, OBJPROP_COLOR)) + "|" ; result + = IntegerToString (ENUM_SET_TYPE_INTEGER) + "=" + IntegerToString (OBJPROP_WIDTH) + "=" + IntegerToString (ObjectGetInteger (chart, name, OBJPROP_WIDTH)) + "|" ; result + = IntegerToString (ENUM_SET_TYPE_INTEGER) + "=" + IntegerToString (OBJPROP_STYLE) + "=" + IntegerToString (ObjectGetInteger (chart, name, OBJPROP_STYLE)) + "|" ; result + = IntegerToString (ENUM_SET_TYPE_INTEGER) + "=" + IntegerToString (OBJPROP_BACK) + "=" + IntegerToString (ObjectGetInteger (chart, name, OBJPROP_BACK)) + "|" ; result + = IntegerToString (ENUM_SET_TYPE_STRING) + "=" + IntegerToString (OBJPROP_TEXT) + "=" + ObjectGetString (chart, name, OBJPROP_TEXT) + "|" ; result + = IntegerToString (ENUM_SET_TYPE_STRING) + "=" + IntegerToString (OBJPROP_TOOLTIP) + "=" + ObjectGetString (chart, name, OBJPROP_TOOLTIP); break; } Return result; }

Детально з кодом всіх функцій можна ознайомитися у вкладенні до статті.


4. Збираємо індикатор

Ми все підготували. Тепер зберемо наш індикатор для відстеження і клонування графічних об'єктів. Параметр у нашого індикатора буде тільки один - ідентифікатор графіка.

sinput long Chart = 0;

При запуску індикатора значення цього параметра завжди має залишатися нульовим. Чую запитання читача: навіщо виводити параметр, який ніколи не буде змінюватися?

Його значення буде змінюватися при виклику індикатора з програми для прикріплення до інших графіками.

Справа в тому, що функція ChartID повертає ідентифікатор того графіка, з якого був викликаний індикатор, а не того, до якого він прикріплений. Це пов'язано з особливостями обробки індикаторів в MetaTrader 5. Якщо по одному інструменту і таймфрейме кілька разів викликається один і той же індикатор, то запускається він тільки один раз - при першому виклику. Наступні звернення до нього, навіть з інших графіків, викликають вже запущений індикатор. У свою чергу, індикатор працює на своєму графіку і повертає інформацію про нього. Таким чином, при виклику примірників індикатора в класі CCloneIndy нові копії індикатора будуть працювати і повертати інформацію про графік, з якого був запущений перший його примірник. Щоб цього уникнути, ми повинні конкретно вказати кожного примірника індикатора графік, який їм буде обслуговуватися.

Розглянемо докладніше код індикатора. У блоці глобальних змінних оголосимо:

  • екземпляри раніше створених класів,
  • змінну для зберігання ідентифікатора робочого графіка
  • і масив для зберігання ідентифікаторів графіків, на які будуть клонувати об'єкти.

CCloneIndy * CloneIndy; CCloneObjects * CloneObjects; long l_Chart; long ar_Charts [];

У функції OnInit инициализируем екземпляри класів для роботи з графіками і об'єктами.

int OnInit () {CloneIndy = new CCloneIndy (); if (CheckPointer (CloneIndy) == POINTER_INVALID) return INIT_FAILED; CloneObjects = new CCloneObjects (); if (CheckPointer (CloneObjects) == POINTER_INVALID) return INIT_FAILED;

Ініціалізіруем ідентифікатор робочого графіка.

l_Chart = (Chart> 0? Chart: ChartID ());

Проведемо пошук відкритих графіків по інструменту. При цьому на знайдені графіки при необхідності будуть додані копії індикатора.

CloneIndy.SearchCharts (l_Chart, ar_Charts);

В кінці функції инициализируем таймер з інтервалом 10 секунд. Єдиною завданням таймера буде актуалізація списку графіків для клонування об'єктів.

EventSetTimer (10); return (INIT_SUCCEEDED); }

У функції OnCalculate не виконуватиметься жодних операцій. Як вже говорилося вище, наш індикатор побудований на подієвої моделі. Отже, весь функціонал нашого індикатора буде зосереджений в функції OnChartEvent. На початку функції оголосимо допоміжні локальні змінні.

void OnChartEvent (const int id, const long & lparam, const double & dparam, const string & sparam) {string message1 = NULL; string message2 = NULL; int total = 0;

Далі на операторі switch побудуємо розгалуження операцій в залежності від вхідного події.

Перший блок операцій буде збирати і передавати на інші графіки інформацію про час створення або редагування об'єкта. Він викликається по подіям створення, зміни або переміщення об'єкта на графіку. Якщо ці події надходять, індикатор створює два повідомлення з даними про стан об'єкта, а потім запускає цикл для їх відправки на всі графіки з ідентифікаторами з нашого масиву.

switch (id) {case CHARTEVENT_OBJECT_CHANGE: case CHARTEVENT_OBJECT_CREATE: case CHARTEVENT_OBJECT_DRAG: message1 = CloneObjects.CreateMessage (l_Chart, sparam, 0); message2 = CloneObjects.CreateMessage (l_Chart, sparam, 1); total = ArraySize (ar_Charts); for (int i = 0; i <total; i ++) {EventChartCustom (ar_Charts [i], (ushort) id, 0, 0, message1); EventChartCustom (ar_Charts [i], (ushort) id, 0, 0, message2); } Break;

Наступний блок запускається при видаленні об'єкта з графіка. В цьому випадку окреме повідомлення готувати не потрібно, оскільки для видалення об'єкта досить тільки його найменування, а воно у нас вже є у змінній sparam. Тому відразу запускається цикл відправки повідомлень на інші графіки.

case CHARTEVENT_OBJECT_DELETE: total = ArraySize (ar_Charts); for (int i = 0; i <total; i ++) EventChartCustom (ar_Charts [i], (ushort) id, 0, 0, sparam); break;

Наступні два блоки прізначені для ОБРОБКИ Повідомлень, отриманий з других графіків. Коли Надходить інформація про годину создания або Редагування об'єкта, ми віклікаємо функцію, что виводу об'єкт на графік. В параметрах функції передаємо ідентифікатор робочого графіка і отримане повідомлення.

case CHARTEVENT_CUSTOM + CHARTEVENT_OBJECT_CHANGE: case CHARTEVENT_CUSTOM + CHARTEVENT_OBJECT_CREATE: case CHARTEVENT_CUSTOM + CHARTEVENT_OBJECT_DRAG: CloneObjects.DrawObjects (l_Chart, sparam); ChartRedraw (l_Chart); break;

При надходженні інформації про об'єкт рухається у зворотному викликаємо функцію видалення аналогічного об'єкта на робочому графіку.

case CHARTEVENT_CUSTOM + CHARTEVENT_OBJECT_DELETE: ObjectDelete (l_Chart, sparam); ChartRedraw (l_Chart); break; }}

Детально з кодом індикатора і використовуваних класів можна ознайомитися у вкладенні.


Висновок

У статті запропонована технологія побудови індикатора, який автоматично копіює графічні об'єкти між графіками терміналу в режимі реального часу. При цьому в розробці реалізований механізм двостороннього обміну даними між графіками, відкритими в терміналі. Така технологія не обмежує користувача у кількості синхронізуються графіків. У той же час користувач може створювати, змінювати і видаляти графічні об'етов на будь-якому з сінхонізіруемих графіків. Робота індикатора продемонстрована на відео:


ПОСИЛАННЯ

  1. Використання хмарних сховищ для обміну даними між терміналами

Програми, які використовуються в статті:

#
имя
Тип
Опис 1 ChartObjectsClone.mq5 Індикатор Індикатор обміну даними між графіками 2 CloneIndy.mqh Бібліотека класу Клас для відбору графіків по інструменту
3 CloneObjects.mqh Бібліотека класу Клас для роботи з графічними об'єктами 4 ChartObjectsClone.mqproj Файл опису проекту

Але що робити, якщо потрібно стежити за ціною одночасно на декількох графіках?
Так чому б нам не скористатися подієвої моделлю і для того, щоб передавати дані про змінюваних об'єктах між індикаторами на різних графіках?
Як же вмістити всю інформацію про об'єкт в ці 4 параметра?
Чую запитання читача: навіщо виводити параметр, який ніколи не буде змінюватися?
Chart> 0?
Категории
  • Биология
  • Математика
  • Краеведению
  • Лечебная
  • Наука
  • Физике
  • Природоведение
  • Информатика
  • Новости

  • Новости
    https://banwar.org/
    Наша взаимовыгодная связь https://banwar.org/. Запустив новый сайт, "Пари Матч" обещает своим клиентам незабываемый опыт и возможность выиграть крупные суммы.


    Наши клиенты
    Клиенты

    Быстрая связь

    Тел.: (044) 587-84-78
    E-mail: [email protected]

    Имя:
    E-mail:
    Телефон:
    Вопрос\Комментарий: