kopirmt4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «kopirmt4 full.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Kopir MT4 — торговый советник для MetaTrader 4, работающий в режиме клиент/сервер для копирования сделок с мастер-счёта на клиентский счёт. Советник считывает данные ордеров из файлов обмена между терминалами, фильтрует их по заданным критериям и открывает соответствующие позиции на клиенте с настраиваемыми параметрами лота и управления рисками. Продукт поддерживает режимы полного копирования, копирования только покупок или продаж, а также режим инверсии направлений. Реализована фильтрация сделок по магическим номерам, инструментам, комментариям и диапазону лотов, встроен тайм-менеджер для ограничения копирования по времени суток и дням недели.
Настройки программы
| Настройка | Описание |
|---|---|
| Time manager use (time_manager_use) | Использование тайм-менеджера — Включает или отключает фильтрацию сделок по времени торговли |
| Monday (Monday_time_on) | Время торговли в понедельник — Диапазон времени, в который разрешено копирование сделок в понедельник |
| Tuesday (Tuesday_time_on) | Время торговли во вторник — Диапазон времени, в который разрешено копирование сделок во вторник |
| Wednesday (Wednesday_time_on) | Время торговли в среду — Диапазон времени, в который разрешено копирование сделок в среду |
| Thursday (Thursday_time_on) | Время торговли в четверг — Диапазон времени, в который разрешено копирование сделок в четверг |
| Friday (Friday_time_on) | Время торговли в пятницу — Диапазон времени, в который разрешено копирование сделок в пятницу |
| Saturday (Saturday_time_on) | Время торговли в субботу — Диапазон времени, в который разрешено копирование сделок в субботу |
| Sunday (Sunday_time_on) | Время торговли в воскресенье — Диапазон времени, в который разрешено копирование сделок в воскресенье |
| Filter magic list, delimiter (,) (filter_magic_list) | Список магических номеров для фильтра — Разрешённые магические номера ордеров для копирования, разделитель запятая |
| Filter symbols list, delimiter (,) (filter_symbols_list) | Список инструментов для фильтра — Разрешённые инструменты для копирования, разделитель запятая |
| Filter comment list, delimiter (,) (filter_comments_list) | Список комментариев для фильтра — Разрешённые комментарии ордеров для копирования, разделитель запятая |
| Filter minimum lot (filter_lots_minumum) | Минимальный лот для фильтра — Минимальный допустимый объём сделки для копирования |
| Filter maximum lot (filter_lots_maximum) | Максимальный лот для фильтра — Максимальный допустимый объём сделки для копирования |
| Cross Table List, delimiter (,) (cross_table) | Таблица соответствия инструментов — Список пар ServerSymbol=ClientSymbol через запятую для маппинга инструментов |
| Copy mode (copytype) | Режим копирования — Выбор направления копирования: все, только покупки, только продажи или отключение новых |
| Copy limit orders (copylimit) | Копирование лимитных ордеров — Включает или отключает копирование лимитных ордеров |
| Copy stop orders (copystop) | Копирование стоп-ордеров — Включает или отключает копирование стоп-ордеров |
| Use balance (auto_lot_balance_or_equity) | Использовать баланс для расчёта лота — Учитывает баланс счёта при автоматическом расчёте размера лота |
| Use currency (use_currency_koef) | Использовать валютный коэффициент — Учитывает валюту депозита при конвертации и расчёте лота |
| Use leverage (use_levelerage_koef) | Использовать коэффициент плеча — Учитывает соотношение плечей сервера и клиента при расчёте лота |
| Use lot multiplicator (lot_koef) | Множитель лота — Множитель для автоматического расчёта размера лота |
| Use fix lot (order_lots) | Фиксированный лот — Фиксированный размер лота для открытия позиций |
| Minimal lot for open (client) (MinLot) | Минимальный лот — Минимально допустимый размер лота при открытии позиции |
| Maximal lot for open (client) (MaxLot) | Максимальный лот — Максимально допустимый размер лота при открытии позиции |
| Stop by equity (stopout_balance) | Остановка по балансу — Значение баланса, при достижении которого копирование останавливается |
| Stop by margin level % (stopout_margin_procent) | Остановка по уровню маржи % — Процентный уровень маржи, при достижении которого копирование останавливается |
| Stop by drawdown % (stopout_dd) | Остановка по просадке % — Процентная просадка, при достижении которой копирование останавливается |
| Close all orders (stopout_close) | Закрытие всех ордеров при стопе — Принудительно закрывает все открытые позиции при срабатывании условия остановки |
| Alert mail use (alert_mail_use) | Использовать email-уведомления — Включает отправку уведомлений на email при событиях копирования |
| Alert push use (alert_push_use) | Использовать push-уведомления — Включает отправку push-уведомлений при событиях копирования |
| Timeout (min) (timeout) | Таймаут для рыночных ордеров — Максимальное время в минутах после открытия ордера на сервере для его копирования |
| Timeout (min) for pending orders (timeout_pending) | Таймаут для отложенных ордеров — Максимальное время в минутах для копирования отложенных ордеров |
| Pause for open next order (sec) (pause_for_open) | Пауза перед открытием следующего ордера — Задержка в секундах между последовательными открытыми сделками |
| Slippage is spread (slippage_is_count_spread) | Слиппаж считается в спредах — Режим расчёта допустимого слиппажа в количестве спредов |
| Filter slippage (slippage) | Допустимый слиппаж — Максимальный допустимый проскальзывание в пунктах при открытии |
| Reopen position (reopen_position) | Переоткрытие позиций — Включает автоматическое переоткрытие позиций после их закрытия |
| Reopen maximum (reopen_maxorders) | Максимальное количество переоткрытий — Ограничение на количество переоткрытий одной позиции |
| Scalper mode (scalper) | Режим скальпера — Вход только по цене точнее или лучше цены открытия на сервере |
| Reverse mode (reverse) | Режим инверсии — Инвертирует направление ордеров при копировании |
| Points (otstup) | Отступ для входа — Смещение цены входа в пунктах от цены открытия на сервере |
| No close orders on client (noCloseOrders) | Запрет закрытия ордеров на клиенте — Запрещает закрытие копируемых ордеров вручную на клиенте |
| Count server order for copy start (count_orders_start) | Номер ордера для начала копирования — Копирование начинается с указанного порядкового номера ордера на сервере |
| Auto comment (auto_comment) | Автокомментарий — Автоматически формирует комментарий к копируемым ордерам |
| User comment (user_comment) | Пользовательский комментарий — Текст комментария, добавляемый к копируемым ордерам |
| Copy stoploss use (copy_stoploss_use) | Копирование стоп-лосса — Включает копирование уровня стоп-лосса с сервера |
| Copy takeprofit use (copy_takeprofit_use) | Копирование тейк-профита — Включает копирование уровня тейк-профита с сервера |
| User can modify orders (user_change_sl_and_tp) | Пользователь может изменять ордера — Разрешает ручное изменение стоп-лосса и тейк-профита на клиенте |
| Stoploss Shift (+/-Points) (stoploss_offset) | Смещение стоп-лосса — Сдвиг уровня стоп-лосса в пунктах при копировании |
| Takeprofit Shift (+/-Points) (takeprofit_offset) | Смещение тейк-профита — Сдвиг уровня тейк-профита в пунктах при копировании |
| User takeprofit use (user_takeprofit_use) | Пользовательский тейк-профит — Включает установку собственного тейк-профита в пунктах от цены открытия |
| User take at points (user_takeprofit) | Значение пользовательского тейк-профита — Размер тейк-профита в пунктах для ручной установки |
| User stoploss use (user_stoploss_use) | Пользовательский стоп-лосс — Включает установку собственного стоп-лосса в пунктах от цены открытия |
| User stop at points (user_stoploss) | Значение пользовательского стоп-лосса — Размер стоп-лосса в пунктах для ручной установки |
| Equity Tral Start (%) (equity_trail_start) | Начало трейлинга по эквити % — Процент прибыли, при достижении которого активируется трейлинг по эквити |
| Equity Tral Step (%) (equity_trail_step) | Шаг трейлинга по эквити % — Шаг изменения трейлинга по эквити в процентах |
| Trailing Stop Points (trailing_stop) | Трейлинг-стоп в пунктах — Расстояние трейлинг-стопа в пунктах от текущей цены |
| Trailing Step Points (trailing_step) | Шаг трейлинг-стопа в пунктах — Шаг смещения трейлинг-стопа в пунктах |
| BU Start Points (bu) | Безубыточность старт в пунктах — Расстояние в пунктах, при достижении которого активируется безубыточность |
| BU Minimum Profit Points (bu_profit) | Минимальная прибыль безубыточности в пунктах — Минимальная прибыль в пунктах для активации безубыточности |
Поиск по коду файла
#property description "telegram support Ru: "
#property version "5.49"
#define VERSION "5.49"
#define LICENSE_OFF
const int PRODUCT_ID=159;//Kopir MT4
#property strict
#property icon "\\Images\\kopirmt4.ico";
/*
5.49
-обновление защиты
5.48
- накопительное обновление
5.44
- исправление автообновлений
5.42
- автообновление
5.41
- версия для партнерской сети
5.38
- исправление работы фильтра по комментариям
5.36
- накопительное исправление ошибок связанные с копированием сделок.
- добавлены новые опции для переоткрытия сделок:
Reopen maximum - максимальное количество переоткрытий (без учета первой позиции).
- исправлен механизм переоткрытия, теперь для переоткрытия автоматически работает режим scalper mode для входа только по заданной цене или лучше. При переоткрытии после первого ордера игнорируется timeout.
- добавлена новая опция для ограничения копирования отложенных ордеров:
timeout (min) for pending orders - тайм аут для копирования отложенных ордеров, 0 - без ограничений
если включено переоткрытие, то данная опция работает для первого ордера, а потом она игнорируется.
5.34
- исправление копирования BUYSTOP,SELLSTOP
5.33
- исправление ошибки торговли на счетах GLD
5.32
- добавлена поддержка счетов с большим количеством цифр, исправление переноса стоплосс
5.31
- обновлен под новую версию терминала
- добавлен режим остановки копирования новых сделок Copy mode = Copy new off отключает копирование новых ордеров. Старые продолжает контролировать
5.30
- возвращены функции ограничения минимального и максимального объема. MinLot, MaxLot
5.29
- исправлен сбой копирования при наличии отложенных ордеров
5.28
- исправлено обновление данных
- исправлена работа механизма входа с указанного количества ордеров на сервере, для возможности копирования сделок с усреднениями
- удалена функция Duplication
- удалена функция остановки копирования по количеству сделок на сервере
- удалена функция остановки копирования по количеству на клиенте
5.27
- добавлена поддержка копирования индексов например Volatility 75 Index и подобные названия
- добавлена поддержка копирования и частичного закрытия ордеров с объемов до 3 знаков после запятой
- доработано переоткрытие ордеров, если тейк профит стоит уже неправильно, что может инициировать закрытие сделки сразу, такие сделки копироваться не будут.
5.25
- исправление определения окончания торговой сессии в терминале
5.24
- добавлена функция задержки открытия сделок относительно предыдущих. Требуется для некоторых брокеров. По умолчанию функция отключена.
5.23
- исправлено копирование отложенных ордеров для инструментов из кросс таблицы
5.22
- исправлено копирование XAUUSD
5.21
- исправлена отмена ТР\СЛ
5.20
- исправлено перемещение отложенных и лимитных заявок
- исправлен приоритет для кросс таблицы, чтобы можно было применять правила EURUSD=GBPUSD и т.п.
5.10
- исправление расчетов при активированной опции 'Use currency' , которое приводило к неверному расчету лота.
5.00
- обновлены механизмы обмена с терминалами МТ4, теперь поддерживается копирование между платформами МТ4 и МТ5 (МТ5 hedge only)
- доработка механизма частичного закрытия
- поправлено отображение статуса работы сервера
- изменена формула расчета множителя лота, теперь можно самому включать нужные опции для учета в расчетах лота
- при расчете лота убрано ограничение на повышение лота если плечо позволяет это сделать
- Close price use функция удалена
- сформированы настрйоки по аналогии МТ5
4.76
- переработан механизм открытия ордеров при заданном параметре Points
- исправлена логика отслеживания просадки на счете для остановки копирования
4.75
- исправление работы с сигналами
4.73
- исправление ошибки копирования инструментов, содержащих в названии восклицательный знак !
4.72
- исправление возможной ошибки при переоткрытии
- добавлено игнорирование Timeout, если включено переоткрытие Reopen position
- при первом открытии берет тр и сл исходные если включен режим User can modify orders
- исправление выставления своих тр и сл.
- исправление обновления данных при закрытии на стороне клиента
- добавлен классический трейлинг стоп (trailing stop) и безубыток (bu)
4.71
- обновлена работа с историей сделок, что позволило существенно снизить нагрузку на процессор
4.68
- исправлена работа с торговыми сессиями, которое приводило к остановке копирования
4.67
- исправлена отключение торговли на сервере с инвесторским паролем
- возвращена настройка частоты опроса по таймеру, по умолчанию 100 мс
4.66
- обновление механизма загрузки данных для снижения нагрузки при отсутствии сделок
4.65
- косметические исправления сообщений
4.64
- отладочный режим: отображение сделок сервера в журнале,которые обновились.
- отображение в журнале максимум информации о попытке открыть сделку.
- исправлена ошибка проверки торговой сессии из-за чего копировщик не копировал сделки
4.63
- исправление сброса тикета ордера при нехватки маржи на открытие, которое приводило к дублированию сделки.
- обновлены отладочные сообщения
4.62
- накопительное обновление, мелкие исправления в работе. Если у вас сделки ранее открывал брокер и вдруг престал копировать, то обновить обязательно.
4.61
- исправлена проблема с округлением лота
4.60
- исправлены комментарии
4.59
- запрет копирования открытых ордеров с комментарием from #
4.58
- отключено дополнительное получение котировок, которое может вызывать задержки при открытии и закрытии.
4.57
- испралена ошибка с повторным открытием сделки
4.56
- исправлено лишнее дублирование сделок в режиме Duplication
4.55
- убраны из настроек не актуальные параметры
- удалены метки на графике о текущем режиме так как они дулируют сообщение в правом верхнем углу
- добавлен параметр Cross Table , формат ServerSymbol1=ClientSymbol1 можно указать несколько через запятую. Это дополнение к внешнему файлу кросс таблиц kopirmt4_cross.ini
- переименован параметр Dublicator в Duplication
- исправлен механизм таймера, введен резервный механизм на случай сбоя.
- параметр timeout задан по умолчанию 5 минут
- обновлен механизм работы с ордерами, чтобы ускорить с ними работу.
- бесплатная версия будет работать только по AUDUSD так как данная версия предназначена в первую очередь для знакомства с функционалом.
- добавлен трал по % профиту как суммарно по всем копируемым сделкам так и раздельно по каждому из копируемых счетов.
- исправлено закрытие всех сделок по просадке в валюте и %
- несколько мелких улучшений и исправление замеченных ошибок.
4.51
- поправлена работа частичного закрытия, которое иногда приводило к закрытию всей сделки без причин
4.50
- добавлены опции увеличения\уменьшения ТР и СЛ
- добавлены опции разрешающие копировать ТР и СЛ раздельно
4.49
- мелкие исправления копирования отложенных ордеров
4.48
- исправлена ошибка отмены отложенного и лимитного ордера при фильтрации по комментарию
4.47
- добавлен режим дубликатора
4.46
- отключена проверка наличия маржи для открытия лимитных и отложенных ордеров до их выставления на клиенте
4.45
- исправлено копирование отложенных ордеров
- добавлена опция для отключения учета соотношения плечей "Use leverage accounts"
4.44
- исправлено округление лота
4.43
- исправлена работа множителя лота по валюте при включенном Auto lot
- остановка копирования по текущей просадке формула ((Эквити/Баланс)-1)*100, если просадка ниже или равна заданной то копирование отключается, возможна отправка уведомления и закрытие позиций принудительно.
4.42
- оптимизация
4.41
- добавлена проверка , можно ли торговать по инструменту прежде чем что либо делать.
4.40
- убраны возможности управления копировщиком из других советников (не актуальная функция)
- убрана возможность управления сторонним советником AutoTrade Manager (не актуальная функция)
- поправлено отображение режима работы с учетом текущего состояния советника
- доработан механизм остановки копирования при понижении уровня эквити или маржи, при востановлении уровня, копирование возобновляется.
- добавлен новый режим остановки копирования при понижении уровня маржи (%)
- добавлена отправка уведомлений при понижении уровня маржи\эквити на почту или с помощью Push уведомлений, не чаще 1 раз в 10 минут
- переработан режим конвертации валют счетов при копировании, по умолчанию конвертация отключена.
- доработан auto comment, добавлен в комментарий номер тикета сервера
- переименован параметр "use currency auto koef" на "use currency accounts"
- добавлены новые параметры "alert mail use", "alert push use", "stopout margin level %"
- добавлено отображение количества позиций открытых на серверах
- в бесплатной версии доступно копирование только на EURUSD, остальные валюты доступны только в платных версиях.
- изменено название параметра Otstup на Points
4.33
- корректировка конвертации RUB->USD
- отключена автоматическая конвертация по умолчанию
4.32
- слово реверс убирается из комментария
- поправлена конвертация с учетом валюты счета. На данный момент поддерживаются основные типы счетов USD,EUR,RUB
- поправлена возможность копировать XAUUSD
4.31
- исправлена работа с таблицей инструментов
- доработан анализ сделок закрытых частично
4.30
- оптимизация кода
4.21
- поправлено определение минимального лота у фьючерсов и акций
4.20
- доработана работа с префиксами
- переработан режим скальпера и режим отступов, изменена логика ограничения точки входа
- доступны настройки для задания частоты опроса сервера
- доступен режим активации опроса по таймеру или по поступлению тиков для снижения нагрузки
4.14
- поправлено отключение по достижению количества ордеров на сервере и клиенте
- добавлена функция count_client_orders_stop и count_client_all_orders_use для контроля количества на клиенте, при достижении указанного количества открытых ордеров копирование новых отключается.
4.13
- добавлена функция для отключения изменения SL и TP при изменении на сервере
4.12
- поправлен комментарий к ордерам
- улучшены фильтры по комментариям и меджикам:
filter magic list
поддерживает возможность указать все меджики начинающиеся с указанных цифр с помощью символа * (например: *1234)
в таком режиме все ордера имеющие меджик номер начинающийся с 1234 будут скопированы
filter comment list
поддерживает возможность строгого соответствия комментария с помощью символа ! (например: !EA_Ilan)
в таком режиме будут скопированы ордера, в которых комментарий полностью совпадает с указанным в настройке
4.11
- доработан перезапуск таймера
- добавлены Суббота и Воскресенье в тайм менеджер.
- поправлены пользовательские комментарии
4.10
- доработана поддержка бинарных опционов (поддержка только типа UP / DOWN)
- доработан режим входа по количеству спредов, теперь если спред нулевой, то копировщик автоматически переключается в режим точности входа в пунктах.
- изменено значение параметра filter slippage = 5.0 для совместимости с предыдущими версиями
- в Lite версии добавлена возможность указать комментарий
- в Free версию возвращена возможность указать множитель лота lot multiplicator
4.00
- доработано закрытие при активном режиме close price use
- изменена логика отслеживания ордеров для последующих новых функций (ВАЖНО: перед обновлением необходимо дождаться закрытия всех позиций, иначе копировщик их потеряет!)
- добавлена возможность включения и остановка копирования по количеству открытых инструментов (не доступно для Lite и Free версий)
- поправлена ошибка с минимальным лотом при копировании CFD и Forex инструментов
- изменена логика таблиц соответствия инструментов, приоритет имеет таблица, в таблице нужно указывать точное соответствие инструментов (полные названия как в терминале)
- добавлена опция no_move_stoploss_and_takeprofit отключающее смещение для стопов и тейков, если вошли с отклонением. опция включена по умолчанию.
- параметр use_currency_koef установлен по умолчанию true
- добавлена новая опция slippage_is_count_spread, при активации true включается режим точности по количеству спредов и точность входа зависит от спреда. Данная опция включена по умолчанию.
- переименованы параметры:
list accounts for copy, delimiter (,) - > server accounts
default lot - > fix lot
filter slippage open price - > filter slippage
3.43
- корректировка чтения данных клиентом (проблема наблюдалась на системах с SSD дисками и гибридными дисками HSSD)
- копирование по умолчанию тейкпрофит и стоплосс включено
3.42
- исправлена ошибка с выставлением отложенных и лимитных ордеров при определенных настройках
- изменена формула расчета лота при режиме авто лот используется описание
- добавлена поддержка счетов в разной валюте, для корректной работы, необходимо, чтобы терминал получал котировки EURUSD и USDRUB. Поддерживаются счета в валютах EUR, USD, RUB
расчет коэфициента можно отключить параметром use currency auto koef = false, по умолчанию данный режим отключен! Функция эксперементальная.
3.41
- возвращен параметр update timeout (sec) для возможности принудительного обновления
- правка ошибок
3.40
- улучшена синхронизация времени между сервером и клиентом
- добавлена возможность указать timeout дробным числом, если нужно указать время жизни сделки менее 1 минуты
- добавлено автоотключение модификации стоплосс\тейкпрофит на стороне клиента, если пользовательский стоп или тейк включен и задан нулем
- переработан алгоритм отслеживания ордеров сервера, опция update timeout (sec) больше не требуется и удалена. Убран параметр Delay, он больше не требуется.
- добавлена поддержка внешнего управления копированием инструмента из советников и индикаторов (подробности будут в инструкции)
- заложена поддержка разной валюты счетов, реализация автокоррекции лота будет в следующих обновлениях
- убрано удаление отложки, если она сработала раньше чем у клиента, что приводило к пропуску входа отложенными ордерами
- значение параметра timeout вернули в 0 по умолчанию, параметр выбора режима работы переименован в mode (по умолчанию данный параметр Server)
Внимание: данное обновление не совместимо с предыдущими версиями, перед обновлением необходимо закрыть открытые позиции на клиентах или дождаться их закрытия!!!
3.33
- поправлено копирование комментариев
- поправлено частичное закрытие в Lite версии
3.32
- доработка логики отслеживания ордеров
- добавлена возможность принудительного обновления данных сервера, параметр update timeout (sec), значение задается в секундах (настройка только для сервера)
- доработка автоопределения инструментов с префиксами и CFD
- тейк и стоп копируются у отложенных ордеров как и у рыночных, по умолчанию копировщик не копирует их.
Включается копирование установкой параметров user takeprofit use=false, user stoploss use=false
- опция автокомментария, пишет номера счета с которого идет копирование
3.31
- исправлена ошибка переоткрытия ордера при timeout=0
3.30
- доработано копирования сделок открытых частями на ECN счетах
- параметр timeout по умолчанию равен 5, вместо 0. Параметр теперь влияет и на отложенные ордера!
- доработано открытие лимитных и стоповых ордеров, особенно при работе со скальперами и новостными советниками
- по умолчанию отключено копирование стопов и тейков для ускорения работы при копировании большого количества ордеров.
Отложенным ордерам сразу тейк и стоп не выставляется, он ставится сразу после их открытия (если активированы соответсвующие опции).
По умолчанию тейк и стоп виртуальные.
- переработано изменение стоп лосс и тейк профит для улучшения работы с роботами-скальперами
3.29
- введен параметр настройки глубины выгрузки истории для клиентов, это нужно для снижения нагрузки при внутридневной торговли
history count (days) = 1..N, параметр принимает в качестве значения кол-во предыдущих дней.
- добавлены настройки Time manager, позволяет задать время работы когда разрешено копировать сделки, время задается для каждого дня недели
формат времени позволяет указывать диапозоны торговли, например
0-10,13-17 или
22:10-08:00, 15:00-18:59
- добавлена поддержка работы совместно с AutoTradeManager
3.28
- исправлена работа с otstup
- исправлена загрузка данных при изменении настроек при открытых сделках
- добавлена новая опция: close price use = false/true , если опция включена (true), тогда сделка закрывается при обязательном условии, что цена не хуже, чем цена закрытия на источнике, при этом учитывается otstup
3.27
- исправлена совместная работа сервера и клиента на одном аккаунте (исправлены задвоения открытия позиций)
- исправлена модификация тейкпрофит, стоплосс и цены открытия
- исправлена опция по умолчанию, pause for set takeprofit (min) = 0
- изменена логика режима scalper mode, теперь положительная величина otstup это сколько пунктов минимум должна пройти цена на сервере от цены открытия, прежде чем сделку будет разрешено открыть.
Если величина otstup отрицательная, то значит цена на сервере должна пройти в минус на данную величину от цены открытия, прежде чем будет разрешено ее открыть.
- введен интелектуальный режим расчета стоплосса и и тейкпрофита, учитывается расхождение между ценами позиций сервера и клиента
- доработан спящий режим для снижения нагрузки на процессор
- доработан режим загрузки счетов с разных серверов
3.26
- включение направления торговли (бай \ селл \ все)
- добавления возможнсоти ставить свой тейк или стоп раздельно
- переоткрытие сделок если закрыли сделку самостоятельно на клиенте
3.25
- версия для маркета, без встроенной защиты
3.22
11.11.2014
- добавил возможность указать свою кросс таблицу инстурментов, полезно для копирования инструментов с разными названиями
- сохранение ключа для последующего его использолвания на случай отсутсвия связи с сервером
- стоп блокировка копирования при достижении заданного убытка в валюте депозита
--------------------------------------------------------------------------------------
21.10.2014
- обновлена работа с частичным закрытием ордеров
- добавлена фильтрация с помощью исключения, например -EURUSD, то копировать все, кроме EURUSD
07.09.2014
глобальное обновление
-убраны все длл
-задействованы новые функции терминала
-снижена нагрузка на ПК за счет изменения способа работы копировщика
-добавлена возможность указать в настройках с каких счетов копировать сделки, за счет этого сильно упростилась настройка. Портов как таковых больше нет и нет с ними проблемы!
-данная версия будет переходной при создании гибридного копировщика мт4<->м5
версия будет содержать в себе клиент и сервер, по умолчанию будет запущен клиент
*/
#include <sovetnikovGUI\mql4.mqh>
#include <sovetnikovGUI\Orders.mqh>
#include <sovetnikovGUI\Time.mqh>
#include <sovetnikovGUI\News.mqh>
#include <EA_Protect\Protect.mqh>
#define CopirName "KopirMT"
string autor="Copyright (c) 2014, Gavrilin Alexander V. ";
static ulong tm_last_open_file[];
enum _set_copytype
{
all, //Long & Short
buy, //Long Only
sell, //Short Only
copyoff//Copy new off
};
enum _set_type
{
client=1,//Client (Slave)
server=0 //Server (Master)
};
int Delay=100; //Delay
BLOCK(1,"General Settings");//.
SHOW_LICENSE_PARAMS; //LicenseKey
input _set_type ClientORServer=server; //Mode
int update_timeout_sec=0; //Update timeout (sec), default=0
int history_days=1; //History count (days)
S servers_list=""; //List of server accounts
SEP(4);//.
BLOCK(4,"Time manager"); //.
B time_manager_use=false; //Time manager use
S Monday_time_on="00:00-24:00"; //Monday
S Tuesday_time_on="00:00-24:00"; //Tuesday
S Wednesday_time_on="00:00-24:00"; //Wednesday
S Thursday_time_on="00:00-24:00"; //Thursday
S Friday_time_on="00:00-24:00"; //Friday
S Saturday_time_on="00:00-24:00"; //Saturday
S Sunday_time_on="00:00-24:00"; //Sunday
SEP(5);//.
BLOCK(5,"Filters deals");//.
S filter_magic_list=""; //Filter magic list, delimiter (,)
S filter_symbols_list=""; //Filter symbols list, delimiter (,)
S filter_comments_list=""; //Filter comment list, delimiter (,)
D filter_lots_minumum=0; //Filter minimum lot
D filter_lots_maximum=0; //Filter maximum lot
S cross_table=""; //Cross Table List, delimiter (,)
input _set_copytype copytype=all; //Copy mode
B copylimit=false; //Copy limit orders
B copystop=false; //Copy stop orders
SEP(6);//.
BLOCK(6,"MM Settings");//.
B auto_lot_balance_or_equity=false; //Use balance
B use_currency_koef=false; //Use currency
B use_levelerage_koef=false; //Use leverage
D lot_koef=1; //Use lot multiplicator
D order_lots=0; //Use fix lot
bool open_minimal_lot=true; //Open minimal lot if lot is 0
D MinLot=0; //Minimal lot for open (client)
D MaxLot=0; //Maximal lot for open (client)
D stopout_balance=0; //Stop by equity
D stopout_margin_procent=0; //Stop by margin level %
D stopout_dd=0; //Stop by drawdown %
B stopout_close=false; //Close all orders
B alert_mail_use=false; //Alert mail use
B alert_push_use=false; //Alert push use
SEP(7);//.
BLOCK(7,"Copying Trades Settings");//.
D timeout=0; //Timeout (min)
D timeout_pending=0; //Timeout (min) for pending orders
I pause_for_open=0; //Pause for open next order (sec)
B slippage_is_count_spread=true; //Slippage is spread
D slippage=10.0; //Filter slippage
B reopen_position=false; //Reopen position
I reopen_maxorders=10; //Reopen maximum
B scalper=false; //Scalper mode
B reverse=false; //Reverse mode
D otstup=0; //Points
int lot_digits=0; //lot digits (0 - auto)
B noCloseOrders=false;//No close orders on client
I count_orders_start=0; //Count server order for copy start
B auto_comment=true; //Auto comment
S user_comment=""; //User comment
B copy_stoploss_use=true; //Copy stoploss use
B copy_takeprofit_use=true;//Copy takeprofit use
B user_change_sl_and_tp=false; //User can modify orders
D stoploss_offset=0; //Stoploss Shift (+/-Points)
D takeprofit_offset=0; //Takeprofit Shift (+/-Points)
int setTP_pause=0; //Pause for set takeprofit (min)
B user_takeprofit_use=false; //User takeprofit use
D user_takeprofit=0; //User take at points
B user_stoploss_use=false; //User stoploss use
D user_stoploss=0; //User stop at points
bool no_move_stoploss_and_takeprofit=true; //No move stoploss and takeprofit
SEP(8);//.
BLOCK(8,"Trailing Settings");//.
D equity_trail_start=0; //Equity Tral Start (%)
D equity_trail_step=1; //Equity Tral Step (%)
B trailing_all_servers=true; //Trailing All Servers Use
D trailing_stop=0; //Trailing Stop Points
D trailing_step=1; //Trailing Step Points
D bu=0; //BU Start Points
D bu_profit=0; //BU Minimum Profit Points
int port=0;
class _ORDERS
{
public:
double lot; //8 лот
double full_lot; //8 полный лот
double open; //8 открытие ордера
double close; //8
double stop; //8
double take; //8
datetime tmOpen;//8
datetime tmClose;//8
double balance;//8
double equity;//8
double leverage; //8 плечо
long ticket; //4 tiket=magic clienta
int type; //4 тип
long magic; //4 magic
long original_ticket; //4 оригинальный тикет ордера
long account; //4 оригинальный тикет ордера
string name; //имя инструмента
string comment;
string currency; //тип валюты счета
int binary; //тип бинарного опциона
bool update; //обновление данных
bool bCross; //флаг что была активна кросс таблица, флаг ставиться при загрузке данных
bool bcopy; //копировать или нет
void operator=(const int nil=NULL) //нулевая инициализация переменных
{
lot=0; //8 лот
full_lot=0; //8 полный лот
open=0; //8 открытие ордера
close=0; //8
stop=0; //8
take=0; //8
tmOpen=0;//8
tmClose=0;//8
balance=0;//8
equity=0;//8
leverage=0; //8 плечо
ticket=0; //4 tiket=magic clienta
type=0; //4 тип
magic=0; //4 magic
original_ticket=0; //4 оригинальный тикет ордера
account=0; //4 оригинальный тикет ордера
name=""; //имя инструмента
comment="";
currency=""; //тип валюты счета
binary=0; //тип бинарного опциона
bcopy=0;
}
void operator=(const _ORDERS &a1)//простое копирование
{
lot=a1.lot; //8 лот
full_lot=a1.full_lot; //8 полный лот
open=a1.open; //8 открытие ордера
close=a1.close; //8
stop=a1.stop; //8
take=a1.take; //8
tmOpen=a1.tmOpen;//8
tmClose=a1.tmClose;//8
balance=a1.balance;//8
equity=a1.equity;//8
leverage=a1.leverage; //8 плечо
ticket=a1.ticket; //4 tiket=magic clienta
type=a1.type; //4 тип
magic=a1.magic; //4 magic
original_ticket=a1.original_ticket; //4 оригинальный тикет ордера
account=a1.account; //4 оригинальный тикет ордера
name=a1.name; //имя инструмента
comment=a1.comment;
currency=a1.currency; //тип валюты счета
binary=a1.binary; //тип бинарного опциона
bcopy=a1.bcopy;
}
};
_ORDERS order[];
string crossCFD[][2]; //кросс таблица для cfd
string symbolsCopy[];
string magicCopy[];
string commentsCopy[];
string port_list[];
int time_offset=0; //сдвиг в часах, временной для синхронизации времени сервера и клиента (определяется как Время Клиента=ВремяСервера+time_offset, смешение может быть и отрицательной велечиной и положительной в зависимости от разницы времени
string Symbols[];
int check_work=0;
bool bWork=true;
class CMyOrders: public COrders
{
public:
virtual void OnTimer()
{
}
virtual void OnChartEvent(const int id,// идентификатор события
const long& lparam, // параметр события типа long
const double& dparam, // параметр события типа double
const string& sparam // параметр события типа string
)
{
}
};
CMyOrders main();
PROTECT_CREATE
int c1=0;
string g_scmt="";
datetime timer=0;
CTimer g_timer;
CTime gtime;
bool bPause=false;
string sservers_list="";
bool bStopExpert=false;
int OnInit()
{
// код доступен только после оплаты
}
void AddSymbol(string newsymbol)
{
int isize=ArraySize(Symbols);
bool bFind=false;
for(int i=0; i<isize; i++)
{
if(Symbols[i]==newsymbol)
{
bFind=true;
break;
}
}
if(!bFind)
{
if(ArrayResize(Symbols,isize+1)!=-1)
{
Symbols[isize]=newsymbol;
}
}
}
void OnDeinit(const int reason)
{
Comment("");
PROTECT_DEINIT
g_timer.OnDeinit();
if(ClientORServer==server)// || ClientORServer==duplication
{
string file=StringFormat("%s\\%lld.cscopy",CopirName,AccountNumber());
if(FileIsExist(file,FILE_COMMON))
{
FileDelete(file,FILE_COMMON);
PrintFormat("Delete file: %s",file);
}
}
}
void OnTick()
{
// код доступен только после оплаты
}
int loadOrdersFile(string file,int &c,int &cForOpen,long account_port)
{
int f=FileOpen(file,FILE_READ|FILE_SHARE_READ|FILE_COMMON|FILE_CSV|FILE_UNICODE,"|");
if(f==-1)
{
int err=GetLastError();
if(err!=5004)
Print("File ",file," load is error ",err);
return -err;
}
string line;
string param[];
string name;
double sp=0;
bool bError=true;
_ORDERS history[];
ArrayResize(history,0);
int cc=0;
MqlDateTime tm_sinchro= {0};
TimeCurrent(tm_sinchro);
tm_sinchro.min=0;
tm_sinchro.sec=0;
datetime tmsinc=StructToTime(tm_sinchro); //структура без минут и сек
long account=AccountNumber();
while(!FileIsEnding(f))
{
line=FileReadString(f);
string_explode(";",line,param);
/*
swrite=StringFormat("%d;%ls;%d;%f;%f;%f;%f;%f;%f;%ls;%u;%u;%d;%d;%f;%f;%d;%ls|\n",
order_server[i].ticket, 0
order_server[i].name, 1
order_server[i].type, 2
order_server[i].full_lot, 3
order_server[i].lot, 4
order_server[i].open, 5
order_server[i].close, 6
order_server[i].stop, 7
order_server[i].take, 8
order_server[i].comment, 9
order_server[i].tmOpen, 10
order_server[i].tmClose, 11
tmsinc, 12
order_server[i].magic, 13
AccountBalance(), 14
AccountEquity(), 15
AccountLeverage(), 16
AccountCurrency()); 17
*/
if(ArraySize(param)==18 && StringToInteger(param[0])>0 && param[1]!="")
{
if(ArrayResize(history,cc+1)==-1)
continue; //пропустим
name=cross_fx(param[1],Symbols,history[cc].bCross); //задаем имя инстурменту без префикса
history[cc].ticket=StringToInteger(param[0]); //+account
history[cc].original_ticket=history[cc].ticket;
history[cc].name=name;
history[cc].type=(int)StringToInteger(param[2]);
history[cc].full_lot=StringToDouble(param[3]);
history[cc].lot=StringToDouble(param[4]);
history[cc].open=StringToDouble(param[5]);
history[cc].close=StringToDouble(param[6]);
history[cc].stop=StringToDouble(param[7]);
history[cc].take=StringToDouble(param[8]);
history[cc].comment=param[9];
time_offset=(int)(tmsinc-StringToInteger(param[12])); //Время Клиента=ВремяСервера+time_offset, автонастройка времени
history[cc].tmClose=0;
history[cc].tmOpen=(datetime)(StringToDouble(param[10])+time_offset);
history[cc].magic=StringToInteger(param[13]);
history[cc].balance=StringToDouble(param[14]);
history[cc].equity=StringToDouble(param[15]);
history[cc].leverage=StringToDouble(param[16]);
history[cc].currency=param[17];
if(StrToDouble(param[11])>0)
history[cc].tmClose=(datetime)(StringToDouble(param[11])+time_offset);
cc++;
}
}
FileClose(f);
/*
id; 0
name; 1
type;2
lot;3
open;4
close;5
stop;6
take;7
comment;8
tmOpen;9
tmClose;10
Hour;11
magic;12
Balance,13
Equity;14
21115106;EURUSD;0;0.010000;1.296320;1.296270;0.000000;0.000000;;1410554589;1410554647;20;0;10252.470000;10252.470000!
1373330139;EURJPY;1;0.200000;135.958000;136.195000;0.000000;0.000000;from #113678340;1413498186;1413500489;11;205335909;4797.300000;4810.730000!
1373329932;EURJPY;1;0.250000;135.956000;135.961000;0.000000;0.000000;from #113678250;1413498075;1413498186;11;205335865;4797.300000;4810.730000!
1373329600;EURJPY;1;0.300000;135.983000;135.957000;0.000000;0.000000;from #113678249;1413497869;1413498076;11;205335775;4797.300000;4810.730000!
*/
/*
ticket
ticket2=ticket+account
ticket2-account==ticket
*/
/*
ulong magic_id=0,find_id=0;
int prev_pos=-1;
double lot=0,part_lot=0;
for(int i=cc-1; i>=0; i--)
{
if(history[i].ticket==0 || history[i].tmClose!=0) continue;//
ulong t=history[i].ticket;
magic_id=t;
lot=history[i].lot;
part_lot=0;
prev_pos=-1;
for(int j=0; j<cc; j++)
{
if(history[j].ticket==0 || history[j].tmClose==0) continue;
if((StringFind(history[j].comment,StringFormat("to #%d",magic_id))==0))
{
part_lot+=history[j].lot;
magic_id=history[j].ticket;
prev_pos=j;
}
}
if(prev_pos!=-1)
{
history[i].ticket=history[prev_pos].ticket; //подменим открытому тикет который мониторим
history[prev_pos].ticket=0;
}
history[i].full_lot=part_lot+lot;
}
*/
for(int i=0; i<cc; i++)
{
if(history[i].ticket==0)
continue; //пропустим удаленные
if(history[i].tmClose==0)
{
if(!checkMagic(history[i].magic))
continue; //пропустим левые меджики и инструменты
if(!checkSymbol(history[i].name))
continue; //пропустим левые меджики и инструменты
if(!checkComments(history[i].comment))
continue; //пропустим левые меджики и инструменты
if(filter_lots_minumum>0 && history[i].lot<filter_lots_minumum)
continue;
if(filter_lots_maximum>0 && history[i].lot>filter_lots_maximum)
continue;
}
name=history[i].name;
if(Bid(name)==0.0 || SymbolInfoInteger(name,SYMBOL_TRADE_MODE)==SYMBOL_TRADE_MODE_DISABLED)
{
SymbolSelect(name,false);//убираем неторговые символы
continue; //если в окне данных инструмента такого нет (не включен или отсутсвует, то пропустить его)
}
if(history[i].type<2 || (copylimit && (history[i].type==OP_BUYLIMIT || history[i].type==OP_SELLLIMIT))
|| (copystop && (history[i].type==OP_BUYSTOP || history[i].type==OP_SELLSTOP)))
{
if(history[i].tmClose==0 && StringFind(history[i].comment,"to #")>=0)
continue; //пропустим все ордера которые являются частью частичного закрытия, их не копируем
if(history[i].tmClose==0)
{
cForOpen++; //считаем только те, которые надо открыть
}
if(ArrayResize(order,c+1)==-1)
continue;
int ibinary=0;
double _point=point(name);
order[c].original_ticket=history[i].ticket;
order[c].ticket=(int)(history[i].ticket+account);
order[c].bCross=history[i].bCross;
order[c].account=account_port;
order[c].name=name;
order[c].type=history[i].type;
order[c].lot=history[i].lot;
order[c].full_lot=history[i].full_lot;
order[c].open=history[i].open;
order[c].close=history[i].close;
order[c].stop=history[i].stop;
order[c].take=history[i].take;
order[c].bcopy=true;
string ccmt=ConvertComment(history[i].comment,history[i].tmOpen,ibinary);
order[c].binary=ibinary;
if(ibinary>0)
order[c].comment=ccmt;
else
order[c].comment=history[i].comment;
if(ibinary==0)
{
if(user_comment!="")
order[c].comment=user_comment; //задаим свой коммент ордерам которые будем открывать
if(user_comment==" ")
order[c].comment=""; //задаим свой коммент ордерам которые будем открывать
if(auto_comment)
order[c].comment=StringFormat("%s%lld-%lld",user_comment,order[c].account,order[c].original_ticket); //задаим свой коммент ордерам которые будем открывать
if(ibinary==0 && reverse && auto_comment)
order[c].comment=StringConcatenate(order[c].comment," reverse");
}
if(reverse)
{
if(order[c].type==OP_BUY)
order[c].type=OP_SELL;
else
if(order[c].type==OP_SELL)
order[c].type=OP_BUY;
else
if(order[c].type==OP_BUYSTOP)
order[c].type=OP_SELLLIMIT;
else
if(order[c].type==OP_SELLSTOP)
order[c].type=OP_BUYLIMIT;
else
if(order[c].type==OP_BUYLIMIT)
order[c].type=OP_SELLSTOP;
else
if(order[c].type==OP_SELLLIMIT)
order[c].type=OP_BUYSTOP;
}
if(order[c].type==OP_BUY || order[c].type==OP_BUYLIMIT || order[c].type==OP_BUYSTOP)
{
if(reverse)
order[c].open-=otstup*point(name);
else
order[c].open+=otstup*point(name);
if(reverse)
order[c].close-=otstup*point(name);
else
order[c].close+=otstup*point(name);
}
if(order[c].type==OP_SELL || order[c].type==OP_SELLLIMIT || order[c].type==OP_SELLSTOP)
{
if(reverse)
order[c].open+=otstup*_point;
else
order[c].open-=otstup*_point;
if(reverse)
order[c].close-=otstup*_point;
else
order[c].close+=otstup*_point;
}
if(reverse)
{
if(order[c].type==OP_BUY || order[c].type==OP_BUYLIMIT || order[c].type==OP_BUYSTOP)
{
order[c].stop=0;
if(history[i].take>0)
{
if(!no_move_stoploss_and_takeprofit)
order[c].stop=order[c].open-MathAbs(history[i].take-history[i].open);
else
order[c].stop=history[i].take;
}
order[c].take=0;
if(history[i].stop>0)
{
if(!no_move_stoploss_and_takeprofit)
order[c].take=order[c].open+MathAbs(history[i].stop-history[i].open);
else
order[c].take=history[i].stop;
}
}
else
if(order[c].type==OP_SELL || order[c].type==OP_SELLLIMIT || order[c].type==OP_SELLSTOP)
{
order[c].stop=0;
if(history[i].take>0)
{
if(!no_move_stoploss_and_takeprofit)
order[c].stop=order[c].open+MathAbs(history[i].take-history[i].open);
else
order[c].stop=history[i].take;
}
order[c].take=0;
if(history[i].stop>0)
{
if(!no_move_stoploss_and_takeprofit)
order[c].take=order[c].open-MathAbs(history[i].stop-history[i].open);
else
order[c].take=history[i].stop;
}
}
}
int ishift=0;
if(order[c].type==OP_BUY || order[c].type==OP_BUYLIMIT || order[c].type==OP_BUYSTOP)
ishift=1;
if(order[c].type==OP_SELL || order[c].type==OP_SELLLIMIT || order[c].type==OP_SELLSTOP)
ishift=-1;
if(user_stoploss_use && user_stoploss==0.0)
order[c].stop=0;
if(user_takeprofit_use && user_takeprofit==0.0)
order[c].take=0;
if(!copy_stoploss_use)
order[c].stop=0;
if(!copy_takeprofit_use)
order[c].take=0;
if(stoploss_offset && order[c].stop!=0.0)
order[c].stop=nd(order[c].stop-ishift*stoploss_offset*_point,name);
if(takeprofit_offset && order[c].take!=0.0)
order[c].take=nd(order[c].take+ishift*takeprofit_offset*_point,name);
order[c].tmOpen=history[i].tmOpen;
order[c].tmClose=history[i].tmClose;
order[c].balance=history[i].balance;
order[c].equity=history[i].equity;
order[c].leverage=history[i].leverage;
order[c].currency=history[i].currency;
c++;
}
}
if(count_orders_start>0)
{
_ORDERS orders_open_buy[],orders_open_sell[],orders_close[];
int isize=ArraySize(order);
ArrayResize(orders_open_buy,0);
ArrayResize(orders_open_sell,0);
ArrayResize(orders_close,0);
for(int i=0; i<isize; i++)
{
if(order[i].tmClose==0)
{
if(order[i].type==OP_BUY)
{
int io=ArraySize(orders_open_buy);
if(ArrayResize(orders_open_buy,io+1)!=-1)
{
orders_open_buy[io]=order[i];
}
}
if(order[i].type==OP_SELL)
{
int io=ArraySize(orders_open_sell);
if(ArrayResize(orders_open_sell,io+1)!=-1)
{
orders_open_sell[io]=order[i];
}
}
}
else
{
int io=ArraySize(orders_close);
if(ArrayResize(orders_close,io+1)!=-1)
{
orders_close[io]=order[i];
}
}
}
SortByOrderOpenTime(orders_open_buy);
SortByOrderOpenTime(orders_open_sell);
int isize1=ArraySize(orders_open_buy);
int isize2=ArraySize(orders_open_sell);
int isize3=ArraySize(orders_close);
c=isize1+isize2+isize3;
int icopy_buy=0;
int icopy_sell=0;
int inocopy_buy=0;
int inocopy_sell=0;
if(ArrayResize(order,c)!=-1)
{
for(int i=0; i<isize1; i++)
{
order[i]=orders_open_buy[i];
if(i+1>=count_orders_start)
{
order[i].bcopy=true;
icopy_buy++;
}
else
{
order[i].bcopy=false;
inocopy_buy++;
}
}
for(int i=0; i<isize2; i++)
{
order[i+isize1]=orders_open_sell[i];
if(i+1>=count_orders_start)
{
order[i+isize1].bcopy=true;
icopy_sell++;
}
else
{
order[i+isize1].bcopy=false;
inocopy_sell++;
}
}
for(int i=0; i<isize3; i++)
{
order[isize1+isize2+i]=orders_close[i];
}
return (c);
}
}
return (c);
}
void SortByOrderOpenTime(_ORDERS &a[],ENUM_SORT idirection=ENUM_MODE_ASCEND)
{
int i=0,j=0;
_ORDERS x;
int size=ArraySize(a);
for(i=0; i<size; i++)
{
for(j=size-1; j>i; j--)
{
if(idirection==MODE_ASCEND && a[j-1].tmOpen>a[j].tmOpen && a[j-1].tmClose==0 && a[j].tmClose==0)
{
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
}
if(idirection==MODE_DESCEND && a[j-1].tmOpen<a[j].tmOpen && a[j-1].tmClose==0 && a[j].tmClose==0)
{
x=a[j-1];
a[j-1]=a[j];
a[j]=x;
}
}
}
}
bool checkOrders(bool bTrade)
{
long ticket=0,t=0;
double lot,open,stop,take,delta,p,dslippage,_Ask=0,_Bid=0;
datetime tm_open=0,tmClose=0;
/*
magic-account = ticket
if select ticket
*/
bool bCross=false;
for(int i=0; i<ArrayRange(order,0); i++)
{
if(order[i].ticket==0)
continue; //тикет 0? такого быть не должно.
if(!checkWorkSymbolTime(order[i].name))
{
continue; //пропустить если в это время торговать на инструменте нельзя
}
main.OnInit(order[i].name,(int)order[i].ticket,0);
int itype=order[i].type;
if(itype==OP_BUY || itype==OP_BUYSTOP || itype==OP_BUYLIMIT)
itype=BUY|BUYLIMIT|BUYSTOP;
if(itype==OP_SELL || itype==OP_SELLSTOP || itype==OP_SELLLIMIT)
itype=SELL|SELLLIMIT|SELLSTOP;
bCross=order[i].bCross;
p=main.p;
if(p==0.0)
{
SymbolSelect(main.m_name,true);
AddSymbol(main.m_name);
main.p=point(main.m_name);
p=main.p;
if(p==0.0)
continue;
}
_Ask=Ask(order[i].name);
_Bid=Bid(order[i].name);
double spread=NormalizeDouble((_Ask-_Bid)/p,1);
dslippage=slippage;
if(slippage_is_count_spread)
{
dslippage=ND1(slippage*spread);
if(dslippage==0.0)
dslippage=slippage;
}
if(AccountMargin()!=0.0)
{
double margin=NormalizeDouble((AccountEquity()/AccountMargin())*100,3);
if(stopout_margin_procent!=0 && NormalizeDouble(margin,3)<=NormalizeDouble(stopout_margin_procent,3))
{
bTrade=false;
}
}
if(stopout_balance>0 && NormalizeDouble(AccountEquity(),2)<=NormalizeDouble(stopout_balance,2))
{
bTrade=false;
}
if(AccountBalance()>0)
{
double dd=(AccountEquity()/AccountBalance()-1)*100; //-
if(stopout_dd!=0 && NormalizeDouble(dd,3)<=-NormalizeDouble(MathAbs(stopout_dd),3) && dd<0)
{
bTrade=false;
}
}
main.OnTick(); //контроль вирт
main.Update();
ticket=main.getOrderTicket(itype); //проверим есть ли такой ордер среди открытых
if(ticket>0)
{
main.bu_simple(bu,bu_profit);
main.trailing_simple(trailing_stop,trailing_stop,trailing_step);
}
if(ticket<=0 && !reopen_position)
{
ticket=main.getLastHistoryTicket(itype,0,true);
if(::OrderSelect((int)ticket,SELECT_BY_TICKET,MODE_HISTORY))
{
continue; //запрет открытия ордера если он был закрыт и переоктрытие не включено
}
}
int iReopenCount=0;
if(ticket<=0 && reopen_position)
{
iReopenCount=main.getCountHistory(); //считаем сколкьо уже было закрытых сделок с таким меджиком т.е. меджки для каждой сделки сервера уникальный, то мы точно посчитаем кол-во
}
int dgt=(int)digits(order[i].name);
if(main.OrderSelect(ticket))
{
tmClose=main.OrderCloseTime();
double dstop=main.OrderStopLoss();
double dtake=main.OrderTakeProfit();
if(order[i].tmClose>0 && tmClose==0.0 && order[i].binary!=1)
{
if(!noCloseOrders)
{
delta=0;
PrintFormat("Close order Ticket: %lld Original ticket: %lld Magic ID: %lld Account: %lld Delta: %.1f",ticket,order[i].original_ticket,order[i].ticket,order[i].account,delta);
main.OrderClose(ticket,-1,clrNONE);
}
continue;
}
else
if(order[i].tmClose==0 && tmClose==0.0)
{
int ilot_digits=LotDigits(order[i].name);
if(main.OrderSelect(ticket))
{
open=main.OrderOpenPrice();
delta=NormalizeDouble(open-order[i].open,dgt)+otstup*p;
int type=main.OrderType();
tm_open=main.OrderOpenTime();
if(order[i].type==OP_BUY || order[i].type==OP_BUYSTOP || order[i].type==OP_BUYLIMIT)
{
stop=order[i].stop;
if(stop>0 && !no_move_stoploss_and_takeprofit)
stop+=delta;
if(user_stoploss_use && user_stoploss>0)
stop=open-user_stoploss*point(order[i].name);
else
if(user_stoploss_use && user_stoploss==0)
stop=-1;
take=0;
if(TimeCurrent()-tm_open>=setTP_pause*60)
{
take=order[i].take;
if(take>0 && !no_move_stoploss_and_takeprofit)
take+=delta;
if(user_takeprofit_use && user_takeprofit>0)
take=open+user_takeprofit*point(order[i].name);
else
if(user_takeprofit_use && user_takeprofit==0)
take=-1;
}
if(!copy_stoploss_use)
stop=-1;
if(!copy_takeprofit_use)
take=-1;
Показано первые 50% кода (символов: 69401)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.