PHP code example of aleedhillon / meta-trader-client

1. Go to this page and download the library: Download aleedhillon/meta-trader-client library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

aleedhillon / meta-trader-client example snippets




return [
    'agent' => env('MT5_AGENT', 'WebAPI'),
    'should_crypt' => env('MT5_SHOULD_CRYPT', true),
    'ip' => env('MT5_SERVER_IP'),
    'port' => env('MT5_SERVER_PORT', 443),
    'login' => env('MT5_SERVER_WEB_LOGIN'),
    'password' => env('MT5_SERVER_WEB_PASSWORD'),
    'timeout' => env('MT5_SERVER_TIMEOUT', 30),
];

use Aleedhillon\MetaTraderClient\Exceptions\MetaTraderException;
use Aleedhillon\MetaTraderClient\Exceptions\AuthenticationException;
use Aleedhillon\MetaTraderClient\Exceptions\NetworkException;
use Aleedhillon\MetaTraderClient\Exceptions\UserManagementException;
use Aleedhillon\MetaTraderClient\Exceptions\TradingException;
use Aleedhillon\MetaTraderClient\Exceptions\ConfigurationException;

try {
    $user = MetaTraderClient::userGet(123456);
} catch (AuthenticationException $e) {
    // Handle authentication errors (1000-1023)
    Log::error('Authentication failed: ' . $e->getMessage());
} catch (UserManagementException $e) {
    // Handle user management errors (3001-3012)
    Log::error('User management error: ' . $e->getMessage());
} catch (NetworkException $e) {
    // Handle network errors (7-10)
    Log::error('Network error: ' . $e->getMessage());
} catch (MetaTraderException $e) {
    // Handle other MT5 errors
    Log::error('MT5 Error: ' . $e->getMessage() . ' (Code: ' . $e->getMtCode() . ')');
}

use Aleedhillon\MetaTraderClient\Facades\MetaTraderClient;

try {
    // The client automatically connects when needed
    $serverTime = MetaTraderClient::timeGet();
    echo "Server time: " . (is_string($serverTime->TimeServer) ? $serverTime->TimeServer : date('Y-m-d H:i:s', $serverTime->TimeServer));
    
    // Check connection status
    if (MetaTraderClient::isConnected()) {
        echo "Connected to MT5 server";
    }
    
    // Manual connection (optional)
    MetaTraderClient::connect();
    
} catch (MetaTraderException $e) {
    echo "Error: " . $e->getMessage();
}

// Manual disconnect (optional - handled automatically)
MetaTraderClient::disconnect();

use Aleedhillon\MetaTraderClient\Facades\MetaTraderClient;
use Aleedhillon\MetaTraderClient\Lib\MTEnDealAction;

try {
    // Create a new user
    $user = MetaTraderClient::userCreate();
    $user->Name = 'John Doe';
    $user->Email = '[email protected]';
    $user->Group = 'demo';
    $user->Leverage = 100;
    $user->MainPassword = 'password123';
    $user->Phone = '+1234567890';

    $newUser = MetaTraderClient::userAdd($user);
    echo "Created user with login: " . $newUser->Login;

    // Get user information
    $userInfo = MetaTraderClient::userGet(123456);
    echo "User: " . $userInfo->Name . " (" . $userInfo->Email . ")";

    // Update user
    $userInfo->Leverage = 200;
    $updatedUser = MetaTraderClient::userUpdate($userInfo);

    // Delete user
    MetaTraderClient::userDelete(123456);

    // Check user password (returns true or throws exception)
    $isValidPassword = MetaTraderClient::userPasswordCheck(123456, 'password123');

    // Change user password
    MetaTraderClient::userPasswordChange(123456, 'newpassword123');

    // Change user balance
    MetaTraderClient::userDepositChange(
        123456,                      // User login
        1000.00,                     // New deposit amount
        'API deposit',               // Comment
        MTEnDealAction::DEAL_BALANCE // Deal type
    );

    // Get user account information
    $account = MetaTraderClient::userAccountGet(123456);
    echo "Balance: " . $account->Balance . " " . $account->Currency;

    // Get list of user logins
    $logins = MetaTraderClient::userLogins('demo');
    
} catch (UserManagementException $e) {
    echo "User management error: " . $e->getMessage();
} catch (MetaTraderException $e) {
    echo "MT5 error: " . $e->getMessage();
}

