mql5/Experts/Advisors/DualEA/Include/FileBasedFeatureExport.mqh
Princeec13 d8462d71d6
2026-01-14 16:17:00 -05:00

133 lines
3.6 KiB
MQL5

// FileBasedFeatureExport.mqh
// Alternative to DLL-based feature export for strategy tester compatibility
#ifndef FILE_BASED_FEATURE_EXPORT_MQH
#define FILE_BASED_FEATURE_EXPORT_MQH
#include <Files\FileBin.mqh>
class CFileBasedFeatureExport
{
private:
string m_base_dir;
int m_file_counter;
public:
CFileBasedFeatureExport()
{
m_base_dir = "";
m_file_counter = 0;
// Using FILE_COMMON for all writes; no directory creation needed
}
~CFileBasedFeatureExport()
{
}
// Export feature batch to file (replaces DLL function)
int ExportFeatureBatch(const uchar &pb_bytes[], int pb_len, uchar &out_path[], int out_path_len)
{
// Validate input parameters
if (pb_len <= 0)
{
return -1; // Invalid input
}
// Generate timestamped filename
string filename = GenerateTimestampedFilename();
string full_path = filename;
// Write binary data to file
CFileBin file;
if (!file.Open(full_path, FILE_BIN | FILE_WRITE | FILE_COMMON))
{
Print("Failed to open file for writing: ", full_path);
return -3; // Failed to open file
}
// Write the binary data using proper MQL5 method
for(int i = 0; i < pb_len; i++)
{
file.WriteChar((char)pb_bytes[i]);
}
file.Close();
// Copy the output path to the provided buffer
int path_len = StringLen(full_path);
if (ArraySize(out_path) > path_len)
{
StringToCharArray(full_path, out_path);
out_path[path_len] = 0; // Null terminator
}
Print("Feature batch exported to: ", full_path);
return 0; // Success
}
// Alternative method for string-based features (more common in MQL5)
int ExportStringFeatures(const string &features[], int feature_count, string &out_path)
{
if (feature_count <= 0)
{
return -1; // Invalid input
}
// Generate timestamped filename
string filename = GenerateTimestampedFilename();
string full_path = filename;
// Write features as text file
int file_handle = FileOpen(full_path, FILE_WRITE | FILE_TXT | FILE_COMMON);
if (file_handle == INVALID_HANDLE)
{
Print("Failed to open file for writing: ", full_path);
return -3; // Failed to open file
}
// Write each feature on a new line
for (int i = 0; i < feature_count; i++)
{
FileWriteString(file_handle, features[i]);
FileWriteString(file_handle, "\n");
}
FileClose(file_handle);
out_path = full_path;
Print("String features exported to: ", full_path);
return 0; // Success
}
// Get version info (replaces DLL function)
int GetFeatureExportVersion(string &version)
{
version = "1.0.0 (File-Based)";
return 0; // Success
}
private:
void CreateDirectoryStructure()
{
// No-op when using FILE_COMMON storage
}
string GenerateTimestampedFilename()
{
datetime now = TimeCurrent();
MqlDateTime dt;
TimeToStruct(now, dt);
m_file_counter++;
return StringFormat("feature_batch_%04d%02d%02d_%02d%02d%02d_%03d.txt",
dt.year, dt.mon, dt.day,
dt.hour, dt.min, dt.sec,
m_file_counter % 1000);
}
};
// Global instance for easy access
CFileBasedFeatureExport g_file_exporter;
#endif // FILE_BASED_FEATURE_EXPORT_MQH