riskgate-service-example/README.md
2026-03-30 12:59:59 -03:00

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 RiskGateHandler with your own risk rules and position sizing logic
  • Start a RiskGateServer that 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:

  1. MetaTrader 5 installed.
  2. 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.
  3. 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 supportkp compile compiles the service
  • Custom handlerMyHandler in src/riskgate-handler.mqh shows how to implement OnSignal()
  • 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:

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.