FMIC/Scripts/Listing all Signals' properties to a CSV file/ListSignals.mq4

93 lines
5.1 KiB
MQL4
Raw Permalink Normal View History

2025-05-30 14:55:26 +02:00
//---------------------------------------------------------------------------------------------------------------------
#define MName "List Signals"
#define MVersion "1.210"
#define MBuild "2022-09-03 12:24 WEST"
#define MCopyright "Copyright \x00A9 2022, Fernando M. I. Carreiro, All rights reserved"
#define MProfile "https://www.mql5.com/en/users/FMIC"
//---------------------------------------------------------------------------------------------------------------------
#property strict
#property version MVersion
#property description MName
#property description "MetaTrader Script (Build "MBuild")"
#property copyright MCopyright
#property link MProfile
//---------------------------------------------------------------------------------------------------------------------
// Script Setup
#property script_show_inputs
// Script inputs
input string
sFileName = "SignalsData.csv", // File name of CSV file
sDelimeter = "\t", // Delimeter character (default = TAB)
sDecimal = ",", // Decimal character
sDate = "-"; // Date delimiter character
input int
nDigits = 2; // Number of decimal digits for floating point numbers
// Declare list of properties to collect
ENUM_SIGNAL_BASE_STRING g_eStringProperty[] =
{ SIGNAL_BASE_NAME, SIGNAL_BASE_AUTHOR_LOGIN, SIGNAL_BASE_BROKER, SIGNAL_BASE_BROKER_SERVER, SIGNAL_BASE_CURRENCY };
ENUM_SIGNAL_BASE_INTEGER g_eDateProperty[] =
{ SIGNAL_BASE_DATE_PUBLISHED, SIGNAL_BASE_DATE_STARTED, SIGNAL_BASE_DATE_UPDATED };
ENUM_SIGNAL_BASE_INTEGER g_eIntegerProperty[] =
{ SIGNAL_BASE_ID, SIGNAL_BASE_LEVERAGE, SIGNAL_BASE_PIPS, SIGNAL_BASE_RATING, SIGNAL_BASE_SUBSCRIBERS, SIGNAL_BASE_TRADES, SIGNAL_BASE_TRADE_MODE };
ENUM_SIGNAL_BASE_DOUBLE g_eDoubleProperty[] =
{ SIGNAL_BASE_BALANCE, SIGNAL_BASE_EQUITY, SIGNAL_BASE_GAIN, SIGNAL_BASE_MAX_DRAWDOWN, SIGNAL_BASE_PRICE, SIGNAL_BASE_ROI };
// OnStart event handler
void OnStart() {
int nSinglsTotal = SignalBaseTotal();
if( nSinglsTotal > 0 ) {
int hSignalsFile=FileOpen( sFileName, FILE_WRITE | FILE_CSV | FILE_ANSI, "", CP_UTF8 );
if( hSignalsFile != INVALID_HANDLE ) {
FileWriteString( hSignalsFile, sField( "INDEX", false ) );
for( int i = 0; i < ArraySize( g_eStringProperty ); i++ )
FileWriteString( hSignalsFile, eField( g_eStringProperty[ i ] ) );
for( int i = 0; i < ArraySize( g_eDateProperty ); i++ )
FileWriteString( hSignalsFile, eField( g_eDateProperty[ i ] ) );
for( int i = 0; i < ArraySize( g_eIntegerProperty ); i++ )
FileWriteString( hSignalsFile, eField( g_eIntegerProperty[ i ] ) );
for( int i = 0; i < ArraySize( g_eDoubleProperty ); i++ )
FileWriteString( hSignalsFile, eField( g_eDoubleProperty[ i ] ) );
FileWriteString( hSignalsFile, "\n" );
for( int j = 0; j < nSinglsTotal; j++ ) {
if( SignalBaseSelect( j ) ) {
FileWriteString( hSignalsFile, (string) j );
for( int i = 0; i < ArraySize( g_eStringProperty ); i++ )
FileWriteString( hSignalsFile, sField( SignalBaseGetString( g_eStringProperty[ i ] ) ) );
for( int i = 0; i < ArraySize( g_eDateProperty ); i++ )
FileWriteString( hSignalsFile, dtField( SignalBaseGetInteger( g_eDateProperty[ i ] ) ) );
for( int i = 0; i < ArraySize( g_eIntegerProperty ); i++ )
FileWriteString( hSignalsFile, lField( SignalBaseGetInteger( g_eIntegerProperty[ i ] ) ) );
for( int i = 0; i < ArraySize( g_eDoubleProperty ); i++ )
FileWriteString( hSignalsFile, dbField( SignalBaseGetDouble( g_eDoubleProperty[ i ] ) ) );
};
FileWriteString( hSignalsFile, "\n" );
};
FileClose( hSignalsFile );
}
else
Print( "Invalid file handle!" );
}
else
Print( "No Signals!" );
};
// Supprt functions
string sField( string sValue, bool bDelimeter = true ) { return ( bDelimeter ? sDelimeter : "" ) + sValue; };
string lField( long lValue, bool bDelimeter = true ) { return sField( IntegerToString( lValue ), bDelimeter ); };
string dtField( datetime dtValue, bool bDelimeter = true ) {
string sValue = TimeToString( dtValue );
StringReplace( sValue, ".", sDate );
return sField( sValue, bDelimeter ); };
string dbField( double dbValue, bool bDelimeter = true ) {
string sValue = DoubleToString( dbValue, nDigits );
StringReplace( sValue, ".", sDecimal );
return sField( sValue, bDelimeter ); };
template<typename T>
string eField( T eValue, bool bDelimeter = true ) {
string sValue = EnumToString( eValue );
StringReplace( sValue, "SIGNAL_BASE_", "" );
return sField( sValue, bDelimeter ); };