72 lines
3.2 KiB
MQL5
72 lines
3.2 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| BehaviorLibrary.mqh |
|
|
//| Synthetic Test Harness for MetaTrader 5 |
|
|
//| Institutional Architecture in MQL5 - Part 1 Series |
|
|
//+------------------------------------------------------------------+
|
|
#ifndef SYNTHETIC_TEST_HARNESS_BEHAVIOR_LIBRARY_MQH
|
|
#define SYNTHETIC_TEST_HARNESS_BEHAVIOR_LIBRARY_MQH
|
|
|
|
#include "BehaviorDelegates.mqh"
|
|
#include "ErrorCodes.mqh"
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Stateful Mock Behaviors for Chaos Engineering |
|
|
//| |
|
|
//| This module supplies pre-packaged behaviors for injecting faults |
|
|
//| and edge cases into the trading environment. |
|
|
//+------------------------------------------------------------------+
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Behavior_RequoteTwice: |
|
|
//| Simulates a broker that requotes 2 consecutive execution |
|
|
//| attempts, and fills the order on the 3rd attempt. |
|
|
//| |
|
|
//| Lifecycle: |
|
|
//| Call 1: Returns false, retcode = TRADE_RETCODE_REQUOTE (10004) |
|
|
//| Call 2: Returns false, retcode = TRADE_RETCODE_REQUOTE (10004) |
|
|
//| Call 3: Returns true, retcode = TRADE_RETCODE_DONE (10009) |
|
|
//| Counter automatically resets to 0. |
|
|
//+------------------------------------------------------------------+
|
|
bool Behavior_RequoteTwice(MqlTradeRequest &request, MqlTradeResult &result)
|
|
{
|
|
static int call_count = 0;
|
|
call_count++;
|
|
|
|
ZeroMemory(result);
|
|
|
|
if(call_count < 3)
|
|
{
|
|
result.retcode = SYNTH_ERR_REQUOTE; // TRADE_RETCODE_REQUOTE
|
|
result.comment = StringFormat("Chaos Injection: Requote attempt #%d", call_count);
|
|
return(false);
|
|
}
|
|
|
|
// 3rd attempt succeeds
|
|
result.retcode = TRADE_RETCODE_DONE;
|
|
result.volume = request.volume;
|
|
result.price = (request.type == ORDER_TYPE_BUY) ? request.price : request.price;
|
|
result.deal = 12345678;
|
|
result.order = 87654321;
|
|
result.comment = "Chaos Injection: Order filled on 3rd attempt";
|
|
|
|
// Reset counter for subsequent cycles
|
|
call_count = 0;
|
|
return(true);
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| Behavior_FatalDisconnect: |
|
|
//| Simulates an unrecoverable broker gateway / network disconnect. |
|
|
//| |
|
|
//| Returns false with TRADE_RETCODE_CONNECTION (10031). |
|
|
//+------------------------------------------------------------------+
|
|
bool Behavior_FatalDisconnect(MqlTradeRequest &request, MqlTradeResult &result)
|
|
{
|
|
ZeroMemory(result);
|
|
result.retcode = TRADE_RETCODE_CONNECTION; // 10031: No connection with the trade server
|
|
result.comment = "Chaos Injection: Fatal broker disconnect simulated";
|
|
return(false);
|
|
}
|
|
|
|
#endif
|
|
//+------------------------------------------------------------------+
|