2026-10-28 00:30:38 -04:00 | | | #include "RuntimeStorage.mqh"
|
2026-01-14 16:17:00 -05:00 | | | // 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;
|
2026-10-28 00:30:38 -04:00 | | | // Using DUALEA_FILE_COMMON for all writes; no directory creation needed
|
2026-01-14 16:17:00 -05:00 | | | }
|
| | |
|
| | | ~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;
|
2026-10-28 00:30:38 -04:00 | | | if (!file.Open(full_path, FILE_BIN | FILE_WRITE | DUALEA_FILE_COMMON))
|
2026-01-14 16:17:00 -05:00 | | | {
|
| | | 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
|
2026-10-28 00:30:38 -04:00 | | | int file_handle = FileOpen(full_path, FILE_WRITE | FILE_TXT | DUALEA_FILE_COMMON);
|
2026-01-14 16:17:00 -05:00 | | | 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()
|
| | | {
|
2026-10-28 00:30:38 -04:00 | | | // No-op when using DUALEA_FILE_COMMON storage
|
2026-01-14 16:17:00 -05:00 | | | }
|
| | |
|
| | | 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
|