На счете netting два робота и ручные ордера могут менять одну общую позицию. Ее результат не становится автоматически результатом каждого робота. Восстановите исполнения и связи между ними, затем задайте аналитическое правило распределения. В примере результаты отдельных советников EA различаются при двух правилах, а общий итог счета остается прежним. Такой расчет служит анализу, не заменяет историю брокера и не устанавливает налоговый порядок учета.
Почему magic не разделяет общую позицию?
В MT5 netting на символ существует одна позиция, объем которой меняется последующими исполнениями. Один ордер тоже может дать несколько сделок — записей фактического исполнения. Это различие описано в основных принципах платформы. Разные названия программ не создают внутри общей позиции отдельные портфели.
DEAL_MAGIC — magic-номер исполнения, а DEAL_REASON — его источник или причина. Это разные свойства. Документация сделок также содержит номер ордера, идентификатор позиции и время. Один лишь нулевой magic не доказывает ручное решение. Сохраняйте связанные записи и явное соответствие программ их идентификаторам.
Ручной выход может уменьшить позицию, которую строили и A, и B. Метка закрывающей сделки не определяет, какой прежний объем считать закрытым для аналитики. Это отдельное правило. Материал о советниках (на английском) объясняет базовый выбор позиции; здесь мы восстанавливаем общую историю, а не создаем отдельный счет для каждой программы.
Как связать сделку, ордер и позицию без догадок?
Храните номера как идентификаторы, а не числа для арифметики. Соедините DEAL_ORDER с ордером, а DEAL_POSITION_ID — с циклом позиции. POSITION_IDENTIFIER связывает историю; текущий POSITION_TICKET может измениться при служебной операции сервера. Для каждого фактического исполнения сохраняйте символ, направление, объем, цену и время.
HistorySelectByPosition выбирает историю ордеров и сделок по идентификатору позиции. Проверьте успешность получения данных и полноту выгрузки. Видимый список в одном окне терминала может не содержать всех нужных записей. Не приписывайте отсутствующий вход советнику только по комментарию выхода. Сохраните исходную запись до добавления собственных трактовок.
Учитывайте комиссии, отдельные сборы, финансирование и результат в валюте счета. Отделяйте балансовые операции от покупок и продаж. Если ордер исполнялся частями, нужны их реальные количества и цены, а не запрошенный объем. Материал по MQL5 (на английском) подробнее рассматривает события исполнения и идентификаторы. Здесь исходными данными служит согласованная история, а не инструкция отправки ордера.
Как один счет дает два результата отдельных EA?
Учебная модель: две покупки и два ручных выхода
Условный линейный EUR/USD: 100 000 EUR на лот, счет в USD, исходной позиции нет. Все приведенные цены — цены полного исполнения: покупка по условному Ask, продажа по Bid. Четыре сделки выполняются в указанном порядке. Комиссия каждой 1 USD; иных сборов и свопа нет. Не вычитайте повторно спред, уже отраженный в ценах исполнения.
Прокрутите таблицу вправо, чтобы увидеть все столбцы →
| Сделка / ордер | Источник | Исполнение | Позиция после |
|---|---|---|---|
| 7001 / 5001 | EA A | Купить 0,10 по 1,1000 | Long 0,10 |
| 7002 / 5002 | EA B | Купить 0,10 по 1,1020 | Long 0,20 |
| 7003 / 5003 | Ручной выход | Продать 0,10 по 1,1010 | Long 0,10 |
| 7004 / 5004 | Ручной выход | Продать 0,10 по 1,1030 | Позиции нет |
Средняя цена общей покупки после второй сделки равна 1,1010. В модели первое сокращение реализует 0 USD ценового результата, второе —20 USD. Четыре комиссии оставляют 20 − 4 = 16 USD нетто. Это согласование полного закрытого цикла на заданных числах, а не наблюдение реального счета или рыночные данные.
В аналитическом FIFO сначала закрывается более ранний объем. Отнесем ручной выход 7003 к A: 10 000 × (1,1010 − 1,1000) = 10 USD. Выход 7004 отнесем к B: 10 000 × (1,1030 − 1,1020) = 10 USD. Каждому EA назначим комиссию его входа и комиссию выхода его объема. Получим A 8 USD и B 8 USD.
В аналитическом LIFO сначала закрывается поздний объем. Выход 7003 дает B ценовой результат −10 USD, а 7004 дает A 30 USD. После затрат у B −12 USD, у A 28 USD; сумма снова 16 USD. FIFO и LIFO здесь — выбранные правила аналитики, а не два режима учета сервера MT5 или универсальное налоговое правило. Не меняйте их молча ради привлекательного результата робота.
Общая сумма и разное распределение
Прокрутите схему вправо, чтобы увидеть ее целиком →
Почему после первого выхода реализованный результат отличается?
После 7003 условный текущий Bid равен 1,1010. У общей позиции netting модельный реализованный результат 0 USD и плавающий результат 0 USD. FIFO показывает A реализованные 10 USD, но остаток B одновременно имеет плавающий убыток 10 USD. Вместе 10 − 10 = 0 USD. Пока позиция открыта, сравнение только реализованных частей с полем сервера некорректно.
После трех исполнений комиссии составляют 3 USD. При этой оценочной цене обе формы учета дают общий результат −3 USD. После 7004 весь цикл закрыт, плавающей части нет, а итог распределения равен 16 USD. Материал о плавающем и реализованном результате разделяет эти показатели. Совпадение суммы само по себе не выбирает подходящее правило аналитики.
Реальная история может включать частичные исполнения, развороты, исправления и отдельно проведенные расходы. При отсутствующей записи оставьте соответствующее распределение нерешенным и укажите причину. Не придумывайте цену входа или источник команды для красивой сверки. Для сравнения стратегий применяйте одно правило ко всем циклам, а изменение отмечайте как смену метода. Ограничения счета и роботов относятся к реальной общей экспозиции.
Что сделать до оценки двух роботов?
- Выберите завершенный цикл одного символа и сохраните исходную выгрузку. Свяжите сделки с ордерами и идентификатором позиции. Согласуйте исполненные объемы и все расходы. Не открывайте живую сделку только ради учебного примера.
- До расчета результатов задайте правило распределения количества и затрат. Источник команды храните отдельно от аналитического владельца объема. Неизвестные данные оставляйте неизвестными; magic закрывающей сделки не заменяет историю входов.
- Согласуйте общий итог закрытого цикла с историей счета. Для открытого цикла суммируйте реализованную и плавающую части по одной оценочной цене. Храните оба представления в торговом журнале. Разбор распределения объясняет поведение учета и не доказывает будущую прибыльность.
Частичные входы: сначала количества, затем распределение
Новый полностью условный цикл. Тот же линейный контракт 100 000 EUR на лот, USD, без начальной позиции, свопов и иных сборов. A покупает 0,06 по 1,1000 и 0,04 по 1,1010; B покупает 0,20 по 1,1020. Два ручных выхода полностью продают по 0,15: сначала 1,1015, затем 1,1005. Комиссия каждой стороны условно равна 10 USD за полный лот и распределяется пропорционально реально закрытому количеству. Это придуманная линейная тарификация, не тариф брокера.
Входы составляют 30 000 EUR, их взвешенная цена равна 1,1014666… Денежная сумма покупок 33044 USD, продаж 33030 USD: ценовой результат −14 USD. Полные комиссии входов 3 USD и выходов 3 USD дают −20 USD нетто. Расчет без округления средней цены исключает накопление ошибки; фактическая денежная точность и правила округления зависят от условий счета.
Прокрутите таблицу вправо, чтобы увидеть все столбцы →
| Аналитика | A: ценовой итог | B: ценовой итог | A после затрат | B после затрат | Вместе |
|---|---|---|---|---|---|
| FIFO | 11 USD | −25 USD | 9 USD | −29 USD | −20 USD |
| LIFO | 1 USD | −15 USD | −1 USD | −19 USD | −20 USD |
В FIFO первый выход закрывает весь A и 5000 EUR B, второй — оставшиеся 15000 EUR B. В LIFO первый выход закрывает 15000 EUR B, второй — остаток B и весь A, начиная с более позднего входа. На A приходится 2 USD полного цикла затрат, на B 4 USD. Аналитическая принадлежность не меняет источник команд и не создает двух серверных позиций.
После первого выхода при оценочном Bid 1,1015 FIFO показывает 8,50 USD реализованной части и −7,50 USD плавающей, а LIFO −7,50 и +8,50 USD. Взвешенная общая позиция показывает 0,50 и 0,50 USD. Везде сумма ценовых частей 1 USD; проведенные к этому моменту комиссии 4,50 USD оставляют −3,50 USD. Нельзя сравнивать только реализованную колонку разных способов. Если отсутствует хотя бы один частичный вход, оставьте распределение нерешенным вместо подстановки средней цены, которой нет в исходных данных.