Forum on trading, automated trading systems and testing trading strategies
Fernando Carreiro, 2016.05.14 13:13
Here is some sample code for various restrictions to be applied on an EA, including that of a Account number. Just set the variables according to your requirements:
//+------------------------------------------------------------------------------------+ // Variables for Handling of Licensing Restrictions //+------------------------------------------------------------------------------------+ bool boolRestrictExpiration = false, // Set to true, to use an Expiration Date boolRestrictAccountNumber = false, // Set to true for Restricting by Account Number boolRestrictAccountName = false, // Set to true for Restricting by Account Name boolRestrictAccountServer = false, // Set to true for Restricting by Account Server boolRestrictAccountCompany = false, // Set to true for Restricting by Account Company boolRestrictDemoAccount = false, // Set to true, to only allow Demo Accounts boolRestrictSymbols = false, // Set to true, to only allow certain Symbols boolRestrictAlert = true; // Display Alert Message when Restrictions apply datetime dtRestrictExpiration = D'2016.12.31'; // Restricted by Expiration Date long longRestrictAccountNumber = 123456789; // Restricted by Account Number string strRestrictAccountName = "Client Name", // Restricted by Account Name strRestrictAccountServer = "Server Name", // Restricted by Account Server strRestrictAccountCompany = "Company Name", // Restricted by Account Company strRestrictSymbols[] = { "EURUSD", "GBPJPY", "NZDCAD" }, // Restricted Symbols strRestrictAlertCaption = "Restrictions", // Alert Message Box Caption strRestrictAlertMessage = "ATTENTION! Due to Licensing Restrictions, code execution has been blocked!"; // Message to be used when Restrictions have been detected //+------------------------------------------------------------------------------------+ // Function to Test Restrictions during Initialisation //+------------------------------------------------------------------------------------+ bool boolRestrictOnInit() { if( boolRestrictAccountNumber ) { if( AccountInfoInteger( ACCOUNT_LOGIN ) != longRestrictAccountNumber ) { voidRestrictAlert(); return( true ); } } if( boolRestrictAccountName ) { if( AccountInfoString( ACCOUNT_NAME ) != strRestrictAccountName ) { voidRestrictAlert(); return( true ); } } if( boolRestrictAccountServer ) { if( AccountInfoString( ACCOUNT_SERVER ) != strRestrictAccountServer ) { voidRestrictAlert(); return( true ); } } if( boolRestrictAccountCompany ) { if( AccountInfoString( ACCOUNT_COMPANY ) != strRestrictAccountCompany ) { voidRestrictAlert(); return( true ); } } if( boolRestrictDemoAccount ) { if( AccountInfoInteger( ACCOUNT_TRADE_MODE ) != ACCOUNT_TRADE_MODE_DEMO ) { voidRestrictAlert(); return( true ); } } if( boolRestrictSymbols() ) { voidRestrictAlert(); return( true ); } return( boolRestrictOnTick() ); } //+------------------------------------------------------------------------------------+ // Function to Test Variations of Restricted Symbols //+------------------------------------------------------------------------------------+ bool boolRestrictSymbols() { if( boolRestrictSymbols ) { int intSymbolCount = ArraySize( strRestrictSymbols ); if( intSymbolCount == 0 ) return( false ); for( int i = 0; i < intSymbolCount; i++ ) { if( StringFind( _Symbol, strRestrictSymbols[i] ) != EMPTY ) return( false ); int intLen = StringLen( strRestrictSymbols[i] ), intHalf = intLen / 2; string strLeft = StringSubstr( strRestrictSymbols[i], 0, intHalf ), strRight = StringSubstr( strRestrictSymbols[i], intHalf, intLen - intHalf ); if( ( StringFind( _Symbol, strLeft ) != EMPTY ) && ( StringFind( _Symbol, strRight ) != EMPTY ) ) return( false ); } return( true ); } return( false ); } //+------------------------------------------------------------------------------------+ // Function to Test Expiration during Tick Events //+------------------------------------------------------------------------------------+ bool boolRestrictOnTick() { if( boolRestrictExpiration ) { if( TimeCurrent() >= dtRestrictExpiration ) { voidRestrictAlert(); return( true ); } } return( false ); } //+------------------------------------------------------------------------------------+ // Function to Alert User of Licensing Restrictions and Remove Code from Execution //+------------------------------------------------------------------------------------+ void voidRestrictAlert() { if( boolRestrictAlert ) MessageBox( strRestrictAlertMessage, strRestrictAlertCaption, MB_ICONERROR ); ExpertRemove(); } //+------------------------------------------------------------------------------------+ // Initialisation Event Function //+------------------------------------------------------------------------------------+ int OnInit() { // Check Licensing Restrictions if( boolRestrictOnInit() ) return( INIT_FAILED ); // ... other code ... return( INIT_SUCCEEDED ); // Initialisation complete } //+------------------------------------------------------------------------------------+ // Tick Event Function //+------------------------------------------------------------------------------------+ void OnTick() { // Check Licensing Restrictions if( boolRestrictOnTick() ) return; // ... other code ... } //+------------------------------------------------------------------------------------+
Forum on trading, automated trading systems and testing trading strategies
Fernando Carreiro, 2016.05.14 16:14
I could be wrong, but according to the "Uninitialization Reason Codes", I don't think that will happen because MT4 will reload the EA when there is a Change in Account, Chart Symbol or Time-frame. So, in essence the OnInit() function will be called again with the new Account Number.
However, if I am wrong, then he just needs to add the verification to the OnTick() event.
For Indicators, however, it seems this does not apply and they do not undergo a OnDeinit/OnInit cycle with a change in Account and in this case, the verification of the account number will have to be checked in one of the other event functions such as OnCalculate(), OnTimer() or OnChartEvent().
Can you pleace tell me what else does not lead to the deinitialization of the indicator?
Should I check for the existence of class objects before creating them in OnInit()? I have seen such a check in someone else's code, but I don't understand why they do it, since the objects will be deleted in OnDeinit(). Example:
class CExample1 { //... }; CExample1* name; void OnInit() { if(CheckPointer(name) == POINTER_DYNAMIC) delete name; name = new CExample1; }
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
Good day
Can anyone please tell me how I can add protection to an expert. I want my expert advisor to be able to only work on one specific broker account number so that my expert cant be coppied to a different pc and used. I am using MT5 please thus it needs to be on MQL5. How would I code my expert to only work on one Account number