try {
    // Get order information
    $order = MetaTraderClient::orderGet(987654);
    echo "Order: " . $order->Symbol . " Volume: " . $order->VolumeInitial;

    // Get total number of orders for user
    $orderCount = MetaTraderClient::orderGetTotal(123456);

    // Get orders by page
    $orders = MetaTraderClient::orderGetPage(123456, 0, 10);
    foreach ($orders as $order) {
        echo "Order " . $order->Order . ": " . $order->Symbol;
    }

    // Get position
    $position = MetaTraderClient::positionGet(123456, 'EURUSD');
    echo "Position: " . $position->Symbol . " Profit: " . $position->Profit;

    // Get all positions count
    $positionCount = MetaTraderClient::positionGetTotal(123456);

    // Get positions by page
    $positions = MetaTraderClient::positionGetPage(123456, 0, 10);

    // Get deal information
    $deal = MetaTraderClient::dealGet(789012);
    echo "Deal: " . $deal->Symbol . " Volume: " . $deal->Volume;

    // Get deals count
    $dealCount = MetaTraderClient::dealGetTotal(123456, strtotime('-1 week'), time());

    // Get deals by page
    $deals = MetaTraderClient::dealGetPage(123456, strtotime('-1 week'), time(), 0, 10);

    // Get history order
    $historyOrder = MetaTraderClient::historyGet(456789);

    // Get history count
    $historyCount = MetaTraderClient::historyGetTotal(123456, strtotime('-1 month'), time());

    // Get history by page
    $historyOrders = MetaTraderClient::historyGetPage(123456, strtotime('-1 month'), time(), 0, 10);

    // Execute balance operation
    $ticket = MetaTraderClient::tradeBalance(
        123456,                      // User login
        MTEnDealAction::DEAL_BALANCE, // Operation type
        1000.00,                     // Amount
        'Deposit via API',           // Comment
        true                         // Margin check
    );
    
    if ($ticket) {
        echo "Balance operation ticket: " . $ticket;
    }
    
} catch (TradingException $e) {
    echo "Trading error: " . $e->getMessage();
} catch (MetaTraderException $e) {
    echo "MT5 error: " . $e->getMessage();
}

try {
    // Get symbol information
    $symbol = MetaTraderClient::symbolGet('EURUSD');
    echo "Symbol: " . $symbol->Symbol . " Digits: " . $symbol->Digits;

    // Get symbol count
    $symbolCount = MetaTraderClient::symbolTotal();

    // Get next symbol by position
    $nextSymbol = MetaTraderClient::symbolNext(0);

    // Get symbol by group
    $groupSymbol = MetaTraderClient::symbolGetGroup('EURUSD', 'demo');

    // Get last ticks
    $ticks = MetaTraderClient::tickLast('EURUSD');
    foreach ($ticks as $tick) {
        echo "Tick: " . $tick->Bid . "/" . $tick->Ask;
    }

    // Get last ticks by group
    $groupTicks = MetaTraderClient::tickLastGroup('EURUSD', 'demo');

    // Get tick statistics
    $tickStats = MetaTraderClient::tickStat('EURUSD');
    
} catch (MetaTraderException $e) {
    echo "Market data error: " . $e->getMessage();
}

