4.4 KiB
Service riskgate-example
Demonstration of a Risk Gate service built with @douglasrechia/riskgate
MIT License
What is this?
riskgate-example is a KnitPkg service that demonstrates how to build a centralized risk management service for MetaTrader 5 using the @douglasrechia/riskgate package.
It shows how to:
- Implement a custom
RiskGateHandlerwith your own risk rules and position sizing logic - Start a
RiskGateServerthat listens for incoming EA connections on a TCP port - Parse trading signals sent by EAs (JSON), apply risk rules, and respond with approved lot sizes
This project is intended as a starting point — rename the files, implement OnSignal() with your own logic, and you have a working risk gate service.
Prerequisites
To use this project, you will need:
- MetaTrader 5 installed.
- KnitPkg CLI: The KnitPkg package manager for MetaTrader. If you don't have it, you can install it by following the instructions in the main KnitPkg repository.
- KnitPkg homepage: See https://knitpkg.dev for an overview and https://docs.knitpkg.dev for documentation.
Features
- Service type (
type: service) — runs as an MQL5 Service in MetaTrader 5 - MQL5 target — designed for MetaTrader 5
- Compile support —
kp compilecompiles the service - Custom handler —
MyHandlerinsrc/riskgate-handler.mqhshows how to implementOnSignal() - JSON protocol — signals and responses are exchanged as JSON via TCP
- Logging — built-in logging via
@douglasrechia/logger - Multi-client — handles up to 32 simultaneous EA connections
Getting started
1) Clone into MetaTrader Services folder
# Go to your MetaTrader 'Services' directory.
# Tip: in MetaEditor, right-click the `Services` folder and choose "Open Folder".
cd "C:\Users\username\AppData\Roaming\MetaQuotes\Terminal\<TERMINAL_ID>\MQL5\Services"
git clone https://forge.mql5.io/DouglasRechia/riskgate-service-example.git
cd riskgate-service-example
2) Install dependencies
kp install
3) Compile
kp compile
4) Run the service
After a successful compilation, restart MetaTrader so the Navigator refreshes. Then attach the service from the Navigator under Services.
Project structure
src/
riskgate-example.mq5 # Service entry point — starts the server
riskgate-handler.mqh # MyHandler — implement your risk rules here
knitpkg.yaml # Project manifest
Implementing your own handler
Open src/riskgate-handler.mqh and implement OnSignal() with your risk rules:
void OnSignal(CJAVal& signal, CJAVal& response) override
{
string symbol = signal["symbol"].ToStr();
string side = signal["side"].ToStr();
double stopLoss = signal["stop_loss"].ToDbl();
// Apply your risk rules here (drawdown checks, correlation, daily loss limits, etc.)
double lot = CalculateLot(symbol, stopLoss);
response["approved"] = (lot > 0.0);
response["lot"] = lot;
response["reason"] = lot > 0.0 ? "" : "risk_limit_reached";
}
The signal structure is defined by your EA — no schema is enforced by the server.
Connecting from an EA
EAs connect to this service using the RiskGateClient from the @douglasrechia/riskgate-ea package:
douglasrechia::RiskGateClient client("127.0.0.1", 5555);
void OnTick()
{
CJAVal signal, response;
signal["symbol"] = _Symbol;
signal["side"] = "BUY";
signal["stop_loss"] = 12.34;
bool online = client.RequestPositionSize(signal, response);
if(online && response["approved"].ToBool())
OpenOrder(response["lot"].ToDbl());
}
Dependencies
This project depends on:
@douglasrechia/riskgate— TCP server infrastructure and handler base class
All dependencies are automatically resolved by KnitPkg.
License
This project is released under the MIT License. See LICENSE for details.
Disclaimer
This code is provided as-is, for educational purposes only.
No warranty (express or implied) is provided. Use at your own risk.