{"openapi":"3.1.0","info":{"title":"Fortexa Public API","version":"1.1.0","description":"\nAPI котировок и торговли платформы Fortexa (CFD с плечом: крипта, форекс,\nметаллы, нефть).\n\n### Аутентификация\n\nКотировки (`/v1/time`, `/v1/market/*`) открыты и ключа не требуют.\n\nОстальное — по API-ключу из кабинета (Dashboard → API Keys). К каждому запросу\nдобавляются заголовки:\n\n| Заголовок | Значение |\n|---|---|\n| `X-FX-API-KEY` | публичный ключ (`fx...`) |\n| `X-FX-TIMESTAMP` | текущее время в миллисекундах |\n| `X-FX-RECV-WINDOW` | окно годности запроса, мс (по умолчанию 5000, максимум 60000) |\n| `X-FX-SIGN` | HMAC SHA-256, hex в нижнем регистре |\n\nПодписывается строка `timestamp + apiKey + recvWindow + payload`, где\n`payload` — строка запроса для GET (без `?`) или сырое тело для POST.\nСекрет показывается один раз при создании ключа.\n\nКлюч привязан к счёту (демо или реальный) и к праву торговли. Чужой счёт для\nключа не существует: его позиции и ордера возвращают 404. Вывода средств через\nAPI нет.\n\n### Объём сделки: лоты или сумма\n\nВ `POST /v1/orders` объём задаётся одним из двух полей:\n\n* `lots` — объём в лотах. Маржу под него считает сервер по цене исполнения;\n* `margin` — сумма в долларах, сервер пересчитает её в объём.\n\nРазмер лота зависит от инструмента и приходит в `GET /v1/market/symbols`\n(`contractSize`): золото — 100 унций, форекс — 100 000 единиц базовой валюты,\nнефть — 1000 баррелей, крипта — 1 монета. Стоимость лота в долларах плавает\nвслед за ценой, поэтому считать её заранее на стороне бота не нужно и вредно:\nмежду расчётом и исполнением цена уже другая.\n\nВ ответе позиция содержит и `lots` (объём в лотах), и `size`/`notionalUsd`\n(тот же объём в долларах, равный `margin × leverage`).\n\n### Лимиты запросов\n\nОкно — одна секунда; оно же предельный всплеск.\n\n* котировки — 100 запросов/с на IP;\n* чтение по ключу — 60 запросов/с;\n* торговые вызовы — 30 запросов/с на ключ.\n\nПревышение — HTTP 429, код `rate_limited`.\n\n### Ошибки\n\nЛюбая ошибка — это `{\"code\": \"...\", \"message\": \"...\"}`. `code` стабилен, на\nнего и стоит опираться; текст `message` может меняться.\n\n### Плата за перенос через ночь\n\nПозиция, оставшаяся открытой в момент пересчёта суток (`swapChargeHourUtc`,\nпо умолчанию 00:00 UTC), платит за перенос. Ставка — процент от объёма\nпозиции за ночь, отдельно для лонга и шорта: `swapLongPctPerDay` и\n`swapShortPctPerDay` в `GET /v1/market/symbols`.\n\nКрипта платит каждую ночь, включая выходные. У инструментов с выходными\n(форекс, металлы, нефть) в субботу и воскресенье ставка не берётся, а в день\n`swapTripleWeekday` берётся тройная — так оплачивается перенос через\nвыходные.\n\nПлата копится в поле `swap` позиции и удерживается один раз при закрытии:\nна счёт возвращается `margin + pnl - fee - swap`. Накопленный своп уменьшает\nзапас до ликвидации, поэтому `liquidationPrice` у долгой позиции смещается —\nчитайте его из ответа, а не считайте по плечу.\n\n### Повторы\n\n`clientOrderId` в `POST /v1/orders` защищает от двойного исполнения: повтор\nтого же запроса (обрыв связи, ретрай бота) вернёт 409 с идентификатором уже\nсозданного ордера, а не откроет вторую сделку.\n","contact":{"url":"https://fortexatrade.com/api-docs"}},"servers":[{"url":"https://api.fortexatrade.com","description":"Боевой сервер"}],"tags":[{"name":"market","description":"Котировки и инструменты, без ключа"},{"name":"account","description":"Счёт и позиции по ключу"},{"name":"trading","description":"Ордера и позиции"}],"paths":{"/v1/time":{"get":{"tags":["market"],"summary":"Время сервера","description":"По нему сверяются часы для подписи запросов.","security":[],"responses":{"200":{"description":"Время в миллисекундах","content":{"application/json":{"schema":{"type":"object","properties":{"serverTime":{"type":"integer","examples":[1758440000000]}}}}}}}}},"/v1/market/symbols":{"get":{"tags":["market"],"summary":"Инструменты платформы","description":"Список торгуемых инструментов с размером лота, минимальным входом и комиссией за лот.","security":[],"responses":{"200":{"description":"Инструменты","content":{"application/json":{"schema":{"type":"object","properties":{"symbols":{"type":"array","items":{"$ref":"#/components/schemas/Symbol"}}}}}}}}}},"/v1/market/ticker":{"get":{"tags":["market"],"summary":"Цена инструмента","description":"Цена, по которой сейчас исполнился бы рыночный ордер.","security":[],"parameters":[{"name":"symbol","in":"query","required":true,"schema":{"type":"string","examples":["XAU/USD"]}}],"responses":{"200":{"description":"Котировка","content":{"application/json":{"schema":{"type":"object","properties":{"symbol":{"type":"string"},"price":{"type":"number"},"time":{"type":"integer","description":"Миллисекунды"}}}}}},"404":{"description":"Нет котировки по инструменту","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Превышен лимит запросов","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/market/tickers":{"get":{"tags":["market"],"summary":"Все цены","security":[],"responses":{"200":{"description":"Цены всех инструментов","content":{"application/json":{"schema":{"type":"object","properties":{"tickers":{"type":"array","items":{"type":"object","properties":{"symbol":{"type":"string"},"price":{"type":"number"}}}},"time":{"type":"integer"}}}}}}}}},"/v1/market/klines":{"get":{"tags":["market"],"summary":"Свечи","security":[],"parameters":[{"name":"symbol","in":"query","required":true,"schema":{"type":"string","examples":["BTC/USDT"]}},{"name":"interval","in":"query","schema":{"type":"string","default":"1h","examples":["1m","5m","15m","1h","4h","1d"]}},{"name":"limit","in":"query","schema":{"type":"integer","default":200,"minimum":1,"maximum":500}}],"responses":{"200":{"description":"Свечи: время открытия (мс), open, high, low, close, объём","content":{"application/json":{"schema":{"type":"object","properties":{"symbol":{"type":"string"},"interval":{"type":"string"},"klines":{"type":"array","items":{"type":"array","items":{"type":"number"}}}}}}}},"400":{"description":"Некорректный запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/account":{"get":{"tags":["account"],"summary":"Счёт ключа","description":"Баланс того счёта (демо или реального), к которому привязан ключ.","security":[{"ApiKey":[],"Timestamp":[],"Signature":[],"RecvWindow":[]}],"responses":{"200":{"description":"Счёт","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Account"}}}},"400":{"description":"Некорректный запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Подпись, ключ или метка времени не приняты","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"IP вне белого списка, торговля ключу запрещена или счёт заблокирован","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Превышен лимит запросов","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Сервис платформы временно недоступен — повторите запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/positions":{"get":{"tags":["account"],"summary":"Открытые позиции","security":[{"ApiKey":[],"Timestamp":[],"Signature":[],"RecvWindow":[]}],"parameters":[{"name":"symbol","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Позиции","content":{"application/json":{"schema":{"type":"object","properties":{"positions":{"type":"array","items":{"$ref":"#/components/schemas/Position"}}}}}}},"400":{"description":"Некорректный запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Подпись, ключ или метка времени не приняты","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"IP вне белого списка, торговля ключу запрещена или счёт заблокирован","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Превышен лимит запросов","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Сервис платформы временно недоступен — повторите запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/positions/history":{"get":{"tags":["account"],"summary":"Закрытые позиции","security":[{"ApiKey":[],"Timestamp":[],"Signature":[],"RecvWindow":[]}],"parameters":[{"name":"symbol","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"integer","default":50,"minimum":1,"maximum":500}}],"responses":{"200":{"description":"История","content":{"application/json":{"schema":{"type":"object","properties":{"positions":{"type":"array","items":{"$ref":"#/components/schemas/Position"}}}}}}},"400":{"description":"Некорректный запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Подпись, ключ или метка времени не приняты","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"IP вне белого списка, торговля ключу запрещена или счёт заблокирован","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Превышен лимит запросов","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Сервис платформы временно недоступен — повторите запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/orders":{"get":{"tags":["trading"],"summary":"Активные лимитные ордера","security":[{"ApiKey":[],"Timestamp":[],"Signature":[],"RecvWindow":[]}],"parameters":[{"name":"symbol","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Ордера","content":{"application/json":{"schema":{"type":"object","properties":{"orders":{"type":"array","items":{"$ref":"#/components/schemas/Order"}}}}}}},"400":{"description":"Некорректный запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Подпись, ключ или метка времени не приняты","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"IP вне белого списка, торговля ключу запрещена или счёт заблокирован","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Превышен лимит запросов","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Сервис платформы временно недоступен — повторите запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"tags":["trading"],"summary":"Создать ордер","description":"Рыночный ордер исполняется сразу и возвращает позицию; лимитный ждёт своей цены и возвращает ордер. Объём задаётся `lots` или `margin` — ровно одним из двух полей.","security":[{"ApiKey":[],"Timestamp":[],"Signature":[],"RecvWindow":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrder"},"examples":{"лотами по рынку":{"value":{"symbol":"XAU/USD","side":"buy","type":"market","lots":0.01,"leverage":100,"clientOrderId":"bot-1"}},"суммой, лимитный":{"value":{"symbol":"BTC/USDT","side":"sell","type":"limit","margin":50,"leverage":20,"price":70000,"takeProfit":68000,"stopLoss":71500}}}}}},"responses":{"200":{"description":"Ордер принят","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOrderResult"}}}},"409":{"description":"clientOrderId уже использован — ордер по нему уже создан","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"Некорректный запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Подпись, ключ или метка времени не приняты","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"IP вне белого списка, торговля ключу запрещена или счёт заблокирован","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Превышен лимит запросов","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Сервис платформы временно недоступен — повторите запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/orders/cancel":{"post":{"tags":["trading"],"summary":"Отменить лимитный ордер","security":[{"ApiKey":[],"Timestamp":[],"Signature":[],"RecvWindow":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["orderId"],"properties":{"orderId":{"type":"integer"}}}}}},"responses":{"200":{"description":"Отменён","content":{"application/json":{"schema":{"type":"object","properties":{"orderId":{"type":"integer"},"status":{"type":"string","examples":["cancelled"]}}}}}},"404":{"description":"Ордера нет на счёте этого ключа","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"Некорректный запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Подпись, ключ или метка времени не приняты","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"IP вне белого списка, торговля ключу запрещена или счёт заблокирован","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Превышен лимит запросов","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Сервис платформы временно недоступен — повторите запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/orders/amend":{"post":{"tags":["trading"],"summary":"Изменить цену лимитного ордера","security":[{"ApiKey":[],"Timestamp":[],"Signature":[],"RecvWindow":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["orderId","price"],"properties":{"orderId":{"type":"integer"},"price":{"type":"number","exclusiveMinimum":0}}}}}},"responses":{"200":{"description":"Новый уровень ордера","content":{"application/json":{"schema":{"type":"object","properties":{"order":{"$ref":"#/components/schemas/Order"}}}}}},"404":{"description":"Ордера нет на счёте этого ключа","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"Некорректный запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Подпись, ключ или метка времени не приняты","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"IP вне белого списка, торговля ключу запрещена или счёт заблокирован","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Превышен лимит запросов","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Сервис платформы временно недоступен — повторите запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/positions/close":{"post":{"tags":["trading"],"summary":"Закрыть позицию по рынку","security":[{"ApiKey":[],"Timestamp":[],"Signature":[],"RecvWindow":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["positionId"],"properties":{"positionId":{"type":"integer"}}}}}},"responses":{"200":{"description":"Закрытая позиция с финансовым результатом","content":{"application/json":{"schema":{"type":"object","properties":{"position":{"$ref":"#/components/schemas/Position"}}}}}},"404":{"description":"Позиции нет на счёте этого ключа","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"Некорректный запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Подпись, ключ или метка времени не приняты","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"IP вне белого списка, торговля ключу запрещена или счёт заблокирован","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Превышен лимит запросов","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Сервис платформы временно недоступен — повторите запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/positions/tpsl":{"post":{"tags":["trading"],"summary":"Тейк-профит и стоп-лосс","description":"Пропущенное поле оставляет уровень как был, `null` — снимает его. Укажите хотя бы одно из двух.","security":[{"ApiKey":[],"Timestamp":[],"Signature":[],"RecvWindow":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["positionId"],"properties":{"positionId":{"type":"integer"},"takeProfit":{"type":["number","null"],"exclusiveMinimum":0},"stopLoss":{"type":["number","null"],"exclusiveMinimum":0}}}}}},"responses":{"200":{"description":"Позиция с новыми уровнями","content":{"application/json":{"schema":{"type":"object","properties":{"position":{"$ref":"#/components/schemas/Position"}}}}}},"404":{"description":"Позиции нет на счёте этого ключа","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"400":{"description":"Некорректный запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Подпись, ключ или метка времени не приняты","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"IP вне белого списка, торговля ключу запрещена или счёт заблокирован","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Превышен лимит запросов","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Сервис платформы временно недоступен — повторите запрос","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"ApiKey":{"type":"apiKey","in":"header","name":"X-FX-API-KEY","description":"Публичный ключ из кабинета"},"Timestamp":{"type":"apiKey","in":"header","name":"X-FX-TIMESTAMP","description":"Текущее время в миллисекундах"},"RecvWindow":{"type":"apiKey","in":"header","name":"X-FX-RECV-WINDOW","description":"Окно годности запроса, мс (максимум 60000)"},"Signature":{"type":"apiKey","in":"header","name":"X-FX-SIGN","description":"HMAC SHA-256 от timestamp + apiKey + recvWindow + payload"}},"schemas":{"Error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","description":"Машинный код ошибки","examples":["invalid_signature"]},"message":{"type":"string","description":"Пояснение для человека"}}},"Symbol":{"type":"object","properties":{"symbol":{"type":"string","examples":["XAU/USD"]},"name":{"type":"string"},"type":{"type":"string","enum":["crypto","forex","commodity","index","stock","other"]},"base":{"type":"string"},"quote":{"type":"string"},"priceDecimals":{"type":["integer","null"]},"maxLeverage":{"type":["integer","null"]},"contractSize":{"type":["number","null"],"description":"Единиц актива в одном лоте: золото 100, форекс 100000, нефть 1000, крипта 1"},"contractUnit":{"type":["string","null"],"description":"Что это за единицы: унции, баррели, валюта, монеты"},"minLot":{"type":["number","null"],"examples":[0.01]},"lotStep":{"type":["number","null"],"examples":[0.01]},"feePerLotUsd":{"type":["number","null"],"description":"Комиссия за круг, $ за лот (у крипты — процентом)"},"minMarginUsd":{"type":["number","null"],"description":"Минимальная маржа фиксированной суммой"},"minMarginByLot":{"type":["boolean","null"],"description":"true — минимум задан объёмом 0.01 лота, в долларах зависит от цены и плеча"},"swapLongPctPerDay":{"type":["number","null"],"description":"Плата за перенос лонга через ночь: процент от объёма позиции за одну ночь. 0.035 = 0.035% от объёма"},"swapShortPctPerDay":{"type":["number","null"],"description":"То же для шорта"},"swapChargeHourUtc":{"type":["integer","null"],"description":"Час пересчёта суток по UTC"},"swapTripleWeekday":{"type":["integer","null"],"description":"День недели с тройной ставкой (0 = понедельник): так оплачивается перенос через выходные. null — инструмент торгуется круглосуточно, тройного дня нет"}}},"Account":{"type":"object","properties":{"accountType":{"type":"string","enum":["demo","real"]},"canTrade":{"type":"boolean"},"currency":{"type":"string","examples":["USD"]},"balance":{"type":"object","properties":{"available":{"type":"number"},"locked":{"type":"number","description":"Занято под маржу открытых позиций"},"total":{"type":"number"}}}}},"Position":{"type":"object","properties":{"positionId":{"type":"integer"},"symbol":{"type":"string"},"side":{"type":"string","enum":["buy","sell"]},"status":{"type":"string","enum":["open","closed","liquidated"]},"entryPrice":{"type":"number"},"markPrice":{"type":"number"},"lots":{"type":["number","null"],"description":"Объём в лотах"},"size":{"type":"number","description":"Объём в долларах: маржа x плечо"},"notionalUsd":{"type":"number","description":"То же, что size"},"margin":{"type":"number"},"leverage":{"type":"integer"},"liquidationPrice":{"type":["number","null"]},"takeProfit":{"type":["number","null"]},"stopLoss":{"type":["number","null"]},"pnl":{"type":["number","null"],"description":"Финансовый результат, $"},"pnlPercent":{"type":["number","null"],"description":"Результат к марже, %"},"fee":{"type":["number","null"],"description":"Комиссия за круг (открытие + закрытие) в долларах. Считается при открытии, списывается ОДИН раз при закрытии. Ставка за лот — feePerLotUsd в /v1/market/symbols."},"swap":{"type":["number","null"],"description":"Накопленная плата за перенос позиции через ночь, $. Растёт при каждом пересчёте суток, пока позиция открыта; удерживается при закрытии вместе с комиссией: на счёт возвращается margin + pnl - fee - swap. Ставки и время пересчёта — в /v1/market/symbols."},"openedAt":{"type":["string","null"],"format":"date-time"},"closedAt":{"type":["string","null"],"format":"date-time"},"closeReason":{"type":["string","null"]}}},"Order":{"type":"object","properties":{"orderId":{"type":"integer"},"symbol":{"type":"string"},"side":{"type":"string","enum":["buy","sell"]},"type":{"type":"string","examples":["limit"]},"status":{"type":"string","examples":["new"]},"price":{"type":"number","description":"Уровень срабатывания"},"lots":{"type":["number","null"]},"margin":{"type":"number"},"leverage":{"type":"integer"},"fee":{"type":["number","null"],"description":"Комиссия за круг, посчитанная при постановке ордера"},"takeProfit":{"type":["number","null"]},"stopLoss":{"type":["number","null"]},"createdAt":{"type":["string","null"],"format":"date-time"}}},"CreateOrder":{"type":"object","required":["symbol","side","type","leverage"],"description":"Ровно одно из полей lots / margin задаёт объём.","properties":{"symbol":{"type":"string","description":"BASE/QUOTE","examples":["XAU/USD"]},"side":{"type":"string","enum":["buy","sell"]},"type":{"type":"string","enum":["market","limit"]},"lots":{"type":"number","exclusiveMinimum":0,"description":"Объём в лотах. Маржу под него считает сервер по цене исполнения — пересчитывать на своей стороне не нужно.","examples":[0.01]},"margin":{"type":"number","exclusiveMinimum":0,"description":"Сумма в долларах под сделку."},"leverage":{"type":"integer","minimum":1,"description":"Не выше maxLeverage инструмента"},"price":{"type":"number","exclusiveMinimum":0,"description":"Только для limit: уровень ордера"},"takeProfit":{"type":"number","exclusiveMinimum":0},"stopLoss":{"type":"number","exclusiveMinimum":0},"clientOrderId":{"type":"string","maxLength":36,"pattern":"^[A-Za-z0-9_-]{1,36}$","description":"Свой идентификатор: защищает от двойного исполнения при ретрае"}}},"CreateOrderResult":{"type":"object","description":"Для рыночного ордера приходит position, для лимитного — order.","properties":{"orderId":{"type":"integer"},"positionId":{"type":["integer","null"]},"status":{"type":"string","enum":["filled","new"]},"clientOrderId":{"type":["string","null"]},"position":{"$ref":"#/components/schemas/Position"},"order":{"$ref":"#/components/schemas/Order"}}}}}}