try {
    // Get total groups count
    $groupCount = MetaTraderClient::groupTotal();

    // Get next group
    $group = MetaTraderClient::groupNext(0);
    echo "Group: " . $group->Group;

    // Create a new group
    $newGroup = MetaTraderClient::groupCreate();
    $newGroup->Group = 'new_demo';
    $newGroup->Company = 'Demo Company';
    $newGroup->Currency = 'USD';
    // Set other group properties...

    $createdGroup = MetaTraderClient::groupAdd($newGroup);

    // Get group information
    $groupInfo = MetaTraderClient::groupGet('demo');
    echo "Group: " . $groupInfo->Group . " Currency: " . $groupInfo->Currency;

    // Delete group
    MetaTraderClient::groupDelete('old_demo');
    
} catch (ConfigurationException $e) {
    echo "Configuration error: " . $e->getMessage();
} catch (MetaTraderException $e) {
    echo "MT5 error: " . $e->getMessage();
}

try {
    // Create a new symbol
    $symbol = MetaTraderClient::symbolCreate();
    $symbol->Symbol = 'CUSTOM';
    $symbol->Description = 'Custom Symbol';
    $symbol->CurrencyBase = 'USD';
    $symbol->CurrencyProfit = 'USD';
    $symbol->Digits = 5;
    // Set other symbol properties...

    $newSymbol = MetaTraderClient::symbolAdd($symbol);
    echo "Created symbol: " . $newSymbol->Symbol;

    // Get symbol information
    $symbolInfo = MetaTraderClient::symbolGet('EURUSD');

    // Delete symbol
    MetaTraderClient::symbolDelete('OBSOLETE');
    
} catch (ConfigurationException $e) {
    echo "Symbol configuration error: " . $e->getMessage();
} catch (MetaTraderException $e) {
    echo "MT5 error: " . $e->getMessage();
}

try {
    // Send email to user
    MetaTraderClient::mailSend(
        '123456',                    // User login
        'Important Notification',     // Subject
        '<h1>Important Message</h1><p>This is an important message.</p>' // HTML body
    );

    // Send news
    MetaTraderClient::newsSend(
        'Market Update',             // Subject
        'General',                   // Category
        1033,                        // Language (English)
        1,                          // Priority
        '<h2>Market Update</h2><p>Important market information.</p>' // HTML body
    );
    
} catch (MetaTraderException $e) {
    echo "Communication error: " . $e->getMessage();
}

