Цель - создание советника для каждой из платформ, получающего команды на создание ордеров и на их изменение и закрытие с внешнего сервера. Советник должен быть нативным, т.е. не использовать dll Советни работает только с хеджинговыми счетами. Запросы к внешнему серверу: Для MT5 запросы осуществляются посредством web socket установка соединения: wss://url/ws/ Задачи сервера передаются в JSON в объекте “tasks” Ответы от клиента передаются в объекте “answer” Для MT4 Для MT4 реализовать REST Все ответы на запросы осуществляются с передачей HTTP кода. Тело ответа в формате JSON формируется только при коде =200 В остальных случаях только код. Заголовки Авторизация осуществляется посредством Api_key . Передается в заголовке запроса так же в заголовке передается account_login Т.е. номер счета Запрос к серверу Запрос выполняется 1 раз в секунду. POST: url/api/getwork Все тела запросов к серверу являются ответами на постановку задач сервера, которые приходят в теле ответа. Тела запросов и ответов формируются в JSON Логика: 1. первый запрос без тела, т.к. при запуске советника нет задач, на которые требуется ответ. 2. сервер присылает в ответе json с задачей (задачами). Так же ответ сервера может быть без тела. Это значит что пока задач нет. 3. задачи выполняется в советнике. 4. Задачи ставятся в очередь на выполнение. 5. при каких либо изменениях в МT , о которых не знает сервер формируется объект. 6. Ответы на задачи на которые запрошена подписка отправляются в каждом запросе. Задачи Получать состояние счета (подписка) "subscribe": true подписаться , false - отписаться {get_account_info : { "subscribe": true } } Ответ: get_account_info = { "balance": 15640.23, "equity": 1231.43, "free_margin": 1231.43, "margin": 234, "drawdown": 3, // в процентах } Получать котировки (подписка) { "get_tic_info": { "subscribe": true, "pairs": [ "EURUSD", "XAUUSD" ] } при постановке задачи котировки должны стремиться раз в 500 мс Ответ: { "get_tic_info": { "tics": [ { "pair": "EURUSD", "bid": 1.2356, "ask": 1.2345, "time": 1638702777 }, { "pair": "XAUUSD", "bid": 1.2356, "ask": 1.2345, "time": 1638702777 } ] } } Получит список открытых ордеров { "get_orders_info": {} } Ответ: { "get_orders_info": { "orders": [ { "ticket": 12123123, "pair": "EUR/USD", "source_id": 1142342, "direction": true, "type": false, "lot": 0.05, "dt_start": 10322323223, "dt_end": 1638702777, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "float_profit": 123, "swap": 1.5, "commission": 1.5, "descr": "примечание к заказу", "magic_id": 123123131 }, { "ticket": 32523533, "pair": "EUR/USD", "source_id": 1142342, "direction": true, "type": false, "lot": 0.05, "dt_start": 10322323223, "dt_end": 1638702777, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "float_profit": 123, "swap": 1.5, "commission": 1.5, "descr": "примечание к заказу", "magic_id": 123123132 }, { "ticket": 424242443, "pair": "XAU/USD", "source_id": 42342, "direction": true, "type": false, "lot": 0.05, "dt_start": 10322323223, "dt_end": 1638702777, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "float_profit": 123, "swap": 1.5, "commission": 1.5, "descr": "примечание к заказу", "magic_id": 123123133 } ] } } Получить историю торгов { "get_orders_history": { "time":1223353 // unix time } } Ответ: { "get_orders_history": { "from": 13234234234324, "orders": [ { "ticket": "12123123", "pair": "EUR/USD", "source_id": 1142342, "direction": true, "type": false, "lot": 0.05, "dt_start": 10322323223, "dt_finish": 10322323223, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "price_finish": 1.2244, "profit": 123, "swap": 1.5, "commission": 1.5, "descr": "примечание к заказу", "magic_id": 123123131 }, { "ticket": "32523533", "pair": "EUR/USD", "source_id": 1142342, "direction": true, "type": false, "lot": 0.05, "dt_start": 10322323223, "dt_finish": 10322323223, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "price_finish": 1.2244, "profit": 123, "swap": 1.5, "commission": 1.5, "descr": "примечание к заказу", "magic_id": 123123132 }, { "tickets": "424242443", "pair": "XAU/USD", "source_id": 42342, "direction": true, "type": false, "lot": 0.05, "dt_start": 10322323223, "dt_finish": 10322323223, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "price_finish": 1.2244, "profit": 123, "swap": 1.5, "commission": 1.5, "descr": "примечание к заказу", "magic_id": 123123133 } ] } } Создание ордера\ордеров { "create_orders": { "rules": { "move_SL1": 0, "move_SL2": 0, "move_SLN": 0, "trealing_start": 70, "trealing_from": 35, "trealing_step": 5, "risk_per_trade": 2, "lot": 0.5, "source_id": 345, "use_virtual_tp": false, "use_virtual_sl": false, "time_to_close": "23:59:30", "close_trades_if_drawdown": 30, "max_volatility": 30, "max_slippage": 30, "direction": true, "type": false, "dt_end": 1638702777, "sl": 1.424223, "pair": "EUR/USD", "at": 1.424223, "descr": "примечание к заказу" }, "orders": [ { "magic_id": "4666566", "tp": 2.42142, "lot_persent": 20 }, { "magic_id": "32523533", "tp": 2.42142, "lot_persent": 30 }, { "magic_id": "424242443", "tp": 2.42142, "lot_persent": 50 } ] } } Ответ: делаем ответ если ордера создались успешно { "create_orders": { "orders": [ { "ticket": 12123123, "pair": "EUR/USD", "source_id": 1142342, "direction": true, "type": false, "lot": 0.05, "dt_start": 10322323223, "dt_end": 1638702777, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "float_profit": 123, "swap": 1.5, "commission": 1.5, "descr": "примечание к заказу", "magic_id": 123123131 }, { "ticket": 32523533, "pair": "EUR/USD", "source_id": 1142342, "direction": true, "type": false, "lot": 0.05, "dt_start": 10322323223, "dt_end": 1638702777, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "float_profit": 123, "swap": 1.5, "commission": 1.5, "descr": "примечание к заказу", "magic_id": 123123132 }, { "ticket": 424242443, "pair": "XAU/USD", "source_id": 42342, "direction": true, "type": false, "lot": 0.05, "dt_start": 10322323223, "dt_end": 1638702777, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "float_profit": 123, "swap": 1.5, "commission": 1.5, "descr": "примечание к заказу", "magic_id": 123123133 } ] } } Изменение ордеров { "change_orders": { "orders": [ { "magic_id": "64656655", "ticket": 1638702777, "sl": 1.424223, "tp": 2.42142, "source_id": 345, "change_lot": 100 }, { "magic_id": "32523533", "ticket": 1638702777, "sl": 1.424223, "tp": 2.42142, "source_id": 345, "change_lot": 50 }, { "magic_id": "424242443", "ticket": 1638702777, "sl": 1.424223, "tp": 2.42142, "source_id": 345, "change_lot": 20 } ] } } Ответ: { "change_orders": { "orders": [ { "ticket": 12123123, "pair": "EUR/USD", "source_id": 1142342, "direction": true, "type": false, "lot": 0.05, "dt_start": 10322323223, "dt_end": 1638702777, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "float_profit": 123, "swap": 1.5, "commission": 1.5, "descr": "примечание к заказу", "magic_id": 123123131 }, { "ticket": 32523533, "pair": "EUR/USD", "source_id": 1142342, "direction": true, "type": false, "lot": 0.05, "dt_start": 10322323223, "dt_end": 1638702777, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "float_profit": 123, "swap": 1.5, "commission": 1.5, "descr": "примечание к заказу", "magic_id": 123123132 }, { "ticket": 424242443, "pair": "XAU/USD", "source_id": 42342, "direction": true, "type": false, "lot": 0.05, "dt_start": 10322323223, "dt_end": 1638702777, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "float_profit": 123, "swap": 1.5, "commission": 1.5, "descr": "примечание к заказу", "magic_id": 123123133 } ] } } Получить историю котировок { "get_history_pair": [ { "pair": "EURUSD", "timeframe": "1", "time_from": 1022311123 }, { "pair": "EURUSD", "timeframe": "1h", "time_from": 1022311123 } ] } Ответ: { "get_history_pair": { "EURUSD": { "1": [ { "time": "123155656", "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 } ], "5": [ { "time": "123155656", "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 } ], "15": [ { "time": "123155656", "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 } ], "30": [ { "time": "123155656", "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 } ], "1h": [ { "time": "123155656", "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 } ], "4h": [ { "time": "123155656", "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 } ], "w": [ { "time": "123155656", "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 } ], "m": [ { "time": "123155656", "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 }, { "time": 123155656, "open": 1.23696, "max": 1.23796, "min": 1.23366, "close": 1.23756, "volume": 153 } ] } } } Оповещение при изменении ордеров на стороне MT высылается если что то изменилось на стороне MT { "orders_changed": { "orders": [ { "magic_id": 12123123, "action": "closed by sl" }, { "magic_id": 32523533, "action": "closed manually" }, { "magic_id": 424242443, "action": "sl or tp changed" } ] } } Отчет об ошибках Высылается если не получилось создать заказ { "error_report": { "orders": [ { "magic_id": 12123123, "error": "minimum margin" }, { "magic_id": 32523533, "error": "no money" }, { "magic_id": 424242443, "error": "market closed" } ] } } Получать изменение ордеров (подписка) { "get_orders_chenging": { "subscribe": true } } Ответ: { "get_orders_chenging": [ {"magic_id": 156423, "ticket": 24243323, "float_profit": 121.43, "price_persent": 0.04 }, {"magic_id": 156424, "ticket": 24243325, "float_profit": 121.43, "price_persent": 0.04 }] } Пояснения: "time": // unix time передается с точностью до секунд "source_id": // int значение, по которому определяем кто автор ордера. Хранить в ордере его негде. "direction": // направление открытия ордера true - buy , false - sell "type" // определяет лимитный или маркет ордер true - market , false - limit "dt_start": // время создания ордера "dt_end": // время отмены лимитного ордера "dt_finish": // время закрытия ордера "price_start": // цена по которой открыт маркет ордер, либо цена по которой должен открыться лимит ордер "price_finish" // цена, по которой ордер был закрыт "magic_id" // уникальный идентификатор ордера на стороне сервера. пишется в ордер "ticket" // номер ордера в MT "profit" // прибыль\убыток на закрытых ордерах "float_profit" // изменяющаяся прибыль\убыток на открытых ордерах "rules" // набор правил для объекта "create_orders". принадлежность к конкретному "create_orders" олпределяется с помощью "source_id" "move_SL1" // переместить SL на точку входа когда первый ордер закрылся по TP. Значения отличные от 0 говорят об отклонении от цены точки входа в пипсах "move_SL2" // переместить SL на TP ордера 1 когда второй ордер закрылся по TP. "move_SLN" //аналогично "move_SL2". Количество "move_SL “ зависит от количества создаваемых заказов в объекту "create_orders" "lot" // в объекте "rules" это общий лот на все ордера в объекте "create_orders". Распределение лотности по ордерам определяется в "lot_persent" (в процентах) "risk_per_trade" // используется для расчета "lot" , когда он не задан "time_to_close" // время закрытия ордеров из объекта "create_orders" "close_trades_if_drawdown" // закрыть все ордера из объекта "create_orders" при наступлении по ним просадки в указанном проценте "max_volatility": // максимальная волатильность при которой может быть открыт маркет ордер "max_slippage": // максимальное проскальзывание при котором может быть открыт маркет ордер "at": // цена для создания лимитного ордера "change_lot" // указывает на какую лотность нужно изменить лот в процентах "action": // параметр для объекта "orders_changed". Определяет какие изменения произошли с ордером. Возможные значения: closed by sl; closed by tp; closed manually; sl or tp changed; closed by time; closet by drawdown "error" // причина отказа в открытии ордера. Возможные значения: minimum margin; no money; // когда запрашиваемый лом больше возможного market closed; max_volatility; max_sloppage Примеры: Пример постановки задачи: { "tasks": { "get_tic_info": { "pairs": [ "EURUSD" ] } }, "get_history_pair": { "EURUSD": { "timeframe": "1,5,15,30,h,4h,w,m", "candel_count": 1000 }, "create_orders": { "rules": { "move_SL1": 0, "move_SL2": 0, "move_SLN": 0, "trealing_start": 70, "trealing_from": 35, "trealing_step": 5, "risk_per_trade": 2, "lot": 0.5, "source_id": 345, "use_virtual_tp": false, "use_virtual_sl": false, "time_to_close_": "23:59:30", "close_trades_if_drawdown": 30, "max_volatility": 30, "max_sloppage": 30 }, "orders": [ { "magic_id": "4666566", "pair": "EUR/USD", "direction": true, "type": false, "dt_start": 10322323223, "dt_end": 1638702777, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "descr": "примечание к заказу", "lot_persent": 20 }, { "magic_id": "32523533", "pair": "EUR/USD", "direction": true, "type": false, "dt_start": 10322323223, "dt_end": 1638702777, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "descr": "примечание к заказу", "lot_persent": 30 }, { "magic_id": "424242443", "pair": "XAU/USD", "direction": true, "type": false, "dt_start": 10322323223, "dt_end": 1638702777, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "descr": "примечание к заказу", "lot_persent": 50 } ] } } } Пример ответа по задаче: { "answer": { "get_tic_info": { "tics": [ { "pair": "EURUSD", "bid": 1.2356, "ask": 1.2345, "time": 1638702777 } ] }, "get_orders_history": { "from": 13234234234324, "orders": [ { "ticket": "12123123", "pair": "EUR/USD", "source_id": 1142342, "direction": true, "type": false, "lot": 0.05, "dt_start": 10322323223, "dt_finish": 10322323223, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "price_finish": 1.2244, "profit": 123, "swap": 1.5, "commission": 1.5, "descr": "примечание к заказу", "magic_id": 123123131 }, { "ticket": "32523533", "pair": "EUR/USD", "source_id": 1142342, "direction": true, "type": false, "lot": 0.05, "dt_start": 10322323223, "dt_finish": 10322323223, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "price_finish": 1.2244, "profit": 123, "swap": 1.5, "commission": 1.5, "descr": "примечание к заказу", "magic_id": 123123132 }, { "tickets": "424242443", "pair": "XAU/USD", "source_id": 42342, "direction": true, "type": false, "lot": 0.05, "dt_start": 10322323223, "dt_finish": 10322323223, "sl": 1.424223, "tp": 2.42142, "price_start": 1.24234, "price_finish": 1.2244, "profit": 123, "swap": 1.5, "commission": 1.5, "descr": "примечание к заказу", "magic_id": 123123133 } ] }, "error_report": { "orders": [ { "magic_id": 12123123, "error": "minimum margin" }, { "magic_id": 32523533, "error": "no money" }, { "magic_id": 424242443, "error": "market closed" } ] }, "orders_changed": { "orders": [ { "magic_id": 12123123, "action": "closed by sl" }, { "magic_id": 32523533, "action": "closed manually" }, { "magic_id": 424242443, "action": "sl or tp changed" } ] } } } Публичные настройки в советнике настройки производятся непосредственно в советнике account drawdown % // при достижении величины закрыть все сделки stop after close true\false // остановить торговлю советником в случае наступления account drawdown % pair drawdown % // если какая то пара просела больше чем указано - закрыть ее currency drawdown % // при достижении величины закрыть все позиции с указанным символом. (пример GBP. если открыты GBPUSD, GBPAUD - закроем их ) minimum margin // минимальный уровень свободной маржи при которой запрещено открывать новые ордера. Api key // ключ, с которым происходит авторизация запроса