Spec Match Trade Copier MT5
- Утилиты
-
Quoc Dat Quach
Software engineer with 8 years in fintech and mobile, writing MQL4/MQL5 since 2017. I build Expert Advisors, indicators, trade and risk-management panels and utilities for MT4/MT5, and I trade forex and gold on MT5 myself. - Версия: 1.1
- Обновлено: 30 сентября 2026
- Активации: 10
Локальный копировщик сделок для MetaTrader 5. Он копирует позиции между терминалами MT5 на одном ПК с Windows или VPS и рассчитывает объём каждой копии по спецификациям контрактов обоих брокеров (размер контракта, стоимость тика, валюта счёта), так что копия несёт ту же экспозицию, даже если у двух брокеров лот определён по-разному. Он никогда не открывает вторую копию одной и той же позиции мастера.
Что он делает
Один и тот же EA прикрепляется к одному графику в каждом терминале:
- В терминале мастера задайте входному параметру Mode значение Master.
- В каждом терминале получателя задайте входному параметру Mode значение Receiver.
Мастер записывает свои открытые позиции, спецификации их символов и сигнал активности (heartbeat) в файл в общей папке Common\Files. Каждый получатель читает этот файл каждые 100 мс и приводит свои позиции в соответствие с мастером:
- открывает новые позиции
- изменяет стоп-лосс и тейк-профит
- частично закрывает
- закрывает
Нет ни сервера, ни сетевого подключения, ни DLL, ни WebRequest.
Объём по контракту, а не по числу лотов
Брокеры по-разному определяют «1 лот». Золото может быть 100 oz, 10 oz или 1 oz на лот. Индексы могут быть по 1, 10 или 25 единиц на пункт. Центовый счёт показывает сумму в 100 раз больше. Копировщик, который копирует число лотов, может открыть в 100 раз больше или меньше, чем нужно.
Этот копировщик измеряет, сколько стоит один лот на каждой стороне. Он использует OrderCalcProfit — собственный расчёт прибыли брокера в валюте счёта. Затем он пересчитывает стоимость у мастера в валюту счёта получателя. Стоимость тика тоже проверяется, и если два значения расходятся, панель показывает предупреждение.
Одна позиция мастера — не более одной копии
Получатель хранит на диске карту копий — по строке на каждую позицию мастера:
- Каждая копия несёт комментарий SMC:<master position id>.
- Запрос записывается в карту до его отправки, поэтому сбой или перезапуск посреди торговой операции не может привести ко второй копии.
- После перезапуска, а также после изменения входных параметров или таймфрейма графика получатель заново загружает карту. Изменение входных параметров при открытых копиях проверено вживую на хеджинговых и неттинговых получателях: ни одной лишней сделки.
- Если файл карты потерян на хеджинговом получателе, получатель восстанавливает карту по комментариям позиций.
- Неттинговый получатель не может восстановить потерянную карту, потому что одну нетто-позицию нельзя разделить обратно на позиции мастера. Вместо этого он ставит каждый символ с открытой копией в NET_HOLD (см. «Когда копировщик останавливается или удерживает копии» ниже).
Когда что-то не сходится, получатель прекращает копирование и выдаёт оповещение. Он никогда не действует наугад. Примеры:
- две позиции получателя несут один и тот же id мастера
- у скопированной позиции нет id в комментарии
- меняется счёт мастера
- меняется режим маржи счёта
- файл карты повреждён
- нетто-объём неттингового счёта изменён вручную
Панель показывает, сколько дубликатов было заблокировано.
Скопированные позиции закрываются только по команде мастера
Мастер публикует запись о закрытии для каждой закрываемой им позиции, взятую из его истории сделок. Получатель закрывает копию, только когда видит эту запись. Позиция может также исчезнуть из файла мастера без записи — например, потому что файл был повреждён или история не загрузилась. В этом случае копия ставится в HOLD, и вы получаете оповещение. Она не закрывается.
Получатель встаёт на паузу, если происходит что-либо из перечисленного, и ваши позиции остаются как есть:
- терминал мастера остановлен
- терминал мастера принудительно завершён
- терминал мастера теряет соединение
- файл мастера перестаёт обновляться (тайм-аут сигнала активности, по умолчанию 3 с)
Мониторинг
Панель состояния находится на графике получателя. Она показывает:
- состояние мастера (ALIVE / SILENT / NOT CONNECTED)
- число активных, закрытых, отклонённых, удерживаемых и отфильтрованных копий
- общую экспозицию мастера в сравнении с получателем в валюте счёта, с разницей в %
- счётчики открытий, закрытий, частичных закрытий, изменений SL/TP и заблокированных дубликатов
- последнее действие, последнюю ошибку и предупреждения
- по строке на каждую скопированную позицию, до 10 строк, затем строку «... N more»
Каждое действие также записывается в CSV-журнал в Common\Files\SpecMatchCopier.
Когда копировщик останавливается или удерживает копии
Копировщик никогда не устраняет несоответствие наугад. Вы устраняете причину, затем перезапускаете его.
| Панель показывает | Что это значит | Что делать |
|---|---|---|
| COPYING STOPPED | Получатель обнаружил то, что не может объяснить: две позиции на один id мастера, позицию с магическим номером копировщика, но без id, изменённый счёт мастера или режим маржи либо повреждённый файл карты. Причина указана на панели и в журнале. До перезапуска EA ничего не копируется. | Устраните причину, названную в сообщении, затем удалите EA с графика и прикрепите его снова. Если причина сохраняется, он снова остановится. |
| COPYING STOPPED: master account changed | В канале теперь другой счёт мастера. | Если смена намеренная: удалите EA, вручную закройте копии старого мастера, удалите map_<login>_<magic>.txt в Common\Files\SpecMatchCopier (логин и магический номер этого получателя) и прикрепите EA снова. |
| COPYING STOPPED: map file is damaged | Карта копий не прошла проверку контрольной суммы. | Хеджинг: удалите файл карты и снова прикрепите EA — карта будет восстановлена по комментариям. Неттинг: см. NET_HOLD. |
| NET_HOLD (неттинговый получатель) | Нетто-объём символа отличается от того, что открыл копировщик, например после ручной сделки или потери карты. Этот символ больше не торгуется. Удержание сохраняется в карте, поэтому перезапуск его не снимает. | Удалите EA. Вручную закройте позиции копировщика. Удалите map_<login>_<magic>.txt. Снова прикрепите EA. После этого он копирует позиции мастера, открытые позже этого момента. |
| HOLD в одной строке | Одна копия под сомнением. Например, позиция мастера исчезла без записи о закрытии. Или торговый запрос не был подтверждён, например из-за обрыва соединения, и в течение 15 секунд позиция не появилась. Если позиция появится позже, она привязывается к удерживаемой строке с оповещением, и ничего не отправляется дважды. Удерживаемая копия остаётся открытой, даже если мастер закрыл свою позицию. | Закройте или оставьте копию вручную. Копировщик больше не трогает удерживаемую копию. |
Режимы лота
| Режим | Объём у получателя | Учитывает контракт |
|---|---|---|
| Same exposure (по умолчанию) | объём мастера x (стоимость 1 лота мастера / стоимость 1 лота получателя) x множитель | да |
| Balance ratio | объём Same exposure x (баланс получателя / баланс мастера) | да |
| Equity ratio | объём Same exposure x (средства получателя / средства мастера) | да |
| Master lot x multiplier | объём мастера x множитель. При различии контрактов показывается предупреждение | нет |
| Fixed lot | фиксированный лот для каждой копии | нет |
Затем в любом режиме объём:
- округляется до шага объёма получателя (до ближайшего или вниз)
- ограничивается необязательным Max lot и максимумом брокера
- пропускается или поднимается до минимума, если он ниже минимума брокера (на ваш выбор)
- перед отправкой проверяется через OrderCalcMargin на достаточность свободной маржи
Копия отклоняется, если один лот на одной стороне стоит более чем в 1000 раз больше одного лота на другой стороне. Этот предел можно изменить. Обычно такое расхождение означает ошибочное сопоставление символов.
Пример расчёта: золото, со 100 oz на лот на 1 oz на лот
| Мастер (брокер A) | Получатель (брокер B) | |
|---|---|---|
| Символ | XAUUSD | XAUUSD.cs (сопоставлен автоматически) |
| Размер контракта | 100 oz | 1 oz |
| Счёт | USD | USD |
| Цена золота | 4 178,13 | 4 178,13 |
| Стоимость 1 лота | 100 x 4 178,13 = 417 813 USD | 1 x 4 178,13 = 4 178,13 USD |
Мастер открывает 0,10 лота, то есть 10 oz стоимостью 41 781 USD.
- Same exposure: 0,10 x 417 813 / 4 178,13 = 10,00 лота у получателя, то есть 10 oz стоимостью 41 781 USD. Копировщик, копирующий число лотов, открыл бы 0,10 лота = 0,1 oz — одну сотую экспозиции.
- Центовый получатель (валюта счёта USC, контракт 1 oz): брокер сообщает 417 813 USC за 1 лот, что после пересчёта из центов составляет 4 178,13 USD. Получатель получает те же 10,00 лота.
- Balance ratio (баланс мастера 10 000 USD, баланс получателя 1 000 USD): 10,00 x 1 000 / 10 000 = 1,00 лота.
Эти числа — модульные тесты, поставляемые вместе с отчётом о тестировании. Тот же расчёт выполнялся и вживую: XAGUSD с 5 000 oz на лот на счёте в USD был скопирован в XAGEUR с 1 000 oz на лот на счёте в EUR. 0,10 лота превратились в 0,50 лота.
Сопоставление символов
Получатель ищет символ мастера в следующем порядке:
- Ручная карта (XAUUSD=GOLD.x,US30=DJ30). Она всегда имеет приоритет и никогда не переходит к другим способам.
- То же имя.
- Подсказка Suffix / Prefix (.cs, m, #).
- То же базовое имя после удаления брокерских добавок: XAUUSD.cs, XAUUSDm, #XAUUSD, EURUSD.pro, US500Cash, fxEURUSD и подобные.
- Встроенные псевдонимы: GOLD/XAUUSD, SILVER/XAGUSD, US30/DJ30/WS30, NAS100/US100/USTEC, US500/SPX500, GER40/DE40/DAX, UK100, JP225, USOIL/WTI, UKOIL/BRENT, BTCUSD, ETHUSD.
Когда два символа получателя подходят одинаково, используется тот, что есть в «Обзоре рынка». Если в «Обзоре рынка» есть оба или ни одного, копия отклоняется, и панель просит задать ручную карту. Например, Exness предлагает US30m (1 единица индекса на лот) и US30_x10m (10 единиц на лот). Оба подходят для US30 мастера, поэтому добавьте нужный в «Обзор рынка» или задайте его в карте. Лот пересчитывается в любом случае.
Цифры после валютной пары не считаются брокерской добавкой. XAUUSD247m у Exness (золото, которое торгуется и в выходные) — другой продукт, поэтому XAUUSD мастера копируется в XAUUSDm и никогда в XAUUSD247m. Если он вам действительно нужен, задайте его в карте вручную.
Перед первой копией по символу получатель сравнивает обе цены в валюте своего счёта. Копия отклоняется, если они различаются более чем на 3% (порог можно изменить). Так отсекаются сопоставления вроде «GOLD», который у некоторых брокеров является акцией золотодобывающей компании стоимостью около 40 USD, а не золотом.
Входные параметры
| Параметр | По умолчанию | Описание |
|---|---|---|
| Mode of this terminal | Receiver | Master публикует; Receiver копирует |
| Channel | 1 | Связывает мастера с его получателями. Используйте разный текст для каждого мастера на ПК |
| Cent account (this terminal) | Auto | Auto считает центовыми валюты счёта USC/EUC. Задайте Yes/No, если ваш брокер использует другой код |
| Master scan interval, ms | 200 | Как часто мастер проверяет изменения, в дополнение к торговым событиям |
| Master heartbeat interval, ms | 500 | Как часто мастер перезаписывает свой файл, когда ничего не меняется |
| Lot mode | Same exposure | См. режимы лота выше |
| Fixed lot | 0.01 | Используется в режиме Fixed lot |
| Multiplier | 1.0 | Применяется во всех режимах, кроме Fixed lot |
| Max lot of one copied position | 0 (выкл.) | Верхний предел для одной копии |
| Volume rounding | Nearest | До ближайшего шага объёма или вниз |
| Volume below the broker minimum | Skip | Пропустить копию или использовать минимальный объём |
| Refuse if one lot is worth more than x times the other | 1000 | Защита от ошибочных сопоставлений |
| Manual symbol map | пусто | Пары MASTER=RECEIVER через запятую |
| Receiver symbol suffix hint | пусто | Например, .cs |
| Receiver symbol prefix hint | пусто | Например, # |
| Refuse a mapping if prices differ by more than, % | 3.0 | 0 отключает проверку |
| Copy only these master symbols | пусто (все) | Через запятую |
| Never copy these master symbols | пусто | Через запятую |
| Copy only these master magic numbers | пусто (все) | Через запятую |
| Never copy these master magic numbers | пусто | Через запятую |
| Reverse copy | false | Покупка становится продажей; стоп-лосс и тейк-профит меняются местами |
| Copy stop loss and take profit | true | |
| Copy positions already open at the first start | false | По умолчанию копируются только позиции, открытые после запуска получателя |
| Skip if price moved more than, % since master entry | 0.10 | Защищает от запоздалых копий после паузы. 0 отключает |
| Master heartbeat timeout, ms | 3000 | Копирование приостанавливается, если файл мастера старше этого значения |
| Hold if a master position vanishes without a close record, s | 30 | |
| Max slippage, points | 20 | Для символов с мгновенным исполнением |
| Magic number of copied positions | 7310001 | Один получатель на счёт и магический номер. Для второго получателя на том же счёте используйте другой магический номер |
| Expected master account | 0 | 0 — принимается первый обнаруженный мастер. Иначе копирование останавливается, если в канале появляется другой счёт |
| Show the status panel | true | |
| Panel X / Y offset, px | 12 / 24 | |
| Popup alerts / Push notifications | true / false | |
| CSV journal | true | Common\Files\SpecMatchCopier\journal_<account>_<magic>.csv |
Настройка
- Скопируйте EA в оба терминала. Они должны работать под одним пользователем Windows, потому что Common\Files принадлежит пользователю. Используйте одну и ту же версию EA в терминале мастера и в каждом терминале получателя: после обновления обновите его во всех.
- В терминале мастера прикрепите EA к любому графику с Mode = Master.
- В каждом терминале получателя прикрепите EA к любому графику с Mode = Receiver и тем же Channel.
- Включите «Алготрейдинг» в терминалах получателей.
- Откройте небольшую позицию на мастере. Панель получателя покажет копию и пересчёт лота.
Тестер стратегий
В тестере стратегий нет второго терминала. Поэтому в тестере EA запускает имитацию мастера:
- каждые несколько баров он открывает, изменяет, частично закрывает и закрывает виртуальные позиции; объём каждой рассчитан так, чтобы на стоп-лоссе потерять около 1% баланса и использовать под маржу не более 10% баланса
- виртуальные позиции никогда не отправляются как ордера
- он копирует эти виртуальные позиции на счёт тестера с выбранным режимом лота и всеми предторговыми проверками
Так можно увидеть логику копирования и пересчёт лота без второго терминала. Это не торговая стратегия, и её результаты в тестере ничего не говорят о прибыли.
Ограничения (прочитайте перед покупкой)
- Только один ПК: мастер и получатели должны работать на одном ПК с Windows или VPS под одним пользователем Windows. Копирование через интернет не поддерживается.
- Встроенный VPS MQL5 не может его запускать. У каждого перенесённого терминала своё хранилище.
- Только из MT5 в MT5. Отложенные ордера не копируются; отложенный ордер копируется после того, как он исполнится и станет позицией.
- Закрытый рынок: когда символ получателя вне торговой сессии, ничего не отправляется. Копировщик ждёт открытия сессии, затем копирует то, что ещё нужно. На новую позицию по-прежнему распространяется ограничение «Skip if price moved». Закрытие, которое мастер сделал, пока рынок получателя был закрыт, выполняется при открытии этого рынка по цене того момента.
- Скорость: по замерам на демо-счетах позиция получателя приходила в соответствие с мастером через время от 0,2 до 1,1 с после сделки мастера (медиана 0,3 с, 60 замеров; случай 1,1 с — закрытие 10 позиций сразу на неттинговом счёте). Это 100 мс опроса плюс время исполнения у брокера. Копии исполняются по собственным ценам получателя, поэтому цены могут отличаться от цен мастера, особенно в период новостей.
- Уровни стоп-лосса и тейк-профита:
- Когда оба символа котируются в одной валюте, копируются точные уровни.
- Иначе, например при копировании XAGUSD в XAGEUR, уровни масштабируются по соотношению цен.
- На неттинговом получателе SL/TP копируются, только если все позиции мастера по этому символу используют одни и те же уровни.
- Позиции, которые вы закрыли или уменьшили вручную на получателе, копировщик не трогает. Они никогда не открываются заново.
- Получатель офлайн более 48 часов: мастер хранит записи о закрытии 48 часов. Копия, позиция мастера которой закрылась раньше этого срока, не закрывается автоматически. Она переходит в HOLD с оповещением, и вы закрываете её вручную.
- Стоп-уровни отклонены при открытии: если брокер отклоняет стоп-лосс или тейк-профит новой копии (неправильные стопы, например уровень стопов расширен в период новостей), копия отклоняется, и повторных попыток нет. Панель показывает её как REFUSED.
- Копии, упёршиеся в предел: если копия ограничена Max lot или максимальным объёмом брокера, частичное закрытие на мастере уменьшает копию, только когда новый пересчитанный объём ниже открытого. До тех пор копия остаётся на уровне предела.
- Без управления рисками: копировщик не ограничивает просадку или дневной убыток и не управляет счетами. Он копирует то, что делает мастер.
- Одна версия везде: мастер и получатели измеряют стоимость лота одним и тем же кодом. Запускайте одну и ту же версию EA во всех терминалах. Например, мастер v1.00 с получателем v1.01 сохраняет округление до центов из v1.00 для CFD на акции и других контрактов с небольшой стоимостью лота.
- Недостаточно денег у брокера: если брокер отклоняет новую копию из-за маржи, копия отклоняется, и повторных попыток нет. Некоторые брокеры требуют больше маржи, чем показывает собственный расчёт маржи MetaTrader; так было на демо-счёте Exness, использованном в тестах.
- Где проверено:
- Проверено вживую на счетах MetaQuotes-Demo: мастер в USD, хеджинговый получатель в EUR, неттинговый получатель в USD.
- Мастер также проверен на неттинговом счёте в USD: с наращиванием, разворотом одной сделкой, частичным и полным закрытием.
- Проверено вживую между двумя брокерами, MetaQuotes-Demo и демо-счётом Exness Standard (USD, хеджинг, символы с суффиксом «m»), в обоих направлениях:
- Из MetaQuotes-Demo в Exness, сопоставление автоматическое: XAUUSD в XAUUSDm, XAGUSD в XAGUSDm, EURUSD в EURUSDm. Проверены открытие с SL/TP, изменение SL, частичное закрытие, перезапуск получателя, изменение входных параметров и закрытие.
- Из Exness на счёт MetaQuotes-Demo в EUR, сопоставление автоматическое: XAUUSDm в XAUUSD, XAGUSDm в XAGUSD, EURUSDm в EURUSD. Проверены открытие, изменение SL, частичное закрытие и закрытие. CFD на акцию BACm (100 акций на лот) скопирован в BAC (1 акция на лот): 0,10 лота стали 10.
- Разные размеры контракта внутри Exness, с ручной картой: US30m в US30_x10m (0,30 лота стали 0,03), USTECm в USTEC_x100m и US500m в US500_x100m (1,00 лота стали 0,01), а также BTCUSDm в BTCUSDTm.
- В каждом прогоне: 0 дубликатов и разница экспозиции от 0,00% до 0,01% на панели. Ошибочные сопоставления отклонялись проверкой цены. Неоднозначные сопоставления отклонялись, пока один из символов не оказывался в «Обзоре рынка».
- Золото 1 oz и центовые счета покрыты модульными тестами с синтетическими спецификациями брокеров, а не живыми счетами. Ни один из брокеров не предлагал их на демо.
- Пожалуйста, проверьте работу с вашими брокерами на демо-счетах, прежде чем копировать реальные деньги.