try {
    // Get server time
    $time = MetaTraderClient::timeGet();
    echo "Server time: " . (is_string($time->TimeServer) ? $time->TimeServer : date('Y-m-d H:i:s', $time->TimeServer));

    // Get server time as Unix timestamp
    $timestamp = MetaTraderClient::timeServer();

    // Get common server information
    $common = MetaTraderClient::commonGet();
    echo "Server: " . $common->Name . " Build: " . $common->Build;

    // Ping server
    MetaTraderClient::ping();

    // Restart server (

try {
    // Send custom command to MT5 server
    $result = MetaTraderClient::customSend(
        'YOUR_CUSTOM_COMMAND',
        ['param1' => 'value1', 'param2' => 'value2'],
        'Request body'
    );
    
    $answer = $result['answer'];
    $answerBody = $result['answer_body'];
    
} catch (MetaTraderException $e) {
    echo "Custom command error: " . $e->getMessage();
}

use Aleedhillon\MetaTraderClient\Facades\MetaTraderClient;

// Error handling utilities
$errorDescription = MetaTraderClient::getErrorDescription(10004);
echo "Error: " . $errorDescription; // "No connection"

// Volume conversion utilities
$newVolume = MetaTraderClient::toNewVolume(100); // Convert 1.00 lots to 1000000
$oldVolume = MetaTraderClient::toOldVolume(1000000); // Convert back to 100

// Validation utilities
$isValidMode = MetaTraderClient::validateTradeMode(4); // Returns 4 (TRADE_FULL)
$isValidSymbol = MetaTraderClient::isValidSymbolName('EURUSD'); // true
$isValidLogin = MetaTraderClient::isValidLogin(123456); // true

// Data conversion utilities
$hexString = MetaTraderClient::binaryToHex('test'); // Convert to hex
$binaryData = MetaTraderClient::hexToBinary('74657374'); // Convert from hex
$escaped = MetaTraderClient::escapeProtocolString('test=value|data'); // Escape special chars

// Time utilities
$formatted = MetaTraderClient::formatMtTimestamp(time(), 'Y-m-d H:i:s');
$mtTime = MetaTraderClient::toMtTimestamp(); // Current time

// Default values
$marginRates = MetaTraderClient::getDefaultMarginRates();
$randomHex = MetaTraderClient::generateRandomHex(32); // For testing

// Version information
$version = MetaTraderClient::getVersionInfo();
echo "MT5 Web API Version: " . $version['web_api_version'];

try {
    $user = MetaTraderClient::userGet(123456);
} catch (MetaTraderException $e) {
    // Get the original MT5 error code
    $mtCode = $e->getMtCode();
    echo "MT5 Error Code: " . $mtCode;
    
    // Exception type is determined by error code range:
    // 1000-1023: AuthenticationException
    // 2000-2012: ConfigurationException  
    // 3001-3012: UserManagementException
    // 4001-4005: TradeManagementException
    // 10001-11002: TradingException
    // 5001-6001: ReportException
    // 7-10: NetworkException
}

use Aleedhillon\MetaTraderClient\MetaTraderClient;

$client = new MetaTraderClient(
    'CustomAgent',               // Agent name
    true,                        // Use encryption
    '192.168.1.1',              // Custom IP
    8443,                        // Custom port
    60,                          // Custom timeout
    'manager',                   // Custom login
    'password123'                // Custom password
);

try {
    $client->connect();
    $user = $client->userGet(123456);
} catch (MetaTraderException $e) {
    echo "Error: " . $e->getMessage();
}

MetaTraderClient::connect();

MetaTraderClient::disconnect();

$connected = MetaTraderClient::isConnected();

MetaTraderClient::ping();

$timeInfo = MetaTraderClient::timeGet();
echo "Timezone: " . $timeInfo->TimeZone;
echo "Daylight: " . $timeInfo->Daylight;

$timestamp = MetaTraderClient::timeServer();
echo "Server time: " . date('Y-m-d H:i:s', $timestamp);

$serverInfo = MetaTraderClient::commonGet();
echo "Server: " . $serverInfo->Name;
echo "Owner: " . $serverInfo->Owner;
echo "Total Users: " . number_format($serverInfo->TotalUsers);

MetaTraderClient::serverRestart();

$user = MetaTraderClient::userCreate();
$user->Name = 'John Doe';
$user->Email = '[email protected]';
$user->Group = 'demo';

$user = MetaTraderClient::userCreate();
$user->Name = 'John Doe';
$user->Email = '[email protected]';
$user->Group = 'demo';
$user->Leverage = 100;
$user->MainPassword = 'password123';

$newUser = MetaTraderClient::userAdd($user);
echo "New user login: " . $newUser->Login;

$user = MetaTraderClient::userGet(123456);
echo "User: " . $user->Name . " (" . $user->Email . ")";
echo "Group: " . $user->Group;
echo "Balance: " . $user->Balance;

$user = MetaTraderClient::userGet(123456);
$user->Leverage = 200;
$user->Email = '[email protected]';

$updatedUser = MetaTraderClient::userUpdate($user);

MetaTraderClient::userDelete(123456);

$isValid = MetaTraderClient::userPasswordCheck(123456, 'password123');
if ($isValid) {
    echo "Password is correct";
}

MetaTraderClient::userPasswordChange(123456, 'newpassword123');

use Aleedhillon\MetaTraderClient\Lib\MTEnDealAction;

MetaTraderClient::userDepositChange(
    123456,                      // User login
    1000.00,                     // Amount
    'API deposit',               // Comment
    MTEnDealAction::DEAL_BALANCE // Deal type
);

$account = MetaTraderClient::userAccountGet(123456);
echo "Balance: " . $account->Balance;
echo "Equity: " . $account->Equity;
echo "Margin: " . $account->Margin;
echo "Free Margin: " . $account->MarginFree;

$logins = MetaTraderClient::userLogins('demo'); // Get all demo users
$logins = MetaTraderClient::userLogins('*');    // Get all users

foreach ($logins as $login) {
    echo "Login: " . $login;
}

$order = MetaTraderClient::orderGet(987654);
echo "Symbol: " . $order->Symbol;
echo "Volume: " . $order->VolumeInitial;
echo "Price: " . $order->PriceOpen;

$orderCount = MetaTraderClient::orderGetTotal(123456);
echo "Total orders: " . $orderCount;

$orders = MetaTraderClient::orderGetPage(123456, 0, 10); // Page 0, 10 items
foreach ($orders as $order) {
    echo "Order " . $order->Order . ": " . $order->Symbol;
}

$position = MetaTraderClient::positionGet(123456, 'EURUSD');
echo "Symbol: " . $position->Symbol;
echo "Volume: " . $position->Volume;
echo "Profit: " . $position->Profit;

$positionCount = MetaTraderClient::positionGetTotal(123456);

$positions = MetaTraderClient::positionGetPage(123456, 0, 10);
foreach ($positions as $position) {
    echo "Position: " . $position->Symbol . " Profit: " . $position->Profit;
}

$deal = MetaTraderClient::dealGet(789012);
echo "Symbol: " . $deal->Symbol;
echo "Volume: " . $deal->Volume;
echo "Price: " . $deal->Price;

$dealCount = MetaTraderClient::dealGetTotal(
    123456,                    // User login
    strtotime('-1 week'),      // From date
    time()                     // To date
);

$deals = MetaTraderClient::dealGetPage(
    123456,                    // User login
    strtotime('-1 week'),      // From date
    time(),                    // To date
    0,                         // Page
    10                         // Count
);

$historyOrder = MetaTraderClient::historyGet(456789);

$historyCount = MetaTraderClient::historyGetTotal(
    123456,                    // User login
    strtotime('-1 month'),     // From date
    time()                     // To date
);

$historyOrders = MetaTraderClient::historyGetPage(
    123456,                    // User login
    strtotime('-1 month'),     // From date
    time(),                    // To date
    0,                         // Page
    10                         // Count
);

use Aleedhillon\MetaTraderClient\Lib\MTEnDealAction;

$ticket = MetaTraderClient::tradeBalance(
    123456,                      // User login
    MTEnDealAction::DEAL_BALANCE, // Operation type
    1000.00,                     // Amount
    'Deposit via API',           // Comment
    true                         // Margin check
);

if ($ticket) {
    echo "Balance operation ticket: " . $ticket;
}

$symbol = MetaTraderClient::symbolGet('EURUSD');
echo "Symbol: " . $symbol->Symbol;
echo "Digits: " . $symbol->Digits;
echo "Spread: " . $symbol->Spread;

$symbolCount = MetaTraderClient::symbolTotal();

$symbol = MetaTraderClient::symbolNext(0); // First symbol

$symbol = MetaTraderClient::symbolGetGroup('EURUSD', 'demo');

$symbol = MetaTraderClient::symbolCreate();
$symbol->Symbol = 'CUSTOM';
$symbol->Description = 'Custom Symbol';
$symbol->CurrencyBase = 'USD';
$symbol->CurrencyProfit = 'USD';

$symbol = MetaTraderClient::symbolCreate();
$symbol->Symbol = 'CUSTOM';
$symbol->Description = 'Custom Symbol';
// ... set other properties

$newSymbol = MetaTraderClient::symbolAdd($symbol);

MetaTraderClient::symbolDelete('OBSOLETE');

$ticks = MetaTraderClient::tickLast('EURUSD');
foreach ($ticks as $tick) {
    echo "Tick: " . $tick->Bid . "/" . $tick->Ask;
}

$ticks = MetaTraderClient::tickLastGroup('EURUSD', 'demo');

$tickStats = MetaTraderClient::tickStat('EURUSD');

$groupCount = MetaTraderClient::groupTotal();

$group = MetaTraderClient::groupNext(0); // First group
echo "Group: " . $group->Group;
echo "Currency: " . $group->Currency;

$group = MetaTraderClient::groupGet('demo');
echo "Group: " . $group->Group;
echo "Company: " . $group->Company;
echo "Currency: " . $group->Currency;

$group = MetaTraderClient::groupCreate();
$group->Group = 'new_demo';
$group->Company = 'Demo Company';
$group->Currency = 'USD';

$group = MetaTraderClient::groupCreate();
$group->Group = 'new_demo';
$group->Company = 'Demo Company';
$group->Currency = 'USD';
// ... set other properties

$newGroup = MetaTraderClient::groupAdd($group);

MetaTraderClient::groupDelete('old_demo');

MetaTraderClient::mailSend(
    '123456',                    // User login
    'Important Notification',     // Subject
    '<h1>Important Message</h1><p>This is an HTML message.</p>' // HTML body
);

MetaTraderClient::newsSend(
    'Market Update',             // Subject
    'General',                   // Category
    1033,                        // Language (English)
    1,                          // Priority
    '<h2>Market Update</h2><p>Important market information.</p>' // HTML body
);

$result = MetaTraderClient::customSend(
    'YOUR_CUSTOM_COMMAND',
    ['param1' => 'value1', 'param2' => 'value2'],
    'Request body'
);

$answer = $result['answer'];
$answerBody = $result['answer_body'];

$errorDescription = MetaTraderClient::getErrorDescription(10004);
echo "Error: " . $errorDescription; // "No connection"

$newVolume = MetaTraderClient::toNewVolume(100);     // Convert 1.00 lots to 1000000
$oldVolume = MetaTraderClient::toOldVolume(1000000); // Convert back to 100

$isValidMode = MetaTraderClient::validateTradeMode(4);          // Returns 4 (TRADE_FULL)
$isValidSymbol = MetaTraderClient::isValidSymbolName('EURUSD'); // true
$isValidLogin = MetaTraderClient::isValidLogin(123456);         // true

$hexString = MetaTraderClient::binaryToHex('test');                    // Convert to hex
$binaryData = MetaTraderClient::hexToBinary('74657374');               // Convert from hex
$escaped = MetaTraderClient::escapeProtocolString('test=value|data');  // Escape special chars

$formatted = MetaTraderClient::formatMtTimestamp(time(), 'Y-m-d H:i:s');
$mtTime = MetaTraderClient::toMtTimestamp(); // Current time

$marginRates = MetaTraderClient::getDefaultMarginRates();
$randomHex = MetaTraderClient::generateRandomHex(32); // For testing

$version = MetaTraderClient::getVersionInfo();
echo "MT5 Web API Version: " . $version['web_api_version'];

// Old way with reference parameters and return codes
$user = null;
$result = MetaTraderClient::UserGet(123456, $user);
if ($result === MTRetCode::MT_RET_OK) {
    echo $user->Name;
} else {
    echo "Error code: " . $result;
}

// New way with direct returns and exceptions
try {
    $user = MetaTraderClient::userGet(123456);
    echo $user->Name;
} catch (MetaTraderException $e) {
    echo "Error: " . $e->getMessage();
}

MT5_AGENT=WebAPI
MT5_SHOULD_CRYPT=true
MT5_SERVER_IP=your-mt5-server-ip
MT5_SERVER_PORT=443
MT5_SERVER_WEB_LOGIN=your-web-api-login
MT5_SERVER_WEB_PASSWORD=your-web-api-password
MT5_SERVER_TIMEOUT=30
bash
   php vendor/bin/testbench test:mt5
   
bash
php artisan about
bash
php artisan mt5
bash
php artisan mt5:status
bash
php artisan mt5:groups
bash
php artisan mt5:symbols
bash
# View package information
php artisan about

# List all available MT5 commands
php artisan list mt5