Add files via upload

This commit is contained in:
amirghadiri1987
2025-02-07 19:13:59 +03:30
committed by GitHub
parent 56b382609f
commit e829dab822
91 changed files with 9355 additions and 0 deletions
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
+27
View File
@@ -0,0 +1,27 @@
//+------------------------------------------------------------------+
//| Element.mqh |
//| Copyright 2023, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link "https://www.mql5.com"
//+------------------------------------------------------------------+
//| defines |
//+------------------------------------------------------------------+
// #define MacrosHello "Hello, world!"
// #define MacrosYear 2010
//+------------------------------------------------------------------+
//| DLL imports |
//+------------------------------------------------------------------+
// #import "user32.dll"
// int SendMessageA(int hWnd,int Msg,int wParam,int lParam);
// #import "my_expert.dll"
// int ExpertRecalculate(int wParam,int lParam);
// #import
//+------------------------------------------------------------------+
//| EX5 imports |
//+------------------------------------------------------------------+
// #import "stdlib.ex5"
// string ErrorDescription(int error_code);
// #import
//+------------------------------------------------------------------+
+659
View File
@@ -0,0 +1,659 @@
//+------------------------------------------------------------------+
//| OpenCL.mqh |
//| Copyright 2000-2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Class for working with OpenCL |
//+------------------------------------------------------------------+
class COpenCL
{
protected:
int m_context;
int m_program;
//--- kernel
string m_kernel_names[];
int m_kernels[];
int m_kernels_total;
//--- buffers
int m_buffers[];
int m_buffers_total;
string m_device_extensions;
bool m_support_cl_khr_fp64;
public:
//--- constructor/destructor
COpenCL();
~COpenCL();
//--- get handles
int GetContext(void) const { return(m_context); }
int GetProgram(void) const { return(m_program); }
int GetKernel(const int kernel_index) const;
string GetKernelName(const int kernel_index) const;
//--- global and local memory size
bool GetGlobalMemorySize(long &global_memory_size);
bool GetLocalMemorySize(long &local_memory_size);
//--- maximal workgroup size
bool GetMaxWorkgroupSize(long &max_workgroup_size);
//--- check support working with double
bool SupportDouble(void) const { return(m_support_cl_khr_fp64); }
//--- initialization and shutdown
bool Initialize(const string program,const bool show_log=true);
bool ContextCreate(const int device=CL_USE_ANY);
bool ProgramCreate(const string program,const bool show_log=true);
void ContextClean(void);
void Shutdown(void);
//--- set buffers/kernels count
bool SetBuffersCount(const int total_buffers);
bool SetKernelsCount(const int total_kernels);
//--- kernel operations
bool KernelCreate(const int kernel_index,const string kernel_name);
bool KernelFree(const int kernel_index);
//--- device and kernel info
long GetDeviceInfo(const int prop);
long GetDeviceInfoInteger(ENUM_OPENCL_PROPERTY_INTEGER prop);
long GetKernelInfoInteger(const int kernel_index,ENUM_OPENCL_PROPERTY_INTEGER prop);
//--- buffer operations
bool BufferCreate(const int buffer_index,const uint size_in_bytes,const uint flags);
bool BufferFree(const int buffer_index);
template<typename T>
bool BufferFromArray(const int buffer_index,T &data[],const uint data_array_offset,const uint data_array_count,const uint flags);
template<typename T>
bool BufferFromMatrix(const int buffer_index,matrix<T> &data,const uint flags);
template<typename T>
bool BufferFromVector(const int buffer_index,vector<T> &data,const uint flags);
template<typename T>
bool BufferToMatrix(const int buffer_index,matrix<T> &data,const ulong rows=-1,const ulong cols=-1);
template<typename T>
bool BufferToVector(const int buffer_index,vector<T> &data,const ulong size=-1);
template<typename T>
bool BufferRead(const int buffer_index,T &data[],const uint cl_buffer_offset,const uint data_array_offset,const uint data_array_count);
template<typename T>
bool BufferWrite(const int buffer_index,T &data[],const uint cl_buffer_offset,const uint data_array_offset,const uint data_array_count);
//--- set kernel arguments
template<typename T>
bool SetArgument(const int kernel_index,const int arg_index,T value);
bool SetArgumentBuffer(const int kernel_index,const int arg_index,const int buffer_index);
bool SetArgumentLocalMemory(const int kernel_index,const int arg_index,const int local_memory_size);
//--- kernel execution
bool Execute(const int kernel_index,const int work_dim,const uint &work_offset[],const uint &work_size[]);
bool Execute(const int kernel_index,const int work_dim,const uint &work_offset[],const uint &work_size[],const uint &local_work_size[]);
};
//+------------------------------------------------------------------+
//| COpenCL class constructor |
//+------------------------------------------------------------------+
COpenCL::COpenCL()
{
m_context=INVALID_HANDLE;
m_program=INVALID_HANDLE;
m_buffers_total=0;
m_kernels_total=0;
m_device_extensions="";
m_support_cl_khr_fp64=false;
}
//+------------------------------------------------------------------+
//| COpenCL class destructor |
//+------------------------------------------------------------------+
COpenCL::~COpenCL()
{
Shutdown();
}
//+------------------------------------------------------------------+
//| GetKernel |
//+------------------------------------------------------------------+
int COpenCL::GetKernel(const int kernel_index) const
{
if(m_kernels_total<=0 || kernel_index<0 || kernel_index>=m_kernels_total)
return(INVALID_HANDLE);
//---
return m_kernels[kernel_index];
}
//+------------------------------------------------------------------+
//| GetKernelName |
//+------------------------------------------------------------------+
string COpenCL::GetKernelName(const int kernel_index) const
{
if(m_kernels_total<=0 || kernel_index<0 || kernel_index>=m_kernels_total)
return("");
//---
return m_kernel_names[kernel_index];
}
//+------------------------------------------------------------------+
//| GetGlobalMemorySize |
//+------------------------------------------------------------------+
bool COpenCL::GetGlobalMemorySize(long &global_memory_size)
{
if(m_context==INVALID_HANDLE)
return(false);
//--- get global memory size
global_memory_size=CLGetInfoInteger(m_context,CL_DEVICE_GLOBAL_MEM_SIZE);
if(global_memory_size==-1)
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| GetLocalMemorySize |
//+------------------------------------------------------------------+
bool COpenCL::GetLocalMemorySize(long &local_memory_size)
{
if(m_context==INVALID_HANDLE)
return(false);
//--- get local memory size
local_memory_size=CLGetInfoInteger(m_context,CL_DEVICE_LOCAL_MEM_SIZE);
if(local_memory_size==-1)
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| GetMaxWorkgroupSize |
//+------------------------------------------------------------------+
bool COpenCL::GetMaxWorkgroupSize(long &max_workgroup_size)
{
if(m_context==INVALID_HANDLE)
return(false);
//--- get maximal workgroup size
max_workgroup_size=CLGetInfoInteger(m_context,CL_DEVICE_MAX_WORK_GROUP_SIZE);
if(max_workgroup_size==-1)
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| Initialize |
//+------------------------------------------------------------------+
bool COpenCL::Initialize(const string program,const bool show_log)
{
if(!ContextCreate(CL_USE_ANY))
return(false);
return(ProgramCreate(program,show_log));
}
//+------------------------------------------------------------------+
//| ContextCreate |
//+------------------------------------------------------------------+
bool COpenCL::ContextCreate(const int device)
{
if((m_context=CLContextCreate(device))==INVALID_HANDLE)
{
Print("OpenCL not found. Error code=",GetLastError());
return(false);
}
//--- check support working with doubles (cl_khr_fp64)
if(CLGetInfoString(m_context,CL_DEVICE_EXTENSIONS,m_device_extensions))
{
string extenstions[];
StringSplit(m_device_extensions,' ',extenstions);
m_support_cl_khr_fp64=false;
int size=ArraySize(extenstions);
for(int i=0; i<size; i++)
{
if(extenstions[i]=="cl_khr_fp64")
m_support_cl_khr_fp64=true;
}
}
//---
return(true);
}
//+------------------------------------------------------------------+
//| ProgramCreate |
//+------------------------------------------------------------------+
bool COpenCL::ProgramCreate(const string program,const bool show_log)
{
//--- compile the program
string build_error_log;
if((m_program=CLProgramCreate(m_context,program,build_error_log))==INVALID_HANDLE)
{
if(show_log)
{
string loglines[];
StringSplit(build_error_log,'\n',loglines);
int lines_count=ArraySize(loglines);
for(int i=0; i<lines_count; i++)
Print(loglines[i]);
}
CLContextFree(m_context);
Print("OpenCL program create failed. Error code=",GetLastError());
return(false);
}
//---
return(true);
}
//+------------------------------------------------------------------+
//| ContextClean |
//+------------------------------------------------------------------+
void COpenCL::ContextClean()
{
//--- remove buffers
if(m_buffers_total>0)
{
for(int i=0; i<m_buffers_total; i++)
BufferFree(i);
m_buffers_total=0;
}
//--- remove buffers
if(m_kernels_total>0)
{
for(int i=0; i<m_kernels_total; i++)
KernelFree(i);
m_kernels_total=0;
}
//--- remove program
if(m_program!=INVALID_HANDLE)
{
CLProgramFree(m_program);
m_program=INVALID_HANDLE;
}
}
//+------------------------------------------------------------------+
//| Shutdown |
//+------------------------------------------------------------------+
void COpenCL::Shutdown()
{
ContextClean();
//--- remove context
if(m_context!=INVALID_HANDLE)
{
CLContextFree(m_context);
m_context=INVALID_HANDLE;
}
}
//+------------------------------------------------------------------+
//| SetBuffersCount |
//+------------------------------------------------------------------+
bool COpenCL::SetBuffersCount(const int total_buffers)
{
if(total_buffers<=0)
return(false);
//---
m_buffers_total=total_buffers;
if(ArraySize(m_buffers)<m_buffers_total)
ArrayResize(m_buffers,m_buffers_total);
for(int i=0; i<m_buffers_total; i++)
m_buffers[i]=INVALID_HANDLE;
//---
return(true);
}
//+------------------------------------------------------------------+
//| SetKernelsCount |
//+------------------------------------------------------------------+
bool COpenCL::SetKernelsCount(const int total_kernels)
{
if(total_kernels<=0)
return(false);
//---
m_kernels_total=total_kernels;
if(ArraySize(m_kernels)<m_kernels_total)
ArrayResize(m_kernels,m_kernels_total);
if(ArraySize(m_kernel_names)<m_kernels_total)
ArrayResize(m_kernel_names,m_kernels_total);
//---
for(int i=0; i<m_kernels_total; i++)
{
m_kernel_names[i]="";
m_kernels[i]=INVALID_HANDLE;
}
//---
return(true);
}
//+------------------------------------------------------------------+
//| KernelCreate |
//+------------------------------------------------------------------+
bool COpenCL::KernelCreate(const int kernel_index,const string kernel_name)
{
if(m_context==INVALID_HANDLE || m_program==INVALID_HANDLE)
return(false);
//--- check parameters
if(kernel_index<0 || kernel_index>=m_kernels_total)
return(false);
//---
int kernel_handle=m_kernels[kernel_index];
if(kernel_handle==INVALID_HANDLE || m_kernel_names[kernel_index]!=kernel_name)
{
//--- create kernel
if((kernel_handle=CLKernelCreate(m_program,kernel_name))==INVALID_HANDLE)
{
CLProgramFree(m_program);
CLContextFree(m_context);
Print("OpenCL kernel create failed. Error code=",GetLastError());
return(false);
}
else
{
m_kernels[kernel_index]=kernel_handle;
m_kernel_names[kernel_index]=kernel_name;
}
}
return(true);
}
//+------------------------------------------------------------------+
//| KernelFree |
//+------------------------------------------------------------------+
bool COpenCL::KernelFree(const int kernel_index)
{
//--- check kernel index
if(kernel_index<0 || kernel_index>=m_kernels_total)
return(false);
if(m_kernels[kernel_index]==INVALID_HANDLE)
return(false);
//--- free kernel handle
CLKernelFree(m_kernels[kernel_index]);
m_kernels[kernel_index]=INVALID_HANDLE;
//---
return(true);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
long COpenCL::GetDeviceInfo(const int prop)
{
if(m_context==INVALID_HANDLE)
return(-1);
uchar data[];
uint size;
if(!CLGetDeviceInfo(m_context,prop,data,size))
return(-1);
if(size<4)
return(-1);
union res_data
{
uchar cdata[8];
long ldata;
} res;
if(size<=8)
{
ZeroMemory(res);
ArrayCopy(res.cdata,data);
}
else
ArrayCopy(res.cdata,data,0,8);
return(res.ldata);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
long COpenCL::GetDeviceInfoInteger(ENUM_OPENCL_PROPERTY_INTEGER prop)
{
if(m_context==INVALID_HANDLE)
return(-1);
return(CLGetInfoInteger(m_context,prop));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
long COpenCL::GetKernelInfoInteger(const int kernel_index,ENUM_OPENCL_PROPERTY_INTEGER prop)
{
if(kernel_index<0 || kernel_index>=m_kernels_total)
return(-1);
return(CLGetInfoInteger(m_kernels[kernel_index],prop));
}
//+------------------------------------------------------------------+
//| BufferCreate |
//+------------------------------------------------------------------+
bool COpenCL::BufferCreate(const int buffer_index,const uint size_in_bytes,const uint flags)
{
//--- check parameters
if(buffer_index<0 || buffer_index>=m_buffers_total)
return(false);
if(m_context==INVALID_HANDLE)
return(false);
//---
int buffer_handle=CLBufferCreate(m_context,size_in_bytes,flags);
if(buffer_handle!=INVALID_HANDLE)
{
m_buffers[buffer_index]=buffer_handle;
return(true);
}
else
return(false);
}
//+------------------------------------------------------------------+
//| BufferFree |
//+------------------------------------------------------------------+
bool COpenCL::BufferFree(const int buffer_index)
{
//--- check buffer index
if(buffer_index<0 || buffer_index>=m_buffers_total)
return(false);
if(m_buffers[buffer_index]==INVALID_HANDLE)
return(false);
//--- free buffer handle
CLBufferFree(m_buffers[buffer_index]);
m_buffers[buffer_index]=INVALID_HANDLE;
//---
return(true);
}
//+------------------------------------------------------------------+
//| BufferFromArray |
//+------------------------------------------------------------------+
template<typename T>
bool COpenCL::BufferFromArray(const int buffer_index,T &data[],const uint data_array_offset,const uint data_array_count,const uint flags)
{
//--- check parameters
if(m_context==INVALID_HANDLE)
return(false);
if(buffer_index<0 || buffer_index>=m_buffers_total || data_array_count<=0)
return(false);
//--- buffer does not exists, create it
if(m_buffers[buffer_index]==INVALID_HANDLE)
{
uint size_in_bytes=data_array_count*sizeof(T);
int buffer_handle=CLBufferCreate(m_context,size_in_bytes,flags);
if(buffer_handle!=INVALID_HANDLE)
{
m_buffers[buffer_index]=buffer_handle;
}
else
return(false);
}
//--- write data to OpenCL buffer
uint data_written=CLBufferWrite(m_buffers[buffer_index],data,0,data_array_offset,data_array_count);
if(data_written!=data_array_count)
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| BufferWriteFromMatrix |
//+------------------------------------------------------------------+
template<typename T>
bool COpenCL::BufferFromMatrix(const int buffer_index,matrix<T> &data,const uint flags)
{
//--- check parameters
if(m_context==INVALID_HANDLE)
return(false);
if(buffer_index<0 || buffer_index>=m_buffers_total || data.Rows()==0 || data.Cols()==0)
return(false);
uint matrix_size=uint(data.Rows()*data.Cols());
//--- buffer does not exists, create it
if(m_buffers[buffer_index]==INVALID_HANDLE)
{
uint size_in_bytes=matrix_size*sizeof(T);
int buffer_handle=CLBufferCreate(m_context,size_in_bytes,flags);
if(buffer_handle!=INVALID_HANDLE)
m_buffers[buffer_index]=buffer_handle;
else
return(false);
}
//--- write data to OpenCL buffer
return(CLBufferWrite(m_buffers[buffer_index],0,data));
}
//+------------------------------------------------------------------+
//| BufferWriteFromVector |
//+------------------------------------------------------------------+
template<typename T>
bool COpenCL::BufferFromVector(const int buffer_index,vector<T> &data,const uint flags)
{
//--- check parameters
if(m_context==INVALID_HANDLE)
return(false);
if(buffer_index<0 || buffer_index>=m_buffers_total || data.Size()==0)
return(false);
//--- buffer does not exists, create it
if(m_buffers[buffer_index]==INVALID_HANDLE)
{
uint size_in_bytes=(uint)data.Size()*sizeof(T);
int buffer_handle=CLBufferCreate(m_context,size_in_bytes,flags);
if(buffer_handle!=INVALID_HANDLE)
m_buffers[buffer_index]=buffer_handle;
else
return(false);
}
//--- write data to OpenCL buffer
return(CLBufferWrite(m_buffers[buffer_index],0,data));
}
//+------------------------------------------------------------------+
//| BufferReadToMatrix |
//+------------------------------------------------------------------+
template<typename T>
bool COpenCL::BufferToMatrix(const int buffer_index,matrix<T> &data,const ulong rows,const ulong cols)
{
//--- check parameters
if(buffer_index<0 || buffer_index>=m_buffers_total)
return(false);
if(m_buffers[buffer_index]==INVALID_HANDLE)
return(false);
if(m_context==INVALID_HANDLE || m_program==INVALID_HANDLE)
return(false);
//--- read data from OpenCL buffer
return(CLBufferRead(m_buffers[buffer_index],0,data,rows,cols));
}
//+------------------------------------------------------------------+
//| BufferReadToVector |
//+------------------------------------------------------------------+
template<typename T>
bool COpenCL::BufferToVector(const int buffer_index,vector<T> &data,const ulong size)
{
//--- check parameters
if(buffer_index<0 || buffer_index>=m_buffers_total)
return(false);
if(m_buffers[buffer_index]==INVALID_HANDLE)
return(false);
if(m_context==INVALID_HANDLE || m_program==INVALID_HANDLE)
return(false);
//--- read data from OpenCL buffer
return(CLBufferRead(m_buffers[buffer_index],0,data,size));
}
//+------------------------------------------------------------------+
//| BufferRead |
//+------------------------------------------------------------------+
template<typename T>
bool COpenCL::BufferRead(const int buffer_index,T &data[],const uint cl_buffer_offset,const uint data_array_offset,const uint data_array_count)
{
//--- check parameters
if(buffer_index<0 || buffer_index>=m_buffers_total || data_array_count<=0)
return(false);
if(m_buffers[buffer_index]==INVALID_HANDLE)
return(false);
if(m_context==INVALID_HANDLE || m_program==INVALID_HANDLE)
return(false);
//--- read data from OpenCL buffer
uint data_read=CLBufferRead(m_buffers[buffer_index],data,cl_buffer_offset,data_array_offset,data_array_count);
if(data_read!=data_array_count)
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| BufferWrite |
//+------------------------------------------------------------------+
template<typename T>
bool COpenCL::BufferWrite(const int buffer_index,T &data[],const uint cl_buffer_offset,const uint data_array_offset,const uint data_array_count)
{
//--- check parameters
if(buffer_index<0 || buffer_index>=m_buffers_total || data_array_count<=0)
return(false);
if(m_buffers[buffer_index]==INVALID_HANDLE)
return(false);
if(m_context==INVALID_HANDLE)
return(false);
//--- write data to OpenCL buffer
uint data_written=CLBufferWrite(m_buffers[buffer_index],data,cl_buffer_offset,data_array_offset,data_array_count);
if(data_written!=data_array_count)
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| SetArgument |
//+------------------------------------------------------------------+
template<typename T>
bool COpenCL::SetArgument(const int kernel_index,const int arg_index,T value)
{
if(kernel_index<0 || kernel_index>=m_kernels_total)
return(false);
int kernel_handle=m_kernels[kernel_index];
if(kernel_handle==INVALID_HANDLE)
return(false);
//---
return CLSetKernelArg(kernel_handle,arg_index,value);
}
//+------------------------------------------------------------------+
//| SetArgumentBuffer |
//+------------------------------------------------------------------+
bool COpenCL::SetArgumentBuffer(const int kernel_index,const int arg_index,const int buffer_index)
{
if(m_context==INVALID_HANDLE || m_program==INVALID_HANDLE)
return(false);
if(kernel_index<0 || kernel_index>=m_kernels_total)
return(false);
if(buffer_index<0 || buffer_index>=m_buffers_total)
return(false);
if(m_buffers[buffer_index]==INVALID_HANDLE)
return(false);
//---
return CLSetKernelArgMem(m_kernels[kernel_index],arg_index,m_buffers[buffer_index]);
}
//+------------------------------------------------------------------+
//| SetArgumentLocalMemory |
//+------------------------------------------------------------------+
bool COpenCL::SetArgumentLocalMemory(const int kernel_index,const int arg_index,const int local_memory_size)
{
if(m_context==INVALID_HANDLE || m_program==INVALID_HANDLE)
return(false);
if(kernel_index<0 || kernel_index>=m_kernels_total)
return(false);
//--- check device local memory size
long device_local_memory_size=CLGetInfoInteger(m_context,CL_DEVICE_LOCAL_MEM_SIZE);
if(local_memory_size>device_local_memory_size)
return(false);
//---
return CLSetKernelArgMemLocal(m_kernels[kernel_index],arg_index,local_memory_size);
}
//+------------------------------------------------------------------+
//| Execute |
//+------------------------------------------------------------------+
bool COpenCL::Execute(const int kernel_index,const int work_dim,const uint &work_offset[],const uint &work_size[])
{
if(kernel_index<0 || kernel_index>=m_kernels_total)
return(false);
int kernel_handle=m_kernels[kernel_index];
if(kernel_handle==INVALID_HANDLE)
return(false);
//---
return CLExecute(kernel_handle,work_dim,work_offset,work_size);
}
//+------------------------------------------------------------------+
//| Execute |
//+------------------------------------------------------------------+
bool COpenCL::Execute(const int kernel_index,const int work_dim,const uint &work_offset[],const uint &work_size[],const uint &local_work_size[])
{
if(kernel_index<0 || kernel_index>=m_kernels_total)
return(false);
//---
return CLExecute(m_kernels[kernel_index],work_dim,work_offset,work_size,local_work_size);
}
//+------------------------------------------------------------------+
+124
View File
@@ -0,0 +1,124 @@
/*
LicenceFileCheck.mqh
Copyright 2021, Orchard Forex
https://www.orchardforex.com
*/
#property copyright "Copyright 2013-2020, Orchard Forex"
#property link "https://www.orchardforex.com"
#property version "1.00"
class CLicenceFile {
protected:
string mProductName;
string mProductKey;
string mData;
virtual bool LoadData( string &data );
virtual string LicencePath();
public:
CLicenceFile( string productName, string productKey );
~CLicenceFile() {}
bool Check();
string KeyGen( string data ); // Allow account to pass in
string Hash( string data );
bool FileGen( string data );
void chekload2(string &dat1) {LoadData(dat1);}
string GetData() { return ( mData ); }
};
CLicenceFile::CLicenceFile( string productName, string productKey ) {
mProductName = productName;
mProductKey = productKey;
}
string CLicenceFile::LicencePath() { return ( "Orchard\\Licence\\" + mProductName + ".lic" ); }
bool CLicenceFile::Check() {
mData = "";
string data = "";
if ( !LoadData( data ) ) return false;
int pos = StringFind( data, "\n" );
if ( pos <= 0 ) {
Print( "Licence file is not valid" );
return ( false );
}
string signature = StringSubstr( data, 0, pos );
mData = StringSubstr( data, pos + 1 );
Print("mdata ",mData," sign ",signature);
string key = KeyGen( mData );
if ( key != signature ) {
Print( "Licence is invalid" );
return ( false );
}
return ( true );
}
bool CLicenceFile::LoadData( string &data ) {
Print("load 02");
string licencePath = LicencePath();
// Open and read the file each time in case it has been modified between iterations
int handle = FileOpen( licencePath, FILE_READ | FILE_BIN | FILE_ANSI );
if ( handle == INVALID_HANDLE ) {
PrintFormat( "Could not open licence file %s", licencePath );
return ( false );
}
int len = ( int )FileSize( handle );
data = FileReadString( handle, len );
FileClose( handle );
Print("load 02 2");
return true;
}
string CLicenceFile::KeyGen( string data ) {
string keyString = data + mProductKey;
return Hash( keyString );
}
string CLicenceFile::Hash( string data ) {
uchar dataChar[];
StringToCharArray( data, dataChar, 0, StringLen( data ) );
uchar cryptChar[];
CryptEncode( CRYPT_HASH_SHA256, dataChar, dataChar, cryptChar );
string result = "";
int count = ArraySize( cryptChar );
for ( int i = 0; i < count; i++ ) {
result += StringFormat( "%.2x", cryptChar[i] );
}
return result;
}
bool CLicenceFile::FileGen( string data ) {
string licencePath = LicencePath();
int handle = FileOpen( licencePath, FILE_WRITE | FILE_BIN | FILE_ANSI );
if ( handle == INVALID_HANDLE ) {
PrintFormat( "Could not create licence file %s", licencePath );
return ( false );
}
string signature = KeyGen( data );
string contents = signature + "\n" + data;
FileWriteString( handle, contents );
FileFlush( handle );
FileClose( handle );
Print( "Licence file '" + licencePath + "' created" );
return ( true );
}
+97
View File
@@ -0,0 +1,97 @@
/*
LicenceWebCheck.mqh
Copyright 2021, Orchard Forex
https://www.orchardforex.com
*/
#property copyright "Copyright 2013-2020, Orchard Forex"
#property link "https://www.orchardforex.com"
#property version "1.00"
// this is important for MT4
#property strict
#include "LicenceFileCheck.mqh"
class CLicenceWeb : public CLicenceFile {
protected:
string mAccount;
string mRegistration;
virtual bool LoadData( string &data );
virtual string LicencePath();
public:
CLicenceWeb( string productName, string productKey, string registration, long account = -1 );
~CLicenceWeb() {}
void SetRegistration();
void chekload1(string &dat1) {LoadData(dat1);}
};
CLicenceWeb::CLicenceWeb( string productName, string productKey, string registration, long account = -1 ) : CLicenceFile( productName, productKey ) {
mRegistration = registration;
if ( account < 0 ) {
account = AccountInfoInteger( ACCOUNT_LOGIN );
}
mAccount = string( account );
string data2;
chekload2(data2);
Print("data 2",data2);
}
void CLicenceWeb::SetRegistration() { mRegistration = Hash( mProductName + "_" + mAccount ); }
string CLicenceWeb::LicencePath() { return ( "Orchard\\Licence\\" + Hash( mProductName + "_" + mAccount ) + ".lic" ); }
bool CLicenceWeb::LoadData( string &data ) {
Print("load 01");
string headers = "";
char postData[];
char resultData[];
string resultHeaders;
int timeout = 5000; // 1 second, may be too short for a slow connection
string url = "https://raw.githubusercontent.com";
// string api = StringFormat( "https://drive.google.com/uc?id=%s&export=download", mRegistration );
// string api = StringFormat( "%s/OrchardForexTutorials/Licence/raw/main/%s.txt", url, mRegistration );
string api = StringFormat( "%s/amirghadiri1987/License/refs/heads/main/%s.lic", url, mRegistration );
Print("api ",api);
ResetLastError();
int response = WebRequest( "GET", api, headers, timeout, postData, resultData, resultHeaders );
int errorCode = GetLastError();
// Add this code to handle 303 redirect but it creates more problems
// if (response==303) {
// int locStart = StringFind(resultHeaders, "Location: ", 0)+10;
// int locEnd = StringFind(resultHeaders, "\r", locStart);
// api = StringSubstr(resultHeaders, locStart, locEnd-locStart);
// ResetLastError();
// response = WebRequest( "GET", api, headers, timeout, postData, resultData, resultHeaders );
// errorCode = GetLastError();
//}
data = CharArrayToString( resultData );
switch ( response ) {
case -1:
Print( "Error in WebRequest. Error code =", errorCode );
Print( "Add the address " + url + " in the list of allowed URLs" );
return false;
break;
case 200:
//--- Success
return true;
break;
default:
PrintFormat( "Unexpected response code %i", response );
return false;
break;
}
return false;
}
+76
View File
@@ -0,0 +1,76 @@
/*
WebLicenceTest
Copyright 2021, Orchard Forex
https://www.orchardforex.com
*/
#include <Orchard/LicenceCheck/LicenceWebCheck.mqh>
input string InpProductName = "product1"; // Product name used in file name
input string InpProductKey = "key1"; // Secret product key
input int InpAccount = 123456; // Customer Account number
input bool InpTesting = false; // Is this a test
CLicenceWeb *licenceWeb;
void OnStart_() {
licenceWeb = new CLicenceWeb( InpProductName, InpProductKey, "", InpAccount );
licenceWeb.SetRegistration();
if ( !InpTesting ) {
Make();
}
else {
Test();
}
string data1;
licenceWeb.chekload1(data1);
Print("data1 ",data1);
delete licenceWeb;
}
void Make() {
// Just making up some data here
// You could use anything that works for you
// Account number, expiry time, grace expiry time
string data = licenceWeb.Hash( string( InpAccount ) ) + "\n" + licenceWeb.Hash( InpProductName ) + "\n" + TimeToString( TimeCurrent() + ( 86400 * 30 ) ) + "\n" +
TimeToString( TimeCurrent() + ( 86400 * 33 ) );
// Not necessary to do this, just for demonstration
string signature = licenceWeb.KeyGen( data );
Print( "The signature is " + signature );
// Create the file to ship to the customer
if ( !licenceWeb.FileGen( data ) ) {
Print( "Failed to create licence file" );
return;
}
Print( "Created licence file" );
}
void Test() {
Print( "Now testing licence" );
if ( !licenceWeb.Check() ) {
Print( "Oops, problem with the licence" );
return;
}
Print( "Valid Licence" );
string parts[];
string licenceData = licenceWeb.GetData();
StringSplit( licenceData, '\n', parts );
PrintFormat( "Account=%s, %s", parts[0], ( parts[0] == licenceWeb.Hash( string( InpAccount ) ) ) ? "correct" : "fail" );
PrintFormat( "Product=%s, %s", parts[1], ( parts[1] == licenceWeb.Hash( InpProductName ) ) ? "correct" : "fail" );
PrintFormat( "Expires at %s", parts[2] );
PrintFormat( "Grace expires at %s", parts[3] );
}
// bnH1yjYYpwp+dBDfzfvgUzmOGVhtv6hTHeYX7MwVhcQ=.lic
// bnH1yjYYpwp+dBDfzfvgUzmOGVhtv6hTHeYX7MwVhcQ=
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
+163
View File
@@ -0,0 +1,163 @@
//+------------------------------------------------------------------+
//| PlotBase.mqh |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//---
#include <Graphics\Graphic.mqh>
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CPlotBase : public CGraphic
{
protected:
long m_chart_id; // chart ID
int m_subwin; // chart subwindow
public:
CPlotBase();
~CPlotBase();
//---
virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int size);
virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
virtual bool SetTimeseriesColor(uint clr, uint timeserie=0);
//---
// virtual void TextUp(string text, uint clr);
// virtual void TextDown(string text, uint clr);
// virtual void TextLeft(string text, uint clr);
// virtual void TextRight(string text, uint clr);
//--- geometry
virtual bool Shift(const int dx,const int dy);
//--- state
virtual bool Show(void);
virtual bool Hide(void);
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CPlotBase::CPlotBase()
{
HistoryNameWidth(0);
HistorySymbolSize(0);
m_x.MaxLabels(3);
m_y.MaxLabels(3);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CPlotBase::~CPlotBase()
{
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CPlotBase::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int size)
{
int x2=x1+size;
int y2=y1+size;
return Create(chart,name,subwin,x1,y1,x2,y2);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CPlotBase::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
{
if(!CGraphic::Create(chart,name,subwin,x1,y1,x2,y2))
return false;
m_chart_id=chart;
m_subwin=subwin;
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CPlotBase::SetTimeseriesColor(uint clr,uint timeserie=0)
{
if((int)timeserie>=m_arr_curves.Total())
return false;
//---
CCurve *curve=m_arr_curves.At(timeserie);
if(CheckPointer(curve)==POINTER_INVALID)
return false;
//---
curve.Color(clr);
//---
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
// CPlotBase::TextUp(string text, uint clr)
// {
// // m_canvas.FontAngleSet(0);
// // TextAdd(m_width/2,1,text,clr,TA_CENTER|TA_TOP);
// }
// //+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
// CPlotBase::TextDown(string text, uint clr)
// {
// m_canvas.FontAngleSet(0);
// TextAdd(m_width/2,m_height-1,text,clr,TA_CENTER|TA_BOTTOM);
// }
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
// CPlotBase::TextLeft(string text, uint clr)
// {
// m_canvas.FontAngleSet(900);
// TextAdd(1,m_height/2,text,clr,TA_CENTER|TA_TOP);
// }
// //+------------------------------------------------------------------+
// //| |
// //+------------------------------------------------------------------+
// CPlotBase::TextRight(string text, uint clr)
// {
// m_canvas.FontAngleSet(900);
// TextAdd(m_width-1,m_height/2,text,clr,TA_CENTER|TA_BOTTOM);
// }
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CPlotBase::Show(void)
{
string obj_name=ChartObjectName();
if(obj_name==NULL || ObjectFind(m_chart_id,obj_name)<0)
return false;
if(!ObjectSetInteger(m_chart_id,obj_name,OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS))
return false;
Update(false);
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CPlotBase::Hide(void)
{
string obj_name=ChartObjectName();
if(obj_name==NULL || ObjectFind(m_chart_id,obj_name)<0)
return false;
return ObjectSetInteger(m_chart_id,obj_name,OBJPROP_TIMEFRAMES,OBJ_NO_PERIODS);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CPlotBase::Shift(const int dx,const int dy)
{
string obj_name=ChartObjectName();
if(obj_name==NULL || ObjectFind(m_chart_id,obj_name)<0)
return false;
//---
int x=(int)ObjectGetInteger(m_chart_id,obj_name,OBJPROP_XDISTANCE)+dx;
int y=(int)ObjectGetInteger(m_chart_id,obj_name,OBJPROP_YDISTANCE)+dy;
if(!ObjectSetInteger(m_chart_id,obj_name,OBJPROP_XDISTANCE,x))
return false;
if(!ObjectSetInteger(m_chart_id,obj_name,OBJPROP_YDISTANCE,y))
return false;
//---
return true;
}
//+------------------------------------------------------------------+
+66
View File
@@ -0,0 +1,66 @@
//+------------------------------------------------------------------+
//| Scatter.mqh |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//---
#include "PlotBase.mqh"
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CScatter : public CPlotBase
{
public:
CScatter();
~CScatter();
//---
int AddTimeseries(const double &timeseries_1[],const double &timeseries_2[]);
bool UpdateTimeseries(const double &timeseries_1[],const double &timeseries_2[],uint timeserie=0);
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CScatter::CScatter()
{
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
CScatter::~CScatter()
{
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CScatter::AddTimeseries(const double &timeseries_1[],const double &timeseries_2[])
{
CCurve *curve=CGraphic::CurveAdd(timeseries_1,timeseries_2,CURVE_POINTS);
if(curve==NULL)
return -1;
curve.PointsSize(2);
curve.TrendLineVisible(true);
return (m_arr_curves.Total()-1);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CScatter::UpdateTimeseries(const double &timeseries_1[],const double &timeseries_2[], uint timeserie=0)
{
if((int)timeserie>=m_arr_curves.Total())
return false;
if(ArraySize(timeseries_1)!=ArraySize(timeseries_2) || ArraySize(timeseries_1)==0)
return false;
//---
CCurve *curve=m_arr_curves.At(timeserie);
if(CheckPointer(curve)==POINTER_INVALID)
return false;
//---
curve.Update(timeseries_1,timeseries_2);
//---
return true;
}
//+------------------------------------------------------------------+
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
+805
View File
@@ -0,0 +1,805 @@
//+------------------------------------------------------------------+
//| Colors.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Êëàññ äëÿ ðàáîòû ñ öâåòîì |
//+------------------------------------------------------------------+
class CColors
{
private:
double Arctan2(const double x,const double y);
double Hue_To_RGB(double v1,double v2,double vH);
public:
CColors();
~CColors();
//--- Ñïèñîê ôóíêöèé ñ ñàéòà > http://www.easyrgb.com/index.php?X=MATH
// start of list <
void RGBtoXYZ(const double aR,const double aG,const double aB,double &oX,double &oY,double &oZ);
void XYZtoRGB(const double aX,const double aY,const double aZ,double &oR,double &oG,double &oB);
void XYZtoYxy(const double aX,const double aY,const double aZ,double &oY,double &ox,double &oy);
void YxyToXYZ(const double aY,const double ax,const double ay,double &oX,double &oY,double &oZ);
void XYZtoHunterLab(const double aX,const double aY,const double aZ,double &oL,double &oa,double &ob);
void HunterLabToXYZ(const double aL,const double aa,const double ab,double &oX,double &oY,double &oZ);
void XYZtoCIELab(const double aX,const double aY,const double aZ,double &oCIEL,double &oCIEa,double &oCIEb);
void CIELabToXYZ(const double aCIEL,const double aCIEa,const double aCIEb,double &oX,double &oY,double &oZ);
void CIELabToCIELCH(const double aCIEL,const double aCIEa,const double aCIEb,double &oCIEL,double &oCIEC,double &oCIEH);
void CIELCHtoCIELab(const double aCIEL,const double aCIEC,const double aCIEH,double &oCIEL,double &oCIEa,double &oCIEb);
void XYZtoCIELuv(const double aX,const double aY,const double aZ,double &oCIEL,double &oCIEu,double &oCIEv);
void CIELuvToXYZ(const double aCIEL,const double aCIEu,const double aCIEv,double &oX,double &oY,double &oZ);
void RGBtoHSL(const double aR,const double aG,const double aB,double &oH,double &oS,double &oL);
void HSLtoRGB(const double aH,const double aS,const double aL,double &oR,double &oG,double &oB);
void RGBtoHSV(const double aR,const double aG,const double aB,double &oH,double &oS,double &oV);
void HSVtoRGB(const double aH,const double aS,const double aV,double &oR,double &oG,double &oB);
void RGBtoCMY(const double aR,const double aG,const double aB,double &oC,double &oM,double &oY);
void CMYtoRGB(const double aC,const double aM,const double aY,double &oR,double &oG,double &oB);
void CMYtoCMYK(const double aC,const double aM,const double aY,double &oC,double &oM,double &oY,double &oK);
void CMYKtoCMY(const double aC,const double aM,const double aY,const double aK,double &oC,double &oM,double &oY);
//--- > end of list
//
void ColorToRGB(const color aColor,double &aR,double &aG,double &aB);
double GetR(const color aColor);
double GetG(const color aColor);
double GetB(const color aColor);
color RGBToColor(const double aR,const double aG,const double aB);
color MixColors(const color aCol1,const color aCol2,const double aK);
void Gradient(color &aColors[],color &aOut[],int aOutCount,bool aCycle=false);
void RGBtoXYZsimple(double aR,double aG,double aB,double &oX,double &oY,double &oZ);
void XYZtoRGBsimple(const double aX,const double aY,const double aZ,double &oR,double &oG,double &oB);
color Negative(const color aColor);
color StandardColor(const color aColor,int &aIndex);
double RGBtoGray(double aR,double aG,double aB);
double RGBtoGraySimple(double aR,double aG,double aB);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CColors::CColors(void)
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CColors::~CColors(void)
{
}
//+------------------------------------------------------------------+
//| Arctan2 |
//+------------------------------------------------------------------+
double CColors::Arctan2(const double x,const double y)
{
if(y==0)
{
if(x<0)
return(M_PI);
//---
return(0);
}
else
{
if(x>0)
return(::MathArctan(y/x));
//---
if(x<0)
{
if(y>0)
return(::MathArctan(y/x)+M_PI);
//---
return(::MathArctan(y/x)-M_PI);
}
else
{
if(y<0)
return(-M_PI_2);
//---
return(M_PI_2);
}
}
}
//+------------------------------------------------------------------+
//| Hue_To_RGB |
//+------------------------------------------------------------------+
double CColors::Hue_To_RGB(double v1,double v2,double vH)
{
if(vH<0)
vH+=1.0;
if(vH>1.0)
vH-=1;
if((6.0*vH)<1.0)
return(v1+(v2-v1)*6.0*vH);
if((2.0*vH)<1.0)
return(v2);
if((3.0*vH)<2.0)
return(v1+(v2-v1)*((2.0/3.0)-vH)*6.0);
//---
return(v1);
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå RGB â XYZ |
//+------------------------------------------------------------------+
void CColors::RGBtoXYZ(const double aR,const double aG,const double aB,double &oX,double &oY,double &oZ)
{
double var_R=aR/255;
double var_G=aG/255;
double var_B=aB/255;
//---
if(var_R>0.04045)
var_R=::MathPow((var_R+0.055)/1.055,2.4);
else
var_R=var_R/12.92;
//---
if(var_G>0.04045)
var_G=::MathPow((var_G+0.055)/1.055,2.4);
else
var_G=var_G/12.92;
//---
if(var_B>0.04045)
var_B=::MathPow((var_B+0.055)/1.055,2.4);
else
var_B=var_B/12.92;
//---
var_R =var_R*100.0;
var_G =var_G*100.0;
var_B =var_B*100.0;
oX =var_R*0.4124+var_G*0.3576+var_B*0.1805;
oY =var_R*0.2126+var_G*0.7152+var_B*0.0722;
oZ =var_R*0.0193+var_G*0.1192+var_B*0.9505;
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå XYZ â RGB |
//+------------------------------------------------------------------+
void CColors::XYZtoRGB(const double aX,const double aY,const double aZ,double &oR,double &oG,double &oB)
{
double var_X =aX/100;
double var_Y =aY/100;
double var_Z =aZ/100;
double var_R =var_X*3.2406+var_Y*-1.5372+var_Z*-0.4986;
double var_G =var_X*(-0.9689)+var_Y*1.8758+var_Z*0.0415;
double var_B =var_X*0.0557+var_Y*(-0.2040)+var_Z*1.0570;
//---
if(var_R>0.0031308)
var_R=1.055*(::MathPow(var_R,1.0/2.4))-0.055;
else
var_R=12.92*var_R;
//---
if(var_G>0.0031308)
var_G=1.055*(::MathPow(var_G,1.0/2.4))-0.055;
else
var_G=12.92*var_G;
//---
if(var_B>0.0031308)
var_B=1.055*(::MathPow(var_B,1.0/2.4))-0.055;
else
var_B=12.92*var_B;
//---
oR =var_R*255.0;
oG =var_G*255.0;
oB =var_B*255.0;
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå XYZ â Yxy |
//+------------------------------------------------------------------+
void CColors::XYZtoYxy(const double aX,const double aY,const double aZ,double &oY,double &ox,double &oy)
{
oY =aY;
ox =aX/(aX+aY+aZ);
oy =aY/(aX+aY+aZ);
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå Yxy â XYZ |
//+------------------------------------------------------------------+
void CColors::YxyToXYZ(const double aY,const double ax,const double ay,double &oX,double &oY,double &oZ)
{
oX =ax*(aY/ay);
oY =aY;
oZ =(1.0-ax-ay)*(aY/ay);
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå XYZ â HunterLab |
//+------------------------------------------------------------------+
void CColors::XYZtoHunterLab(const double aX,const double aY,const double aZ,double &oL,double &oa,double &ob)
{
oL =10.0*::MathSqrt(aY);
oa =17.5*(((1.02*aX)-aY)/::MathSqrt(aY));
ob =7.0*((aY-(0.847*aZ))/::MathSqrt(aY));
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå HunterLab â XYZ |
//+------------------------------------------------------------------+
void CColors::HunterLabToXYZ(const double aL,const double aa,const double ab,double &oX,double &oY,double &oZ)
{
double var_Y =aL/10.0;
double var_X =aa/17.5*aL/10.0;
double var_Z =ab/7.0*aL/10.0;
//---
oY =::MathPow(var_Y,2);
oX =(var_X+oY)/1.02;
oZ =-(var_Z-oY)/0.847;
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå XYZ â CIELab |
//+------------------------------------------------------------------+
void CColors::XYZtoCIELab(const double aX,const double aY,const double aZ,double &oCIEL,double &oCIEa,double &oCIEb)
{
double ref_X =95.047;
double ref_Y =100.0;
double ref_Z =108.883;
double var_X =aX/ref_X;
double var_Y =aY/ref_Y;
double var_Z =aZ/ref_Z;
//---
if(var_X>0.008856)
var_X=::MathPow(var_X,1.0/3.0);
else
var_X=(7.787*var_X)+(16.0/116.0);
//---
if(var_Y>0.008856)
var_Y=::MathPow(var_Y,1.0/3.0);
else
var_Y=(7.787*var_Y)+(16.0/116.0);
//---
if(var_Z>0.008856)
var_Z=::MathPow(var_Z,1.0/3.0);
else
var_Z=(7.787*var_Z)+(16.0/116.0);
//---
oCIEL =(116.0*var_Y)-16.0;
oCIEa =500.0*(var_X-var_Y);
oCIEb =200*(var_Y-var_Z);
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå CIELab â ToXYZ |
//+------------------------------------------------------------------+
void CColors::CIELabToXYZ(const double aCIEL,const double aCIEa,const double aCIEb,double &oX,double &oY,double &oZ)
{
double var_Y =(aCIEL+16.0)/116.0;
double var_X =aCIEa/500.0+var_Y;
double var_Z =var_Y-aCIEb/200.0;
//---
if(::MathPow(var_Y,3)>0.008856)
var_Y=::MathPow(var_Y,3);
else
var_Y=(var_Y-16.0/116.0)/7.787;
//---
if(::MathPow(var_X,3)>0.008856)
var_X=::MathPow(var_X,3);
else
var_X=(var_X-16.0/116.0)/7.787;
//---
if(::MathPow(var_Z,3)>0.008856)
var_Z=::MathPow(var_Z,3);
else
var_Z=(var_Z-16.0/116.0)/7.787;
//---
double ref_X =95.047;
double ref_Y =100.0;
double ref_Z =108.883;
//---
oX =ref_X*var_X;
oY =ref_Y*var_Y;
oZ =ref_Z*var_Z;
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå CIELab â CIELCH |
//+------------------------------------------------------------------+
void CColors::CIELabToCIELCH(const double aCIEL,const double aCIEa,const double aCIEb,double &oCIEL,double &oCIEC,double &oCIEH)
{
double var_H=this.Arctan2(aCIEb,aCIEa);
//---
if(var_H>0)
var_H=(var_H/M_PI)*180.0;
else
var_H=360.0-(::MathAbs(var_H)/M_PI)*180.0;
//---
oCIEL =aCIEL;
oCIEC =::MathSqrt(::MathPow(aCIEa,2)+::MathPow(aCIEb,2));
oCIEH =var_H;
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå CIELCH â CIELab |
//+------------------------------------------------------------------+
void CColors::CIELCHtoCIELab(const double aCIEL,const double aCIEC,const double aCIEH,double &oCIEL,double &oCIEa,double &oCIEb)
{
//--- Àðãóìåíòû from 0 to 360°
oCIEL =aCIEL;
oCIEa =::MathCos(M_PI*aCIEH/180.0)*aCIEC;
oCIEb =::MathSin(M_PI*aCIEH/180)*aCIEC;
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå XYZ â CIELuv |
//+------------------------------------------------------------------+
void CColors::XYZtoCIELuv(const double aX,const double aY,const double aZ,double &oCIEL,double &oCIEu,double &oCIEv)
{
double var_U =(4.0*aX)/(aX+(15.0*aY)+(3.0*aZ));
double var_V =(9.0*aY)/(aX+(15.0*aY)+(3.0*aZ));
double var_Y =aY/100.0;
//---
if(var_Y>0.008856)
var_Y=::MathPow(var_Y,1.0/3.0);
else
var_Y=(7.787*var_Y)+(16.0/116.0);
//---
double ref_X =95.047;
double ref_Y =100.000;
double ref_Z =108.883;
double ref_U =(4.0*ref_X)/(ref_X+(15.0*ref_Y)+(3.0*ref_Z));
double ref_V =(9.0*ref_Y)/(ref_X+(15.0*ref_Y)+(3.0*ref_Z));
//---
oCIEL =(116.0*var_Y)-16.0;
oCIEu =13.0*oCIEL*(var_U-ref_U);
oCIEv =13.0*oCIEL*(var_V-ref_V);
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå CIELuv â XYZ |
//+------------------------------------------------------------------+
void CColors::CIELuvToXYZ(const double aCIEL,const double aCIEu,const double aCIEv,double &oX,double &oY,double &oZ)
{
double var_Y=(aCIEL+16.0)/116.0;
//---
if(::MathPow(var_Y,3)>0.008856)
var_Y=::MathPow(var_Y,3);
else
var_Y=(var_Y-16.0/116.0)/7.787;
//---
double ref_X =95.047;
double ref_Y =100.000;
double ref_Z =108.883;
double ref_U =(4.0*ref_X)/(ref_X+(15.0*ref_Y)+(3.0*ref_Z));
double ref_V =(9.0*ref_Y)/(ref_X+(15.0*ref_Y)+(3.0*ref_Z));
double var_U =aCIEu/(13.0*aCIEL)+ref_U;
double var_V =aCIEv/(13.0*aCIEL)+ref_V;
//---
oY=var_Y*100.0;
oX=-(9.0*oY*var_U)/((var_U-4.0)*var_V-var_U*var_V);
oZ=(9.0*oY-(15.0*var_V*oY)-(var_V*oX))/(3.0*var_V);
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå RGB â HSL |
//+------------------------------------------------------------------+
void CColors::RGBtoHSL(const double aR,const double aG,const double aB,double &oH,double &oS,double &oL)
{
double var_R =(aR/255);
double var_G =(aG/255);
double var_B =(aB/255);
double var_Min =::MathMin(var_R,::MathMin(var_G,var_B));
double var_Max =::MathMax(var_R,::MathMax(var_G,var_B));
double del_Max =var_Max-var_Min;
//---
oL=(var_Max+var_Min)/2;
//---
if(del_Max==0)
{
oH=0;
oS=0;
}
else
{
if(oL<0.5)
oS=del_Max/(var_Max+var_Min);
else
oS=del_Max/(2.0-var_Max-var_Min);
//---
double del_R =(((var_Max-var_R)/6.0)+(del_Max/2.0))/del_Max;
double del_G =(((var_Max-var_G)/6.0)+(del_Max/2.0))/del_Max;
double del_B =(((var_Max-var_B)/6.0)+(del_Max/2.0))/del_Max;
//---
if(var_R==var_Max)
oH=del_B-del_G;
else if(var_G==var_Max)
oH=(1.0/3.0)+del_R-del_B;
else if(var_B==var_Max)
oH=(2.0/3.0)+del_G-del_R;
//---
if(oH<0)
oH+=1.0;
//---
if(oH>1)
oH-=1.0;
}
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå HSL â RGB |
//+------------------------------------------------------------------+
void CColors::HSLtoRGB(const double aH,const double aS,const double aL,double &oR,double &oG,double &oB)
{
if(aS==0)
{
oR=aL*255;
oG=aL*255;
oB=aL*255;
}
else
{
double var_2=0.0;
//---
if(aL<0.5)
var_2=aL*(1.0+aS);
else
var_2=(aL+aS)-(aS*aL);
//---
double var_1=2.0*aL-var_2;
oR =255.0*Hue_To_RGB(var_1,var_2,aH+(1.0/3.0));
oG =255.0*Hue_To_RGB(var_1,var_2,aH);
oB =255.0*Hue_To_RGB(var_1,var_2,aH-(1.0/3.0));
}
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå RGB â HSV |
//+------------------------------------------------------------------+
void CColors::RGBtoHSV(const double aR,const double aG,const double aB,double &oH,double &oS,double &oV)
{
const double var_R =(aR/255.0);
const double var_G =(aG/255.0);
const double var_B =(aB/255.0);
const double var_Min =::MathMin(var_R,::MathMin(var_G, var_B));
const double var_Max =::MathMax(var_R,::MathMax(var_G,var_B));
const double del_Max =var_Max-var_Min;
//---
oV=var_Max;
//---
if(del_Max==0)
{
oH=0;
oS=0;
}
else
{
oS=del_Max/var_Max;
const double del_R =(((var_Max-var_R)/6.0)+(del_Max/2))/del_Max;
const double del_G =(((var_Max-var_G)/6.0)+(del_Max/2))/del_Max;
const double del_B =(((var_Max-var_B)/6.0)+(del_Max/2))/del_Max;
//---
if(var_R==var_Max)
oH=del_B-del_G;
else if(var_G==var_Max)
oH=(1.0/3.0)+del_R-del_B;
else if(var_B==var_Max)
oH=(2.0/3.0)+del_G-del_R;
//---
if(oH<0)
oH+=1.0;
//---
if(oH>1.0)
oH-=1.0;
}
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå HSV â RGB |
//+------------------------------------------------------------------+
void CColors::HSVtoRGB(const double aH,const double aS,const double aV,double &oR,double &oG,double &oB)
{
if(aS==0)
{
oR =aV*255.0;
oG =aV*255.0;
oB =aV*255.0;
}
else
{
double var_h=aH*6.0;
//---
if(var_h==6)
var_h=0;
//---
int var_i =int(var_h);
double var_1 =aV*(1.0-aS);
double var_2 =aV*(1.0-aS*(var_h-var_i));
double var_3 =aV*(1.0-aS*(1.0-(var_h-var_i)));
double var_r =0.0;
double var_g =0.0;
double var_b =0.0;
//---
if(var_i==0)
{
var_r =aV;
var_g =var_3;
var_b =var_1;
}
else if(var_i==1.0)
{
var_r=var_2;
var_g=aV;
var_b=var_1;
}
else if(var_i==2.0)
{
var_r=var_1;
var_g=aV;
var_b=var_3;
}
else if(var_i==3)
{
var_r=var_1;
var_g=var_2;
var_b=aV;
}
else if(var_i==4)
{
var_r=var_3;
var_g=var_1;
var_b=aV;
}
else
{
var_r=aV;
var_g=var_1;
var_b=var_2;
}
//---
oR =var_r*255.0;
oG =var_g*255.0;
oB =var_b*255.0;
}
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå RGB â CMY |
//+------------------------------------------------------------------+
void CColors::RGBtoCMY(const double aR,const double aG,const double aB,double &oC,double &oM,double &oY)
{
oC =1.0-(aR/255.0);
oM =1.0-(aG/255.0);
oY =1.0-(aB/255.0);
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå CMY â RGB |
//+------------------------------------------------------------------+
void CColors::CMYtoRGB(const double aC,const double aM,const double aY,double &oR,double &oG,double &oB)
{
oR =(1.0-aC)*255.0;
oG =(1.0-aM)*255.0;
oB =(1.0-aY)*255.0;
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå CMY â CMYK |
//+------------------------------------------------------------------+
void CColors::CMYtoCMYK(const double aC,const double aM,const double aY,double &oC,double &oM,double &oY,double &oK)
{
double var_K=1;
//---
if(aC<var_K)
var_K=aC;
if(aM<var_K)
var_K=aM;
if(aY<var_K)
var_K=aY;
//---
if(var_K==1.0)
{
oC =0;
oM =0;
oY =0;
}
else
{
oC =(aC-var_K)/(1.0-var_K);
oM =(aM-var_K)/(1.0-var_K);
oY =(aY-var_K)/(1.0-var_K);
}
//---
oK=var_K;
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå CMYK â CMY |
//+------------------------------------------------------------------+
void CColors::CMYKtoCMY(const double aC,const double aM,const double aY,const double aK,double &oC,double &oM,double &oY)
{
oC =(aC*(1.0-aK)+aK);
oM =(aM*(1.0-aK)+aK);
oY =(aY*(1.0-aK)+aK);
}
//+------------------------------------------------------------------+
//| Ïîëó÷åíèå çíà÷åíèé êîìïîíåíòîâ RGB |
//+------------------------------------------------------------------+
void CColors::ColorToRGB(const color aColor,double &aR,double &aG,double &aB)
{
aR =GetR(aColor);
aG =GetG(aColor);
aB =GetB(aColor);
}
//+------------------------------------------------------------------+
//| Ïîëó÷åíèå çíà÷åíèÿ êîìïîíåíòà R |
//+------------------------------------------------------------------+
double CColors::GetR(const color aColor)
{
return(aColor&0xff);
}
//+------------------------------------------------------------------+
//| Ïîëó÷åíèå çíà÷åíèÿ êîìïîíåíòà G |
//+------------------------------------------------------------------+
double CColors::GetG(const color aColor)
{
return((aColor>>8)&0xff);
}
//+------------------------------------------------------------------+
//| Ïîëó÷åíèå çíà÷åíèÿ êîìïîíåíòà B |
//+------------------------------------------------------------------+
double CColors::GetB(const color aColor)
{
return((aColor>>16)&0xff);
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå RGB â const color |
//+------------------------------------------------------------------+
color CColors::RGBToColor(const double aR,const double aG,const double aB)
{
int int_r =(int)::MathRound(aR);
int int_g =(int)::MathRound(aG);
int int_b =(int)::MathRound(aB);
int Color =0;
//---
Color=int_b;
Color<<=8;
Color|=int_g;
Color<<=8;
Color|=int_r;
//---
return((color)Color);
}
//+------------------------------------------------------------------+
//| Ïîëó÷åíèå çíà÷åíè ïðîìåæóòî÷íîãî öâåòà ìåæäó äâóõ öâåòîâ |
//+------------------------------------------------------------------+
color CColors::MixColors(const color aCol1,const color aCol2,const double aK)
{
//--- aK - îò 0 äî 1
double R1=0.0,G1=0.0,B1=0.0,R2=0.0,G2=0.0,B2=0.0;
//---
ColorToRGB(aCol1,R1,G1,B1);
ColorToRGB(aCol2,R2,G2,B2);
//---
R1+=(int)::MathRound(aK*(R2-R1));
G1+=(int)::MathRound(aK*(G2-G1));
B1+=(int)::MathRound(aK*(B2-B1));
//---
return(RGBToColor(R1,G1,B1));
}
//+------------------------------------------------------------------+
//| Ïîëó÷åíèå ìàññèâà çàäàííîãî ðàçìåðà ñ öâåòîâûì ãðàäèåíòîì |
//+------------------------------------------------------------------+
void CColors::Gradient(color &aColors[], // Ñïèñîê öâåòîâ
color &aOut[], // Âîçâðàùàåìûé ìàññèâ
int aOutCount, // Óñòàíîâêà ðàçìåðà âîçâðàùàåìîãî ìàññèâà
bool aCycle=false) // Çàìêíóòûé öèêë. Âîçâðàùàåìûé ìàññèâ çàêàí÷èâàåòñÿ òàêèì æå öâåòîì, ñ êîòîðîãî íà÷èíàåòñÿ
{
::ArrayResize(aOut,aOutCount);
//---
int InCount =::ArraySize(aColors)+aCycle;
int PrevJ =0;
int nci =0;
double K =0.0;
//---
for(int i=1; i<InCount; i++)
{
int J=(aOutCount-1)*i/(InCount-1);
//---
for(int j=PrevJ; j<=J; j++)
{
if(aCycle && i==InCount-1)
{
nci =0;
K =1.0*(j-PrevJ)/(J-PrevJ+1);
}
else
{
nci =i;
K =1.0*(j-PrevJ)/(J-PrevJ);
}
aOut[j]=MixColors(aColors[i-1],aColors[nci],K);
}
PrevJ=J;
}
}
//+------------------------------------------------------------------+
//| Åùå îäèí âàðèàíò ïðåîáðàçîâàíèÿ RGB â XYZ è |
//| ñîîòâåòñòâóþùåå åìó ïðåîáðàçîâàíèå XYZ â RGB |
//+------------------------------------------------------------------+
void CColors::RGBtoXYZsimple(double aR,double aG,double aB,double &oX,double &oY,double &oZ)
{
aR/=255;
aG/=255;
aB/=255;
aR*=100;
aG*=100;
aB*=100;
//---
oX=0.431*aR+0.342*aG+0.178*aB;
oY=0.222*aR+0.707*aG+0.071*aB;
oZ=0.020*aR+0.130*aG+0.939*aB;
}
//+------------------------------------------------------------------+
//| XYZtoRGBsimple |
//+------------------------------------------------------------------+
void CColors::XYZtoRGBsimple(const double aX,const double aY,const double aZ,double &oR,double &oG,double &oB)
{
oR=3.063*aX-1.393*aY-0.476*aZ;
oG=-0.969*aX+1.876*aY+0.042*aZ;
oB=0.068*aX-0.229*aY+1.069*aZ;
}
//+------------------------------------------------------------------+
//| Íåãàòèâíûé öâåò |
//+------------------------------------------------------------------+
color CColors::Negative(const color aColor)
{
double R=0.0,G=0.0,B=0.0;
ColorToRGB(aColor,R,G,B);
//---
return(RGBToColor(255-R,255-G,255-B));
}
//+------------------------------------------------------------------+
//| Ïîèñê íàèáîëåå ïîõîæåãî öâåòà |
//| â íàáîðå ñòàíäàðòíûõ öâåòîâ òåðìèíàëà |
//+------------------------------------------------------------------+
color CColors::StandardColor(const color aColor,int &aIndex)
{
color m_c[]=
{
clrBlack,clrDarkGreen,clrDarkSlateGray,clrOlive,clrGreen,clrTeal,clrNavy,clrPurple,clrMaroon,clrIndigo,
clrMidnightBlue,clrDarkBlue,clrDarkOliveGreen,clrSaddleBrown,clrForestGreen,clrOliveDrab,clrSeaGreen,
clrDarkGoldenrod,clrDarkSlateBlue,clrSienna,clrMediumBlue,clrBrown,clrDarkTurquoise,clrDimGray,
clrLightSeaGreen,clrDarkViolet,clrFireBrick,clrMediumVioletRed,clrMediumSeaGreen,clrChocolate,clrCrimson,
clrSteelBlue,clrGoldenrod,clrMediumSpringGreen,clrLawnGreen,clrCadetBlue,clrDarkOrchid,clrYellowGreen,
clrLimeGreen,clrOrangeRed,clrDarkOrange,clrOrange,clrGold,clrYellow,clrChartreuse,clrLime,clrSpringGreen,
clrAqua,clrDeepSkyBlue,clrBlue,clrFuchsia,clrRed,clrGray,clrSlateGray,clrPeru,clrBlueViolet,clrLightSlateGray,
clrDeepPink,clrMediumTurquoise,clrDodgerBlue,clrTurquoise,clrRoyalBlue,clrSlateBlue,clrDarkKhaki,clrIndianRed,
clrMediumOrchid,clrGreenYellow,clrMediumAquamarine,clrDarkSeaGreen,clrTomato,clrRosyBrown,clrOrchid,
clrMediumPurple,clrPaleVioletRed,clrCoral,clrCornflowerBlue,clrDarkGray,clrSandyBrown,clrMediumSlateBlue,
clrTan,clrDarkSalmon,clrBurlyWood,clrHotPink,clrSalmon,clrViolet,clrLightCoral,clrSkyBlue,clrLightSalmon,
clrPlum,clrKhaki,clrLightGreen,clrAquamarine,clrSilver,clrLightSkyBlue,clrLightSteelBlue,clrLightBlue,
clrPaleGreen,clrThistle,clrPowderBlue,clrPaleGoldenrod,clrPaleTurquoise,clrLightGray,clrWheat,clrNavajoWhite,
clrMoccasin,clrLightPink,clrGainsboro,clrPeachPuff,clrPink,clrBisque,clrLightGoldenrod,clrBlanchedAlmond,
clrLemonChiffon,clrBeige,clrAntiqueWhite,clrPapayaWhip,clrCornsilk,clrLightYellow,clrLightCyan,clrLinen,
clrLavender,clrMistyRose,clrOldLace,clrWhiteSmoke,clrSeashell,clrIvory,clrHoneydew,clrAliceBlue,clrLavenderBlush,
clrMintCream,clrSnow,clrWhite,clrDarkCyan,clrDarkRed,clrDarkMagenta,clrAzure,clrGhostWhite,clrFloralWhite
};
//---
double m_rv=0.0,m_gv=0.0,m_bv=0.0;
//---
ColorToRGB(aColor,m_rv,m_gv,m_bv);
//---
double m_md=0.3*::MathPow(255,2)+0.59*::MathPow(255,2)+0.11*::MathPow(255,2)+1;
aIndex=0;
//---
for(int i=0; i<138; i++)
{
double m_d=0.3*::MathPow(GetR(m_c[i])-m_rv,2)+0.59*::MathPow(GetG(m_c[i])-m_gv,2)+0.11*::MathPow(GetB(m_c[i])-m_bv,2);
//---
if(m_d<m_md)
{
m_md =m_d;
aIndex =i;
}
}
//---
return(m_c[aIndex]);
}
//+------------------------------------------------------------------+
//| Ïðåîáðàçîâàíèå â ñåðûé öâåò |
//+------------------------------------------------------------------+
double CColors::RGBtoGray(double aR,double aG,double aB)
{
aR/=255;
aG/=255;
aB/=255;
//---
aR=::MathPow(aR,2.2);
aG=::MathPow(aG,2.2);
aB=::MathPow(aB,2.2);
//---
double rY=0.21*aR+0.72*aG+0.07*aB;
rY=::MathPow(rY,1.0/2.2);
//---
return(rY);
}
//+------------------------------------------------------------------+
//| Ïðîñòîå ïðåîáðàçîâàíèå â ñåðûé öâåò |
//+------------------------------------------------------------------+
double CColors::RGBtoGraySimple(double aR,double aG,double aB)
{
aR/=255;
aG/=255;
aB/=255;
double rY=0.3*aR+0.59*aG+0.11*aB;
//---
return(rY);
}
//+------------------------------------------------------------------+
+21
View File
@@ -0,0 +1,21 @@
//+------------------------------------------------------------------+
//| Defines.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
//--- Class name
#define CLASS_NAME ::StringSubstr(__FUNCTION__,0,::StringFind(__FUNCTION__,"::"))
//--- Program name
#define PROGRAM_NAME ::MQLInfoString(MQL_PROGRAM_NAME)
//--- Program type
#define PROGRAM_TYPE (ENUM_PROGRAM_TYPE)::MQLInfoInteger(MQL_PROGRAM_TYPE)
//--- Prevention of exceeding the array size
#define PREVENTING_OUT_OF_RANGE __FUNCTION__," > Prevention of exceeding the array size."
//--- Font
#define FONT ("Calibri")
#define FONT_SIZE (8)
//--- Timer step (milliseconds)
#define TIMER_STEP_MSC (16)
//+------------------------------------------------------------------+
+243
View File
@@ -0,0 +1,243 @@
//+------------------------------------------------------------------+
//| Element.mqh |
//| Copyright 2023, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#include "Objects.mqh"
#include "Colors.mqh"
//+------------------------------------------------------------------+
//| Base class of control |
//+------------------------------------------------------------------+
class CElement
{
protected:
//--- Class instance for working with the color
CColors m_clr;
//--- (1) Name of class and (2) program, (3) program type
string m_class_name;
string m_program_name;
ENUM_PROGRAM_TYPE m_program_type;
//--- Identifier and window number of the chart
long m_chart_id;
int m_subwin;
//--- Identifier and index of control
int m_id;
int m_index;
//--- Coordinates and boundaries
int m_x;
int m_y;
int m_x2;
int m_y2;
int m_x_size;
int m_y_size;
int m_x_gap;
int m_y_gap;
//--- Control states
bool m_is_visible;
bool m_is_dropdown;
int m_is_object_tabs;
//--- Focus
bool m_mouse_focus;
//--- Chart corner and anchor point of objects
ENUM_BASE_CORNER m_corner;
ENUM_ANCHOR_POINT m_anchor;
//--- Number of colors in the gradient
int m_gradient_colors_total;
//--- Common array of pointers to all objects in this control
CChartObject *m_objects[];
//---
public:
CElement(void);
~CElement(void);
//--- (1) Obtaining and setting the class name, (2) obtaining the program name,
// (3) obtaining the program type, (4) setting the number of the chart window
string ClassName(void) const { return(m_class_name); }
void ClassName(const string class_name) { m_class_name=class_name; }
string ProgramName(void) const { return(m_program_name); }
ENUM_PROGRAM_TYPE ProgramType(void) const { return(m_program_type); }
void SubwindowNumber(const int number) { m_subwin=number; }
//--- Obtaining the object pointer by the specified index
CChartObject *Object(const int index);
//--- (1) Obtaining the number of the control objects, (2) emptying the object array
int ObjectsElementTotal(void) const { return(::ArraySize(m_objects)); }
void FreeObjectsArray(void) { ::ArrayFree(m_objects); }
//--- Setting and obtaining the control identifier
void Id(const int id) { m_id=id; }
int Id(void) const { return(m_id); }
//--- Setting and obtaining the control index
void Index(const int index) { m_index=index; }
int Index(void) const { return(m_index); }
//--- Boundaries
int X(void) const { return(m_x); }
void X(const int x) { m_x=x; }
int Y(void) const { return(m_y); }
void Y(const int y) { m_y=y; }
int X2(void) const { return(m_x+m_x_size); }
int Y2(void) const { return(m_y+m_y_size); }
//--- Size
int XSize(void) const { return(m_x_size); }
void XSize(const int x_size) { m_x_size=x_size; }
int YSize(void) const { return(m_y_size); }
void YSize(const int y_size) { m_y_size=y_size; }
//--- Indents from the edge point (xy)
int XGap(void) const { return(m_x_gap); }
void XGap(const int x_gap) { m_x_gap=x_gap; }
int YGap(void) const { return(m_y_gap); }
void YGap(const int y_gap) { m_y_gap=y_gap; }
//--- Control states
void IsVisible(const bool flag) { m_is_visible=flag; }
bool IsVisible(void) const { return(m_is_visible); }
void IsDropdown(const bool flag) { m_is_dropdown=flag; }
bool IsDropdown(void) const { return(m_is_dropdown); }
void IsObjectTabs(const int index) { m_is_object_tabs=index; }
int IsObjectTabs(void) const { return(m_is_object_tabs); }
//--- (1) Focus, (2) setting the gradient size
bool MouseFocus(void) const { return(m_mouse_focus); }
void MouseFocus(const bool focus) { m_mouse_focus=focus; }
void GradientColorsTotal(const int total) { m_gradient_colors_total=total; }
//---
public:
//--- Chart event handler
virtual void OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam) {}
//--- Timer
virtual void OnEventTimer(void) {}
//--- Moving the control
virtual void Moving(const int x,const int y) {}
//--- (1) Showing, (2) hiding, (3) resetting, (4) deleting
virtual void Show(void) {}
virtual void Hide(void) {}
virtual void Reset(void) {}
virtual void Delete(void) {}
//--- (1) Setting, (2) resetting of priorities for left clicking on mouse
virtual void SetZorders(void) {}
virtual void ResetZorders(void) {}
//---
protected:
//--- Method to add pointers of primitive objects to the common array
void AddToArray(CChartObject &object);
//--- Initializing the array gradient
void InitColorArray(const color outer_color,const color hover_color,color &color_array[]);
//--- Changing the object color
void ChangeObjectColor(const string name,const bool mouse_focus,const ENUM_OBJECT_PROPERTY_INTEGER property,
const color outer_color,const color hover_color,const color &color_array[]);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CElement::CElement(void) : m_x(0),
m_y(0),
m_x2(0),
m_y2(0),
m_x_size(0),
m_y_size(0),
m_x_gap(0),
m_y_gap(0),
m_is_visible(true),
m_is_dropdown(false),
m_mouse_focus(false),
m_id(WRONG_VALUE),
m_index(WRONG_VALUE),
m_gradient_colors_total(3),
m_is_object_tabs(WRONG_VALUE),
m_corner(CORNER_LEFT_UPPER),
m_anchor(ANCHOR_LEFT_UPPER),
m_program_name(PROGRAM_NAME),
m_program_type(PROGRAM_TYPE),
m_class_name("")
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CElement::~CElement(void)
{
}
//+------------------------------------------------------------------+
//| Returns the object pointer of the control by index |
//+------------------------------------------------------------------+
CChartObject *CElement::Object(const int index)
{
int array_size=::ArraySize(m_objects);
//--- Verifying the size of the object array
if(array_size<1)
{
::Print(__FUNCTION__," > No ("+m_class_name+") objects in this control!");
return(NULL);
}
//--- Correction in case the size was exceeded
int i=(index>=array_size)? array_size-1 :(index<0)? 0 : index;
//--- Return the object pointer
return(m_objects[i]);
}
//+------------------------------------------------------------------+
//| Adds object pointer to an array |
//+------------------------------------------------------------------+
void CElement::AddToArray(CChartObject &object)
{
int size=ObjectsElementTotal();
::ArrayResize(m_objects,size+1);
m_objects[size]=::GetPointer(object);
}
//+------------------------------------------------------------------+
//| Initialization of the gradient array |
//+------------------------------------------------------------------+
void CElement::InitColorArray(const color outer_color,const color hover_color,color &color_array[])
{
//--- Array of the gradient colors
color colors[2];
colors[0]=outer_color;
colors[1]=hover_color;
//--- Formation of the color array
m_clr.Gradient(colors,color_array,m_gradient_colors_total);
}
//+------------------------------------------------------------------+
//| Changing of object color when hovering the cursor over it |
//+------------------------------------------------------------------+
void CElement::ChangeObjectColor(const string name,const bool mouse_focus,const ENUM_OBJECT_PROPERTY_INTEGER property,
const color outer_color,const color hover_color,const color &color_array[])
{
if(::ArraySize(color_array)<1)
return;
//--- Obtain the current object color
color current_color=(color)::ObjectGetInteger(m_chart_id,name,property);
//--- If the cursor is over the object
if(mouse_focus)
{
//--- Leave, if the specified color has been reached
if(current_color==hover_color)
return;
//--- Move from the first to the last one
for(int i=0; i<m_gradient_colors_total; i++)
{
//--- If colors do not match, move to the following
if(color_array[i]!=current_color)
continue;
//---
color new_color=(i+1==m_gradient_colors_total)? color_array[i]: color_array[i+1];
//--- Change color
::ObjectSetInteger(m_chart_id,name,property,new_color);
break;
}
}
//--- If the cursor is not in the area of the object
else
{
//--- Leave, if the specified color has been reached
if(current_color==outer_color)
return;
//--- Move from the last to the first one
for(int i=m_gradient_colors_total-1; i>=0; i--)
{
//--- If colors do not match, move to the following
if(color_array[i]!=current_color)
continue;
//---
color new_color=(i-1<0)? color_array[i]: color_array[i-1];
//--- Change color
::ObjectSetInteger(m_chart_id,name,property,new_color);
break;
}
}
}
//+------------------------------------------------------------------+
Binary file not shown.
+306
View File
@@ -0,0 +1,306 @@
//+------------------------------------------------------------------+
//| Objects.mqh |
//| Copyright 2023, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#include "Enums.mqh"
#include "Defines.mqh"
#include <ChartObjects/ChartObjectsBmpControls.mqh>
#include <ChartObjects/ChartObjectsTxtControls.mqh>
//--- List of classes in file for a quick navigation (Alt+G)
class CRectLabel;
class CEdit;
class CLabel;
class CBmpLabel;
class CButton;
//+------------------------------------------------------------------+
//| Class with additional properties for the Rectangle Label object |
//+------------------------------------------------------------------+
class CRectLabel : public CChartObjectRectLabel
{
protected:
int m_x;
int m_y;
int m_x2;
int m_y2;
int m_x_gap;
int m_y_gap;
int m_x_size;
int m_y_size;
bool m_mouse_focus;
public:
CRectLabel(void);
~CRectLabel(void);
//--- Coordinates
int X(void) { return(m_x); }
void X(const int x) { m_x=x; }
int Y(void) { return(m_y); }
void Y(const int y) { m_y=y; }
int X2(void) { return(m_x+m_x_size); }
int Y2(void) { return(m_y+m_y_size); }
//--- Indents from the edge point (xy)
int XGap(void) { return(m_x_gap); }
void XGap(const int x_gap) { m_x_gap=x_gap; }
int YGap(void) { return(m_y_gap); }
void YGap(const int y_gap) { m_y_gap=y_gap; }
//--- Sizes
int XSize(void) { return(m_x_size); }
void XSize(const int x_size) { m_x_size=x_size; }
int YSize(void) { return(m_y_size); }
void YSize(const int y_size) { m_y_size=y_size; }
//--- Focus
bool MouseFocus(void) { return(m_mouse_focus); }
void MouseFocus(const bool focus) { m_mouse_focus=focus; }
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CRectLabel::CRectLabel(void) : m_x(0),
m_y(0),
m_x2(0),
m_y2(0),
m_x_gap(0),
m_y_gap(0),
m_x_size(0),
m_y_size(0),
m_mouse_focus(false)
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CRectLabel::~CRectLabel(void)
{
}
//+------------------------------------------------------------------+
//| Class with additional properties for the Edit object |
//+------------------------------------------------------------------+
class CEdit : public CChartObjectEdit
{
protected:
int m_x;
int m_y;
int m_x2;
int m_y2;
int m_x_gap;
int m_y_gap;
int m_x_size;
int m_y_size;
bool m_mouse_focus;
public:
CEdit(void);
~CEdit(void);
//--- Coordinates
int X(void) { return(m_x); }
void X(const int x) { m_x=x; }
int Y(void) { return(m_y); }
void Y(const int y) { m_y=y; }
int X2(void) { return(m_x+m_x_size); }
int Y2(void) { return(m_y+m_y_size); }
//--- Indents from the edge point (xy)
int XGap(void) { return(m_x_gap); }
void XGap(const int x_gap) { m_x_gap=x_gap; }
int YGap(void) { return(m_y_gap); }
void YGap(const int y_gap) { m_y_gap=y_gap; }
//--- Sizes
int XSize(void) { return(m_x_size); }
void XSize(const int x_size) { m_x_size=x_size; }
int YSize(void) { return(m_y_size); }
void YSize(const int y_size) { m_y_size=y_size; }
//--- Focus
bool MouseFocus(void) { return(m_mouse_focus); }
void MouseFocus(const bool focus) { m_mouse_focus=focus; }
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CEdit::CEdit(void) : m_x(0),
m_y(0),
m_x2(0),
m_y2(0),
m_x_gap(0),
m_y_gap(0),
m_x_size(0),
m_y_size(0),
m_mouse_focus(false)
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CEdit::~CEdit(void)
{
}
//+------------------------------------------------------------------+
//| Class with additional properties for the Label object |
//+------------------------------------------------------------------+
class CLabel : public CChartObjectLabel
{
protected:
int m_x;
int m_y;
int m_x2;
int m_y2;
int m_x_gap;
int m_y_gap;
int m_x_size;
int m_y_size;
public:
CLabel(void);
~CLabel(void);
//--- Coordinates
int X(void) { return(m_x); }
void X(const int x) { m_x=x; }
int Y(void) { return(m_y); }
void Y(const int y) { m_y=y; }
int X2(void) { return(m_x+m_x_size); }
int Y2(void) { return(m_y+m_y_size); }
//--- Indents from the edge point (xy)
int XGap(void) { return(m_x_gap); }
void XGap(const int x_gap) { m_x_gap=x_gap; }
int YGap(void) { return(m_y_gap); }
void YGap(const int y_gap) { m_y_gap=y_gap; }
//--- Sizes
int XSize(void) { return(m_x_size); }
void XSize(const int x_size) { m_x_size=x_size; }
int YSize(void) { return(m_y_size); }
void YSize(const int y_size) { m_y_size=y_size; }
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CLabel::CLabel(void) : m_x(0),
m_y(0),
m_x2(0),
m_y2(0),
m_x_gap(0),
m_y_gap(0),
m_x_size(0),
m_y_size(0)
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CLabel::~CLabel(void)
{
}
//+------------------------------------------------------------------+
//| Class with additional properties for the Bmp Label object |
//+------------------------------------------------------------------+
class CBmpLabel : public CChartObjectBmpLabel
{
protected:
int m_x;
int m_y;
int m_x2;
int m_y2;
int m_x_gap;
int m_y_gap;
int m_x_size;
int m_y_size;
bool m_mouse_focus;
public:
CBmpLabel(void);
~CBmpLabel(void);
//--- Coordinates
int X(void) { return(m_x); }
void X(const int x) { m_x=x; }
int Y(void) { return(m_y); }
void Y(const int y) { m_y=y; }
int X2(void) { return(m_x+m_x_size); }
int Y2(void) { return(m_y+m_y_size); }
//--- Indents from the edge point (xy)
int XGap(void) { return(m_x_gap); }
void XGap(const int x_gap) { m_x_gap=x_gap; }
int YGap(void) { return(m_y_gap); }
void YGap(const int y_gap) { m_y_gap=y_gap; }
//--- Sizes
int XSize(void) { return(m_x_size); }
void XSize(const int x_size) { m_x_size=x_size; }
int YSize(void) { return(m_y_size); }
void YSize(const int y_size) { m_y_size=y_size; }
//--- Focus
bool MouseFocus(void) { return(m_mouse_focus); }
void MouseFocus(const bool focus) { m_mouse_focus=focus; }
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CBmpLabel::CBmpLabel(void) : m_x(0),
m_y(0),
m_x2(0),
m_y2(0),
m_x_gap(0),
m_y_gap(0),
m_x_size(0),
m_y_size(0),
m_mouse_focus(false)
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CBmpLabel::~CBmpLabel(void)
{
}
//+------------------------------------------------------------------+
//| Class with additional properties for the Edit object |
//+------------------------------------------------------------------+
class CButton : public CChartObjectButton
{
protected:
int m_x;
int m_y;
int m_x2;
int m_y2;
int m_x_gap;
int m_y_gap;
int m_x_size;
int m_y_size;
bool m_mouse_focus;
public:
CButton(void);
~CButton(void);
//--- Coordinates
int X(void) { return(m_x); }
void X(const int x) { m_x=x; }
int Y(void) { return(m_y); }
void Y(const int y) { m_y=y; }
int X2(void) { return(m_x+m_x_size); }
int Y2(void) { return(m_y+m_y_size); }
//--- Indents from the edge point (xy)
int XGap(void) { return(m_x_gap); }
void XGap(const int x_gap) { m_x_gap=x_gap; }
int YGap(void) { return(m_y_gap); }
void YGap(const int y_gap) { m_y_gap=y_gap; }
//--- Sizes
int XSize(void) { return(m_x_size); }
void XSize(const int x_size) { m_x_size=x_size; }
int YSize(void) { return(m_y_size); }
void YSize(const int y_size) { m_y_size=y_size; }
//--- Focus
bool MouseFocus(void) { return(m_mouse_focus); }
void MouseFocus(const bool focus) { m_mouse_focus=focus; }
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CButton::CButton(void) : m_x(0),
m_y(0),
m_x2(0),
m_y2(0),
m_x_gap(0),
m_y_gap(0),
m_x_size(0),
m_y_size(0),
m_mouse_focus(false)
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CButton::~CButton(void)
{
}
//+------------------------------------------------------------------+
Binary file not shown.
Binary file not shown.
Binary file not shown.
+152
View File
@@ -0,0 +1,152 @@
//+------------------------------------------------------------------+
//| Button.mqh |
//| Copyright 2000-2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Controls/WndObj.mqh>
#include <ChartObjects\ChartObjectsTxtControls.mqh>
#include "Colors.mqh"
#include "Font.mqh"
#include "Setting.mqh"
//+------------------------------------------------------------------+
//| Class CButton |
//| Usage: control that is displayed by |
//| the CChartObjectButton object |
//+------------------------------------------------------------------+
class CButton : public CWndObj
{
private:
CThemes m_Themes;
CFont m_Fonts;
CChartObjectButton m_button; // chart object
public:
CButton(void);
~CButton(void);
//--- create
virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
//--- state
bool Pressed(void) const { return(m_button.State()); }
bool Pressed(const bool pressed) { return(m_button.State(pressed)); }
//--- properties
bool Locking(void) const { return(IS_CAN_LOCK); }
void Locking(const bool flag);
protected:
//--- handlers of object settings
virtual bool OnSetText(void) { return(m_button.Description(m_text)); }
virtual bool OnSetColor(void) { return(m_button.Color(m_color)); }
virtual bool OnSetColorBackground(void) { return(m_button.BackColor(m_color_background)); }
virtual bool OnSetColorBorder(void) { return(m_button.BorderColor(m_color_border)); }
virtual bool OnSetFont(void) { return(m_button.Font(m_Fonts.FontsByIndex((int)Sets.FontName))); }
virtual bool OnSetFontSize(void) { return(m_button.FontSize(m_font_size)); }
//--- internal event handlers
virtual bool OnCreate(void);
virtual bool OnShow(void);
virtual bool OnHide(void);
virtual bool OnMove(void);
virtual bool OnResize(void);
//---
virtual bool OnMouseDown(void);
virtual bool OnMouseUp(void);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CButton::CButton(void)
{
m_Themes.ApplyTheme((int)Sets.Themes);
m_color =m_Themes.CONTROLS_BUTTON_TEXT;
m_color_background=m_Themes.CONTROLS_BUTTON_DISABLE;
m_color_border =CONTROLS_BUTTON_COLOR_BORDER;
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CButton::~CButton(void)
{
}
//+------------------------------------------------------------------+
//| Create a control |
//+------------------------------------------------------------------+
bool CButton::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
{
//--- call method of the parent class
if(!CWndObj::Create(chart,name,subwin,x1,y1,x2,y2))
return(false);
//--- create the chart object
if(!m_button.Create(chart,name,subwin,x1,y1,Width(),Height()))
return(false);
//--- call the settings handler
return(OnChange());
}
//+------------------------------------------------------------------+
//| Locking flag |
//+------------------------------------------------------------------+
void CButton::Locking(const bool flag)
{
if(flag)
PropFlagsSet(WND_PROP_FLAG_CAN_LOCK);
else
PropFlagsReset(WND_PROP_FLAG_CAN_LOCK);
}
//+------------------------------------------------------------------+
//| Create object on chart |
//+------------------------------------------------------------------+
bool CButton::OnCreate(void)
{
//--- create the chart object by previously set parameters
return(m_button.Create(m_chart_id,m_name,m_subwin,m_rect.left,m_rect.top,m_rect.Width(),m_rect.Height()));
}
//+------------------------------------------------------------------+
//| Display object on chart |
//+------------------------------------------------------------------+
bool CButton::OnShow(void)
{
return(m_button.Timeframes(OBJ_ALL_PERIODS));
}
//+------------------------------------------------------------------+
//| Hide object from chart |
//+------------------------------------------------------------------+
bool CButton::OnHide(void)
{
return(m_button.Timeframes(OBJ_NO_PERIODS));
}
//+------------------------------------------------------------------+
//| Absolute movement of the chart object |
//+------------------------------------------------------------------+
bool CButton::OnMove(void)
{
//--- position the chart object
return(m_button.X_Distance(m_rect.left) && m_button.Y_Distance(m_rect.top));
}
//+------------------------------------------------------------------+
//| Resize the chart object |
//+------------------------------------------------------------------+
bool CButton::OnResize(void)
{
//--- resize the chart object
return(m_button.X_Size(m_rect.Width()) && m_button.Y_Size(m_rect.Height()));
}
//+------------------------------------------------------------------+
//| Handler of click on the left mouse button |
//+------------------------------------------------------------------+
bool CButton::OnMouseDown(void)
{
if(!IS_CAN_LOCK)
Pressed(!Pressed());
//--- call of the method of the parent class
return(CWnd::OnMouseDown());
}
//+------------------------------------------------------------------+
//| Handler of click on the left mouse button |
//+------------------------------------------------------------------+
bool CButton::OnMouseUp(void)
{
//--- depress the button if it is not fixed
if(m_button.State() && !IS_CAN_LOCK)
m_button.State(false);
//--- call of the method of the parent class
return(CWnd::OnMouseUp());
}
//+------------------------------------------------------------------+
+685
View File
@@ -0,0 +1,685 @@
enum ThemeType {
Midnight_Blue,
Periwinkle_Dream,
Lime_Breeze,
Autumn_Spice,
Winter_Wonderland,
Spring_Blossom,
Summer_Breeze,
Midnight_Dream,
Tropical_Paradise,
// Midnight_Blue,
Forest_Green,
Sunset_Orange,
Calm_Pastel,
Ocean_Breeze,
Desert_Sand,
Crimson_Rose,
Cool_Mint,
Black_Theme,
Brown_Theme,
White_Theme_1,
White_Theme_2
// Add more themes here as needed
};
class CThemes
{
public:
color CONTROLS_BUTTON_TEXT, CONTROLS_BUTTON_ENABLE, CONTROLS_BUTTON_DISABLE,
CONTROLS_LABEL_TEXT, CONTROLS_LABEL_BACKGROUND, CONTROLS_LABEL_TEXT_TOOLTIP, CONTROLS_LABEL_TEXT_TITLE, CONTROLS_LABEL_TITLE_BACKGROUND, CONTROLS_LABEL_TEXT_ARM, CONTROLS_LABEL_TEXT_ANSWER,
CONTROLS_LABEL_LOG_TEXT,
CONTROL_EDIT_TEXT, CONTROL_EDIT_BACKGROUND, CONTROL_EDIT_BORDER,
CONTROL_COMBOBOX_BACKGROUND, CONTROL_COMBOBOX_BORDER, CONTROL_COMBOBOX_BACKGROUND_ITEM, CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL,
CONTROL_BACK_BACGROUND, CONTROL_BORDER_BACKGROUND,
CONTROL_CLINET, CONTROL_CLINET_BACKGROUND,
CONTROL_CAPTION_TEXT, CONTROL_CAPTION_BACKGROUND, CONTROL_CAPTION_BORDERP,
CONTROL_PROGRESS_BACKGROUND, CONTROL_PROGRESS_FORGROUND,
CONTROL_LICENSE_BIGGER, CONTROL_LICENSE_SMALLER;
// CONTROLS_LABEL_TEXT_ARM
// CONTROLS_LABEL_LOG_TEXT
// CONTROLS_LABEL_TEXT_ANSWER
virtual color AdjustBrightness(color baseColor, double factor);
virtual void ApplyThemeBrightness(bool isDarkMode);
void ApplyTheme(int theme)
{
switch (theme)
{
default:
case Midnight_Blue:
{
CONTROLS_BUTTON_TEXT = C'255,255,255'; // C'182,182,182'
CONTROLS_BUTTON_ENABLE = C'0,0,139';
CONTROLS_BUTTON_DISABLE = C'169,169,169';
CONTROLS_LABEL_TEXT = C'224,255,255';
CONTROLS_LABEL_TEXT_ARM = C'255,255,0';
CONTROLS_LABEL_LOG_TEXT = C'205,247,21';
CONTROLS_LABEL_TEXT_ANSWER = C'160,252,252';
CONTROLS_LABEL_BACKGROUND = C'0,0,139';
CONTROLS_LABEL_TEXT_TOOLTIP = C'224,255,255';
CONTROLS_LABEL_TEXT_TITLE = C'255,255,0';
CONTROLS_LABEL_TITLE_BACKGROUND = C'0,0,139';
CONTROL_EDIT_TEXT = C'255,255,255';
CONTROL_EDIT_BORDER = C'0,191,255';
CONTROL_EDIT_BACKGROUND = C'0,0,139';
CONTROL_COMBOBOX_BACKGROUND = C'0,0,139';
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'255,255,0';
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'224,255,255';
CONTROL_BACK_BACGROUND = C'0,211,217';
CONTROL_BORDER_BACKGROUND = C'0,191,255';
CONTROL_CLINET = C'255,255,255';
CONTROL_CLINET_BACKGROUND = C'0,0,139';
CONTROL_CAPTION_TEXT = C'255,255,255';
CONTROL_CAPTION_BACKGROUND = C'0,0,139';
CONTROL_CAPTION_BORDERP = C'0,191,255';
CONTROL_PROGRESS_BACKGROUND = C'114,235,1';
CONTROL_PROGRESS_FORGROUND = C'255,255,255';
CONTROL_LICENSE_BIGGER = C'236,184,39';
CONTROL_LICENSE_SMALLER = C'231,21,21';
}
break;
case Periwinkle_Dream:
{
CONTROLS_BUTTON_TEXT = C'78,73,73'; // White
CONTROLS_BUTTON_ENABLE = C'106,90,205'; // Slate Blue
CONTROLS_BUTTON_DISABLE = C'204,204,255'; // Periwinkle
CONTROLS_LABEL_TEXT = C'26,66,245'; // Crimson
CONTROLS_LABEL_TEXT_ARM = C'129,79,160';
CONTROLS_LABEL_LOG_TEXT = C'26,194,245';
CONTROLS_LABEL_TEXT_ANSWER = C'88,114,231';
CONTROLS_LABEL_BACKGROUND = C'218,112,214'; // Orchid
CONTROLS_LABEL_TEXT_TOOLTIP = C'0,128,128'; // Teal
CONTROLS_LABEL_TEXT_TITLE = C'43,35,48'; // Coral
CONTROLS_LABEL_TITLE_BACKGROUND = C'106,90,205'; // Slate Blue
CONTROL_EDIT_TEXT = C'255,255,255'; // White
CONTROL_EDIT_BORDER = C'218,165,32'; // Goldenrod
CONTROL_EDIT_BACKGROUND = C'94,94,201'; // Periwinkle
CONTROL_COMBOBOX_BACKGROUND = C'94,94,201'; // Orchid
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'106,90,205'; // Slate Blue
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'255,127,80'; // Coral
CONTROL_BACK_BACGROUND = C'204,204,255'; // Periwinkle
CONTROL_BORDER_BACKGROUND = C'218,165,32'; // Goldenrod
CONTROL_CLINET = C'255,255,255'; // White
CONTROL_CLINET_BACKGROUND = C'218,112,214'; // Orchid
CONTROL_CAPTION_TEXT = C'255,255,255'; // White
CONTROL_CAPTION_BACKGROUND = C'106,90,205'; // Slate Blue
CONTROL_CAPTION_BORDERP = C'0,128,128'; // Teal
}
break;
case Lime_Breeze:
{
CONTROLS_BUTTON_TEXT = C'0,100,0'; // Dark Green
CONTROLS_BUTTON_ENABLE = C'83,197,149'; // Lawn Green
CONTROLS_BUTTON_DISABLE = C'173,255,47'; // Green Yellow
CONTROLS_LABEL_TEXT = C'50,205,50'; // Lime Green
CONTROLS_LABEL_TEXT_ARM = C'11,141,228';
CONTROLS_LABEL_LOG_TEXT = C'136,136,85';
CONTROLS_LABEL_TEXT_ANSWER = C'4,255,4';
CONTROLS_LABEL_BACKGROUND = C'240,255,240'; // Honeydew
CONTROLS_LABEL_TEXT_TOOLTIP = C'154,205,50'; // Yellow Green
CONTROLS_LABEL_TEXT_TITLE = C'24,24,22'; // Yellow
CONTROLS_LABEL_TITLE_BACKGROUND = C'124,252,0'; // Lawn Green
CONTROL_EDIT_TEXT = C'85,107,47'; // Dark Olive Green
CONTROL_EDIT_BORDER = C'173,255,47'; // Green Yellow
CONTROL_EDIT_BACKGROUND = C'240,255,240'; // Honeydew
CONTROL_COMBOBOX_BACKGROUND = C'124,252,0'; // Lawn Green
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'85,107,47'; // Dark Olive Green
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'255,255,0'; // Yellow
CONTROL_BACK_BACGROUND = C'173,255,47'; // Green Yellow
CONTROL_BORDER_BACKGROUND = C'85,107,47'; // Dark Olive Green
CONTROL_CLINET = C'255,255,255'; // White
CONTROL_CLINET_BACKGROUND = C'240,255,240'; // Honeydew
CONTROL_CAPTION_TEXT = C'73,50,205'; // Lime Green
CONTROL_CAPTION_BACKGROUND = C'124,252,0'; // Lawn Green
CONTROL_CAPTION_BORDERP = C'154,205,50'; // Yellow Green
}
break;
case Autumn_Spice:
{
CONTROLS_BUTTON_TEXT = C'82,41,11'; // Saddle Brown
CONTROLS_BUTTON_ENABLE = C'210,105,30'; // Chocolate
CONTROLS_BUTTON_DISABLE = C'160,82,45'; // Sienna
CONTROLS_LABEL_TEXT = C'255,228,181'; // Moccasin
CONTROLS_LABEL_TEXT_ARM = C'4,0,252';
CONTROLS_LABEL_LOG_TEXT = C'125,240,110';
CONTROLS_LABEL_TEXT_ANSWER = C'247,191,94';
CONTROLS_LABEL_BACKGROUND = C'139,69,19'; // Saddle Brown
CONTROLS_LABEL_TEXT_TOOLTIP = C'255,140,0'; // Dark Orange
CONTROLS_LABEL_TEXT_TITLE = C'94,92,205'; // Indian Red
CONTROLS_LABEL_TITLE_BACKGROUND = C'210,105,30'; // Chocolate
CONTROL_EDIT_TEXT = C'255,255,255'; // White
CONTROL_EDIT_BORDER = C'205,133,63'; // Peru
CONTROL_EDIT_BACKGROUND = C'139,69,19'; // Saddle Brown
CONTROL_COMBOBOX_BACKGROUND = C'210,105,30'; // Chocolate
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'255,228,181'; // Moccasin
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'139,69,19'; // Saddle Brown
CONTROL_BACK_BACGROUND = C'160,82,45'; // Sienna
CONTROL_BORDER_BACKGROUND = C'205,133,63'; // Peru
CONTROL_CLINET = C'255,245,238'; // Seashell
CONTROL_CLINET_BACKGROUND = C'210,105,30'; // Chocolate
CONTROL_CAPTION_TEXT = C'139,69,19'; // Saddle Brown
CONTROL_CAPTION_BACKGROUND = C'255,228,181'; // Moccasin
CONTROL_CAPTION_BORDERP = C'205,92,92'; // Indian Red
}
break;
case Winter_Wonderland:
{
CONTROLS_BUTTON_TEXT = C'255,255,255'; // White
CONTROLS_BUTTON_ENABLE = C'70,130,180'; // Steel Blue
CONTROLS_BUTTON_DISABLE = C'121,168,230'; // Pale Turquoise
CONTROLS_LABEL_TEXT = C'240,248,255'; // Alice Blue
CONTROLS_LABEL_TEXT_ANSWER = C'215,233,250';
CONTROLS_LABEL_TEXT_ARM = C'0,0,255';
CONTROLS_LABEL_LOG_TEXT = C'21,255,21';
CONTROLS_LABEL_BACKGROUND = C'70,130,180'; // Steel Blue
CONTROLS_LABEL_TEXT_TOOLTIP = C'255,215,0'; // Gold
CONTROLS_LABEL_TEXT_TITLE = C'0,0,139'; // Dark Blue
CONTROLS_LABEL_TITLE_BACKGROUND = C'70,130,180'; // Steel Blue
CONTROL_EDIT_TEXT = C'0,0,0'; // Black
CONTROL_EDIT_BORDER = C'176,224,230'; // Powder Blue
CONTROL_EDIT_BACKGROUND = C'151,185,216'; // Alice Blue
CONTROL_COMBOBOX_BACKGROUND = C'151,185,216'; // Steel Blue
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'255,255,255'; // White
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'0,0,139'; // Dark Blue
CONTROL_BACK_BACGROUND = C'175,238,238'; // Pale Turquoise
CONTROL_BORDER_BACKGROUND = C'176,224,230'; // Powder Blue
CONTROL_CLINET = C'255,250,250'; // Snow
CONTROL_CLINET_BACKGROUND = C'70,130,180'; // Steel Blue
CONTROL_CAPTION_TEXT = C'255,255,255'; // White
CONTROL_CAPTION_BACKGROUND = C'70,130,180'; // Steel Blue
CONTROL_CAPTION_BORDERP = C'255,215,0'; // Gold
}
break;
case Spring_Blossom:
{
CONTROLS_BUTTON_TEXT = C'255,105,180'; // Hot Pink
CONTROLS_BUTTON_ENABLE = C'144,238,144'; // Light Green
CONTROLS_BUTTON_DISABLE = C'255,182,193'; // Light Pink
CONTROLS_LABEL_TEXT = C'0,0,236'; // Lavender Blush
CONTROLS_LABEL_TEXT_ARM = C'255,20,147';
CONTROLS_LABEL_LOG_TEXT = C'40,223,236';
CONTROLS_LABEL_TEXT_ANSWER = C'109,109,236';
CONTROLS_LABEL_BACKGROUND = C'144,238,144'; // Light Green
CONTROLS_LABEL_TEXT_TOOLTIP = C'255,69,0'; // Red Orange
CONTROLS_LABEL_TEXT_TITLE = C'255,20,147'; // Deep Pink
CONTROLS_LABEL_TITLE_BACKGROUND = C'144,238,144'; // Light Green
CONTROL_EDIT_TEXT = C'0,0,0'; // Black
CONTROL_EDIT_BORDER = C'0,255,127'; // Spring Green
CONTROL_EDIT_BACKGROUND = C'255,228,225'; // Lavender Blush
CONTROL_COMBOBOX_BACKGROUND = C'144,238,144'; // Light Green
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'255,255,240'; // Ivory
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'255,20,147'; // Deep Pink
CONTROL_BACK_BACGROUND = C'255,182,193'; // Light Pink
CONTROL_BORDER_BACKGROUND = C'0,255,127'; // Spring Green
CONTROL_CLINET = C'255,250,250'; // Snow
CONTROL_CLINET_BACKGROUND = C'144,238,144'; // Light Green
CONTROL_CAPTION_TEXT = C'255,105,180'; // Hot Pink
CONTROL_CAPTION_BACKGROUND = C'255,228,225'; // Lavender Blush
CONTROL_CAPTION_BORDERP = C'255,20,147'; // Deep Pink
}
break;
case Summer_Breeze:
{
CONTROLS_BUTTON_TEXT = C'0,0,0'; // Black
CONTROLS_BUTTON_ENABLE = C'0,204,102'; // Medium Sea Green
CONTROLS_BUTTON_DISABLE = C'192,192,192'; // Light Gray
CONTROLS_LABEL_TEXT = C'0,102,204'; // Dodger Blue
CONTROLS_LABEL_TEXT_ARM = C'255,99,71';
CONTROLS_LABEL_LOG_TEXT = C'122,138,136';
CONTROLS_LABEL_TEXT_ANSWER = C'98,145,192';
CONTROLS_LABEL_BACKGROUND = C'255,255,255'; // White
CONTROLS_LABEL_TEXT_TOOLTIP = C'255,69,0'; // Red Orange
CONTROLS_LABEL_TEXT_TITLE = C'255,99,71'; // Tomato
CONTROLS_LABEL_TITLE_BACKGROUND = C'0,204,102'; // Medium Sea Green
CONTROL_EDIT_TEXT = C'0,0,0'; // Black
CONTROL_EDIT_BORDER = C'0,204,204'; // Turquoise
CONTROL_EDIT_BACKGROUND = C'255,255,255'; // White
CONTROL_COMBOBOX_BACKGROUND = C'0,204,102'; // Medium Sea Green
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'173,216,230'; // Light Blue
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'0,0,0'; // Black
CONTROL_BACK_BACGROUND = C'255,215,0'; // Gold
CONTROL_BORDER_BACKGROUND = C'0,204,204'; // Turquoise
CONTROL_CLINET = C'255,250,205'; // Lemon Chiffon
CONTROL_CLINET_BACKGROUND = C'240,248,255'; // Alice Blue
CONTROL_CAPTION_TEXT = C'0,0,0'; // Black
CONTROL_CAPTION_BACKGROUND = C'173,216,230'; // Light Blue
CONTROL_CAPTION_BORDERP = C'255,69,0'; // Red Orange
}
break;
case Midnight_Dream:
{
CONTROLS_BUTTON_TEXT = C'224,102,255'; // Medium Purple
CONTROLS_BUTTON_ENABLE = C'75,0,130'; // Indigo
CONTROLS_BUTTON_DISABLE = C'138,43,226'; // Blue Violet
CONTROLS_LABEL_TEXT = C'255,250,250'; // Snow
CONTROLS_LABEL_TEXT_ARM = C'0,49,211';
CONTROLS_LABEL_LOG_TEXT = C'5,248,208';
CONTROLS_LABEL_TEXT_ANSWER = C'250,206,206';
CONTROLS_LABEL_BACKGROUND = C'75,0,130'; // Indigo
CONTROLS_LABEL_TEXT_TOOLTIP = C'148,0,211'; // Dark Orchid
CONTROLS_LABEL_TEXT_TITLE = C'186,85,211'; // Orchid
CONTROLS_LABEL_TITLE_BACKGROUND = C'75,0,130'; // Indigo
CONTROL_EDIT_TEXT = C'255,255,255'; // White
CONTROL_EDIT_BORDER = C'123,104,238'; // Medium Slate Blue
CONTROL_EDIT_BACKGROUND = C'75,0,130'; // Indigo
CONTROL_COMBOBOX_BACKGROUND = C'75,0,130'; // Indigo
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'224,102,255'; // Medium Purple
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'255,250,250'; // Snow
CONTROL_BACK_BACGROUND = C'138,43,226'; // Blue Violet
CONTROL_BORDER_BACKGROUND = C'123,104,238'; // Medium Slate Blue
CONTROL_CLINET = C'240,248,255'; // Alice Blue
CONTROL_CLINET_BACKGROUND = C'75,0,130'; // Indigo
CONTROL_CAPTION_TEXT = C'224,102,255'; // Medium Purple
CONTROL_CAPTION_BACKGROUND = C'255,250,250'; // Snow
CONTROL_CAPTION_BORDERP = C'148,0,211'; // Dark Orchid
}
break;
case Tropical_Paradise:
{
CONTROLS_BUTTON_TEXT = C'48,47,45'; // Gold
CONTROLS_BUTTON_ENABLE = C'0,255,127'; // Spring Green
CONTROLS_BUTTON_DISABLE = C'255,140,0'; // Dark Orange
CONTROLS_LABEL_TEXT = C'255,228,196'; // Misty Rose
CONTROLS_LABEL_TEXT_ARM = C'0,60,255';
CONTROLS_LABEL_LOG_TEXT = C'131,136,153';
CONTROLS_LABEL_TEXT_ANSWER = C'250,207,154';
CONTROLS_LABEL_BACKGROUND = C'0,191,255'; // Deep Sky Blue
CONTROLS_LABEL_TEXT_TOOLTIP = C'255,69,0'; // Red Orange
CONTROLS_LABEL_TEXT_TITLE = C'0,60,255'; // Magenta
CONTROLS_LABEL_TITLE_BACKGROUND = C'0,191,255'; // Deep Sky Blue
CONTROL_EDIT_TEXT = C'0,0,0'; // Black
CONTROL_EDIT_BORDER = C'60,179,113'; // Medium Sea Green
CONTROL_EDIT_BACKGROUND = C'255,228,196'; // Misty Rose
CONTROL_COMBOBOX_BACKGROUND = C'0,191,255'; // Deep Sky Blue
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'255,255,224'; // Light Yellow
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'0,255,127'; // Spring Green
CONTROL_BACK_BACGROUND = C'255,140,0'; // Dark Orange
CONTROL_BORDER_BACKGROUND = C'60,179,113'; // Medium Sea Green
CONTROL_CLINET = C'255,250,250'; // Snow
CONTROL_CLINET_BACKGROUND = C'0,191,255'; // Deep Sky Blue
CONTROL_CAPTION_TEXT = C'41,138,230'; // Gold
CONTROL_CAPTION_BACKGROUND = C'255,228,196'; // Misty Rose
CONTROL_CAPTION_BORDERP = C'255,69,0'; // Red Orange
}
break;
case Forest_Green:
{
CONTROLS_BUTTON_TEXT = C'240,255,240'; // Honeydew
CONTROLS_BUTTON_ENABLE = C'34,139,34'; // Forest Green
CONTROLS_BUTTON_DISABLE = C'120,128,105'; // Olive Green
CONTROLS_LABEL_TEXT = C'245,245,220'; // Beige
CONTROLS_LABEL_TEXT_ARM = C'173,255,47';
CONTROLS_LABEL_LOG_TEXT = C'118,170,238';
CONTROLS_LABEL_TEXT_ANSWER = C'250,250,185';
CONTROLS_LABEL_BACKGROUND = C'34,139,34'; // Forest Green
CONTROLS_LABEL_TEXT_TOOLTIP = C'255,255,240'; // Ivory
CONTROLS_LABEL_TEXT_TITLE = C'173,255,47'; // Light Green
CONTROLS_LABEL_TITLE_BACKGROUND = C'34,139,34'; // Forest Green
CONTROL_EDIT_TEXT = C'240,255,240'; // Honeydew
CONTROL_EDIT_BORDER = C'0,100,0'; // Dark Green
CONTROL_EDIT_BACKGROUND = C'107,142,35'; // Olive Green
CONTROL_COMBOBOX_BACKGROUND = C'34,139,34'; // Forest Green
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'173,255,47'; // Light Green
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'255,255,240'; // Ivory
CONTROL_BACK_BACGROUND = C'107,142,35'; // Olive Green
CONTROL_BORDER_BACKGROUND = C'0,100,0'; // Dark Green
CONTROL_CLINET = C'255,255,255'; // White
CONTROL_CLINET_BACKGROUND = C'34,139,34'; // Forest Green
CONTROL_CAPTION_TEXT = C'255,255,240'; // Ivory
CONTROL_CAPTION_BACKGROUND = C'34,139,34'; // Forest Green
CONTROL_CAPTION_BORDERP = C'0,100,0';
}
break;
case Sunset_Orange:
{
CONTROLS_BUTTON_TEXT = C'255,255,255'; // White
CONTROLS_BUTTON_ENABLE = C'255,69,0'; // Orange Red
CONTROLS_BUTTON_DISABLE = C'139,0,0'; // Dark Red
CONTROLS_LABEL_TEXT = C'255,228,181'; // Light Beige
CONTROLS_LABEL_TEXT_ARM = C'255,255,0';
CONTROLS_LABEL_LOG_TEXT = C'179,163,114';
CONTROLS_LABEL_TEXT_ANSWER = C'252,213,147';
CONTROLS_LABEL_BACKGROUND = C'255,140,0'; // Dark Orange
CONTROLS_LABEL_TEXT_TOOLTIP = C'255,165,0'; // Orange
CONTROLS_LABEL_TEXT_TITLE = C'255,255,0'; // Bright Yellow
CONTROLS_LABEL_TITLE_BACKGROUND = C'255,140,0'; // Dark Orange
CONTROL_EDIT_TEXT = C'255,255,255'; // White
CONTROL_EDIT_BORDER = C'255,69,0'; // Orange Red
CONTROL_EDIT_BACKGROUND = C'139,0,0'; // Dark Red
CONTROL_COMBOBOX_BACKGROUND = C'255,140,0'; // Dark Orange
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'255,255,0'; // Bright Yellow
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'255,228,181'; // Light Beige
CONTROL_BACK_BACGROUND = C'255,69,0'; // Orange Red
CONTROL_BORDER_BACKGROUND = C'139,0,0'; // Dark Red
CONTROL_CLINET = C'255,255,255'; // White
CONTROL_CLINET_BACKGROUND = C'255,140,0'; // Dark Orange
CONTROL_CAPTION_TEXT = C'255,255,255'; // White
CONTROL_CAPTION_BACKGROUND = C'255,140,0'; // Dark Orange
CONTROL_CAPTION_BORDERP = C'255,69,0';
}
break;
case Calm_Pastel:
{
CONTROLS_BUTTON_TEXT = C'0,0,0'; // Black
CONTROLS_BUTTON_ENABLE = C'255,182,193'; // Light Pink
CONTROLS_BUTTON_DISABLE = C'176,224,230'; // Powder Blue
CONTROLS_LABEL_TEXT = C'19,80,248'; // Medium Aquamarine
CONTROLS_LABEL_TEXT_ARM = C'250,128,114';
CONTROLS_LABEL_LOG_TEXT = C'137,250,114';
CONTROLS_LABEL_TEXT_ANSWER = C'97,138,250';
CONTROLS_LABEL_BACKGROUND = C'255,228,196'; // Pastel Peach
CONTROLS_LABEL_TEXT_TOOLTIP = C'255,218,185'; // Peach Puff
CONTROLS_LABEL_TEXT_TITLE = C'250,128,114'; // Salmon
CONTROLS_LABEL_TITLE_BACKGROUND = C'255,228,196'; // Pastel Peach
CONTROL_EDIT_TEXT = C'0,0,0'; // Black
CONTROL_EDIT_BORDER = C'139,182,231'; // Powder Blue
CONTROL_EDIT_BACKGROUND = C'255,228,196'; // Pastel Peach
CONTROL_COMBOBOX_BACKGROUND = C'255,228,196'; // Pastel Peach
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'255,218,185'; // Peach Puff
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'102,205,170'; // Medium Aquamarine
CONTROL_BACK_BACGROUND = C'255,228,196'; // Pastel Peach
CONTROL_BORDER_BACKGROUND = C'255,182,193'; // Light Pink
CONTROL_CLINET = C'0,0,0'; // Black
CONTROL_CLINET_BACKGROUND = C'255,228,196'; // Pastel Peach
CONTROL_CAPTION_TEXT = C'0,0,0'; // Black
CONTROL_CAPTION_BACKGROUND = C'255,228,196'; // Pastel Peach
CONTROL_CAPTION_BORDERP = C'255,182,193';
}
break;
case Ocean_Breeze:
{
CONTROLS_BUTTON_TEXT = C'255,255,255'; // White
CONTROLS_BUTTON_ENABLE = C'0,105,148'; // Deep Sea Blue
CONTROLS_BUTTON_DISABLE = C'100,149,237'; // Cornflower Blue
CONTROLS_LABEL_TEXT = C'240,255,255'; // Azure
CONTROLS_LABEL_TEXT_ARM = C'173,216,230';
CONTROLS_LABEL_LOG_TEXT = C'173,216,230';
CONTROLS_LABEL_TEXT_ANSWER = C'117,255,225';
CONTROLS_LABEL_BACKGROUND = C'70,130,180'; // Steel Blue
CONTROLS_LABEL_TEXT_TOOLTIP = C'255,255,240'; // Ivory
CONTROLS_LABEL_TEXT_TITLE = C'173,216,230'; // Light Blue
CONTROLS_LABEL_TITLE_BACKGROUND = C'0,105,148'; // Deep Sea Blue
CONTROL_EDIT_TEXT = C'255,255,255'; // White
CONTROL_EDIT_BORDER = C'100,149,237'; // Cornflower Blue
CONTROL_EDIT_BACKGROUND = C'0,105,148'; // Deep Sea Blue
CONTROL_COMBOBOX_BACKGROUND = C'70,130,180'; // Steel Blue
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'173,216,230'; // Light Blue
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'240,255,255'; // Azure
CONTROL_BACK_BACGROUND = C'0,105,148'; // Deep Sea Blue
CONTROL_BORDER_BACKGROUND = C'70,130,180'; // Steel Blue
CONTROL_CLINET = C'255,255,255'; // White
CONTROL_CLINET_BACKGROUND = C'0,105,148'; // Deep Sea Blue
CONTROL_CAPTION_TEXT = C'255,255,255'; // White
CONTROL_CAPTION_BACKGROUND = C'0,105,148'; // Deep Sea Blue
CONTROL_CAPTION_BORDERP = C'100,149,237';
}
break;
case Desert_Sand:
{
CONTROLS_BUTTON_TEXT = C'139,69,19'; // Saddle Brown
CONTROLS_BUTTON_ENABLE = C'210,180,140'; // Tan
CONTROLS_BUTTON_DISABLE = C'244,164,96'; // Sandy Brown
CONTROLS_LABEL_TEXT = C'255,228,181'; // Moccasin
CONTROLS_LABEL_TEXT_ARM = C'82,80,78';
CONTROLS_LABEL_LOG_TEXT = C'183,189,129';
CONTROLS_LABEL_TEXT_ANSWER = C'253,244,227';
CONTROLS_LABEL_BACKGROUND = C'210,180,140'; // Tan
CONTROLS_LABEL_TEXT_TOOLTIP = C'255,235,205'; // Blanched Almond
CONTROLS_LABEL_TEXT_TITLE = C'82,80,78'; // Sandy Brown
CONTROLS_LABEL_TITLE_BACKGROUND = C'139,69,19'; // Saddle Brown
CONTROL_EDIT_TEXT = C'139,69,19'; // Saddle Brown
CONTROL_EDIT_BORDER = C'117,113,110'; // Sandy Brown
CONTROL_EDIT_BACKGROUND = C'255,228,181'; // Moccasin
CONTROL_COMBOBOX_BACKGROUND = C'210,180,140'; // Tan
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'255,235,205'; // Blanched Almond
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'244,164,96'; // Sandy Brown
CONTROL_BACK_BACGROUND = C'139,69,19'; // Saddle Brown
CONTROL_BORDER_BACKGROUND = C'210,180,140'; // Tan
CONTROL_CLINET = C'139,69,19'; // Saddle Brown
CONTROL_CLINET_BACKGROUND = C'210,180,140'; // Tan
CONTROL_CAPTION_TEXT = C'54,100,228'; // Moccasin
CONTROL_CAPTION_BACKGROUND = C'210,180,140'; // Tan
CONTROL_CAPTION_BORDERP = C'244,164,96';
}
break;
case Crimson_Rose:
{
CONTROLS_BUTTON_TEXT = C'255,255,255'; // White
CONTROLS_BUTTON_ENABLE = C'220,20,60'; // Crimson
CONTROLS_BUTTON_DISABLE = C'216,141,182'; // Light Pink
CONTROLS_LABEL_TEXT = C'255,240,245'; // Lavender Blush
CONTROLS_LABEL_TEXT_ARM = C'255,69,0';
CONTROLS_LABEL_LOG_TEXT = C'0,217,255';
CONTROLS_LABEL_TEXT_ANSWER = C'250,201,217';
CONTROLS_LABEL_BACKGROUND = C'255,105,180'; // Hot Pink
CONTROLS_LABEL_TEXT_TOOLTIP = C'255,182,193'; // Light Pink
CONTROLS_LABEL_TEXT_TITLE = C'255,69,0'; // Orange Red
CONTROLS_LABEL_TITLE_BACKGROUND = C'220,20,60'; // Crimson
CONTROL_EDIT_TEXT = C'255,255,255'; // White
CONTROL_EDIT_BORDER = C'255,105,180'; // Hot Pink
CONTROL_EDIT_BACKGROUND = C'255,69,0'; // Orange Red
CONTROL_COMBOBOX_BACKGROUND = C'220,20,60'; // Crimson
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'255,182,193'; // Light Pink
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'255,240,245'; // Lavender Blush
CONTROL_BACK_BACGROUND = C'255,69,0'; // Orange Red
CONTROL_BORDER_BACKGROUND = C'255,105,180'; // Hot Pink
CONTROL_CLINET = C'255,255,255'; // White
CONTROL_CLINET_BACKGROUND = C'255,105,180'; // Hot Pink
CONTROL_CAPTION_TEXT = C'255,255,255'; // White
CONTROL_CAPTION_BACKGROUND = C'255,69,0'; // Orange Red
CONTROL_CAPTION_BORDERP = C'220,20,60';
}
break;
case Cool_Mint:
{
CONTROLS_BUTTON_TEXT = C'0,100,0'; // Dark Green
CONTROLS_BUTTON_ENABLE = C'0,245,0'; // Pale Green
CONTROLS_BUTTON_DISABLE = C'0,250,154'; // Medium Spring Green
CONTROLS_LABEL_TEXT = C'165,84,46'; // Mint Cream
CONTROLS_LABEL_TEXT_ARM = C'25,106,199';
CONTROLS_LABEL_LOG_TEXT = C'25,199,63';
CONTROLS_LABEL_TEXT_ANSWER = C'165,84,46';
CONTROLS_LABEL_BACKGROUND = C'152,251,152'; // Pale Green
CONTROLS_LABEL_TEXT_TOOLTIP = C'245,255,250'; // Mint Cream
CONTROLS_LABEL_TEXT_TITLE = C'25,106,199'; // Green
CONTROLS_LABEL_TITLE_BACKGROUND = C'0,250,154'; // Medium Spring Green
CONTROL_EDIT_TEXT = C'0,100,0'; // Dark Green
CONTROL_EDIT_BORDER = C'70,100,89'; // Medium Spring Green
CONTROL_EDIT_BACKGROUND = C'245,255,250'; // Mint Cream
CONTROL_COMBOBOX_BACKGROUND = C'152,251,152'; // Pale Green
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'0,250,154'; // Medium Spring Green
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'0,100,0'; // Dark Green
CONTROL_BACK_BACGROUND = C'0,250,154'; // Medium Spring Green
CONTROL_BORDER_BACKGROUND = C'152,251,152'; // Pale Green
CONTROL_CLINET = C'0,100,0'; // Dark Green
CONTROL_CLINET_BACKGROUND = C'152,251,152'; // Pale Green
CONTROL_CAPTION_TEXT = C'0,100,0'; // Dark Green
CONTROL_CAPTION_BACKGROUND = C'152,251,152'; // Pale Green
CONTROL_CAPTION_BORDERP = C'0,250,154';
}
break;
case Black_Theme:
{
CONTROLS_BUTTON_TEXT = C'255,255,255'; // White
CONTROLS_BUTTON_ENABLE = C'50,50,50'; // Dark Gray
CONTROLS_BUTTON_DISABLE = C'128,128,128'; // Gray
CONTROLS_LABEL_TEXT = C'255,255,255'; // White
CONTROLS_LABEL_TEXT_ARM = C'255,215,0';
CONTROLS_LABEL_LOG_TEXT = C'255,166,0';
CONTROLS_LABEL_TEXT_ANSWER = C'252,204,204';
CONTROLS_LABEL_BACKGROUND = C'0,0,0'; // Black
CONTROLS_LABEL_TEXT_TOOLTIP = C'255,69,0'; // Red Orange
CONTROLS_LABEL_TEXT_TITLE = C'255,215,0'; // Gold
CONTROLS_LABEL_TITLE_BACKGROUND = C'50,50,50'; // Dark Gray
CONTROL_EDIT_TEXT = C'255,255,255'; // White
CONTROL_EDIT_BORDER = C'128,128,128'; // Gray
CONTROL_EDIT_BACKGROUND = C'30,30,30'; // Darker Gray
CONTROL_COMBOBOX_BACKGROUND = C'50,50,50'; // Dark Gray
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'180,171,171'; // Darker Gray
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'255,255,255'; // White
CONTROL_BACK_BACGROUND = C'128,128,128'; // Black
CONTROL_BORDER_BACKGROUND = C'128,128,128'; // Gray
CONTROL_CLINET = C'50,50,50'; // Dark Gray
CONTROL_CLINET_BACKGROUND = C'30,30,30'; // Darker Gray
CONTROL_CAPTION_TEXT = C'255,255,255'; // White
CONTROL_CAPTION_BACKGROUND = C'0,0,0'; // Black
CONTROL_CAPTION_BORDERP = C'255,215,0'; // Gold
}
break;
case Brown_Theme:
{
CONTROLS_BUTTON_TEXT = C'255,255,255'; // White
CONTROLS_BUTTON_ENABLE = C'139,69,19'; // Saddle Brown
CONTROLS_BUTTON_DISABLE = C'218,161,76'; // Sienna
CONTROLS_LABEL_TEXT = C'255,228,181'; // Moccasin
CONTROLS_LABEL_BACKGROUND = C'139,69,19'; // Saddle Brown
CONTROLS_LABEL_TEXT_TOOLTIP = C'255,140,0'; // Dark Orange
CONTROLS_LABEL_TEXT_TITLE = C'92,94,205'; // Indian Red
CONTROLS_LABEL_TITLE_BACKGROUND = C'210,105,30'; // Chocolate
CONTROL_EDIT_TEXT = C'255,255,255'; // White
CONTROL_EDIT_BORDER = C'205,133,63'; // Peru
CONTROL_EDIT_BACKGROUND = C'139,69,19'; // Saddle Brown
CONTROL_COMBOBOX_BACKGROUND = C'210,105,30'; // Chocolate
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'255,228,181'; // Moccasin
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'139,69,19'; // Saddle Brown
CONTROL_BACK_BACGROUND = C'160,82,45'; // Sienna
CONTROL_BORDER_BACKGROUND = C'205,133,63'; // Peru
CONTROL_CLINET = C'255,245,238'; // Seashell
CONTROL_CLINET_BACKGROUND = C'210,105,30'; // Chocolate
CONTROL_CAPTION_TEXT = C'255,255,255'; // White
CONTROL_CAPTION_BACKGROUND = C'139,69,19'; // Saddle Brown
CONTROL_CAPTION_BORDERP = C'205,92,92'; // Indian Red
}
break;
case White_Theme_1:
{
CONTROLS_BUTTON_TEXT = C'0,0,0'; // Black
CONTROLS_BUTTON_ENABLE = C'220,220,220'; // Light Gray
CONTROLS_BUTTON_DISABLE = C'192,192,192'; // Gray
CONTROLS_LABEL_TEXT = C'0,0,0'; // Black
CONTROLS_LABEL_TEXT_ARM = C'0,102,204';
CONTROLS_LABEL_LOG_TEXT = C'0,180,204';
CONTROLS_LABEL_TEXT_ANSWER = C'83,82,82';
CONTROLS_LABEL_BACKGROUND = C'255,255,255'; // White
CONTROLS_LABEL_TEXT_TOOLTIP = C'255,69,0'; // Red Orange
CONTROLS_LABEL_TEXT_TITLE = C'0,102,204'; // Dodger Blue
CONTROLS_LABEL_TITLE_BACKGROUND = C'220,220,220'; // Light Gray
CONTROL_EDIT_TEXT = C'0,0,0'; // Black
CONTROL_EDIT_BORDER = C'192,192,192'; // Gray
CONTROL_EDIT_BACKGROUND = C'255,255,255'; // White
CONTROL_COMBOBOX_BACKGROUND = C'220,220,220'; // Light Gray
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'255,255,255'; // White
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'0,0,0'; // Black
CONTROL_BACK_BACGROUND = C'255,255,255'; // White
CONTROL_BORDER_BACKGROUND = C'192,192,192'; // Gray
CONTROL_CLINET = C'255,250,205'; // Lemon Chiffon
CONTROL_CLINET_BACKGROUND = C'255,255,255'; // White
CONTROL_CAPTION_TEXT = C'0,0,0'; // Black
CONTROL_CAPTION_BACKGROUND = C'220,220,220'; // Light Gray
CONTROL_CAPTION_BORDERP = C'255,69,0'; // Red Orange
}
break;
case White_Theme_2:
{
CONTROLS_BUTTON_TEXT = C'0,0,0'; // Black
CONTROLS_BUTTON_ENABLE = C'240,240,240'; // Very Light Gray
CONTROLS_BUTTON_DISABLE = C'192,192,192'; // Gray
CONTROLS_LABEL_TEXT = C'0,0,0'; // Black
CONTROLS_LABEL_TEXT_ARM = C'0,102,204';
CONTROLS_LABEL_LOG_TEXT = C'240,113,176';
CONTROLS_LABEL_TEXT_ANSWER = C'83,82,82';
CONTROLS_LABEL_BACKGROUND = C'255,255,255'; // White
CONTROLS_LABEL_TEXT_TOOLTIP = C'255,140,0'; // Dark Orange
CONTROLS_LABEL_TEXT_TITLE = C'0,102,204'; // Dodger Blue
CONTROLS_LABEL_TITLE_BACKGROUND = C'240,240,240'; // Very Light Gray
CONTROL_EDIT_TEXT = C'0,0,0'; // Black
CONTROL_EDIT_BORDER = C'192,192,192'; // Gray
CONTROL_EDIT_BACKGROUND = C'255,255,255'; // White
CONTROL_COMBOBOX_BACKGROUND = C'240,240,240'; // Very Light Gray
CONTROL_COMBOBOX_BACKGROUND_ITEM = C'255,255,255'; // White
CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL = C'0,0,0'; // Black
CONTROL_BACK_BACGROUND = C'255,255,255'; // White
CONTROL_BORDER_BACKGROUND = C'192,192,192'; // Gray
CONTROL_CLINET = C'240,248,255'; // Alice Blue
CONTROL_CLINET_BACKGROUND = C'255,255,255'; // White
CONTROL_CAPTION_TEXT = C'0,0,0'; // Black
CONTROL_CAPTION_BACKGROUND = C'240,240,240'; // Very Light Gray
CONTROL_CAPTION_BORDERP = C'255,140,0'; // Dark Orange
}
break;
}
}
};
// Function to adjust brightness of a color
color CThemes::AdjustBrightness(color baseColor, double factor) {
// Extract the RGB components using bitwise operations
int r = int(((baseColor >> 16) & 0xFF) * factor);
int g = int(((baseColor >> 8) & 0xFF) * factor);
int b = int((baseColor & 0xFF) * factor);
// Ensure the color values are within the valid range (0-255)
r = MathMin(r, 255);
g = MathMin(g, 255);
b = MathMin(b, 255);
// Combine the adjusted RGB values back into a color
return (color)((r << 16) | (g << 8) | b);
}
// Example usage
/*
void CThemes::ApplyThemeBrightness(bool isDarkMode) {
double factor = isDarkMode ? 0.8 : 1.2; // Adjust factor for dark/light mode
// Adjust brightness for each color attribute
CONTROLS_BUTTON_TEXT = AdjustBrightness(CONTROLS_BUTTON_TEXT, factor);
CONTROLS_BUTTON_ENABLE = AdjustBrightness(CONTROLS_BUTTON_ENABLE, factor);
CONTROLS_BUTTON_DISABLE = AdjustBrightness(CONTROLS_BUTTON_DISABLE, factor);
CONTROLS_LABEL_TEXT = AdjustBrightness(CONTROLS_LABEL_TEXT, factor);
CONTROLS_LABEL_BACKGROUND = AdjustBrightness(CONTROLS_LABEL_BACKGROUND, factor);
CONTROLS_LABEL_TEXT_TOOLTIP = AdjustBrightness(CONTROLS_LABEL_TEXT_TOOLTIP, factor);
CONTROLS_LABEL_TEXT_TITLE = AdjustBrightness(CONTROLS_LABEL_TEXT_TITLE, factor);
CONTROLS_LABEL_TITLE_BACKGROUND = AdjustBrightness(CONTROLS_LABEL_TITLE_BACKGROUND, factor);
CONTROL_EDIT_TEXT = AdjustBrightness(CONTROL_EDIT_TEXT, factor);
CONTROL_EDIT_BACKGROUND = AdjustBrightness(CONTROL_EDIT_BACKGROUND, factor);
CONTROL_EDIT_BORDER = AdjustBrightness(CONTROL_EDIT_BORDER, factor);
CONTROL_COMBOBOX_BACKGROUND = AdjustBrightness(CONTROL_COMBOBOX_BACKGROUND, factor);
CONTROL_COMBOBOX_BACKGROUND_ITEM = AdjustBrightness(CONTROL_COMBOBOX_BACKGROUND_ITEM, factor);
CONTROL_BACK_BACGROUND = AdjustBrightness(CONTROL_BACK_BACGROUND, factor);
CONTROL_BORDER_BACKGROUND = AdjustBrightness(CONTROL_BORDER_BACKGROUND, factor);
CONTROL_CLINET = AdjustBrightness(CONTROL_CLINET, factor);
CONTROL_CLINET_BACKGROUND = AdjustBrightness(CONTROL_CLINET_BACKGROUND, factor);
CONTROL_CAPTION_TEXT = AdjustBrightness(CONTROL_CAPTION_TEXT, factor);
CONTROL_CAPTION_BACKGROUND = AdjustBrightness(CONTROL_CAPTION_BACKGROUND, factor);
CONTROL_CAPTION_BORDERP = AdjustBrightness(CONTROL_CAPTION_BORDERP, factor);
Print("Theme brightness adjusted for ", isDarkMode ? "dark mode" : "light mode");
}
+332
View File
@@ -0,0 +1,332 @@
//+------------------------------------------------------------------+
//| ComboBox_New.mqh |
//| Copyright 2000-2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Controls/WndContainer.mqh>
#include <Controls/Edit.mqh>
#include <Controls/BmpButton.mqh>
#include "ListView_New.mqh"
//+------------------------------------------------------------------+
//| Resources |
//+------------------------------------------------------------------+
//--- Can not place the same file into resource twice
#resource "res\\DropOn.bmp" // image file
#resource "res\\DropOff.bmp" // image file
//+------------------------------------------------------------------+
//| Class CComboBox |
//| Usage: drop-down list |
//+------------------------------------------------------------------+
class CComboBox : public CWndContainer
{
private:
//--- dependent controls
CEdit m_edit; // the entry field object
CBmpButton m_drop; // the button object
CListView m_list; // the drop-down list object
//--- set up
int m_item_height; // height of visible row
int m_view_items; // number of visible rows in the drop-down list
bool flage;
public:
CComboBox(void);
~CComboBox(void);
//--- create
virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
//--- chart event handler
virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
//--- fill
bool AddItem(const string item,const long value=0);
//--- set up
void ListViewItems(const int value) { m_view_items=value; }
//--- data
virtual bool ItemAdd(const string item,const long value=0) { return(m_list.ItemAdd(item,value)); }
virtual bool ItemInsert(const int index,const string item,const long value=0) { return(m_list.ItemInsert(index,item,value)); }
virtual bool ItemUpdate(const int index,const string item,const long value=0) { return(m_list.ItemUpdate(index,item,value)); }
virtual bool ItemDelete(const int index) { return(m_list.ItemDelete(index)); }
virtual bool ItemsClear(void) { return(m_list.ItemsClear()); }
bool CheckShowHide(void) {return flage;}
//--- data
string Select(void) { return(m_edit.Text()); }
bool Select(const int index);
bool SelectByText(const string text);
bool SelectByValue(const long value);
//--- data (read only)
long Value(void) { return(m_list.Value()); }
//--- state
virtual bool Show(void);
//--- methods for working with files
virtual bool Save(const int file_handle);
virtual bool Load(const int file_handle);
protected:
//--- create dependent controls
virtual bool CreateEdit(void);
virtual bool CreateButton(void);
virtual bool CreateList(void);
//--- handlers of the dependent controls events
virtual bool OnClickEdit(void);
virtual bool OnClickButton(void);
virtual bool OnChangeList(void);
//--- show drop-down list
bool ListShow(void);
bool ListHide(void);
void CheckListHide(const int id,int x,int y);
};
//+------------------------------------------------------------------+
//| Common handler of chart events |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CComboBox)
ON_EVENT(ON_CLICK,m_edit,OnClickEdit)
ON_EVENT(ON_CLICK,m_drop,OnClickButton)
ON_EVENT(ON_CHANGE,m_list,OnChangeList)
CheckListHide(id,(int)lparam,(int)dparam);
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
EVENT_MAP_END(CWndContainer)
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CComboBox::CComboBox(void) : m_item_height(CONTROLS_COMBO_ITEM_HEIGHT),
m_view_items(CONTROLS_COMBO_ITEMS_VIEW)
{
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CComboBox::~CComboBox(void)
{
}
//+------------------------------------------------------------------+
//| Create a control |
//+------------------------------------------------------------------+
bool CComboBox::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
{
//--- check height
if(y2-y1<CONTROLS_COMBO_MIN_HEIGHT)
return(false);
//--- call method of the parent class
if(!CWndContainer::Create(chart,name,subwin,x1,y1,x2,y2))
return(false);
//--- create dependent controls
if(!CreateEdit())
return(false);
if(!CreateButton())
return(false);
if(!CreateList())
return(false);
//--- succeeded
return(true);
}
//+------------------------------------------------------------------+
//| Create main entry field |
//+------------------------------------------------------------------+
bool CComboBox::CreateEdit(void)
{
//--- create
if(!m_edit.Create(m_chart_id,m_name+"Edit",m_subwin,0,0,Width(),Height()))
return(false);
if(!m_edit.Text(""))
return(false);
if(!m_edit.ReadOnly(true))
return(false);
if(!Add(m_edit))
return(false);
//--- succeeded
return(true);
}
//+------------------------------------------------------------------+
//| Create button |
//+------------------------------------------------------------------+
bool CComboBox::CreateButton(void)
{
//--- right align button (try to make equal offsets from top and bottom)
int x1=Width()-(CONTROLS_BUTTON_SIZE+CONTROLS_COMBO_BUTTON_X_OFF);
int y1=(Height()-CONTROLS_BUTTON_SIZE)/2;
int x2=x1+CONTROLS_BUTTON_SIZE;
int y2=y1+CONTROLS_BUTTON_SIZE;
//--- create
if(!m_drop.Create(m_chart_id,m_name+"Drop",m_subwin,x1,y1,x2,y2))
return(false);
if(!m_drop.BmpNames("::res\\DropOff.bmp","::res\\DropOn.bmp"))
return(false);
if(!Add(m_drop))
return(false);
m_drop.Locking(true);
//--- succeeded
return(true);
}
//+------------------------------------------------------------------+
//| Create drop-down list |
//+------------------------------------------------------------------+
bool CComboBox::CreateList(void)
{
//--- create
if(m_list.TotalView(m_view_items))
{
if(!m_list.Create(m_chart_id,m_name+"List",m_subwin,0,Height(),Width(),0))
return(false);
if(!Add(m_list))
return(false);
m_list.Hide();
}
//--- succeeded
return(true);
}
//+------------------------------------------------------------------+
//| Add item (row) |
//+------------------------------------------------------------------+
bool CComboBox::AddItem(const string item,const long value)
{
//--- add item to list
return(m_list.AddItem(item,value));
}
//+------------------------------------------------------------------+
//| Select item |
//+------------------------------------------------------------------+
bool CComboBox::Select(const int index)
{
if(!m_list.Select(index))
return(false);
//--- call the handler
return(OnChangeList());
}
//+------------------------------------------------------------------+
//| Select item (by text) |
//+------------------------------------------------------------------+
bool CComboBox::SelectByText(const string text)
{
if(!m_list.SelectByText(text))
return(false);
//--- call the handler
return(OnChangeList());
}
//+------------------------------------------------------------------+
//| Select item (by value) |
//+------------------------------------------------------------------+
bool CComboBox::SelectByValue(const long value)
{
if(!m_list.SelectByValue(value))
return(false);
//--- call the handler
return(OnChangeList());
}
//+------------------------------------------------------------------+
//| Makes the control visible |
//+------------------------------------------------------------------+
bool CComboBox::Show(void)
{
m_edit.Show();
m_drop.Show();
m_list.Hide();
flage = false;
//--- call of the method of the parent class
return(CWnd::Show());
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CComboBox::Save(const int file_handle)
{
//--- check
if(file_handle==INVALID_HANDLE)
return(false);
//---
FileWriteLong(file_handle,Value());
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CComboBox::Load(const int file_handle)
{
//--- check
if(file_handle==INVALID_HANDLE)
return(false);
//---
if(!FileIsEnding(file_handle))
SelectByValue(FileReadLong(file_handle));
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| Handler of click on main entry field |
//+------------------------------------------------------------------+
bool CComboBox::OnClickEdit(void)
{
//--- change button state
if(!m_drop.Pressed(!m_drop.Pressed()))
return(false);
//--- call the click on button handler
return(OnClickButton());
}
//+------------------------------------------------------------------+
//| Handler of click on button |
//+------------------------------------------------------------------+
bool CComboBox::OnClickButton(void)
{
//--- show or hide the drop-down list depending on the button state
return((m_drop.Pressed()) ? ListShow() : ListHide());
}
//+------------------------------------------------------------------+
//| Handler of click on drop-down list |
//+------------------------------------------------------------------+
bool CComboBox::OnChangeList(void)
{
string text=m_list.Select();
//--- hide the list, depress the button
ListHide();
m_drop.Pressed(false);
//--- set text in the main entry field
m_edit.Text(text);
//--- send notification
EventChartCustom(CONTROLS_SELF_MESSAGE,ON_CHANGE,m_id,0.0,m_name);
//--- handled
return(true);
}
//+------------------------------------------------------------------+
//| Show the drop-down list |
//+------------------------------------------------------------------+
bool CComboBox::ListShow(void)
{
BringToTop();
//--- show the list
flage = true;
return(m_list.Show());
}
//+------------------------------------------------------------------+
//| Hide drop-down list |
//+------------------------------------------------------------------+
bool CComboBox::ListHide(void)
{
flage = false;
//--- hide the list
return(m_list.Hide());
}
//+------------------------------------------------------------------+
//| Hide the drop-down element if necessary |
//+------------------------------------------------------------------+
void CComboBox::CheckListHide(const int id,int x,int y)
{
//--- check event ID
if(id!=CHARTEVENT_CLICK && id != CHARTEVENT_MOUSE_MOVE)
return;
//--- check visibility of the drop-down element
if(!m_list.IsVisible())
return;
//--- check mouse cursor's position
y-=(int)ChartGetInteger(m_chart_id,CHART_WINDOW_YDISTANCE,m_subwin);
if(!m_edit.Contains(x,y) && !m_list.Contains(x,y))
{
m_drop.Pressed(false);
m_list.Hide();
flage = false;
}
}
//+------------------------------------------------------------------+
+1164
View File
File diff suppressed because it is too large Load Diff
+111
View File
@@ -0,0 +1,111 @@
//+------------------------------------------------------------------+
//| FileSave.mqh |
//| Copyright 2023, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link "https://www.mql5.com"
class CFileSaving
{
private:
MqlDateTime m_date;
string m_mqlName;
string m_path;
string m_expertRunLogPath;
public:
CFileSaving(void);
~CFileSaving(void);
void IniFileSave(string errortxt, bool symbol);
void IniFileSaveRun(string errortxt, bool symbol);
string IniFileName();
bool Save(const int file_handle, string errortxt, bool symbol);
virtual string DirectoryLogFile() {return (m_mqlName + " EA" + "\\" + AccountInfoString(ACCOUNT_COMPANY) + "\\"+IntegerToString(GenerateMagicNumbers())+ "\\Log\\Log.txt");}
};
CFileSaving::CFileSaving(void)
{
// FileDelete(m_mqlName + " EA" + "\\" + AccountInfoString(ACCOUNT_COMPANY) + "\\Log\\Log.txt");
m_mqlName = MQLInfoString(MQL_PROGRAM_NAME);
TimeToStruct(TimeCurrent(), m_date);
string logFile = StringFormat("%04d%02d%02d", m_date.year, m_date.mon, m_date.day) + ".txt";
m_path = m_mqlName + " EA" + "\\" + AccountInfoString(ACCOUNT_COMPANY) + "\\" + IntegerToString(GenerateMagicNumbers())+ "\\Log\\" + logFile;
m_expertRunLogPath = m_mqlName + " EA" + "\\" + AccountInfoString(ACCOUNT_COMPANY) + "\\"+ IntegerToString(GenerateMagicNumbers())+ "\\Log\\Log.txt";
}
CFileSaving::~CFileSaving(void)
{
}
void CFileSaving::IniFileSave(string errortxt, bool symbol)
{
string filename=m_path;
int handle=FileOpen(filename,FILE_READ|FILE_WRITE|FILE_CSV);
if(handle!=INVALID_HANDLE)
{
Save(handle,errortxt,symbol);
FileClose(handle);
}
}
void CFileSaving::IniFileSaveRun(string errortxt, bool symbol)
{
string filename=m_expertRunLogPath;
int handle=FileOpen(filename,FILE_READ|FILE_WRITE|FILE_CSV);
if(handle!=INVALID_HANDLE)
{
Save(handle,errortxt,symbol);
FileClose(handle);
}
}
string CFileSaving::IniFileName()
{
string name;
name=m_mqlName;
name+="_Log";
name+="_Ini.txt";
return(name);
}
bool CFileSaving::Save(const int file_handle, string errortxt, bool symbol)
{
datetime currentTime = TimeCurrent();
string dateTimeStr = TimeToString(currentTime, TIME_DATE | TIME_MINUTES);
string str = symbol ? " " + Symbol() : " " ;
FileSeek(file_handle,0,SEEK_END);
bool success = FileWriteString(file_handle,dateTimeStr + str + errortxt + "\n");
return success;
}
long GenerateMagicNumbers()
{
string expNames = MQLInfoString(MQL_PROGRAM_NAME);
string symbol = Symbol(); // Get the current symbol (e.g., "EURUSD")
// string expName = MQLInfoString(MQL_PROGRAM_NAME); // Get the expert name
int baseMagicNumber = 10000; // Base magic number
// Calculate a unique number for the symbol
int symbolCode = 0;
for (int i = 0; i < StringLen(symbol); i++)
{
symbolCode += StringGetCharacter(symbol, i); // Sum the ASCII values of the symbol's characters
}
// Calculate a unique number for the expert name
int expNameCode = 0;
for (int i = 0; i < StringLen(expNames); i++)
{
expNameCode += StringGetCharacter(expNames, i); // Sum the ASCII values of the expert name's characters
}
// Combine base magic number, symbol code, and expert name code
return baseMagicNumber + symbolCode + expNameCode;
}
+63
View File
@@ -0,0 +1,63 @@
//+------------------------------------------------------------------+
//| Enumeration for Windows fonts indices storage |
//+------------------------------------------------------------------+
class CFont
{
private:
string m_fonts[];
public:
CFont(void);
~CFont(void);
int FontsTotal(void) const { return(::ArraySize(m_fonts)); }
string FontsByIndex(const uint index);
private:
void InitializeFontsArray(void);
};
CFont::CFont(void)
{
InitializeFontsArray();
}
CFont::~CFont(void)
{
::ArrayFree(m_fonts);
}
string CFont::FontsByIndex(const uint index)
{
uint array_size=FontsTotal();
uint i=(index>=array_size)? array_size-1 : index;
return(m_fonts[i]);
}
void CFont::InitializeFontsArray(void)
{
::ArrayResize(m_fonts,15);
m_fonts[0]="Arial";
m_fonts[1]="Comic Sans MS";
m_fonts[2]="Courier";
m_fonts[3]="Courier New";
m_fonts[4]="Georgia";
m_fonts[5]="Lucida Console Bold";
m_fonts[6]="Palatino Linotype";
m_fonts[7]="Small Fonts";
m_fonts[8]="Tahoma";
m_fonts[9]="Times New Roman";
m_fonts[10]="Trebuchet MS";
m_fonts[11]="Verdana";
m_fonts[12]="Consolas";
m_fonts[13]="Simplified Arabic Fixed";
m_fonts[14]="Sitka Small";
}
+467
View File
@@ -0,0 +1,467 @@
#include <Trade/DealInfo.mqh>
#include <Arrays/ArrayDouble.mqh>
#include <Generic/HashSet.mqh>
#include "FileSave.mqh"
#include "Translations/English.mqh"
enum deal_result
{
NO_VALUE=0,
WIN=1,
LOSS
};
enum ENUM_HISTORY_SORT
{
HISTORY_SORT_OPENTIME, // Open time
HISTORY_SORT_CLOSETIME // Close time
};
class CHistory
{
private:
CFileSaving m_FileSave;
CDealInfo m_deal;
CArrayDouble m_profit_data;
CArrayDouble m_balance_data;
CArrayDouble m_sharp_balance;
CArrayDouble m_balance_line;
double m_max_lot;
double m_initial_deposit;
double m_withdrawal;
double m_volume;
double m_swap;
double m_commission;
double m_profit;
double m_gross_profit;
double m_gross_loss;
double m_profit_factor;
double m_expected_payoff;
double m_balance;
double m_maxdraw_MDD;
double m_maxdraw_percent;
// double m_balance_min;
// double m_balance_dd;
// double m_balance_dd_percent;
// double m_balance_dd_relative;
// double m_balance_dd_relative_percent;
// double m_balance_dd_absolute;
double m_min_peak;
double m_max_peak;
long arr_Positions[];
long m_type;
long m_magic;
int m_deals;
int m_trades;
int m_profit_trades;
double m_profit_trades_percent;
int m_loss_trades;
string m_symbol;
string m_comment;
string m_openTime_str;
string m_closeTime_str;
datetime m_openTime_dt;
datetime m_closeTime_dt;
string m_mqlName;
public:
CHistory(void);
~CHistory(void);
bool Calculate(const string Symbl,const long Mgc,datetime time_start,datetime time_end);
double MaxLots() {return(m_max_lot);}
// double InitialDeposit() {return(m_initial_deposit);}
// double Withdrawal() {return(m_withdrawal);}
double Profit() {return(m_profit);};
double GrossProfit() {return(m_gross_profit);}
double GrossLoss() {return(m_gross_loss);}
double MDD() {return(m_maxdraw_MDD);}
double ProfitFactor() {return(m_profit_factor);}
int Trades() {return(m_trades);}
int ProfitTrades() {return(m_profit_trades);};
double ExpectedPayoff() {return(m_expected_payoff);}
string OpenTime() {return(m_openTime_str);}
string CloseTime() {return(m_closeTime_str);}
double Percent(double value,double divider);
bool AppendDataToCSV(datetime open_time, string symbol, ulong magic, string posType, double volume, double openPric, double Sl, double Tp, double closePrice, datetime close_time, double Commis, double Swp, double profit);
bool CheckIsFileBot() {return(FileIsExist(m_mqlName + " EA" + "\\" + AccountInfoString(ACCOUNT_COMPANY) +"\\"+ IntegerToString(GenerateMagicNumbers())+"\\AnalysisOutput\\"+"Transaction11209.csv"));}
string AnalyzePathFile() {return(m_mqlName + " EA" + "\\" + AccountInfoString(ACCOUNT_COMPANY) +"\\"+ IntegerToString(GenerateMagicNumbers())+"\\AnalysisOutput\\"+"Transaction11209.csv");}
protected:
bool HistorySelectByPositionProcess(const long position_id);
};
//m_withdrawal(0.0), m_max_lot(0.0), m_symbol(NULL), m_type(-1), m_magic(-1), m_volume(0.0),
// m_openTime_str("-"), m_closeTime_str("-"), m_profit(0.0), m_gross_loss(0.0), m_gross_profit(0.0)
CHistory::CHistory(void) : m_max_lot(0.0), m_openTime_str("-"), m_closeTime_str("-"), m_balance(0.0), m_max_peak(0.0), m_min_peak(0.0), m_trades(0),
m_expected_payoff(0.0)
{
m_mqlName = MQLInfoString(MQL_PROGRAM_NAME);
// datetime timestart = D'2024.12.24';
// if(!CheckIsFileBot())
// {
// Calculate(Symbol(), GenerateMagicNumbers(), timestart, TimeCurrent());
// AppendDataToCSV(OpenTime(), Symbol(), GenerateMagicNumbers(), )
// }
}
CHistory::~CHistory(void)
{
}
bool CHistory::Calculate(const string Symbl, const long Mgc,datetime time_start,datetime time_end)
{
deal_result result = NO_VALUE;
int sort_by = HISTORY_SORT_OPENTIME;
datetime first_entry_time = 0;
datetime overall_first_entry_time = 0;
m_profit=0;
m_gross_profit=0;
m_gross_loss=0;
if(!HistorySelect(time_start,time_end))
{
ResetLastError();
string txt = " ⚠ "+ TRANSLATION_HISTORY_GET_TRADE + TRANSLATION_MESSAGE_ERROR + IntegerToString(GetLastError());
m_FileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_FileSave.IniFileSaveRun(txt,false);
return(false);
}
int deals_total = HistoryDealsTotal();
if(sort_by==HISTORY_SORT_OPENTIME)
{
for(int i = 0; i < deals_total && !IsStopped(); i++)
if(m_deal.SelectByIndex(i))
if(m_deal.Entry()==DEAL_ENTRY_IN)
if(m_deal.DealType()==DEAL_TYPE_BUY || m_deal.DealType()==DEAL_TYPE_SELL)
{
if(m_deal.Symbol() != Symbl)
continue;
if(m_deal.Magic() != Mgc)
continue;
//--- save position ids to the array
long position_id=m_deal.PositionId();
int arr_size=ArraySize(arr_Positions);
if(ArrayResize(arr_Positions,arr_size+1)==arr_size+1)
arr_Positions[arr_size]=position_id;
m_trades++;
if (first_entry_time == 0 || m_deal.Time() < first_entry_time) {first_entry_time = m_deal.Time();}
}
}
if(sort_by==HISTORY_SORT_CLOSETIME)
{
//--- define a hashset to collect position IDs (with no duplicates)
CHashSet<long>hashset;
//--- handle the case when a position has multiple deals out.
for(int i = deals_total-1; i >= 0 && !IsStopped(); i--)
if(m_deal.SelectByIndex(i))
if(m_deal.Entry()==DEAL_ENTRY_OUT || m_deal.Entry()==DEAL_ENTRY_OUT_BY)
if(m_deal.DealType()==DEAL_TYPE_BUY || m_deal.DealType()==DEAL_TYPE_SELL)
{
if(m_deal.Symbol() != Symbl)
continue;
if(m_deal.Magic() != Mgc)
continue;
hashset.Add(m_deal.PositionId());
}
//--- copy the elements from the set to a compatible one-dimensional array
hashset.CopyTo(arr_Positions,0);
//ArrayReverse(arr_Positions);
ArraySetAsSeries(arr_Positions,true);
}
deals_total = ArraySize(arr_Positions);
for(int i=0; i<deals_total; i++)
{
long position_id = arr_Positions[i];
HistorySelectByPositionProcess(position_id);
}
if (first_entry_time > 0)
{
if (overall_first_entry_time == 0 || first_entry_time < overall_first_entry_time)
{
overall_first_entry_time = first_entry_time;
m_openTime_dt = overall_first_entry_time;
m_openTime_str = TimeToString(overall_first_entry_time, TIME_DATE);
}
}
return true;
}
//+------------------------------------------------------------------+
//| Select history of orders and deals by position ID and |
//| prints a list of orders and deals for the position in the journal|
//+------------------------------------------------------------------+
bool CHistory::HistorySelectByPositionProcess(const long position_id)
{
double profit=0, profit_close=0;
m_profit_factor = 0;
datetime last_exit_time = 0;
datetime overall_last_exit_time = 0;
if(!HistorySelectByPosition(position_id))
{
ResetLastError();
string txt = " ⚠ "+ TRANSLATION_HISTORY_SELECTPOSITION_ERR + "(#"+IntegerToString(position_id,0)+") " + TRANSLATION_HISTORY_SELECTPOSITION_FAILED + TRANSLATION_MESSAGE_ERROR + IntegerToString(GetLastError());
m_FileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_FileSave.IniFileSaveRun(txt,false);
return(false);
}
int orders_total=HistoryOrdersTotal();
for(int i=0; i<orders_total; i++)
{
ulong ticket = HistoryOrderGetTicket(i);
string ordersymbol = HistoryOrderGetString(ticket, ORDER_SYMBOL);
long ordermagic = HistoryOrderGetInteger(ticket, ORDER_MAGIC);
if(ticket==0)
continue;
}
int deals_total =HistoryDealsTotal();
for(int i=0; i<deals_total; i++)
{
ulong ticket=HistoryDealGetTicket(i);
double dealprofit = HistoryDealGetDouble(ticket, DEAL_PROFIT);
string dealsymbl = HistoryDealGetString(ticket, DEAL_SYMBOL);
ulong dealmagic = HistoryDealGetInteger(ticket, DEAL_MAGIC);
double dealswap = HistoryDealGetDouble(ticket, DEAL_SWAP);
double dealcomision = HistoryDealGetDouble(ticket, DEAL_COMMISSION);
double dealvolume = HistoryDealGetDouble(ticket, DEAL_VOLUME);
datetime dealtimeClose = (datetime)HistoryDealGetInteger(ticket, DEAL_TIME);
if(ticket==0)
continue;
ENUM_DEAL_ENTRY deal_entry=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket, DEAL_ENTRY);
ENUM_DEAL_TYPE deal_type= (ENUM_DEAL_TYPE)HistoryDealGetInteger(ticket, DEAL_TYPE);
if(deal_type == DEAL_TYPE_BUY || deal_type == DEAL_TYPE_SELL)
{
profit = NormalizeDouble(dealprofit + dealswap + dealcomision, 2);
if(profit >= 0.0) {m_gross_profit += profit;}
else {m_gross_loss += profit;}
// Print(dealprofit," |in| ",dealswap," |in| ",dealcomision);
if(dealvolume > m_max_lot) {m_max_lot = dealvolume;}
if (last_exit_time < dealtimeClose) {last_exit_time = dealtimeClose;}
}
if(deal_entry == DEAL_ENTRY_OUT || deal_entry == DEAL_ENTRY_OUT_BY || deal_entry == DEAL_ENTRY_IN || deal_entry == DEAL_ENTRY_INOUT)
{
profit_close = NormalizeDouble(dealprofit + dealswap + dealcomision,2);
m_balance += profit_close;
// m_trades++;
// Print(dealprofit," |out| ",dealswap," |out| ",dealcomision);
if(profit >= 0.0)
{
m_profit_trades++;
}
}
}
if (last_exit_time > 0)
{
if (overall_last_exit_time == 0 || last_exit_time > overall_last_exit_time)
{
overall_last_exit_time = last_exit_time;
m_closeTime_dt = overall_last_exit_time;
m_closeTime_str = TimeToString(overall_last_exit_time, TIME_DATE);
}
}
if (m_balance > max_balance)
{
max_balance = m_balance;
}
drawdown = NormalizeDouble(max_balance - m_balance, 2);
if(drawdown > m_maxdraw_MDD) {m_maxdraw_MDD = drawdown;}
// Print("balance ",m_balance," | ",max_balance," | ",drawdown," | ",m_maxdraw_MDD);
m_profit = m_gross_profit+m_gross_loss;
if(MathAbs(m_gross_loss) > FLT_EPSILON) {m_profit_factor = MathAbs(m_gross_profit/m_gross_loss);}
if(m_trades > 0)
{
m_expected_payoff=m_profit/m_trades;
m_profit_trades_percent = (double)m_profit_trades / m_trades * 100;
}
return true;
}
double CHistory::Percent(double value,double divider)
{
if(MathAbs(value)<=FLT_EPSILON)
return(0);
return(100*value/divider);
}
bool CHistory::AppendDataToCSV(datetime open_time, string symbol, ulong magic, string posType, double volume, double openPric, double Sl, double Tp, double closePrice, datetime close_time, double Commis, double Swp, double profit)
{
int fh;
// Save to new format only.
fh = FileOpen(AnalyzePathFile(), FILE_WRITE|FILE_CSV|FILE_ANSI,',');
if (fh == INVALID_HANDLE)
{
ResetLastError();
string txt = TRANSLATION_FILED_TO_OPEN_FILE_WRITING + AnalyzePathFile() + TRANSLATION_MESSAGE_ERROR + IntegerToString(GetLastError());
m_FileSave.IniFileSaveRun(txt,false);
m_FileSave.IniFileSave(__FUNCTION__+":: "+ txt, false);
return false;
}
FileWrite(fh, "Open Time", "Symbol", "Magic Number", "Type", "Volume", "Open Price", "S/L", "T/P", "Close Price", "Close Time", "Commission", "Swap", "Profit");
FileWrite(fh, open_time, symbol, magic, posType, volume, openPric, Sl, Tp, closePrice, close_time, Commis, Swp, profit);
FileClose(fh);
return true;
}
//--- global variable
double max_balance = -DBL_MAX;
double drawdown = 0.0;
/*
bool CHistory::Calculate(const string Symbl, const long Mgc,datetime time_start,datetime time_end,double initial_deposit=0.0)
{
if(!HistorySelect(time_start,time_end))
{
ResetLastError();
string txt = " ⚠ "+ TRANSLATION_HISTORY_GET_TRADE + TRANSLATION_MESSAGE_ERROR + IntegerToString(GetLastError());
m_FileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_FileSave.IniFileSaveRun(txt,false);
return(false);
}
for(int i = HistoryDealsTotal()-1; i >=0; i--)
{
// deals
ulong dealticket = HistoryDealGetTicket(i);
if (dealticket <= 0) {
ResetLastError();
string txt = " ⚠ "+ TRANSLATION_DEAL_ERROR_TICKT + TRANSLATION_MESSAGE_ERROR + IntegerToString(GetLastError());
m_FileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_FileSave.IniFileSaveRun(txt,false);
return(false);
}
datetime first_entry_time = 0;
datetime last_exit_time = 0;
datetime overall_first_entry_time = 0;
datetime overall_last_exit_time = 0;
long dealID = 0;
double dealprice = HistoryDealGetDouble(dealticket,DEAL_PRICE);
double dealvolume = HistoryDealGetDouble(dealticket,DEAL_VOLUME);
double dealprofit = HistoryDealGetDouble(dealticket,DEAL_PROFIT);
double dealcommision = HistoryDealGetDouble(dealticket,DEAL_COMMISSION);
double dealswap = HistoryDealGetDouble(dealticket,DEAL_SWAP);
ulong dealmagic = HistoryDealGetInteger(dealticket,DEAL_MAGIC);
string dealcomment = HistoryDealGetString(dealticket,DEAL_COMMENT);
datetime dealtimed = (datetime)HistoryDealGetInteger(dealticket, DEAL_TIME);
string dealDate = TimeToString(dealtimed, TIME_DATE|TIME_MINUTES|TIME_SECONDS);
string dealsymbol = HistoryDealGetString(dealticket,DEAL_SYMBOL);
ENUM_DEAL_ENTRY dealentry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(dealticket,DEAL_ENTRY);
ENUM_DEAL_TYPE dealtype = (ENUM_DEAL_TYPE)HistoryDealGetInteger(dealticket,DEAL_TYPE);
long dealreason = HistoryDealGetInteger(dealticket,DEAL_REASON);
long posID = 0;
// orders
ulong orderticket = HistoryDealGetInteger(dealticket,DEAL_ORDER);
long orderID = HistoryOrderGetInteger(orderticket, ORDER_POSITION_ID);
double orderprice = HistoryOrderGetDouble(orderticket,ORDER_PRICE_OPEN);
double ordervolume = HistoryOrderGetDouble(dealticket,ORDER_VOLUME_INITIAL);
datetime ordertimed = (datetime)HistoryOrderGetInteger(orderticket,ORDER_TIME_DONE);
string orderDate = TimeToString(ordertimed, TIME_DATE|TIME_MINUTES|TIME_SECONDS);
string ordersymbol = HistoryOrderGetString(orderticket,ORDER_SYMBOL);
ENUM_ORDER_TYPE ordertype = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(orderticket,ORDER_TYPE);
if((dealsymbol == Symbl) && (dealmagic == Mgc))
{
if(dealentry == DEAL_ENTRY_IN)
{
if(dealvolume > m_max_lot) {m_max_lot = dealvolume;}
if (first_entry_time == 0 || dealtimed < first_entry_time) {first_entry_time = dealtimed;}
dealID = HistoryDealGetInteger(dealticket,DEAL_POSITION_ID);
posID = dealID;
// Print(dealsymbol," in| ",dealcommision," | ",dealprofit," | ",dealmagic," | ",dealticket," | ",dealvolume," |id| ",dealID);
// Print(ordersymbol," in| ",0," | ",0," | ",0," | ",orderticket," | ",ordervolume," |id| ",orderID);
}
// else if (dealentry == DEAL_ENTRY_OUT)
// {
// if(orderticket == dealID)
// {
// Print("tick ",dealticket, " | ",orderticket);
// }
// // Print(dealsymbol," | ",dealcommision," | ",dealprofit," | ",dealmagic," | ",dealticket," | ",dealvolume);
// // Print(ordersymbol," | ",0," | ",0," | ",0," | ",orderticket," | ",ordervolume);
// }
// Print(dealsymbol," in| ",dealcommision," | ",dealprofit," | ",dealmagic," | ",dealticket," | ",dealvolume," |id| ",dealID);
// Print(ordersymbol," in| ",0," | ",0," | ",0," | ",orderticket," | ",ordervolume," |id| ",orderID);
}
if(dealticket == posID)
{
Print(dealticket," | ",orderticket);
// Print(dealsymbol," in| ",dealcommision," | ",dealprofit," | ",dealmagic," | ",dealticket," | ",dealvolume," |id| ",dealID);
// Print(ordersymbol," in| ",0," | ",0," | ",0," | ",orderticket," | ",ordervolume," |id| ",orderID);
}
// if(dealID == posID)
// {
// Print(dealsymbol," in| ",dealcommision," | ",dealprofit," | ",dealmagic," | ",dealticket," | ",dealvolume," |id| ",dealID);
// Print(ordersymbol," in| ",0," | ",0," | ",0," | ",orderticket," | ",ordervolume," |id| ",orderID);
// }
if (first_entry_time > 0)
{
if (overall_first_entry_time == 0 || first_entry_time < overall_first_entry_time)
{
overall_first_entry_time = first_entry_time;
m_openTime_str = TimeToString(overall_first_entry_time, TIME_DATE);
}
}
}
// Print("maxlot ",m_max_lot," open time ",m_openTime_str," close time ",m_closeTime_str);
return true;
}
+787
View File
@@ -0,0 +1,787 @@
#include <Trade/DealInfo.mqh>
#include <Arrays/ArrayDouble.mqh>
#include <Generic/HashSet.mqh>
#include <Retrace/FileSave.mqh>
#include <Retrace/Translations/English.mqh>
enum deal_result
{
NO_VALUE=0,
WIN=1,
LOSS
};
enum ENUM_HISTORY_SORT
{
HISTORY_SORT_OPENTIME, // Open time
HISTORY_SORT_CLOSETIME // Close time
};
class CHistory
{
private:
CDealInfo m_deal;
CFileSaving m_FileSave;
CArrayDouble m_profit_data;
CArrayDouble m_balance_data;
CArrayDouble m_sharp_balance;
CArrayDouble m_balance_line;
double m_max_lot;
double m_initial_deposit;
double m_withdrawal;
double m_volume;
double m_swap;
double m_commission;
double m_profit;
double m_gross_profit;
double m_gross_loss;
double m_profit_factor;
double m_expected_payoff;
double m_balance;
double m_maxdraw_MDD;
double m_maxdraw_percent;
// double m_balance_min;
// double m_balance_dd;
// double m_balance_dd_percent;
// double m_balance_dd_relative;
// double m_balance_dd_relative_percent;
// double m_balance_dd_absolute;
double m_min_peak;
double m_max_peak;
long arr_Positions[];
long m_type;
long m_magic;
int m_deals;
int m_trades;
int m_profit_trades;
double m_profit_trades_percent;
int m_loss_trades;
string m_symbol;
string m_comment;
string m_openTime_str;
string m_closeTime_str;
datetime m_openTime_dt;
datetime m_closeTime_dt;
string m_mqlName;
// only to save file CSV
datetime c_opTime;
datetime c_clTime;
string c_type;
long c_magic;
double c_volume;
double c_opPrice;
double c_sl;
double c_tp;
double c_clPrice;
double c_commission;
double c_swap;
double c_profit;
double c_profitPoint;
string c_duration;
string c_opComment;
string c_clComment;
public:
CHistory(void);
~CHistory(void);
bool ExportHistoryPositions(const string Cmment);
double MaxLots() {return(m_max_lot);}
// double InitialDeposit() {return(m_initial_deposit);}
// double Withdrawal() {return(m_withdrawal);}
double Profit() {return(m_profit);};
double GrossProfit() {return(m_gross_profit);}
double GrossLoss() {return(m_gross_loss);}
double MDD() {return(m_maxdraw_MDD);}
double ProfitFactor() {return(m_profit_factor);}
int Trades() {return(m_trades);}
int ProfitTrades() {return(m_profit_trades);};
double ExpectedPayoff() {return(m_expected_payoff);}
string OpenTime() {return(m_openTime_str);}
string CloseTime() {return(m_closeTime_str);}
double Percent(double value,double divider);
int CountRowsInCSV();
bool AppendDataToCSV();
bool CheckIsFileBot() {return(FileIsExist(m_mqlName + " EA" + "\\" + AccountInfoString(ACCOUNT_COMPANY) +"\\"+ "Trade_Transaction.csv"));}
string AnalyzePathFile() {return(m_mqlName + " EA" + "\\" + AccountInfoString(ACCOUNT_COMPANY) +"\\"+"Trade_Transaction.csv");}
bool Calculate(const string Symbl,const long Mgc,datetime time_start,datetime time_end);
bool HistorySelectByPositionProcess(const long position_id, const bool saveCsv);
string GetExpertNameWithSum();
};
CHistory::CHistory(void)
{
m_mqlName = MQLInfoString(MQL_PROGRAM_NAME);
c_magic = 1;
}
CHistory::~CHistory(void)
{
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
bool CHistory::ExportHistoryPositions(const string Cmment)
{
datetime time_start = D'2024.12.24';
int handle= FileOpen(AnalyzePathFile(),FILE_WRITE|FILE_CSV|FILE_ANSI,',');// |FILE_ANSI,','
if(handle == INVALID_HANDLE)
{
ResetLastError();
string txt = TRANSLATION_FILED_TO_OPEN_FILE_WRITING + AnalyzePathFile() + TRANSLATION_MESSAGE_ERROR + IntegerToString(GetLastError());
m_FileSave.IniFileSaveRun(txt,false);
m_FileSave.IniFileSave(__FUNCTION__+":: "+ txt, false);
return false;
}
FileWrite(handle, "Open Time", "Symbol", "Magic Number", "Type", "Volume", "Open Price", "S/L", "T/P", "Close Price", "Close Time", "Commission", "Swap", "Profit",
"Profit Points", "Duration", "Open Comment", "Close Comment");
ulong s_time=GetMicrosecondCount();
double Balanc=0;
if(!HistorySelect(time_start,TimeCurrent()))
{
ResetLastError();
string txt = " ⚠ "+ TRANSLATION_HISTORY_GET_TRADE + TRANSLATION_MESSAGE_ERROR + IntegerToString(GetLastError());
m_FileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_FileSave.IniFileSaveRun(txt,false);
return(false);
}
int deals = HistoryDealsTotal();
int sort_by = HISTORY_SORT_CLOSETIME;
if(sort_by==HISTORY_SORT_OPENTIME)
{
for(int i = 0; i < deals && !IsStopped(); i++)
{
if(m_deal.SelectByIndex(i))
if(m_deal.Entry()==DEAL_ENTRY_IN)
{
if(m_deal.DealType()==DEAL_TYPE_BUY || m_deal.DealType()==DEAL_TYPE_SELL)
{
//--- save position ids to the array
long position_id=m_deal.PositionId();
int arr_size=ArraySize(arr_Positions);
ArrayResize(arr_Positions,arr_size+1,100);
arr_Positions[arr_size]=position_id;
}
}
}
}
//---
if(sort_by==HISTORY_SORT_CLOSETIME)
{
//--- define a hashset to collect position IDs (with no duplicates)
CHashSet<long>hashset;
//--- handle the case when a position has multiple deals out.
for(int i = deals-1; i >= 0 && !IsStopped(); i--)
if(m_deal.SelectByIndex(i))
{
if(m_deal.Entry() == DEAL_ENTRY_IN && StringFind(m_deal.Comment(), Cmment) != -1)
{
if(m_deal.DealType() == DEAL_TYPE_BUY || m_deal.DealType() == DEAL_TYPE_SELL)
{
hashset.Add(m_deal.PositionId());
}
}
// if(m_deal.Entry()==DEAL_ENTRY_OUT || m_deal.Entry()==DEAL_ENTRY_OUT_BY)
// if(m_deal.DealType()==DEAL_TYPE_BUY || m_deal.DealType()==DEAL_TYPE_SELL)
// hashset.Add(m_deal.PositionId());
}
//--- copy the elements from the set to a compatible one-dimensional array
hashset.CopyTo(arr_Positions,0);
//ArrayReverse(arr_Positions);
ArraySetAsSeries(arr_Positions,true);
}
//--- now process the list of positions stored in the array
int positions=ArraySize(arr_Positions);
for(int i=0; i<positions && !IsStopped(); i++)
{
string pos_symbol=NULL;
long pos_id=-1;
long pos_type=-1;
long pos_magic=-1;
double pos_open_price=0;
double pos_close_price=0;
double pos_sl = 0;
double pos_tp = 0;
double pos_commission = 0;
double pos_swap=0;
double pos_profit=0;
double pos_open_volume= 0;
double pos_close_volume=0;
datetime pos_open_time=0;
datetime pos_close_time=0;
double pos_sum_cost=0;
long pos_open_reason=-1;
long pos_close_reason=-1;
string pos_open_comment = NULL;
string pos_close_comment = NULL;
//--- request the history of deals and orders for the specified position
if(HistorySelectByPosition(arr_Positions[i]) && HistoryDealsTotal()>1)
{
//--- now process the list of received deals for the specified position
deals=HistoryDealsTotal();
for(int j=0; j<deals && !IsStopped(); j++)
{
//--- select deal ticket by its position in the list
if(m_deal.SelectByIndex(j))
{
pos_id = m_deal.PositionId();
pos_symbol = m_deal.Symbol();
pos_commission += m_deal.Commission();
pos_swap += m_deal.Swap();
pos_profit += m_deal.Profit();
//--- Entry deal for position
if(m_deal.Entry()==DEAL_ENTRY_IN)
{
pos_magic = m_deal.Magic();
pos_type = m_deal.DealType();
pos_open_time = m_deal.Time();
pos_open_price = m_deal.Price();
pos_open_volume = m_deal.Volume();
//---
pos_open_comment = m_deal.Comment();
pos_open_reason = HistoryDealGetInteger(m_deal.Ticket(), DEAL_REASON);
}
//--- Exit deal(s) for position
else if(m_deal.Entry()==DEAL_ENTRY_OUT || m_deal.Entry()==DEAL_ENTRY_OUT_BY)
{
pos_close_time = m_deal.Time();
pos_sum_cost += m_deal.Volume() * m_deal.Price();
pos_close_volume += m_deal.Volume();
pos_close_price = pos_sum_cost / pos_close_volume;
pos_sl = HistoryDealGetDouble(m_deal.Ticket(), DEAL_SL);
pos_tp = HistoryDealGetDouble(m_deal.Ticket(), DEAL_TP);
//---
pos_close_comment += m_deal.Comment() + " ";
pos_close_reason = HistoryDealGetInteger(m_deal.Ticket(), DEAL_REASON);
}
}
}
//--- If the position is still open, it will not be displayed in the history.
if(MathAbs(pos_open_volume-pos_close_volume)>0.00001)
continue;
//--- Closed position is reconstructed
StringTrimLeft(pos_close_comment);
StringTrimRight(pos_close_comment);
//--- sums
Balanc+=pos_profit+pos_swap+pos_commission;
//---
SymbolSelect(pos_symbol,true);
int digits=(int)SymbolInfoInteger(pos_symbol,SYMBOL_DIGITS);
double point=SymbolInfoDouble(pos_symbol,SYMBOL_POINT);
FileWrite(handle,
(string)pos_open_time,
pos_symbol,
pos_magic,
(pos_type==DEAL_TYPE_BUY) ? "buy" : (pos_type==DEAL_TYPE_SELL) ? "sell" : "other",
DoubleToString(pos_close_volume,2),
DoubleToString(pos_open_price,digits),
(pos_sl ? DoubleToString(pos_sl,digits) : ""),
(pos_tp ? DoubleToString(pos_tp,digits) : ""),
DoubleToString(pos_close_price,(deals==2 ? digits : digits+3)),
(string)pos_close_time,
DoubleToString(pos_commission,2),
DoubleToString(pos_swap,2),
DoubleToString(pos_profit,2),
MathRound((pos_type == DEAL_TYPE_BUY ? pos_close_price - pos_open_price : pos_open_price - pos_close_price) / point),
//
// (sort_by == HISTORY_SORT_CLOSETIME ? DoubleToString(Balanc,2) : ""),
//
TimeElapsedToString(pos_close_time - pos_open_time),
pos_open_comment,
pos_close_comment
);
}
}
FileClose(handle);
return true;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
string TimeElapsedToString(const datetime pElapsedSeconds)
{
const long days = pElapsedSeconds / PeriodSeconds(PERIOD_D1);
return((days ? (string)days + "d " : "") + TimeToString(pElapsedSeconds,TIME_SECONDS));
}
bool CHistory::Calculate(const string Symbl, const long Mgc,datetime time_start,datetime time_end)
{
deal_result result = NO_VALUE;
int sort_by = HISTORY_SORT_OPENTIME;
datetime first_entry_time = 0;
datetime overall_first_entry_time = 0;
datetime open_times[];
m_profit=0;
m_gross_profit=0;
m_gross_loss=0;
if(!HistorySelect(time_start,time_end))
{
ResetLastError();
string txt = " ⚠ "+ TRANSLATION_HISTORY_GET_TRADE + TRANSLATION_MESSAGE_ERROR + IntegerToString(GetLastError());
m_FileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_FileSave.IniFileSaveRun(txt,false);
return(false);
}
int deals_total = HistoryDealsTotal();
if(sort_by==HISTORY_SORT_OPENTIME)
{
for(int i = 0; i < deals_total && !IsStopped(); i++)
{
if(m_deal.SelectByIndex(i))
if(m_deal.Entry()==DEAL_ENTRY_IN)
{
if(m_deal.DealType()==DEAL_TYPE_BUY || m_deal.DealType()==DEAL_TYPE_SELL)
{
if(m_deal.Symbol() != Symbl)
continue;
if(m_deal.Magic() != Mgc)
continue;
//--- save position ids to the array
long position_id=m_deal.PositionId();
int arr_size=ArraySize(arr_Positions);
if(ArrayResize(arr_Positions,arr_size+1)==arr_size+1)
arr_Positions[arr_size]=position_id;
m_trades++;
if (first_entry_time == 0 || m_deal.Time() < first_entry_time) {first_entry_time = m_deal.Time();}
}
}
}
}
if(sort_by==HISTORY_SORT_CLOSETIME)
{
//--- define a hashset to collect position IDs (with no duplicates)
CHashSet<long>hashset;
//--- handle the case when a position has multiple deals out.
for(int i = deals_total-1; i >= 0 && !IsStopped(); i--)
if(m_deal.SelectByIndex(i))
if(m_deal.Entry()==DEAL_ENTRY_OUT || m_deal.Entry()==DEAL_ENTRY_OUT_BY)
if(m_deal.DealType()==DEAL_TYPE_BUY || m_deal.DealType()==DEAL_TYPE_SELL)
{
if(m_deal.Symbol() != Symbl)
continue;
if(m_deal.Magic() != Mgc)
continue;
hashset.Add(m_deal.PositionId());
}
//--- copy the elements from the set to a compatible one-dimensional array
hashset.CopyTo(arr_Positions,0);
//ArrayReverse(arr_Positions);
ArraySetAsSeries(arr_Positions,true);
}
deals_total = ArraySize(arr_Positions);
for(int i=0; i<deals_total; i++)
{
long position_id = arr_Positions[i];
HistorySelectByPositionProcess(position_id, false);
}
if (first_entry_time > 0)
{
if (overall_first_entry_time == 0 || first_entry_time < overall_first_entry_time)
{
overall_first_entry_time = first_entry_time;
m_openTime_dt = overall_first_entry_time;
m_openTime_str = TimeToString(overall_first_entry_time, TIME_DATE);
}
}
return true;
}
//+------------------------------------------------------------------+
//| Select history of orders and deals by position ID and |
//| prints a list of orders and deals for the position in the journal|
//+------------------------------------------------------------------+
bool CHistory::HistorySelectByPositionProcess(const long position_id, const bool saveCsv)
{
double profit=0, profit_close=0;
m_profit_factor = 0;
c_commission = 0.0;
datetime last_exit_time = 0;
datetime overall_last_exit_time = 0;
if(!HistorySelectByPosition(position_id))
{
ResetLastError();
string txt = " ⚠ "+ TRANSLATION_HISTORY_SELECTPOSITION_ERR + "(#"+IntegerToString(position_id,0)+") " + TRANSLATION_HISTORY_SELECTPOSITION_FAILED + TRANSLATION_MESSAGE_ERROR + IntegerToString(GetLastError());
m_FileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_FileSave.IniFileSaveRun(txt,false);
return(false);
}
int orders_total=HistoryOrdersTotal();
for(int i=0; i<orders_total; i++)
{
ulong ticket = HistoryOrderGetTicket(i);
string ordersymbol = HistoryOrderGetString(ticket, ORDER_SYMBOL);
long ordermagic = HistoryOrderGetInteger(ticket, ORDER_MAGIC);
if(ticket==0)
continue;
}
int deals_total =HistoryDealsTotal();
for(int i=0; i<deals_total; i++)
{
ulong ticket=HistoryDealGetTicket(i);
double dealprofit = HistoryDealGetDouble(ticket, DEAL_PROFIT);
string dealsymbl = HistoryDealGetString(ticket, DEAL_SYMBOL);
ulong dealmagic = HistoryDealGetInteger(ticket, DEAL_MAGIC);
double dealswap = HistoryDealGetDouble(ticket, DEAL_SWAP);
double dealcomision = HistoryDealGetDouble(ticket, DEAL_COMMISSION);
double dealvolume = HistoryDealGetDouble(ticket, DEAL_VOLUME);
datetime dealtimeClose = (datetime)HistoryDealGetInteger(ticket, DEAL_TIME);
ulong c_dealticket = HistoryDealGetInteger(ticket, DEAL_TICKET);
ENUM_DEAL_ENTRY c_dealentry=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(c_dealticket, DEAL_ENTRY);
ENUM_DEAL_TYPE c_dealTyp = (ENUM_DEAL_TYPE)HistoryDealGetInteger(c_dealticket, DEAL_TYPE);
string c_symbol = HistoryDealGetString(c_dealticket, DEAL_SYMBOL);
double c_point = SymbolInfoDouble(c_symbol, SYMBOL_POINT);
if(ticket==0)
continue;
if(c_dealentry == DEAL_ENTRY_IN || c_dealentry == DEAL_ENTRY_INOUT)
{
c_opTime = (datetime)HistoryDealGetInteger(c_dealticket, DEAL_TIME);
c_type = HistoryDealGetInteger(c_dealticket, DEAL_TYPE) == 0 ? "Buy" : "Sell";
c_volume = HistoryDealGetDouble(c_dealticket, DEAL_VOLUME);
c_opPrice = HistoryDealGetDouble(c_dealticket, DEAL_PRICE);
c_commission += HistoryDealGetDouble(c_dealticket, DEAL_COMMISSION);
c_opComment = HistoryDealGetString(c_dealticket, DEAL_COMMENT);
}
if(c_dealentry == DEAL_ENTRY_OUT || c_dealentry == DEAL_ENTRY_OUT_BY)
{
c_sl = HistoryDealGetDouble(c_dealticket, DEAL_SL);
c_tp = HistoryDealGetDouble(c_dealticket, DEAL_TP);
c_clPrice = HistoryDealGetDouble(c_dealticket, DEAL_PRICE);
c_clTime = (datetime)HistoryDealGetInteger(c_dealticket, DEAL_TIME);
c_commission += HistoryDealGetDouble(c_dealticket, DEAL_COMMISSION);
c_swap = HistoryDealGetDouble(c_dealticket, DEAL_SWAP);
c_profit = HistoryDealGetDouble(c_dealticket, DEAL_PROFIT);
c_profitPoint = MathRound((c_dealTyp == DEAL_TYPE_BUY ? c_clPrice - c_opPrice : c_opPrice - c_clPrice) / c_point);
c_duration = TimeElapsedToString(c_clTime - c_opTime);
c_clComment = HistoryDealGetString(c_dealticket, DEAL_COMMENT);
c_magic = HistoryDealGetInteger(c_dealticket, DEAL_MAGIC);
}
ENUM_DEAL_ENTRY deal_entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket, DEAL_ENTRY);
ENUM_DEAL_TYPE deal_type = (ENUM_DEAL_TYPE)HistoryDealGetInteger(ticket, DEAL_TYPE);
if(deal_type == DEAL_TYPE_BUY || deal_type == DEAL_TYPE_SELL)
{
profit = NormalizeDouble(dealprofit + dealswap + dealcomision, 2);
if(profit >= 0.0) {m_gross_profit += profit;}
else {m_gross_loss += profit;}
if(dealvolume > m_max_lot) {m_max_lot = dealvolume;}
if (last_exit_time < dealtimeClose) {last_exit_time = dealtimeClose;}
}
if(deal_entry == DEAL_ENTRY_OUT || deal_entry == DEAL_ENTRY_OUT_BY || deal_entry == DEAL_ENTRY_IN || deal_entry == DEAL_ENTRY_INOUT)
{
profit_close = NormalizeDouble(dealprofit + dealswap + dealcomision,2);
m_balance += profit_close;
if(profit >= 0.0)
{
m_profit_trades++;
}
}
}
if (last_exit_time > 0)
{
if (overall_last_exit_time == 0 || last_exit_time > overall_last_exit_time)
{
overall_last_exit_time = last_exit_time;
m_closeTime_dt = overall_last_exit_time;
m_closeTime_str = TimeToString(overall_last_exit_time, TIME_DATE);
}
}
if (m_balance > max_balance)
{
max_balance = m_balance;
}
drawdown = NormalizeDouble(max_balance - m_balance, 2);
if(drawdown > m_maxdraw_MDD) {m_maxdraw_MDD = drawdown;}
// Print("balance ",m_balance," | ",max_balance," | ",drawdown," | ",m_maxdraw_MDD);
m_profit = m_gross_profit+m_gross_loss;
if(MathAbs(m_gross_loss) > FLT_EPSILON) {m_profit_factor = MathAbs(m_gross_profit/m_gross_loss);}
if(m_trades > 0)
{
m_expected_payoff=m_profit/m_trades;
m_profit_trades_percent = (double)m_profit_trades / m_trades * 100;
}
// Print("c_optime: ", TimeToString(c_opTime, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
// " c_type: ", c_type,
// " c_volume: ", c_volume,
// " c_opPrice: ", c_opPrice,
// " c_sl: ", c_sl,
// " c_tp: ", c_tp,
// " c_clPrice: ", c_clPrice,"\n",
// " c_clTime: ", TimeToString(c_clTime, TIME_DATE | TIME_MINUTES | TIME_SECONDS),
// " commis: " ,c_commission,
// " swap: ", c_swap,
// " profit: ", c_profit,"\n",
// " profit point: ", c_profitPoint,
// " duration: ", c_duration,
// " opcoment: ", c_opComment," cclcom ",c_clComment);
if(saveCsv) {AppendDataToCSV();}
return true;
}
double CHistory::Percent(double value,double divider)
{
if(MathAbs(value)<=FLT_EPSILON)
return(0);
return(100*value/divider);
}
bool CHistory::AppendDataToCSV()
{
int retryCount = 0; // Initialize the retry counter
const int maxRetries = 3; // Maximum allowed retries
while (retryCount < maxRetries)
{
int handle = FileOpen(AnalyzePathFile(), FILE_READ | FILE_WRITE | FILE_CSV|FILE_ANSI,','); // | FILE_ANSI, ','
if (handle != INVALID_HANDLE)
{
// File opened successfully, append data
FileSeek(handle, 0, SEEK_END);
FileWrite(handle,
c_opTime, Symbol(), c_magic, c_type, c_volume, c_opPrice, c_sl, c_tp,
c_clPrice, c_clTime, c_commission, c_swap, c_profit, c_profitPoint,
c_duration, c_opComment, c_clComment);
FileClose(handle);
return true; // Successfully written to the file
}
else
{
// Handle the file open error
retryCount++;
ResetLastError();
string errorDetails = TRANSLATION_FILED_TO_OPEN_FILE_WRITING + AnalyzePathFile() +
TRANSLATION_MESSAGE_ERROR + IntegerToString(GetLastError());
m_FileSave.IniFileSaveRun(errorDetails, false);
m_FileSave.IniFileSave(__FUNCTION__ + ":: " + errorDetails, false);
// Prepare warning message for the user
string caption = TRANSLATION_FILED_TO_OPEN_FILE_WRITING2;
string warning = StringFormat(
"%s\n%s\n\n%s\n%s (%d/%d)%s%d%s",
TRANSLATION_SAVE_ERR_MESSAG_FILE, AnalyzePathFile(),
TRANSLATION_SAVE_ERR_MESSAG_FILE_OPEN, TRANSLATION_SAVE_ERR_MESSAG_ATTEMPT,
retryCount, maxRetries, TRANSLATION_SAVE_ERR_MESSAG_WILL, maxRetries,
TRANSLATION_SAVE_ERR_MESSAG_ATTEMPTS
);
// Show the warning message
int ret = MessageBox(warning, caption, MB_OK | MB_ICONWARNING);
if (ret == IDOK)
{
ExportHistoryPositions("Break EA 651"); // GetExpertNameWithSum()
// continue; // User clicked OK, retry file access
}
}
}
// Final warning after maximum retries exceeded
string finalWarning = StringFormat(
"%s\n%s\n\n%s%d%s\n%s",
TRANSLATION_SAVE_ERR_MESSAG_FILE, AnalyzePathFile(),
TRANSLATION_SAVE_ERR_MESSAG_AFFTER, maxRetries,
TRANSLATION_SAVE_ERR_MESSAG_ATTEMPTS, TRANSLATION_SAVE_ERR_MESSAG_STOP
);
MessageBox(finalWarning, "Error", MB_OK | MB_ICONERROR);
ExpertRemove(); // Stop the expert after exceeding retries
return false;
}
string CHistory::GetExpertNameWithSum()
{
string result;
string expName = MQLInfoString(MQL_PROGRAM_NAME);
int totalSum = 0;
// Loop through each character in the expert name
for (int i = 0; i < StringLen(expName); i++)
{
int charValue = StringGetCharacter(expName, i);
totalSum += charValue;
}
result = expName +" EA_"+ IntegerToString(totalSum);
return result;
}
string baseSymbol = "";
void GetMatchingSymbols(string &matchingSymbols[])
{
string currentSymbol = Symbol(); // Get the current chart symbol
if (baseSymbol == "")
{
baseSymbol = currentSymbol; // Set base symbol globally
ArrayResize(matchingSymbols, 1);
matchingSymbols[0] = currentSymbol; // Store the first matching symbol
Print("Base symbol initialized: ", baseSymbol);
return; // Return early with the base symbol
}
int minLength = MathMin(StringLen(baseSymbol), StringLen(currentSymbol));
int commonLength = 0;
for (int i = 0; i < minLength; i++)
{
if (StringGetCharacter(baseSymbol, i) == StringGetCharacter(currentSymbol, i))
commonLength++;
else
break;
}
string baseCore = StringSubstr(baseSymbol, 0, commonLength);
string currentCore = StringSubstr(currentSymbol, 0, commonLength);
if (baseCore != currentCore)
{
baseSymbol = currentSymbol;
ArrayResize(matchingSymbols, 1);
matchingSymbols[0] = currentSymbol;
Print("Symbol change detected: Previous Base = ", baseSymbol, ", New Core = ", currentCore);
}
else
{
ArrayResize(matchingSymbols, ArraySize(matchingSymbols) + 1);
matchingSymbols[ArraySize(matchingSymbols) - 1] = currentSymbol;
}
}
// Function to count rows in a CSV file
int CHistory::CountRowsInCSV() {
int row_count = 0;
string filename = AnalyzePathFile();
int file_handle = FileOpen(filename, FILE_READ | FILE_CSV | FILE_ANSI);
if (file_handle == INVALID_HANDLE) {
ResetLastError();
string txt = " ⚠ "+ TRANSLATION_FILED_TO_OPEN_FILE_WRITING3 + AnalyzePathFile() + TRANSLATION_MESSAGE_ERROR + IntegerToString(GetLastError());
m_FileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_FileSave.IniFileSaveRun(txt,false);
return(-1);
}
// Read the file line by line
while (!FileIsEnding(file_handle)) // Loop until the end of the file
{
string firstColumn = FileReadString(file_handle); // Read the first column
if (firstColumn != "") // If the first column is not empty, increment the row count
{
row_count++;
}
// Skip the rest of the columns in the current row
while (!FileIsLineEnding(file_handle) && !FileIsEnding(file_handle))
{
FileReadString(file_handle); // Read and discard the remaining columns
}
}
FileClose(file_handle); // Close the file
return row_count - 1;
}
//--- global variable
double max_balance = -DBL_MAX;
double drawdown = 0.0;
+633
View File
@@ -0,0 +1,633 @@
//+------------------------------------------------------------------+
//| License.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property strict
#define LICENSED_TRADE_MODES {ACCOUNT_TRADE_MODE_DEMO,ACCOUNT_TRADE_MODE_REAL}//{ACCOUNT_TRADE_MODE_CONTEST,ACCOUNT_TRADE_MODE_DEMO}
#define LICENSED_PRIVATE_KEY "Activation Key E"
#define LICENSED_EXPIRY_DAYS 30
#include "Setting.mqh"
#include "FileSave.mqh"
#include "Translations/English.mqh"
long InpUserId = 123456;
datetime InpExpiry = D'2020.01.01';
class License
{
private:
CFileSaving m_fileSave;
string g_logMessages;
protected:
string m_mqlName;
string m_account;
string m_userid;
string m_expiry;
public:
License();
~License();
void Initialization();
bool CheckTradeModes();
bool VerifyLicenseWeb();
bool CheckAccountMarginMode();
private:
string IniFileName(const bool Log) const;
bool IniFileDelete(void) {return FileDelete(m_fileSave.DirectoryLogFile());}
string LoadPathSetting() {return ("Licence\\"+m_mqlName+"\\" +IniFileName(false));}
bool SaveSettingsOnDisk();
bool LoadSettingsFromDisk();
bool FileGen();
string Hash(string data);
string KeyGen( string data );
bool CheckIsFile() { return FileIsExist(LicencePath());}
bool CreateLicenseFile();
bool VerifyLicenseFile();
string LicencePath();
bool LoadDataFile( string &data );
string SanitizeFileName(string fileName);
long Current_Account_Mode() {return AccountInfoInteger(ACCOUNT_TRADE_MODE);}
bool LoadDataServer( string &data );
};
License::License()
{
}
License::~License()
{
}
void License::Initialization()
{
m_mqlName = MQLInfoString(MQL_PROGRAM_NAME);
m_account = IntegerToString(AccountInfoInteger(ACCOUNT_LOGIN));
IniFileDelete();
string txt = "\n"+__FUNCTION__+":: "+TRANSLATION_EXPERT_START;
m_fileSave.IniFileSave(txt,false);
m_fileSave.IniFileSaveRun(TRANSLATION_EXPERT_START,false);
if (!LoadSettingsFromDisk()) {SaveSettingsOnDisk();}
}
string License::IniFileName(const bool Log) const
{
string name;
name=m_mqlName;
if(Log) {name+="_Log";}
else {name+="_Setttings";}
name+="_Ini.txt";
return(name);
}
bool License::SaveSettingsOnDisk()
{
Sets.LoginUserID = IntegerToString(InpUserId);
Sets.LoginExpiry = TimeToString(InpExpiry,TIME_DATE);
ResetLastError();
string txt = TRANSLATION_TRYING_TO_SAVE_FILE + IniFileName(false)+TRANSLATION_MESSAGE_ERROR + IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+":: "+ txt,false);
m_fileSave.IniFileSaveRun(txt,false);
int fh;
// Save to new format only.
fh = FileOpen(LoadPathSetting(), FILE_CSV | FILE_WRITE);
if (fh == INVALID_HANDLE)
{
ResetLastError();
string txt = " ⚠ "+ TRANSLATION_LICENSE_FILED_TO_OPEN_ + TRANSLATION_MESSAGE_ERROR + IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
return false;
}
//--- Sets
FileWrite(fh, "LoginUserID");
FileWrite(fh, Sets.LoginUserID);
FileWrite(fh, "LoginExpiry");
FileWrite(fh, Sets.LoginExpiry);
FileClose(fh);
ResetLastError();
txt = TRANSLATION_SAVE_DONE + IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+":: "+ txt,false);
m_fileSave.IniFileSaveRun(txt,false);
return true;
}
bool License::LoadSettingsFromDisk()
{
ResetLastError();
string txt = TRANSLATION_LICENSE_TRYING_TO_LOAD + IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+":: "+ txt,false);
m_fileSave.IniFileSaveRun(txt,false);
int fh;
if (!FileIsExist(LoadPathSetting()))
{
ResetLastError();
string txt = " ⚠ "+ TRANSLATION_LICENSE_NO_SETTINGS + IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
return false;
}
fh = FileOpen(LoadPathSetting(), FILE_CSV | FILE_READ);
if (fh == INVALID_HANDLE)
{
ResetLastError();
string txt =" ⚠ "+ TRANSLATION_LICENSE_FAILED_TO_OPEN_FILE_READING+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
return false;
}
while (!FileIsEnding(fh))
{
string var_name = FileReadString(fh);
string var_content = FileReadString(fh);
if (var_name == "LoginUserID")
Sets.LoginUserID = (var_content);
else if (var_name == "LoginExpiry")
Sets.LoginExpiry = (var_content);
}
FileClose(fh);
ResetLastError();
txt = TRANSLATION_LICENSE_LOADED_DONE + IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+":: "+ txt,false);
m_fileSave.IniFileSaveRun(txt,false);
return true;
}
string License::Hash(string data)
{
uchar dataCharArray[];
StringToCharArray(data, dataCharArray);
uchar combinedCharArray[];
int combinedSize = ArraySize(dataCharArray);
ArrayResize(combinedCharArray, combinedSize);
ArrayCopy(combinedCharArray, dataCharArray, 0, 0, ArraySize(dataCharArray));
// Generate SHA-256 hash
uchar hashResult[];
if (!CryptEncode(CRYPT_HASH_SHA256, combinedCharArray, combinedCharArray, hashResult)) {
ResetLastError();
string txt = TRANSLATION_LICENSE_ERROR_HASH + TRANSLATION_MESSAGE_ERROR +IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+":: "+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
return "";
}
// Base64 encode the hash result
uchar base64Result[];
if (!CryptEncode(CRYPT_BASE64, hashResult, hashResult, base64Result)) {
ResetLastError();
string txt = TRANSLATION_LICENSE_ERROR_BASE + TRANSLATION_MESSAGE_ERROR +IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+":: "+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
return "";
}
// Convert Base64 result to string for the final passcode
string result = CharArrayToString(base64Result);
return result;
}
string License::KeyGen( string data ) {
string keyString = data + m_mqlName;
return Hash( keyString );
}
bool License::FileGen() {
// Step 1: Ensure directory structure exists by creating a dummy file temporarily.
string licenceDirPath = "Licence\\"+m_mqlName+"\\dummy.txt";
int dummyHandle = FileOpen(licenceDirPath, FILE_WRITE | FILE_ANSI);
if (dummyHandle == INVALID_HANDLE) {
ResetLastError();
string txt = " ⚠ "+TRANSLATION_LICENSE_CREATE_DIRECTORY+m_mqlName+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
return false;
}
FileClose(dummyHandle);
FileDelete(licenceDirPath); // Delete the dummy file afterward
// Step 2: Proceed to create the actual licence file
string licencePath = LicencePath();
int handle = FileOpen(licencePath, FILE_WRITE | FILE_BIN | FILE_ANSI);
if (handle == INVALID_HANDLE) {
ResetLastError();
string txt = " ⚠ "+TRANSLATION_LICENSE_NO_CREATE_FILE+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
return false;
}
// Combine signature and data into one line
string data_hash = Hash(m_account + "_" + Sets.LoginExpiry + "_" + Sets.LoginUserID + "_" + m_mqlName + "_" + LICENSED_PRIVATE_KEY);
string signature = KeyGen(data_hash);
string contents = signature + data_hash + "\n" + Sets.LoginExpiry;
// Print(licencePath); // show name file
// Print(contents); // show hahs
FileWriteString(handle, contents);
FileFlush(handle);
FileClose(handle);
ResetLastError();
string txt = TRANSLATION_LICENSE_CREATE_LICENSE_FILE+TRANSLATION_MESSAGE_ERROR+ IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+":: "+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
return true;
}
bool License::CreateLicenseFile()
{
// Check if the file exists and verify if it matches current inputs
if(CheckIsFile())
{
if(VerifyLicenseFile()) {return true;}
else
{
ResetLastError();
string txt = " ⚠ "+TRANSLATION_LICENSE_RETRY+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
FileDelete(LicencePath());
Alert(TRANSLATION_LICENSE_RETRY+".");
return false;
}
}
if(FileGen())
{
if(CheckIsFile())
{
ResetLastError();
string txt =TRANSLATION_LICENSE_TO_CREATE+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+":: "+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
return true;
}
}
return false;
}
bool License::VerifyLicenseFile()
{
string licencePath = LicencePath();
int maxAttempts = 2; // Allow one retry
int attempt = 0;
while (attempt < maxAttempts)
{
attempt++;
// Attempt to open the file
int handle = FileOpen(licencePath, FILE_READ | FILE_BIN | FILE_ANSI);
if (handle == INVALID_HANDLE)
{
ResetLastError();
string txt = " ⚠ "+TRANSLATION_LICENSE_FAILET_TO_OPEN_FILE+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt, false);
m_fileSave.IniFileSaveRun(txt, false);
Alert(TRANSLATION_LICENSE_FAILET_TO_OPEN_FILE+".");
return false; // Cannot open file, no retry possible
}
// Read the file contents
string fileContents = FileReadString(handle);
FileClose(handle);
// Generate the expected data hash
string data_hash = Hash(m_account + "_" + Sets.LoginExpiry + "_" + Sets.LoginUserID + "_" + m_mqlName + "_" + LICENSED_PRIVATE_KEY);
string signature = KeyGen(data_hash);
string expectedContents = signature + data_hash + "\n" + Sets.LoginExpiry;
// Check if the file contents match the expected format and data
if (fileContents == expectedContents)
{
return true; // Verification succeeded
}
// Log the error for this attempt
ResetLastError();
string txt = " ⚠ "+TRANSLATION_LICENSE_NO_VERIFY_INPUTS+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt, false);
m_fileSave.IniFileSaveRun(txt, false);
// Retry if more attempts are allowed
if (attempt < maxAttempts)
{
ResetLastError();
string txt =" ⚠ "+TRANSLATION_LICENSE_FAILED_RETRY_CREATE+IntegerToString(attempt+1)+TRANSLATION_LICENSE_FAILED_RETRY_CREATE+
IntegerToString(maxAttempts)+")"+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt, false);
m_fileSave.IniFileSaveRun(txt, false);
Sleep(500); // Add a small delay before retrying
continue;
}
// After maximum attempts, show alert and fail
ResetLastError();
txt = " ⚠ "+TRANSLATION_LICENSE_FAILED_RETRY_ERROR1+"\n"+TRANSLATION_LICENSE_FAILED_RETRY_ERROR2+"\n"+
TRANSLATION_LICENSE_FAILED_RETRY_ERROR3+"\n"+TRANSLATION_LICENSE_FAILED_RETRY_ERROR4+"\n"+TRANSLATION_LICENSE_ERROR_404_2+
TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt, false);
m_fileSave.IniFileSaveRun(txt, false);
Alert(TRANSLATION_LICENSE_FAILED_RETRY_ERROR1+"\n"+TRANSLATION_LICENSE_FAILED_RETRY_ERROR2+"\n"+
TRANSLATION_LICENSE_FAILED_RETRY_ERROR3+"\n"+TRANSLATION_LICENSE_FAILED_RETRY_ERROR4+"\n"+TRANSLATION_LICENSE_ERROR_404_2+".");
return false;
}
return false;
}
// bool License::VerifyLicenseFile()
// {
// string licencePath = LicencePath();
// int handle = FileOpen(licencePath, FILE_READ | FILE_BIN | FILE_ANSI);
// if(handle == INVALID_HANDLE)
// {
// ResetLastError();
// string txt = __FUNCTION__+":: ⚠ "+TRANSLATION_LICENSE_FAILET_TO_OPEN_FILE+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
// m_fileSave.IniFileSave(txt,false);
// m_fileSave.IniFileSaveRun(txt,false);
// Alert(TRANSLATION_LICENSE_FAILET_TO_OPEN_FILE+".");
// return false;
// }
// // Read the file contents
// string fileContents = FileReadString(handle);
// FileClose(handle);
// // Generate the expected data hash
// string data_hash = Hash(m_account + "_" + Sets.LoginExpiry + "_" + Sets.LoginUserID + "_" + m_mqlName + "_" + LICENSED_PRIVATE_KEY);
// string signature = KeyGen(data_hash);
// string expectedContents = signature + data_hash + "\n" + Sets.LoginExpiry;
// // Check if the file contents match the expected format and data
// if (fileContents == expectedContents) {return true;}
// ResetLastError();
// string txt = __FUNCTION__+":: ⚠ "+TRANSLATION_LICENSE_NO_VERIFY_INPUTS+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
// m_fileSave.IniFileSave(txt,false);
// m_fileSave.IniFileSaveRun(txt,false);
// Alert(TRANSLATION_LICENSE_NO_VERIFY_INPUTS+".");
// return false;
// }
bool License::LoadDataFile( string &data ) {
string licencePath = LicencePath();
int handle = FileOpen( licencePath, FILE_READ | FILE_BIN | FILE_ANSI );
if ( handle == INVALID_HANDLE ) {
ResetLastError();
string txt = " ⚠ "+TRANSLATION_LICENSE_NO_OPEN_FILE+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
Alert(TRANSLATION_LICENSE_NO_OPEN_FILE+".");
return ( false );
}
int len = ( int )FileSize( handle );
data = FileReadString( handle, len );
FileClose( handle );
return true;
}
string License::LicencePath()
{
string rawHash = Hash(m_mqlName + "_" + m_account);
string sanitizedHash = SanitizeFileName(rawHash);
return ("Licence\\" + m_mqlName + "\\" + sanitizedHash + ".lic");
}
string License::SanitizeFileName(string fileName)
{
// List of invalid characters to replace/remove
string invalidChars = "\\/:*?\"<>|";
// Replace invalid characters with an underscore (_)
for (int i = 0; i < StringLen(invalidChars); i++) {
// Extract each invalid character as a string
string invalidChar = StringSubstr(invalidChars, i, 1);
// Update fileName directly
StringReplace(fileName, invalidChar, "_");
}
return fileName;
}
// -- check trade mode user
bool License::CheckTradeModes(){
int validModes[] = LICENSED_TRADE_MODES;
for (int i = ArraySize(validModes) - 1; i >= 0; i--) {
if (Current_Account_Mode() == validModes[i]) {
return true;
}
}
ResetLastError();
string txt = " ⚠ "+TRANSLATION_LICENSE_AUTHORIZED+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
Alert(TRANSLATION_LICENSE_AUTHORIZED+".");
return false; // Return false if no valid mode was found
}
bool License::LoadDataServer( string &data )
{
string headers = "";
char postData[];
char resultData[];
string resultHeaders;
int timeout = 10000; // 10 seconds standard timeout
int delayThreshold = 5000;
string rawHash = Hash(m_mqlName + "_" + m_account);
string mRegistration = SanitizeFileName(rawHash);
string url = "https://raw.githubusercontent.com";
// string api = StringFormat( "%s/amirghadiri1987/License/blob/main/%s.txt", url, mRegistration );
string api = StringFormat( "%s/amirghadiri1987/License/refs/heads/main/%s.lic", url, mRegistration );
// Start tracking the time for feedback
datetime startTime = TimeLocal();
ResetLastError();
int response = WebRequest( "GET", api, headers, timeout, postData, resultData, resultHeaders );
// Add this code to handle 303 redirect but it creates more problems
// if (response==303) {
// int locStart = StringFind(resultHeaders, "Location: ", 0)+10;
// int locEnd = StringFind(resultHeaders, "\r", locStart);
// api = StringSubstr(resultHeaders, locStart, locEnd-locStart);
// ResetLastError();
// response = WebRequest( "GET", api, headers, timeout, postData, resultData, resultHeaders );
// errorCode = GetLastError();
//}
if ((TimeLocal() - startTime) > delayThreshold / 1000) {
Comment("The license check is taking longer than expected. Please wait...");
}
data = CharArrayToString( resultData );
switch ( response ) {
case -1:
{
ResetLastError();
string txt = " ⚠ "+TRANSLATION_LICENSE_ERROR_RESPONSE+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
ResetLastError();
txt = " ⚠ "+TRANSLATION_LICENSE_ADD_URL + url + TRANSLATION_LICENSE_ADD_URL2+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
Alert(TRANSLATION_LICENSE_ADD_URL + url + TRANSLATION_LICENSE_ADD_URL2+".");
Comment("");
return false;
}
break;
case 200:
//--- Success
Comment("");
return true;
break;
case 404:
{
ResetLastError();
string txt = " ⚠ "+TRANSLATION_LICENSE_ERROR_404+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
Alert(TRANSLATION_LICENSE_ERROR_404+"\n"+TRANSLATION_LICENSE_ERROR_404_2+".");
Comment("");
return false;
}
break;
default:
{
ResetLastError();
string txt = TRANSLATION_LICENSE_ERROE_UNEXPECTED+ IntegerToString(response)+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+":: "+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
Comment("");
return false;
}
break;
}
Comment(""); // Clear any comment on exit
return false;
}
bool License::VerifyLicenseWeb()
{
// Check if license file creation was successful
if (!CreateLicenseFile())
{
return false;
}
// Load data from server and file
string data_server, data_file;
if (!LoadDataServer(data_server))
{
return false;
}
if (!LoadDataFile(data_file))
{
return false;
}
// Parse server data
int pos_Server = StringFind(data_server, "\n");
if (pos_Server <= 0)
{
ResetLastError();
string txt = " ⚠ "+TRANSLATION_LICENSE_INVALID_LICENSE_SERVER+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
Alert(TRANSLATION_LICENSE_INVALID_LICENSE_SERVER+".");
return false;
}
// Parse file data
int pos_File = StringFind(data_file, "\n");
if (pos_File <= 0)
{
ResetLastError();
string txt = " ⚠ "+TRANSLATION_LICENSE_INVALID_LICENSE_FILE+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
Alert(TRANSLATION_LICENSE_INVALID_LICENSE_FILE+".");
return false;
}
string signature_Server = StringSubstr( data_server, 0, pos_Server );
string expiry_Server = StringSubstr( data_server, pos_Server + 1 );
string signature_File = StringSubstr( data_file, 0, pos_File );
string expiry_File = StringSubstr( data_file, pos_File + 1 );
Sets.SHowExpiry = expiry_Server;
// Validate signatures and expiry dates
if (signature_Server != signature_File || expiry_Server != expiry_File) {
ResetLastError();
string txt = " ⚠ "+TRANSLATION_LICENSE_VERIFY_LICENSE+TRANSLATION_MESSAGE_ERROR+IntegerToString(GetLastError());
m_fileSave.IniFileSave(__FUNCTION__+"::"+txt,false);
m_fileSave.IniFileSaveRun(txt,false);
Alert(TRANSLATION_LICENSE_VERIFY_LICENSE);
return false;
}
// All checks passed
return true;
}
bool License::CheckAccountMarginMode()
{
if(AccountInfoInteger(ACCOUNT_MARGIN_MODE)!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
{
ResetLastError();
string txt = TRANSLATION_TERMINAL_MARGIN_MODE_HEDGE + TRANSLATION_MESSAGE_ERROR + IntegerToString(GetLastError());
m_fileSave.IniFileSaveRun(txt,false);
m_fileSave.IniFileSave(__FUNCTION__+":: "+ txt, false);
Alert(TRANSLATION_TERMINAL_MARGIN_MODE_HEDGE+".");
return false;
}
return true;
}
+564
View File
@@ -0,0 +1,564 @@
//+------------------------------------------------------------------+
//| ListView_New.mqh |
//| Copyright 2000-2024, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Arrays\ArrayString.mqh>
#include <Arrays\ArrayLong.mqh>
#include <Controls/WndClient.mqh>
#include <Controls/Edit.mqh>
#include "Colors.mqh"
#include "Setting.mqh"
//+------------------------------------------------------------------+
//| Class CListView |
//| Usage: display lists |
//+------------------------------------------------------------------+
class CListView : public CWndClient
{
private:
CThemes m_Themes;
//--- dependent controls
// CThemes m_Themes;
CEdit m_rows[]; // array of the row objects
//--- set up
int m_offset; // index of first visible row in array of rows
int m_total_view; // number of visible rows
int m_item_height; // height of visible row
bool m_height_variable; //
//--- data
CArrayString m_strings; // array of rows
CArrayLong m_values; // array of values
int m_current; // index of current row in array of rows
public:
CListView(void);
~CListView(void);
color m_BgGround_Item, m_BgGround_Item_TextSel;
//--- create
virtual bool Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2);
virtual void Destroy(const int reason=0);
//--- chart event handler
virtual bool OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
//--- set up
bool TotalView(const int value);
//--- fill
virtual bool AddItem(const string item,const long value=0);
//--- data
virtual bool ItemAdd(const string item,const long value=0);
virtual bool ItemInsert(const int index,const string item,const long value=0);
virtual bool ItemUpdate(const int index,const string item,const long value=0);
virtual bool ItemDelete(const int index);
virtual bool ItemsClear(void);
//--- data
int Current(void) { return(m_current); }
string Select(void) { return(m_strings.At(m_current)); }
bool Select(const int index);
bool SelectByText(const string text);
bool SelectByValue(const long value);
//--- data (read only)
long Value(void) { return(m_values.At(m_current)); }
void SetBackGroundItem(const color BgGroundItem, const color BgGroundItemTextSel);
//--- state
virtual bool Show(void);
protected:
//--- create dependent controls
bool CreateRow(const int index);
//--- event handlers
virtual bool OnResize(void);
//--- handlers of the dependent controls events
virtual bool OnVScrollShow(void);
virtual bool OnVScrollHide(void);
virtual bool OnScrollLineDown(void);
virtual bool OnScrollLineUp(void);
virtual bool OnItemClick(const int index);
//--- redraw
bool Redraw(void);
bool RowState(const int index,const bool select);
bool CheckView(void);
};
//+------------------------------------------------------------------+
//| Common handler of chart events |
//+------------------------------------------------------------------+
EVENT_MAP_BEGIN(CListView)
ON_INDEXED_EVENT(ON_CLICK,m_rows,OnItemClick)
EVENT_MAP_END(CWndClient)
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CListView::CListView(void) : m_offset(0),
m_total_view(0),
m_item_height(CONTROLS_LIST_ITEM_HEIGHT),
m_current(CONTROLS_INVALID_INDEX),
m_height_variable(false)
{
m_Themes.ApplyTheme((int)Sets.Themes);
m_BgGround_Item = m_Themes.CONTROL_COMBOBOX_BACKGROUND_ITEM;
m_BgGround_Item_TextSel = m_Themes.CONTROL_COMBOBOX_BACKGROUND_ITEM_TEXT_SELL;
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CListView::~CListView(void)
{
}
//+------------------------------------------------------------------+
//| Create a control |
//+------------------------------------------------------------------+
bool CListView::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2)
{
int y=y2;
//--- if the number of visible rows is previously determined, adjust the vertical size
if(!TotalView((y2-y1)/m_item_height))
y=m_item_height+y1+2*CONTROLS_BORDER_WIDTH;
//--- check the number of visible rows
if(m_total_view<1)
return(false);
//--- call method of the parent class
if(!CWndClient::Create(chart,name,subwin,x1,y1,x2,y))
return(false);
//--- set up
if(!m_background.ColorBackground(CONTROLS_LIST_COLOR_BG))
return(false);
if(!m_background.ColorBorder(CONTROLS_LIST_COLOR_BORDER))
return(false);
//--- create dependent controls
ArrayResize(m_rows,m_total_view);
for(int i=0;i<m_total_view;i++)
{
if(!CreateRow(i))
return(false);
if(m_height_variable && i>0)
m_rows[i].Hide();
}
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| Delete group of controls |
//+------------------------------------------------------------------+
void CListView::Destroy(const int reason)
{
//--- call of the method of the parent class
CWndClient::Destroy(reason);
//--- clear items
m_strings.Clear();
m_values.Clear();
//---
m_offset =0;
m_total_view=0;
}
//+------------------------------------------------------------------+
//| Set parameter |
//+------------------------------------------------------------------+
bool CListView::TotalView(const int value)
{
//--- if parameter is not equal to 0, modifications are not possible
if(m_total_view!=0)
{
m_height_variable=true;
return(false);
}
//--- save value
m_total_view=value;
//--- parameter has been changed
return(true);
}
//+------------------------------------------------------------------+
//| Makes the control visible |
//+------------------------------------------------------------------+
bool CListView::Show(void)
{
//--- call of the method of the parent class
CWndClient::Show();
//--- number of items
int total=m_strings.Total();
//---
if(total==0)
total=1;
//---
if(m_height_variable && total<m_total_view)
for(int i=total;i<m_total_view;i++)
m_rows[i].Hide();
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| Create "row" |
//+------------------------------------------------------------------+
bool CListView::CreateRow(const int index)
{
//--- calculate coordinates
int x1=CONTROLS_BORDER_WIDTH;
int y1=CONTROLS_BORDER_WIDTH+m_item_height*index;
int x2=Width()-2*CONTROLS_BORDER_WIDTH;
int y2=y1+m_item_height;
//--- create
if(!m_rows[index].Create(m_chart_id,m_name+"Item"+IntegerToString(index),m_subwin,x1,y1,x2,y2))
return(false);
if(!m_rows[index].Text(""))
return(false);
if(!m_rows[index].ReadOnly(true))
return(false);
if(!RowState(index,false))
return(false);
if(!Add(m_rows[index]))
return(false);
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| Add item (row) |
//+------------------------------------------------------------------+
bool CListView::AddItem(const string item,const long value)
{
//--- method left for compatibility with previous version
return(ItemAdd(item,value));
}
//+------------------------------------------------------------------+
//| Add item (row) |
//+------------------------------------------------------------------+
bool CListView::ItemAdd(const string item,const long value)
{
//--- add
if(!m_strings.Add(item))
return(false);
if(!m_values.Add((value)?value:m_values.Total()))
return(false);
//--- number of items
int total=m_strings.Total();
//--- exit if number of items does not exceed the size of visible area
if(total<m_total_view+1)
{
if(m_height_variable && total!=1)
{
Height(total*m_item_height+2*CONTROLS_BORDER_WIDTH);
if(IS_VISIBLE)
m_rows[total-1].Show();
}
return(Redraw());
}
//--- if number of items exceeded the size of visible area
if(total==m_total_view+1)
{
//--- enable vertical scrollbar
if(!VScrolled(true))
return(false);
//--- and immediately make it invisible (if needed)
if(IS_VISIBLE && !OnVScrollShow())
return(false);
}
//--- set up the scrollbar
m_scroll_v.MaxPos(m_strings.Total()-m_total_view);
//--- redraw
return(Redraw());
}
//+------------------------------------------------------------------+
//| Insert item (row) |
//+------------------------------------------------------------------+
bool CListView::ItemInsert(const int index,const string item,const long value)
{
//--- insert
if(!m_strings.Insert(item,index))
return(false);
if(!m_values.Insert(value,index))
return(false);
//--- number of items
int total=m_strings.Total();
//--- exit if number of items does not exceed the size of visible area
if(total<m_total_view+1)
{
if(m_height_variable && total!=1)
{
Height(total*m_item_height+2*CONTROLS_BORDER_WIDTH);
if(IS_VISIBLE)
m_rows[total-1].Show();
}
return(Redraw());
}
//--- if number of items exceeded the size of visible area
if(total==m_total_view+1)
{
//--- enable vertical scrollbar
if(!VScrolled(true))
return(false);
//--- and immediately make it invisible (if needed)
if(IS_VISIBLE && !OnVScrollShow())
return(false);
}
//--- set up the scrollbar
m_scroll_v.MaxPos(m_strings.Total()-m_total_view);
//--- redraw
return(Redraw());
}
//+------------------------------------------------------------------+
//| Update item (row) |
//+------------------------------------------------------------------+
bool CListView::ItemUpdate(const int index,const string item,const long value)
{
//--- update
if(!m_strings.Update(index,item))
return(false);
if(!m_values.Update(index,value))
return(false);
//--- redraw
return(Redraw());
}
//+------------------------------------------------------------------+
//| Delete item (row) |
//+------------------------------------------------------------------+
bool CListView::ItemDelete(const int index)
{
//--- delete
if(!m_strings.Delete(index))
return(false);
if(!m_values.Delete(index))
return(false);
//--- number of items
int total=m_strings.Total();
//--- exit if number of items does not exceed the size of visible area
if(total<m_total_view)
{
if(m_height_variable && total!=0)
{
Height(total*m_item_height+2*CONTROLS_BORDER_WIDTH);
m_rows[total].Hide();
}
return(Redraw());
}
//--- if number of items exceeded the size of visible area
if(total==m_total_view)
{
//--- disable vertical scrollbar
if(!VScrolled(false))
return(false);
//--- and immediately make it unvisible
if(!OnVScrollHide())
return(false);
}
//--- set up the scrollbar
m_scroll_v.MaxPos(m_strings.Total()-m_total_view);
//--- redraw
return(Redraw());
}
//+------------------------------------------------------------------+
//| Delete all items |
//+------------------------------------------------------------------+
bool CListView::ItemsClear(void)
{
m_offset=0;
//--- clear
if(!m_strings.Shutdown())
return(false);
if(!m_values.Shutdown())
return(false);
//---
if(m_height_variable)
{
Height(m_item_height+2*CONTROLS_BORDER_WIDTH);
for(int i=1;i<m_total_view;i++)
m_rows[i].Hide();
}
//--- disable vertical scrollbar
if(!VScrolled(false))
return(false);
//--- and immediately make it unvisible (if needed)
if(!OnVScrollHide())
return(false);
//--- redraw
return(Redraw());
}
//+------------------------------------------------------------------+
//| Sett current item |
//+------------------------------------------------------------------+
bool CListView::Select(const int index)
{
//--- check index
if(index>=m_strings.Total())
return(false);
if(index<0 && index!=CONTROLS_INVALID_INDEX)
return(false);
//--- unselect
if(m_current!=CONTROLS_INVALID_INDEX)
RowState(m_current-m_offset,false);
//--- select
if(index!=CONTROLS_INVALID_INDEX)
RowState(index-m_offset,true);
//--- save value
m_current=index;
//--- succeed
return(CheckView());
}
//+------------------------------------------------------------------+
//| Set current item (by text) |
//+------------------------------------------------------------------+
bool CListView::SelectByText(const string text)
{
//--- find text
int index=m_strings.SearchLinear(text);
//--- if text is not found, exit without changing the selection
if(index==CONTROLS_INVALID_INDEX)
return(false);
//--- change selection
return(Select(index));
}
//+------------------------------------------------------------------+
//| Set current item (by value) |
//+------------------------------------------------------------------+
bool CListView::SelectByValue(const long value)
{
//--- find value
int index=m_values.SearchLinear(value);
//--- if value is not found, exit without changing the selection
if(index==CONTROLS_INVALID_INDEX)
return(false);
//--- change selection
return(Select(index));
}
//+------------------------------------------------------------------+
//| Redraw |
//+------------------------------------------------------------------+
bool CListView::Redraw(void)
{
//--- loop by "rows"
for(int i=0;i<m_total_view;i++)
{
//--- copy text
if(!m_rows[i].Text(m_strings.At(i+m_offset)))
return(false);
//--- select
if(!RowState(i,(m_current==i+m_offset)))
return(false);
}
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| Change state |
//+------------------------------------------------------------------+
bool CListView::RowState(const int index,const bool select)
{
//--- check index
if(index<0 || index>=ArraySize(m_rows))
return(true);
//--- determine colors
color text_color=(select) ? m_BgGround_Item_TextSel : CONTROLS_LISTITEM_COLOR_TEXT; // CONTROLS_LISTITEM_COLOR_TEXT
color back_color=(select) ? CONTROLS_LISTITEM_COLOR_BG_SEL : m_BgGround_Item;
//--- get pointer
CEdit *item=GetPointer(m_rows[index]);
//--- recolor the "row"
return(item.Color(text_color) && item.ColorBackground(back_color) && item.ColorBorder(back_color));
}
//+------------------------------------------------------------------+
//| Check visibility of selected row |
//+------------------------------------------------------------------+
bool CListView::CheckView(void)
{
//--- check visibility
if(m_current>=m_offset && m_current<m_offset+m_total_view)
return(true);
//--- selected row is not visible
int total=m_strings.Total();
m_offset=(total-m_current>m_total_view) ? m_current : total-m_total_view;
//--- adjust the scrollbar
m_scroll_v.CurrPos(m_offset);
//--- redraw
return(Redraw());
}
//+------------------------------------------------------------------+
//| Handler of resizing |
//+------------------------------------------------------------------+
bool CListView::OnResize(void)
{
//--- call of the method of the parent class
if(!CWndClient::OnResize())
return(false);
//--- set up the size of "row"
if(VScrolled())
OnVScrollShow();
else
OnVScrollHide();
//--- succeed
return(true);
}
//+------------------------------------------------------------------+
//| Handler of the "Show vertical scrollbar" event |
//+------------------------------------------------------------------+
bool CListView::OnVScrollShow(void)
{
//--- loop by "rows"
for(int i=0;i<m_total_view;i++)
{
//--- resize "rows" according to shown vertical scrollbar
m_rows[i].Width(Width()-(CONTROLS_SCROLL_SIZE+CONTROLS_BORDER_WIDTH));
}
//--- check visibility
if(!IS_VISIBLE)
{
m_scroll_v.Visible(false);
return(true);
}
//--- event is handled
return(true);
}
//+------------------------------------------------------------------+
//| Handler of the "Hide vertical scrollbar" event |
//+------------------------------------------------------------------+
bool CListView::OnVScrollHide(void)
{
//--- check visibility
if(!IS_VISIBLE)
return(true);
//--- loop by "rows"
for(int i=0;i<m_total_view;i++)
{
//--- resize "rows" according to hidden vertical scroll bar
m_rows[i].Width(Width()-2*CONTROLS_BORDER_WIDTH);
}
//--- event is handled
return(true);
}
//+------------------------------------------------------------------+
//| Handler of the "Scroll up for one row" event |
//+------------------------------------------------------------------+
bool CListView::OnScrollLineUp(void)
{
//--- get new offset
m_offset=m_scroll_v.CurrPos();
//--- redraw
return(Redraw());
}
//+------------------------------------------------------------------+
//| Handler of the "Scroll down for one row" event |
//+------------------------------------------------------------------+
bool CListView::OnScrollLineDown(void)
{
//--- get new offset
m_offset=m_scroll_v.CurrPos();
//--- redraw
return(Redraw());
}
//+------------------------------------------------------------------+
//| Handler of click on row |
//+------------------------------------------------------------------+
bool CListView::OnItemClick(const int index)
{
//--- select "row"
Select(index+m_offset);
//--- send notification
EventChartCustom(CONTROLS_SELF_MESSAGE,ON_CHANGE,m_id,0.0,m_name);
//--- handled
return(true);
}
//+------------------------------------------------------------------+
void CListView::SetBackGroundItem(const color BgGroundItem, const color BgGroundItemTextSel)
{
m_BgGround_Item = BgGroundItem;
m_BgGround_Item_TextSel = BgGroundItemTextSel;
Redraw();
}
+151
View File
@@ -0,0 +1,151 @@
#include <Controls/CheckBox.mqh>
#include <Controls/Label.mqh>
#include <Arrays/List.mqh>
enum TYPE_THEMES
{
Dark,
Light
};
enum SET_COLOR_THEMES
{
SET_COLOR_THEMES_ABSENT, // Absent
SET_COLOR_THEMES_BANNER, // Banner
SET_COLOR_THEMES_BRAVE, // Brave
SET_COLOR_THEMES_BLINK, // Blink
SET_COLOR_THEMES_CODECOURSE, // Codecourse
SET_COLOR_THEMES_DOWNPOUR, // Downpour
SET_COLOR_THEMES_FODDER, // Fodder
SET_COLOR_THEMES_MUD, // Mud
SET_COLOR_THEMES_VIOLACEOUS, // Violaceous
SET_COLOR_THEMES_VISION, // Vision
};
enum SYMBOL_CHART_CHANGE_REACTION
{
SYMBOL_CHART_CHANGE_EACH_OWN, // Each symbol - own settings
SYMBOL_CHART_CHANGE_HARD_RESET, // Reset to defaults on symbol change
};
enum TABS
{
OverviewTab,
SettingTab,
SettingInputsEATab,
SettingPanelEATab,
PerformanceTab,
GlobalMetricsTab,
OptimizerTab,
LogsTab,
SecurityTab,
PerformanceSummaryTab,
PerformanceEquityTab,
PerformanceDayTab,
PerformanceWeekTab,
PerformanceMonthTab,
PerformanceYearTab,
PerformanceReturnTab
};
struct Coordinates
{
int x1;
int y1;
int x2;
int y2;
};
struct Settings
{
// panel
SYMBOL_CHART_CHANGE_REACTION symbolchange;
bool IsPanelMinimized;
TABS SelectedTab;
uint LastRecalc;
long TimFrames;
long Streak;
long Condition;
long MaxBuy;
long MaxSell;
long TypePositions;
long RiskReward;
long Expiryations;
double RiskManagments;
double LotSize;
double MaximumRiskAouto;
long InpSl;
long SlEntry;
long Telorance;
long ZeroLots;
long StrategyRisk;
long SaveProfit;
long SaveType;
long SaveTrigger;
long SaveValue;
long Tls;
long TlsType;
long TlsTrigger;
long TlsValue;
long ComisionInOut;
long ComisionMethod;
double ComisionFirstInput;
double ComisionFirstInput2;
double ComisionFirstValue;
double ComisionSecondInput;
double ComisionSecondInput2;
double ComisionSecondValue;
long SymbolChange;
long Minimized;
long Privacy;
long TesterHide;
long TesterReport;
long FontName;
long Themes;
// License
string LoginUserID;
string LoginExpiry;
bool CheckVerifyLicense;
string SHowExpiry;
string ShowDaysLeft;
}Sets;
enum ControlType { Label, EditText, Button, ComboBox, Progrees, Graphic, Pictur};
struct ControlLayout {
ControlType type;
int width;
int height;
int xOffset;
int yOffset;
string text;
};
struct TooltipMapping {
int labelIndex; // The index of the label
string tooltip; // Tooltip text
};
// An object class for a list of panel objects with their names for fields located on a given tab of the panel. There will be one list per tab.
class CStringForList : public CObject
{
public:
string Name;
CWnd* Obj;
bool Hidden; // Used only in the Trading tab to avoid deleting the extra TPs but keep them hidden after removal.
CStringForList() {Hidden = false;}
};
class CPanelList : public CList
{
public:
void DeleteListElementByName(const string name);
void MoveListElementByName(const string name, const int index);
void CreateListElementByName(CObject &obj, const string name);
void SetHiddenByName(const string name, const bool hidden);
};
+189
View File
@@ -0,0 +1,189 @@
//--- Messege
#define TRANSLATION_MESSAGE_FAILED_CREATE_INDICATOR "فشل في إنشاء مقبض المؤشر. Error: "
#define TRANSLATION_MESSAGE_FAILED_LODED_FILE "فشل في تحميل الملف "
#define TRANSLATION_MESSAGE_ERROR " . Error: "
#define TRANSLATION_MESSAGE_FAILED_GET_RATES "فشل في الحصول على الأسعار. Error: "
#define TRANSLATION_MESSAGE_FILED_GET_INDICATOR "فشل في الحصول على قيم المؤشر. Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_BUY "لا يمكن حساب هامش شراء (طلب). Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_SELL "لا يمكن حساب هامش بيع (طلب). Error: "
#define TRANSLATION_MESSAGE_CANNOT_RETRIEVE "لا يمكن استرجاع حجم النقطة لـ "
#define TRANSLATION_MESSAGE_LOOKS_LIKE ". يبدو أن الأداة لم تعد متاحة. قد لا يكون الحساب دقيقاً. Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_POSITIONS_BUY "لا يمكن حساب هامش شراء (موضع). Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_POSITIONS_SELL "لا يمكن حساب هامش بيع (موضع). Error: "
#define TRANSLATION_MESSAGE_FAILLED_GET_ORDER "فشل في الحصول على تذكرة الطلب. Error: "
#define TRANSLATION_MESSAGE_FILLED_SELECT_ORDER "فشل في اختيار الطلبات. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_MAGIC_ORDER "فشل في الحصول على رقم سحر الطلب. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_TYPE_ORDER "فشل في الحصول على نوع الطلب. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_TICKET "فشل في الحصول على تذكرة الموضع. Error: "
#define TRANSLATION_MESSAGE_FILLED_SELECT_POSITION "فشل في اختيار الموضع. Error: "
#define TRANSLATION_MESSAGE_FAILLED_GET_MAGIC_POSITION "فشل في الحصول على رقم سحر الموضع. Error: "
#define TRANSLATION_MESSAGE_FAILLED_GET_TYPE_POSITION "فشل في الحصول على نوع الموضع. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_CURRENT "فشل في الحصول على سعر الرمز الحالي. Error: "
#define TRANSLATION_MESSAGE_TRAIL_NOT_PERFORMED "لم يتم تنفيذ التوقف المتعقب بسبب عدم كفاية الإدخالات. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_STOPLOSS_POSITION "فشل في الحصول على وقف الخسارة للموضع. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_PROFIT_POSITION "فشل في الحصول على جني الأرباح للموضع. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_PRICE_POSITION "فشل في الحصول على سعر فتح الموضع. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_SYMBOL_POSITION "فشل في الحصول على رمز الموضع. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_VOLUME_POSITION "فشل في الحصول على حجم الموضع. Error: "
#define TRANSLATION_MESSAGE_PIPVALUE_BUY "لم يتم حساب قيمة البيب للشراء. Error: "
#define TRANSLATION_MESSAGE_INSIDE_SELL "البيع داخل مستوى التوقف. Error: "
#define TRANSLATION_MESSAGE_INSIDE_BUY "الشراء داخل مستوى التوقف. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_COMMENT_ORDER "فشل في الحصول على تعليق الطلب. Error: "
#define TRANSLATION_MESSAGE_REPETITIVE_ORDER "الطلبات مكررة. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_COMMENT_POSITION "فشل في الحصول على تعليق الموضع. Error: "
#define TRANSLATION_MESSAGE_REPETITIVE_POSITION "المواضع مكررة. Error: "
#define TRANSLATION_MESSAGE_VOLUME_ZERO "الحجم صفر. Error: "
#define TRANSLATION_MESSAGE_MARGIN_CANNOT_ERROR "لا يمكن حساب الهوامش. Error: "
#define TRANSLATION_MESSAGE_MARGIN_CANNOT "لا يمكن حساب الهوامش."
#define TRANSLATION_MESSAGE_FILLED_CALCULATE_TOTALSTOPLOSS "فشل في حساب (CalculateTotalstopLoss). Error: "
#define TRANSLATION_MESSAGE_FAILLED_CALCULATE_LOTSIZE "فشل في حساب حجم اللوت. Error: "
#define TRANSLATION_MESSAGE_FAILLED_PIP_CALCULATE "لم يتم حساب قيمة البيب. Error: "
#define TRANSLATION_MESSAGE_STOPLOSS_POSITION " ليس لديه وقف خسارة. يرجى التحقق من الموضع."
#define TRANSLATION_MESSAGE_PROFIT_POSITION "ليس لديه جني أرباح. يرجى التحقق من الموضع."
#define TRANSLATION_MESSAGE_PROFIT_STOPLOSS_POSITION " ليس لديه جني أرباح ووقف خسارة. يرجى التحقق من الموضع."
#define TRANSLATION_MESSAGE_STOPLOSS_ORDER "ليس لديه وقف خسارة. يرجى التحقق من الطلب."
#define TRANSLATION_MESSAGE_PROFIT_ORDER "ليس لديه جني أرباح. يرجى التحقق من الطلب."
#define TRANSLATION_MESSAGE_PROFIT_STOPLOSS_ORDER " ليس لديه جني أرباح ووقف خسارة. يرجى التحقق من الطلب."
#define TRANSLATION_MESSAGE_ERROR_SETTING_TIMER "خطأ في ضبط الموقت"
#define TRANSLATION_MESSAGE_FAILED_DELETE_INI "فشل في حذف ملف .ini الخاص بلوحة التتبع"
//--- retcode ID
#define TRANSLATION_RETCODE_10004 "تغير السعر، ويحتاج الطلب إلى سعر جديد."
#define TRANSLATION_RETCODE_10006 "رفض الخادم طلب التجارة."
#define TRANSLATION_RETCODE_10007 "تم إلغاء الطلب بواسطة المتداول."
#define TRANSLATION_RETCODE_10008 "تم تقديم الطلب بنجاح."
#define TRANSLATION_RETCODE_10009 "تمت معالجة طلب التجارة بالكامل."
#define TRANSLATION_RETCODE_10010 "تم إكمال جزء فقط من الطلب."
#define TRANSLATION_RETCODE_10011 "حدث خطأ أثناء معالجة الطلب."
#define TRANSLATION_RETCODE_10012 "تم إلغاء الطلب بسبب انتهاء المهلة."
#define TRANSLATION_RETCODE_10013 "كان الطلب مشوهاً أو غير صالح."
#define TRANSLATION_RETCODE_10014 "الحجم المطلوب غير صحيح."
#define TRANSLATION_RETCODE_10015 "السعر في الطلب غير صالح."
#define TRANSLATION_RETCODE_10016 "مستويات التوقف-الخسارة أو جني الأرباح غير صالحة."
#define TRANSLATION_RETCODE_10017 "تم تعطيل التداول للحساب."
#define TRANSLATION_RETCODE_10018 "السوق مغلق حالياً."
#define TRANSLATION_RETCODE_10019 "لا يوجد أموال كافية لإتمام الطلب."
#define TRANSLATION_RETCODE_10020 "تغير السعر قبل معالجة الطلب."
#define TRANSLATION_RETCODE_10021 "لا توجد عروض أسعار متاحة لمعالجة الطلب."
#define TRANSLATION_RETCODE_10022 "تاريخ انتهاء صلاحية الطلب غير صالح."
#define TRANSLATION_RETCODE_10023 "تم تعديل حالة الطلب."
#define TRANSLATION_RETCODE_10024 "يتم إرسال الكثير من الطلبات في فترة قصيرة."
#define TRANSLATION_RETCODE_10025 "لا توجد تغييرات في الطلب."
#define TRANSLATION_RETCODE_10026 "تم تعطيل التداول الآلي بواسطة الخادم."
#define TRANSLATION_RETCODE_10027 "تم تعطيل التداول الآلي بواسطة طرف العميل."
#define TRANSLATION_RETCODE_10028 "الطلب مقفل حالياً لمعالجته."
#define TRANSLATION_RETCODE_10029 "الطلب أو الموضع مجمد."
#define TRANSLATION_RETCODE_10030 "نوع التعبئة المحدد في الطلب غير صالح."
#define TRANSLATION_RETCODE_10031 "لا اتصال بخادم التجارة."
#define TRANSLATION_RETCODE_10032 "العملية مسموح بها فقط للحسابات الحية."
#define TRANSLATION_RETCODE_10033 "تم الوصول إلى الحد الأقصى لعدد الأوامر المعلقة."
#define TRANSLATION_RETCODE_10034 "تم الوصول إلى الحد الأقصى للحجم للرمز."
#define TRANSLATION_RETCODE_10035 "نوع الطلب غير صحيح أو محظور."
#define TRANSLATION_RETCODE_10036 "تم إغلاق الموضع المحدد بالفعل."
#define TRANSLATION_RETCODE_UNKNOW_CODE "رمز خطأ غير معروف: "
#define TRANSLATION_RETCODE_UNKNOW_SUPPORT ". يرجى الاتصال بالدعم للحصول على مساعدة إضافية."
//--- Trancaction Type
#define TRANSLATION_TRANSCATION_TYPE_0 "إضافة طلب مفتوح جديد"
#define TRANSLATION_TRANSCATION_TYPE_1 "تحديث طلب مفتوح"
#define TRANSLATION_TRANSCATION_TYPE_2 "إزالة طلب من القائمة المفتوحة"
#define TRANSLATION_TRANSCATION_TYPE_3 "إضافة صفقة إلى التاريخ"
#define TRANSLATION_TRANSCATION_TYPE_4 "تحديث صفقة في التاريخ"
#define TRANSLATION_TRANSCATION_TYPE_5 "حذف صفقة من التاريخ"
#define TRANSLATION_TRANSCATION_TYPE_6 "إضافة طلب إلى التاريخ"
#define TRANSLATION_TRANSCATION_TYPE_7 "تغيير طلب في تاريخ الطلبات"
#define TRANSLATION_TRANSCATION_TYPE_8 "حذف طلب من تاريخ الطلبات"
#define TRANSLATION_TRANSCATION_TYPE_9 "تغيير موضع غير مرتبط بتنفيذ صفقة"
#define TRANSLATION_TRANSCATION_TYPE_10 "إشعار بطلب التجارة المعالج"
#define TRANSLATION_TRANSCATION_TYPE_UNKNOW "نوع المعاملة غير معروف: "
//---Order Type
#define TRANSLATION_ORDER_TYPE_UNKNOW "نوع الطلب غير معروف: "
//---Order State
#define TRANSLATION_ORDER_STATE_0 "تم فحص الطلب، لكنه لم يُقبل بعد من قبل الوسيط"
#define TRANSLATION_ORDER_STATE_1 "تم قبول الطلب"
#define TRANSLATION_ORDER_STATE_2 "تم إلغاء الطلب بواسطة العميل"
#define TRANSLATION_ORDER_STATE_3 "تم تنفيذ الطلب جزئيًا"
#define TRANSLATION_ORDER_STATE_4 "تم تنفيذ الطلب بالكامل"
#define TRANSLATION_ORDER_STATE_5 "تم رفض الطلب"
#define TRANSLATION_ORDER_STATE_6 "انتهت صلاحية الطلب"
#define TRANSLATION_ORDER_STATE_7 "يتم تسجيل الطلب (وضعه في نظام التداول)"
#define TRANSLATION_ORDER_STATE_8 "يتم تعديل الطلب (تغيير معاييره)"
#define TRANSLATION_ORDER_STATE_9 "يتم حذف الطلب (إزالته من نظام التداول)"
#define TRANSLATION_ORDER_STATE_UNKNOW "حالة الطلب غير معروفة: "
//--- Deal Type
#define TRANSLATION_DEAL_TYPE_3 "رصيد"
#define TRANSLATION_DEAL_TYPE_4 "رسوم إضافية"
#define TRANSLATION_DEAL_TYPE_5 "تصحيح"
#define TRANSLATION_DEAL_TYPE_7 "عمولة إضافية"
#define TRANSLATION_DEAL_TYPE_8 "عمولة يومية"
#define TRANSLATION_DEAL_TYPE_9 "عمولة شهرية"
#define TRANSLATION_DEAL_TYPE_10 "عمولة وكيل يومية"
#define TRANSLATION_DEAL_TYPE_11 "عمولة وكيل شهرية"
#define TRANSLATION_DEAL_TYPE_12 "سعر الفائدة"
#define TRANSLATION_DEAL_TYPE_13 "صفقة شراء ملغاة"
#define TRANSLATION_DEAL_TYPE_14 "صفقة بيع ملغاة"
#define TRANSLATION_DEAL_TYPE_15 "عمليات توزيع الأرباح"
#define TRANSLATION_DEAL_TYPE_16 "عمليات توزيع أرباح معفاة (غير خاضعة للضريبة)"
#define TRANSLATION_DEAL_TYPE_17 "رسوم الضرائب"
#define TRANSLATION_DEAL_TYPE_UNKNOW "نوع الصفقة غير معروف: "
//--- Deal Entry
#define TRANSLATION_DEAL_ENTRY_UNKNOW "إدخال الصفقة غير معروف: "
//--- Terminals
#define TRANSLATION_TERMINAL_CLOSED_TERMINAL "تم إغلاق المحطة"
#define TRANSLATION_TERMINAL_DELETED_CHART "تم حذف البرنامج من الرسم البياني"
#define TRANSLATION_TERMINAL_CLOSED_CHART "تم إغلاق الرسم البياني"
#define TRANSLATION_TERMINAL_REMOVE_EXPERT "تم إزالة الخبير"
#define TRANSLATION_TERMINAL_CHANGE_INPUT "تم تغيير معلمات الإدخال بواسطة المستخدم"
#define TRANSLATION_TERMINAL_NON_ZERO "أرجع المعالج OnInit() قيمة غير صفرية"
//---Trade Transcation
#define TRANSLATION_TRANSCATION_DONE "تم بنجاح"
//--- Save File
#define TRANSLATION_TRYING_TO_SAVE_FILE "محاولة لحفظ الإعدادات في الملف: "
#define TRANSLATION_FILED_TO_OPEN_FILE_WRITING "فشل في فتح الملف للكتابة: "
#define TRANSLATION_SAVE_DONE "تم حفظ الإعدادات بنجاح. Error: "
//--- Load File
#define TRANSLATION_TRYING_TO_LOAD "محاولة لتحميل الإعدادات من الملف. Error: "
#define TRANSLATION_NO_SETTINGS "لا يوجد ملف إعدادات لتحميله. Error: "
#define TRANSLATION_FAILED_TO_OPEN_FILE_READING "فشل في فتح الملف للقراءة: "
#define TRANSLATION_LOADED_DONE "تم تحميل الإعدادات بنجاح. Error: "
//--- Delet File
#define TRANSLATION_MESSAGE_NO_SETTINGS_FILE_TO_DELETE "لا يوجد ملف إعدادات لحذفه."
#define TRANSLATION_MESSAGE_TRYING_TO_DELETE_FILE "محاولة لحذف ملف الإعدادات."
#define TRANSLATION_MESSAGE_FAILED_TO_DELETE_FILE "فشل في حذف الملف"
#define TRANSLATION_MESSAGE_DELETED_SETTINGS "تم حذف ملف الإعدادات بنجاح."
//--- Verify Inputs
#define TRANSLATION_MESSAGE_INPUTS_EXTEND "إدخال خاطئ: عدد الشموع لتمديد الخط < 2"
#define TRANSLATION_MESSAGE_INPUTS_CONDITION "إدخال خاطئ: عدد شروط الشموع < 4"
#define TRANSLATION_MESSAGE_INPUTS_MAX_BUY "إدخال خاطئ: الحد الأقصى للمواضع للشراء <= 0"
#define TRANSLATION_MESSAGE_INPUTS_MAX_SELL "إدخال خاطئ: الحد الأقصى للمواضع للبيع <= 0"
#define TRANSLATION_MESSAGE_INPUTS_RIWARD "إدخال خاطئ: نسبة المخاطرة إلى المكافأة < 1"
#define TRANSLATION_MESSAGE_INPUTS_CANDLE_EXPIRATION "إدخال خاطئ: الشموع عند انتهاء صلاحية الطلبات < 2"
#define TRANSLATION_MESSAGE_INPUTS_PERCENTAGE "إدخال خاطئ: معدل تحمل المخاطر الأولي كنقاط مئوية <= 0"
#define TRANSLATION_MESSAGE_INPUTS_LOTSSIZE "إدخال خاطئ: حجم اللوت < 0"
#define TRANSLATION_MESSAGE_INPUTS_MAX_RISK "إدخال خاطئ: المخاطرة القصوى <= 0"
#define TRANSLATION_MESSAGE_INPUTS_STOPLOSS "إدخال خاطئ: وقف الخسارة < 0"
#define TRANSLATION_MESSAGE_INPUTS_STOPLOSS_LIMIT "إدخال خاطئ: حد وقف الخسارة أقل من الحد الأدنى المسموح به من النقاط ("
#define TRANSLATION_MESSAGE_INPUTS_STOPLOSS_DISTANCE "إدخال خاطئ: المسافة إلى وقف الخسارة < 0"
#define TRANSLATION_MESSAGE_INPUTS_SAVE_AND_TRAIL "إدخال خاطئ: لا يمكن تفعيل إدارة الأرباح والتوقف المتعقب في نفس الوقت."
#define TRANSLATION_MESSAGE_INPUTS_TRIGGER_TRAIL "إدخال خاطئ: البدء بعد النقاط/المال < 0"
#define TRANSLATION_MESSAGE_INPUTS_VALUE_TRAIL "إدخال خاطئ: البدء بعد النقاط/المال <= حفظ الأرباح"
#define TRANSLATION_MESSAGE_INPUTS_SAVEPROFIT "إدخال خاطئ: حفظ الأرباح < 0"
#define TRANSLATION_MESSAGE_INPUTS_SAVE_BIGGER_TRIGGER_SAVE "إدخال خاطئ: حفظ الأرباح >= البدء بعد النقاط/المال"
#define TRANSLATION_MESSAGE_INPUTS_TRIGGER_ZERO "إدخال خاطئ: عدد النقاط للبدء < 0"
#define TRANSLATION_MESSAGE_INPUTS_SAVE_SMALLER_TRIGGER_SAVE "إدخال خاطئ: البدء بعد النقاط/المال <= التوقف المتعقب"
#define TRANSLATION_MESSAGE_INPUTS_TRAIL_ZERO "إدخال خاطئ: التوقف المتعقب < 0"
#define TRANSLATION_MESSAGE_INPUTS_TRAIL_BIGGER_SAVE "إدخال خاطئ: التوقف المتعقب >= البدء بعد النقاط/المال"
#define TRANSLATION_MESSAGE_INPUTS_FIRST_COMMISSION "إدخال خاطئ: إدخال العمولة الأولى غير صالح."
#define TRANSLATION_MESSAGE_INPUTS_SECOND_COMMISSION "إدخال خاطئ: إدخال العمولة الثانية غير صالح."
#define TRANSLATION_MESSAGE_INPUTS_BALANCE_ZERO "رصيد الحساب فارغ."
+190
View File
@@ -0,0 +1,190 @@
//--- Message
#define TRANSLATION_MESSAGE_FAILED_CREATE_INDICATOR "创建指标句柄失败。Error: "
#define TRANSLATION_MESSAGE_FAILED_LODED_FILE "文件加载失败 Error: "
#define TRANSLATION_MESSAGE_ERROR " Error: "
#define TRANSLATION_MESSAGE_FAILED_GET_RATES "获取汇率失败。Error: "
#define TRANSLATION_MESSAGE_FILED_GET_INDICATOR "获取指标值失败。Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_BUY "无法计算买入(订单)保证金。Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_SELL "无法计算卖出(订单)保证金。Error: "
#define TRANSLATION_MESSAGE_CANNOT_RETRIEVE "无法检索 Error: "
#define TRANSLATION_MESSAGE_LOOKS_LIKE "。看起来该工具不再可用。计算可能不准确。Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_POSITIONS_BUY "无法计算买入(持仓)保证金。Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_POSITIONS_SELL "无法计算卖出(持仓)保证金。Error: "
#define TRANSLATION_MESSAGE_FAILLED_GET_ORDER "获取订单票据失败。Error: "
#define TRANSLATION_MESSAGE_FILLED_SELECT_ORDER "选择订单失败。Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_MAGIC_ORDER "获取订单魔术编号失败。Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_TYPE_ORDER "获取订单类型失败。Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_TICKET "获取持仓票据失败。Error: "
#define TRANSLATION_MESSAGE_FILLED_SELECT_POSITION "选择持仓失败。Error: "
#define TRANSLATION_MESSAGE_FAILLED_GET_MAGIC_POSITION "获取持仓魔术编号失败。Error: "
#define TRANSLATION_MESSAGE_FAILLED_GET_TYPE_POSITION "获取持仓类型失败。Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_CURRENT "获取当前符号报价失败。Error: "
#define TRANSLATION_MESSAGE_TRAIL_NOT_PERFORMED "未执行追踪止损,因为条目不足。Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_STOPLOSS_POSITION "获取持仓止损失败。Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_PROFIT_POSITION "获取持仓止盈失败。Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_PRICE_POSITION "获取持仓开盘价失败。Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_SYMBOL_POSITION "获取持仓符号失败。Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_VOLUME_POSITION "获取持仓量失败。Error: "
#define TRANSLATION_MESSAGE_PIPVALUE_BUY "未计算买入的点值。Error: "
#define TRANSLATION_MESSAGE_INSIDE_SELL "SELL 在止损水平内。Error: "
#define TRANSLATION_MESSAGE_INSIDE_BUY "BUY 在止损水平内。Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_COMMENT_ORDER "获取订单评论失败。Error: "
#define TRANSLATION_MESSAGE_REPETITIVE_ORDER "订单重复。Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_COMMENT_POSITION "获取持仓评论失败。Error: "
#define TRANSLATION_MESSAGE_REPETITIVE_POSITION "持仓重复。Error: "
#define TRANSLATION_MESSAGE_VOLUME_ZERO "量为零。Error: "
#define TRANSLATION_MESSAGE_MARGIN_CANNOT_ERROR "无法计算保证金。Error: "
#define TRANSLATION_MESSAGE_MARGIN_CANNOT "无法计算保证金。"
#define TRANSLATION_MESSAGE_FILLED_CALCULATE_TOTALSTOPLOSS "计算总止损失败。Error: "
#define TRANSLATION_MESSAGE_FAILLED_CALCULATE_LOTSIZE "计算手数失败。Error: "
#define TRANSLATION_MESSAGE_FAILLED_PIP_CALCULATE "未计算点值。Error: "
#define TRANSLATION_MESSAGE_STOPLOSS_POSITION " 没有止损,请检查持仓。"
#define TRANSLATION_MESSAGE_PROFIT_POSITION "没有止盈,请检查持仓。"
#define TRANSLATION_MESSAGE_PROFIT_STOPLOSS_POSITION " 没有止盈和止损,请检查持仓。"
#define TRANSLATION_MESSAGE_STOPLOSS_ORDER "没有止损,请检查订单。"
#define TRANSLATION_MESSAGE_PROFIT_ORDER "没有止盈,请检查订单。"
#define TRANSLATION_MESSAGE_PROFIT_STOPLOSS_ORDER " 没有止盈和止损,请检查订单。"
#define TRANSLATION_MESSAGE_ERROR_SETTING_TIMER "定时器设置错误"
#define TRANSLATION_MESSAGE_FAILED_DELETE_INI "無法刪除 Retrace 面板的 .ini 文件"
//--- retcode ID
#define TRANSLATION_RETCODE_10004 "价格已变动,订单需要新的价格。"
#define TRANSLATION_RETCODE_10006 "服务器已拒绝交易请求。"
#define TRANSLATION_RETCODE_10007 "请求已被交易员取消。"
#define TRANSLATION_RETCODE_10008 "订单已成功下达。"
#define TRANSLATION_RETCODE_10009 "交易请求已完全处理。"
#define TRANSLATION_RETCODE_10010 "请求只有部分完成。"
#define TRANSLATION_RETCODE_10011 "处理请求时发生错误。"
#define TRANSLATION_RETCODE_10012 "请求由于超时而被取消。"
#define TRANSLATION_RETCODE_10013 "请求格式错误或无效。"
#define TRANSLATION_RETCODE_10014 "请求的数量不正确。"
#define TRANSLATION_RETCODE_10015 "请求中的价格无效。"
#define TRANSLATION_RETCODE_10016 "止损或止盈水平无效。"
#define TRANSLATION_RETCODE_10017 "账户的交易已被禁用。"
#define TRANSLATION_RETCODE_10018 "市场当前已关闭。"
#define TRANSLATION_RETCODE_10019 "没有足够的资金来完成请求。"
#define TRANSLATION_RETCODE_10020 "在请求处理之前价格已发生变化。"
#define TRANSLATION_RETCODE_10021 "没有可用的报价来处理请求。"
#define TRANSLATION_RETCODE_10022 "订单的过期日期无效。"
#define TRANSLATION_RETCODE_10023 "订单状态已被修改。"
#define TRANSLATION_RETCODE_10024 "在短时间内发送的请求过多。"
#define TRANSLATION_RETCODE_10025 "请求中没有变化。"
#define TRANSLATION_RETCODE_10026 "服务器已禁用自动交易。"
#define TRANSLATION_RETCODE_10027 "客户端终端已禁用自动交易。"
#define TRANSLATION_RETCODE_10028 "请求当前正在处理锁定中。"
#define TRANSLATION_RETCODE_10029 "订单或持仓被冻结。"
#define TRANSLATION_RETCODE_10030 "请求中指定的填充类型无效。"
#define TRANSLATION_RETCODE_10031 "无法连接到交易服务器。"
#define TRANSLATION_RETCODE_10032 "操作仅允许在真实账户上进行。"
#define TRANSLATION_RETCODE_10033 "已达到最大未决订单数量。"
#define TRANSLATION_RETCODE_10034 "已达到该符号的最大交易量。"
#define TRANSLATION_RETCODE_10035 "订单类型不正确或被禁止。"
#define TRANSLATION_RETCODE_10036 "指定的持仓已被关闭。"
#define TRANSLATION_RETCODE_UNKNOW_CODE "未知错误代码: "
#define TRANSLATION_RETCODE_UNKNOW_SUPPORT ". 请联系支持部门以获取进一步帮助。"
//--- Trancaction Type
#define TRANSLATION_TRANSCATION_TYPE_0 "添加一个新的未结订单"
#define TRANSLATION_TRANSCATION_TYPE_1 "更新一个未结订单"
#define TRANSLATION_TRANSCATION_TYPE_2 "从未结订单列表中删除订单"
#define TRANSLATION_TRANSCATION_TYPE_3 "将交易添加到历史记录中"
#define TRANSLATION_TRANSCATION_TYPE_4 "更新历史记录中的交易"
#define TRANSLATION_TRANSCATION_TYPE_5 "从历史记录中删除交易"
#define TRANSLATION_TRANSCATION_TYPE_6 "将订单添加到历史记录中"
#define TRANSLATION_TRANSCATION_TYPE_7 "更改订单在订单历史中的记录"
#define TRANSLATION_TRANSCATION_TYPE_8 "从订单历史中删除订单"
#define TRANSLATION_TRANSCATION_TYPE_9 "更改与交易执行无关的持仓"
#define TRANSLATION_TRANSCATION_TYPE_10 "处理过的交易请求的通知"
#define TRANSLATION_TRANSCATION_TYPE_UNKNOW "未知的交易类型: "
//--- Order Type
#define TRANSLATION_ORDER_TYPE_UNKNOW "未知的订单类型: "
//--- Order State
#define TRANSLATION_ORDER_STATE_0 "订单已检查,但尚未被经纪商接受"
#define TRANSLATION_ORDER_STATE_1 "订单已被接受"
#define TRANSLATION_ORDER_STATE_2 "订单被客户取消"
#define TRANSLATION_ORDER_STATE_3 "订单部分执行"
#define TRANSLATION_ORDER_STATE_4 "订单完全执行"
#define TRANSLATION_ORDER_STATE_5 "订单被拒绝"
#define TRANSLATION_ORDER_STATE_6 "订单已过期"
#define TRANSLATION_ORDER_STATE_7 "订单正在注册中(放入交易系统)"
#define TRANSLATION_ORDER_STATE_8 "订单正在修改中(更改其参数)"
#define TRANSLATION_ORDER_STATE_9 "订单正在删除中(从交易系统中删除)"
#define TRANSLATION_ORDER_STATE_UNKNOW "未知的订单状态: "
//--- Deal Type
#define TRANSLATION_DEAL_TYPE_3 "信用"
#define TRANSLATION_DEAL_TYPE_4 "额外费用"
#define TRANSLATION_DEAL_TYPE_5 "修正"
#define TRANSLATION_DEAL_TYPE_7 "额外佣金"
#define TRANSLATION_DEAL_TYPE_8 "每日佣金"
#define TRANSLATION_DEAL_TYPE_9 "每月佣金"
#define TRANSLATION_DEAL_TYPE_10 "每日代理佣金"
#define TRANSLATION_DEAL_TYPE_11 "每月代理佣金"
#define TRANSLATION_DEAL_TYPE_12 "利率"
#define TRANSLATION_DEAL_TYPE_13 "取消的买入交易"
#define TRANSLATION_DEAL_TYPE_14 "取消的卖出交易"
#define TRANSLATION_DEAL_TYPE_15 "股息操作"
#define TRANSLATION_DEAL_TYPE_16 "免税股息操作"
#define TRANSLATION_DEAL_TYPE_17 "税费"
#define TRANSLATION_DEAL_TYPE_UNKNOW "未知的交易类型: "
//--- Deal Entry
#define TRANSLATION_DEAL_ENTRY_UNKNOW "未知的交易条目: "
//--- Terminals
#define TRANSLATION_TERMINAL_CLOSED_TERMINAL "终端已关闭"
#define TRANSLATION_TERMINAL_DELETED_CHART "程序已从图表中删除"
#define TRANSLATION_TERMINAL_CLOSED_CHART "图表已关闭"
#define TRANSLATION_TERMINAL_REMOVE_EXPERT "专家已移除"
#define TRANSLATION_TERMINAL_CHANGE_INPUT "用户已更改输入参数"
#define TRANSLATION_TERMINAL_NON_ZERO "OnInit() 处理程序返回了非零值"
//---Trade Transcation
#define TRANSLATION_TRANSCATION_DONE "操作成功完成"
//--- Save File
#define TRANSLATION_TRYING_TO_SAVE_FILE "尝试将设置保存到文件: "
#define TRANSLATION_FILED_TO_OPEN_FILE_WRITING "无法打开文件进行写入: "
#define TRANSLATION_SAVE_DONE "设置已成功保存. 错误: "
//--- Load File
#define TRANSLATION_TRYING_TO_LOAD "尝试从文件加载设置. 错误: "
#define TRANSLATION_NO_SETTINGS "没有设置文件可加载. 错误: "
#define TRANSLATION_FAILED_TO_OPEN_FILE_READING "无法打开文件进行读取: "
#define TRANSLATION_LOADED_DONE "设置已成功加载. 错误: "
//--- Delet File
#define TRANSLATION_MESSAGE_NO_SETTINGS_FILE_TO_DELETE "没有设置文件可删除."
#define TRANSLATION_MESSAGE_TRYING_TO_DELETE_FILE "尝试删除设置文件."
#define TRANSLATION_MESSAGE_FAILED_TO_DELETE_FILE "删除文件失败"
#define TRANSLATION_MESSAGE_DELETED_SETTINGS "设置文件已成功删除."
//--- Verify Inputs
#define TRANSLATION_MESSAGE_INPUTS_EXTEND "输入错误:延长线的蜡烛数量 < 2"
#define TRANSLATION_MESSAGE_INPUTS_CONDITION "输入错误:蜡烛条件的数量 < 4"
#define TRANSLATION_MESSAGE_INPUTS_MAX_BUY "输入错误:最大买入头寸 <= 0"
#define TRANSLATION_MESSAGE_INPUTS_MAX_SELL "输入错误:最大卖出头寸 <= 0"
#define TRANSLATION_MESSAGE_INPUTS_RIWARD "输入错误:风险回报比 < 1"
#define TRANSLATION_MESSAGE_INPUTS_CANDLE_EXPIRATION "输入错误:订单过期时的蜡烛数量 < 2"
#define TRANSLATION_MESSAGE_INPUTS_PERCENTAGE "输入错误:初始风险容忍度(百分比) <= 0"
#define TRANSLATION_MESSAGE_INPUTS_LOTSSIZE "输入错误:手数 < 0"
#define TRANSLATION_MESSAGE_INPUTS_MAX_RISK "输入错误:最大风险 <= 0"
#define TRANSLATION_MESSAGE_INPUTS_STOPLOSS "输入错误:止损 < 0"
#define TRANSLATION_MESSAGE_INPUTS_STOPLOSS_LIMIT "输入错误:止损限制小于允许的最小点数("
#define TRANSLATION_MESSAGE_INPUTS_STOPLOSS_DISTANCE "输入错误:止损距离 < 0"
#define TRANSLATION_MESSAGE_INPUTS_SAVE_AND_TRAIL "输入错误:利润管理和追踪止损不能同时激活。"
#define TRANSLATION_MESSAGE_INPUTS_TRIGGER_TRAIL "输入错误:触发点数/金额 < 0"
#define TRANSLATION_MESSAGE_INPUTS_VALUE_TRAIL "输入错误:触发点数/金额 <= 保存利润"
#define TRANSLATION_MESSAGE_INPUTS_SAVEPROFIT "输入错误:保存利润 < 0"
#define TRANSLATION_MESSAGE_INPUTS_SAVE_BIGGER_TRIGGER_SAVE "输入错误:保存利润 >= 触发点数/金额"
#define TRANSLATION_MESSAGE_INPUTS_TRIGGER_ZERO "输入错误:触发点数值 < 0"
#define TRANSLATION_MESSAGE_INPUTS_SAVE_SMALLER_TRIGGER_SAVE "输入错误:触发点数/金额值 <= 追踪止损"
#define TRANSLATION_MESSAGE_INPUTS_TRAIL_ZERO "输入错误:追踪止损 < 0"
#define TRANSLATION_MESSAGE_INPUTS_TRAIL_BIGGER_SAVE "输入错误:追踪止损 >= 触发点数/金额值"
#define TRANSLATION_MESSAGE_INPUTS_FIRST_COMMISSION "输入错误:第一次佣金条目无效。"
#define TRANSLATION_MESSAGE_INPUTS_SECOND_COMMISSION "输入错误:第二次佣金条目无效。"
#define TRANSLATION_MESSAGE_INPUTS_BALANCE_ZERO "账户余额为空。"
+373
View File
@@ -0,0 +1,373 @@
// Tabs
#define TRANSLATION_TAB_BUTTON_OVERWIEV "Overwiev"
#define TRANSLATION_TAB_BUTTON_SETTINGS "Settings"
#define TRANSLATION_TAB_BUTTON_SETTINGS_INPUTEA "inputs EA"
#define TRANSLATION_TAB_BUTTON_SETTINGS_PANELSETTING "Panel Setting"
#define TRANSLATION_TAB_BUTTON_PERFORMANCE "Performance"
#define TRANSLATION_TAB_BUTTON_LOGS "Logs"
#define TRANSLATION_TAB_BUTTON_SETTINGS_SECURITY "Security"
#define TRANSLATION_TAB_BUTTON_SUMMARY "Summary"
#define TRANSLATION_TAB_BUTTON_EQUITY "Equity"
#define TRANSLATION_TAB_BUTTON_DAY "Day"
#define TRANSLATION_TAB_BUTTON_WEEK "Week"
#define TRANSLATION_TAB_BUTTON_MONTH "Month"
#define TRANSLATION_TAB_BUTTON_YEAR "Year"
#define TRANSLATION_TAB_BUTTON_RETURN "Return"
//--- Terminals
#define TRANSLATION_TERMINAL_CLOSED_TERMINAL "Terminal has been closed"
#define TRANSLATION_TERMINAL_DELETED_CHART "Program has been deleted from the chart"
#define TRANSLATION_TERMINAL_CLOSED_CHART "Chart has been closed"
#define TRANSLATION_TERMINAL_REMOVE_EXPERT "Expert Removed"
#define TRANSLATION_TERMINAL_CHANGE_INPUT "Input parameters have been changed by a user"
#define TRANSLATION_TERMINAL_NON_ZERO "OnInit() handler has returned a nonzero value"
#define TRANSLATION_TERMINAL_MARGIN_MODE_HEDGE "This expert can only be used on a retail hedging account"
// Label
// #define TRANSLATION_LABEL_SETTINGS_GROUP_TRADESETTINGS " -- Trade Setting -- "
// // #define TRANSLATION_LABEL_SETTINGS_GROUP_TRADESETTINGS "------- Risk Management -------"
// // #define TRANSLATION_LABEL_SETTINGS_GROUP_TRADESETTINGS "------- Save Profit -------"
// // #define TRANSLATION_LABEL_SETTINGS_GROUP_TRADESETTINGS "------- Trailling Stop -------"
// // #define TRANSLATION_LABEL_SETTINGS_GROUP_TRADESETTINGS "------- Commission calculation -------"
// // #define TRANSLATION_LABEL_SETTINGS_GROUP_TRADESETTINGS "------- Panel Settings -------"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_TIMEFRAME "Time Frame"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_STREAK "Number of candles to extend the line(<2,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_CONDITION "number of candle condition(<4,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_MAXBUY "Maximum positions Buy(<=0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_MAXSELL "Maximum positions Sell(<=0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_TYPEPOSITIONS "Type Position"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_RISKREWARD "RiskReward Ratio(<1,= Off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_EXPIRYTION "candles at the time of expiration of the orders(<2,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_RISKMANEGMENT "Risk: Initial risk tolerance in percentage points (<=0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_LOTSIZE "Lot Size: (0=auto calculate,<0=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_MAXRISKAUTO "Maximum Risk: if RiskAuto is true (<=0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_SLENTRY "If the position is stopped, will the position be reversed ?"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_INPSL "If the stop loss is 0, it is calculated automatically(<0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_TELORANCE "Distance to Stop Loss(<0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_ZEROLOTS "if the(lot size < minimum lots) stoploss = auto calculate"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_STRATEGYRISK "Select your preferred risk management method: Easy,Normal,Advanced"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_SAVEPROFIT "Choose how to manage profits"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_SAVETYPE "Set the save profit to points or money"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_SAVETRIGGER "Start after Points/Money value(<=Value or <0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_SAVEVALUE "Save Profit ?(>=Trigger or <0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_TLS "Start trailling Stop ?"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_TLSTYPE "Set the trailing stop to points or money"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_TLSTRIGGER "Start after Points/Money value(<=Value or <0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_TLSVALUE "Trailling Stop ?(>=Trigger or <0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_COMISIONINOUT "Calculation of input or output commission"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_COMISIONMETHOD "Type of commission calculation"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_COMISIONFIRSTINPUT "The first input of the commission(>= - first input or <0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_COMISIONFIRSTINPUT2 "- input(<= first input or <0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_COMISIONFIRSTVALUE "Value commission(<0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_COMISIONSECONDINPUT "The second input of the commission(>= - second input or <0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_COMISIONSECONDINPUT2 "- input(<= second input or <0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_COMISIONSECONDVALUE "Value commission(<0,=off)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_SYMBOLCHANGE "SymbolChange: Can the settings be saved by changing the symbol ?"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_PNLPRIVATY "privacy (hides private info on overwiev tab)"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_PNLFONT "Font"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_PNLFONTSIZE "Size Font"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_PNLPOSX "PanelPositionX: Panel's X coordinate"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_PNLPOSY "PanelPositionY: Panel's Y coordinat"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_PNLMINIMIZ "StartPanelMinimized: Start the panel minimized ?"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_TESTER_HIDE "Hide Panel is Testing"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_TESTER_REPORT "Create Test Report"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_FONT "Font Name"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_THEMES "Themes"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_ACCOUNT_LOGIN "Account Broker Number"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_EA_LOGIN "User EA Login Number"
#define TRANSLATION_LABEL_SETTINGS_INPUTS_TOOLTIP_PRIVATEKEY "Unique private key"
// Error text
#define TRANSLATION_LABEL_ERROR_VERIFY_CANNOT_BE_LESS " cannot be less than "
#define TRANSLATION_LABEL_ERROR_VERIFY_PREVIOUS " The previous value is replaced"
#define TRANSLATION_LABEL_ERROR_VERIFY_OR_LESS " or less than or equal to "
#define TRANSLATION_LABEL_ERROR_VERIFY_OR_GREATER " or greater than or equal to "
#define TRANSLATION_LABEL_ERROR_VERIFY_EQUAL " cannot be less than or equal to "
#define TRANSLATION_LABEL_ERROR_VERIFY_INTEGER " Must be integer. The previous value is replaced."
#define TRANSLATION_LABEL_ERROR_VERIFY_INTEGER_DECIMAL " Must be integer or decimal. The previous value is replaced"
#define TRANSLATION_LABEL_ERROR_VERIFY_INPUT_NUMBER " Must be integer or decimal"
// Overwiev tab
#define TRANSLATION_LABEL_OVERWIEV_GENERALINFO "General Informations"
#define TRANSLATION_LABEL_OVERWIEV_MAGIC_NUMBER "MagicNumber :"
#define TRANSLATION_LABEL_OVERWIEV_SYMBOL "Symbol :"
#define TRANSLATION_LABEL_OVERWIEV_STOPLEVEL "Stops Level :"
#define TRANSLATION_LABEL_OVERWIEV_LICENSEINFO "License Informations"
#define TRANSLATION_LABEL_OVERWIEV_VERIFYED_OK "License is Valid"
#define TRANSLATION_LABEL_OVERWIEV_VALIDUNTIL "Valid Until :"
#define TRANSLATION_LABEL_OVERWIEV_DAYSLEFT "Days Left :"
#define TRANSLATION_LABEL_OVERWIEV_VERSION "Version :"
#define TRANSLATION_LABEL_OVERWIEV_MAXLOTS "Max Lots :"
#define TRANSLATION_LABEL_OVERWIEV_PERFORMANCE "Performance"
#define TRANSLATION_LABEL_OVERWIEV_PERIODSTART "Period Start :"
#define TRANSLATION_LABEL_OVERWIEV_PERIODEND "Period End :"
#define TRANSLATION_LABEL_OVERWIEV_PROFIT "Profit :"
#define TRANSLATION_LABEL_OVERWIEV_DRAWDOWN "DrawDown :"
#define TRANSLATION_LABEL_OVERWIEV_PROFITFACTOR "Profit Factor :"
#define TRANSLATION_LABEL_OVERWIEV_TREDS "Trades (Won %) :"
#define TRANSLATION_LABEL_OVERWIEV_EXPECTEDPAY "Expected Payoff :"
#define TRANSLATION_LABEL_OVERWIEV_ABUT "About"
#define TRANSLATION_LABEL_OVERWIEV_MASTERGOLDEAABOUT "MasterPanelRaw"
#define TRANSLATION_LABEL_OVERWIEV_VERSIONABOUT "V 3.07"
#define TRANSLATION_LABEL_OVERWIEV_LINKABOUT "www.clubamoz.ir"
#define TRANSLATION_LABEL_OVERWIEV_COPYRIGHT "© 2023, clubtrading"
#define TRANSLATION_LABEL_OVERWIEV_STATUS "Status :"
#define TRANSLATION_LABEL_OVERWIEV_LOG "Log"
#define TRANSLATION_LABEL_OVERWIEV_TIME "Time"
#define TRANSLATION_LABEL_OVERWIEV_SYMBOLRIGH "Symbol"
#define TRANSLATION_LABEL_OVERWIEV_MESSAGE "Message"
#define TRANSLATION_LABEL_OVERWIEV_ACCOUNTINFO "Account Informations"
#define TRANSLATION_LABEL_OVERWIEV_NUMBER "Number :"
#define TRANSLATION_LABEL_OVERWIEV_MODE "Mode :"
#define TRANSLATION_LABEL_OVERWIEV_BROKER "Broker :"
#define TRANSLATION_LABEL_OVERWIEV_EQUITY "Equity"
//--- inputs Tab
#define TRANSLATION_LABEL_TRADE_SETTING "Trade Setting"
#define TRANSLATION_LABEL_TIME_FRAME "Time Frame :"
#define TRANSLATION_LABEL_STREAK "Streak :"
#define TRANSLATION_LABEL_CONDITION "Condition :"
#define TRANSLATION_LABEL_MAXBUY "MaxBuy :"
#define TRANSLATION_LABEL_MAXSELL "MaxSell :"
#define TRANSLATION_LABEL_POSITION "Position :"
#define TRANSLATION_LABEL_RISKRWARD "RiskRiward :"
#define TRANSLATION_LABEL_EXPIRYTION "Expirytion:"
#define TRANSLATION_LABEL_RISK_MANAGEMENT "Risk Management"
#define TRANSLATION_LABEL_RISK "Risk :"
#define TRANSLATION_LABEL_LOTSIZE "LotSize :"
#define TRANSLATION_LABEL_MAXRISK_AUTO "MaxRiskAuto :"
#define TRANSLATION_LABEL_ERROR "Error :"
#define TRANSLATION_LABEL_WEBSITE "www.clubamoz.ir"
#define TRANSLATION_LABEL_NO_ERROR "No Error."
#define TRANSLATION_LABEL_REVERSED "Reversed :"
#define TRANSLATION_LABEL_STOPLOSS "StopLoss :"
#define TRANSLATION_LABEL_TOLORANCE "Telorance :"
#define TRANSLATION_LABEL_ZEROLOT "ZeroLot :"
#define TRANSLATION_LABEL_STRATEGY_RISK "StrategyRisk :"
#define TRANSLATION_LABEL_SAVE_PROFIT "Save Profit"
#define TRANSLATION_LABEL_SAVEPROFIT "SaveProfit ?"
#define TRANSLATION_LABEL_METHOD "Methode :"
#define TRANSLATION_LABEL_TRIGGER "Trigger :"
#define TRANSLATION_LABEL_VALUE "Value :"
#define TRANSLATION_LABEL_TRAILLING_STOP "Trailling Stop"
#define TRANSLATION_LABEL_TRAILLING "Trailling ?"
#define TRANSLATION_LABEL_COMMISSION "Commission"
#define TRANSLATION_LABEL_COMMISSION_DETAILS "Commission ?"
#define TRANSLATION_LABEL_FIRSTINPUT "FirstInput :"
#define TRANSLATION_LABEL_SEPARATOR "- :"
#define TRANSLATION_LABEL_FIRSTVALUE "FirstValue :"
#define TRANSLATION_LABEL_SECONDINPUT "SecondInput :"
#define TRANSLATION_LABEL_SECONDVALUE "SecondValue :"
//--- Panel Tab
#define TRANSLATION_LABEL_PANEL_SETTING "Panel Setting"
#define TRANSLATION_LABEL_SYMBOL_CHANGE "SymbolChange :"
#define TRANSLATION_LABEL_HIDE_PRIVACY "HidePrivacy :"
#define TRANSLATION_LABEL_PANEL_MINIMIZED "PanelMinimized :"
#define TRANSLATION_LABEL_TESTER_SETTING "Tester Setting"
#define TRANSLATION_LABEL_CREATE_REPORT "CreateReport :"
#define TRANSLATION_LABEL_HIDE_PANEL "HidePanel :"
#define TRANSLATION_LABEL_FONT_THEMES "Font/Themes"
#define TRANSLATION_LABEL_FONT "Font :"
#define TRANSLATION_LABEL_THEMES "Themes :"
//--- Performance Tab
#define TRANSLATION_LABEL_PERFORMANCE_FILTER "Filter"
#define TRANSLATION_LABEL_PERFORMANCE_TIMEPERIOD "Time Period"
#define TRANSLATION_LABEL_PERFORMANCE_MAGIC "Magic "
#define TRANSLATION_LABEL_PERFORMANCE_ALL "All"
#define TRANSLATION_LABEL_PERFORMANCE_CLEAR "Clear"
#define TRANSLATION_LABEL_PERFORMANCE_SYMBOL "Symbol "
#define TRANSLATION_LABEL_PERFORMANCE_ACCOUNT "Account"
#define TRANSLATION_LABEL_PERFORMANCE_UPDATE "Update"
#define TRANSLATION_LABEL_GENERAL "General"
#define TRANSLATION_LABEL_PERIOD "Period :"
#define TRANSLATION_LABEL_MAGIC "Magic :"
#define TRANSLATION_LABEL_SYMBOLS "Symbols :"
#define TRANSLATION_LABEL_ACCOUNTS "Accounts :"
#define TRANSLATION_LABEL_PROFIT "Profit :"
#define TRANSLATION_LABEL_NET_PROFIT "NetProfit :"
#define TRANSLATION_LABEL_NET_LOSS "NetLoss :"
#define TRANSLATION_LABEL_BALANCE_MDD "Balance/mDD :"
#define TRANSLATION_LABEL_PROFIT_FACTOR "ProfitFactor :"
#define TRANSLATION_LABEL_EXPECTED_PAYOFF "Exp.Payoff"
#define TRANSLATION_LABEL_LINEARITY "Linearity :"
#define TRANSLATION_LABEL_OPTI "Opti :"
#define TRANSLATION_LABEL_TRADES "Trades"
#define TRANSLATION_LABEL_QUANTITY "Quantity :"
#define TRANSLATION_LABEL_PROFITABLE "Profitable :"
#define TRANSLATION_LABEL_OPEN_TIME "Open Time(d:h:m) :"
#define TRANSLATION_LABEL_MAX_OPEN_TIME "Max Open Time :"
#define TRANSLATION_LABEL_MIN_OPEN_TIME "Min Open Time :"
#define TRANSLATION_LABEL_BIGGEST_WIN "Biggest Win"
#define TRANSLATION_LABEL_AVERAGE_WIN "Average Win :"
#define TRANSLATION_LABEL_BIGGEST_LOSS "Biggest Loss :"
#define TRANSLATION_LABEL_AVERAGE_LOSS "Average Loss :"
#define TRANSLATION_LABEL_CLOSED_BY_ORDER "Closed by order :"
#define TRANSLATION_LABEL_CLOSED_BY_SL "Closed by SL :"
#define TRANSLATION_LABEL_CLOSED_BY_TP "Closed by TP :"
#define TRANSLATION_LABEL_OTHER_REASON "other reason :"
#define TRANSLATION_LABEL_ALL_PERCENT "All(%)"
#define TRANSLATION_LABEL_BUY_PERCENT "Buy(%)"
#define TRANSLATION_LABEL_SELL_PERCENT "Sell(%)"
#define TRANSLATION_LABEL_DRAW_DOWN "Draw Down"
#define TRANSLATION_LABEL_MAX_FLAT_PERIOD "Max flat Period :"
#define TRANSLATION_LABEL_MAX_DD_TIME "Max Drawdown Time :"
#define TRANSLATION_LABEL_MAX_DD_TRADES "Max Drawdown Tades :"
#define TRANSLATION_LABEL_MAX_DD "Max Drawdown :"
#define TRANSLATION_LABEL_MIN_DD "Min Drawdown :"
#define TRANSLATION_LABEL_STREAKS "Streaks"
#define TRANSLATION_LABEL_MOST_WINNING_TRADES "Most Winning Trades :"
#define TRANSLATION_LABEL_MOST_LOSING_TRADES "Most Losing Trades :"
#define TRANSLATION_LABEL_WINNING_STREAK "Winning Streak :"
#define TRANSLATION_LABEL_LOSING_STREAK "Losing Streak :"
#define TRANSLATION_LABEL_COSTS "Costs"
#define TRANSLATION_LABEL_SUM_LOTS "Sum Lots : "
#define TRANSLATION_LABEL_SUM_COMMISSION "Sum Commission : "
#define TRANSLATION_LABEL_SUM_SWAP "Sum Swap : "
//--- Equity Tab
#define TRANSLATION_BUTTON_SHOW_MAGIC "Show Magics"
#define TRANSLATION_BUTTON_SHOW_SYMBOL "Show Symbols"
#define TRANSLATION_BUTTON_SHOW_ACCOUNT "Show Accounts"
//--- Day Tab
#define TRANSLATION_LABEL_DAY_OPEN "Trade open hour of day"
#define TRANSLATION_LABEL_DAY_CLOSE "Trade close hour of day"
#define TRANSLATION_LABEL_DAY_OPEN_PROFIT "Trade open profit hour of day"
#define TRANSLATION_LABEL_DAY_CLOSE_PROFIT "Trade close profit hour of day"
//--- Week Tab
#define TRANSLATION_LABEL_WEEK_OPEN "Trade open hour of Week"
#define TRANSLATION_LABEL_WEEK_CLOSE "Trade close hour of Week"
#define TRANSLATION_LABEL_WEEK_OPEN_PROFIT "Trade open profit hour of Week"
#define TRANSLATION_LABEL_WEEK_CLOSE_PROFIT "Trade close profit hour of Week"
//--- Month Tab
#define TRANSLATION_LABEL_MONTH_OPEN "Trade open hour of Month"
#define TRANSLATION_LABEL_MONTH_CLOSE "Trade close hour of Month"
#define TRANSLATION_LABEL_MONTH_OPEN_PROFIT "Trade open profit hour of Month"
#define TRANSLATION_LABEL_MONTH_CLOSE_PROFIT "Trade close profit hour of Month"
//--- Year Tab
#define TRANSLATION_LABEL_YEAR_OPEN "Trade open hour of Year"
#define TRANSLATION_LABEL_YEAR_CLOSE "Trade close hour of Year"
#define TRANSLATION_LABEL_YEAR_OPEN_PROFIT "Trade open profit hour of Year"
#define TRANSLATION_LABEL_YEAR_CLOSE_PROFIT "Trade close profit hour of Year"
//--- Returm Tab
#define TRANSLATION_LABEL_RETURN_RETURN "Return Per Month in "
//--- Message Panel
#define TRANSLATION_MESSAGE_ERROR " . Error: "
#define TRANSLATION_MESSAGE_FAILED_LODED_FILE "Failed loaded file "
#define TRANSLATION_MESSAGE_ERROR_SETTING_TIMER "Error setting timer"
#define TRANSLATION_MESSAGE_FAILED_DELETE_INI "Failed to delete the "
#define TRANSLATION_MESSAGE_FAILED_DELETE_INI2 " panel's .ini file"
#define TRANSLATION_MESSAGE_FAILED_ORDER "Failed to get Order ticket: "
#define TRANSLATION_MESSAGE_FAILED_ORDER_SELECT "Failed to select Order by ticket: "
#define TRANSLATION_MESSAGE_FAILED_COMMENT "Failed to select Order by comment: "
//--- History
#define TRANSLATION_DEAL_ERROR_TICKT "Deal ticket is invalid or zero. Error: "
#define TRANSLATION_HISTORY_ERR_SELECT "HistorySelect failed! "
#define TRANSLATION_HISTORY_GET_TRADE "Unable to get the trade history"
#define TRANSLATION_HISTORY_ERR_FUNCTION "Error function SelectByIndex()"
#define TRANSLATION_HISTORY_SELECTPOSITION_ERR "HistorySelectByPosition "
#define TRANSLATION_HISTORY_SELECTPOSITION_FAILED "failed"
// #define TRANSLATION_HISTORY_
// #define TRANSLATION_HISTORY_
// #define TRANSLATION_HISTORY_
// #define TRANSLATION_HISTORY_
// #define TRANSLATION_HISTORY_
// #define TRANSLATION_HISTORY_
//--- Save File
#define TRANSLATION_EXPERT_START "The expert is attempting to start."
#define TRANSLATION_TRYING_TO_SAVE_FILE "Trying to save settings to file: "
#define TRANSLATION_FILED_TO_OPEN_FILE_WRITING "Failed to open file for writing: "
#define TRANSLATION_FILED_TO_OPEN_FILE_WRITING2 "Failed to open file for writin"
#define TRANSLATION_FILED_TO_OPEN_FILE_WRITING3 "Failed to open file for reading: "
#define TRANSLATION_SAVE_DONE "Saved settings successfully. Error: "
#define TRANSLATION_SAVE_ERR_MESSAG_FILE "The file:"
#define TRANSLATION_SAVE_ERR_MESSAG_FILE_OPEN "is currently open."
#define TRANSLATION_SAVE_ERR_MESSAG_CLOSE "Please close the file to allow updates."
#define TRANSLATION_SAVE_ERR_MESSAG_ATTEMPT "Attempt "
#define TRANSLATION_SAVE_ERR_MESSAG_WILL ". If the file is not closed, the expert will stop after "
#define TRANSLATION_SAVE_ERR_MESSAG_ATTEMPTS " attempts."
#define TRANSLATION_SAVE_ERR_MESSAG_AFFTER "is still open after "
#define TRANSLATION_SAVE_ERR_MESSAG_STOP "The expert will now stop."
//--- Load File
#define TRANSLATION_TRYING_TO_LOAD "Trying to load settings from file. Error: "
#define TRANSLATION_NO_SETTINGS "No settings file to load. Error: "
#define TRANSLATION_FAILED_TO_OPEN_FILE_READING "Failed to open file for reading: "
#define TRANSLATION_LOADED_DONE "Loaded settings successfully. Error: "
//--- Delet File
#define TRANSLATION_MESSAGE_NO_SETTINGS_FILE_TO_DELETE "No settings file to delete"
#define TRANSLATION_MESSAGE_TRYING_TO_DELETE_FILE "Trying to delete settings file"
#define TRANSLATION_MESSAGE_FAILED_TO_DELETE_FILE "Failed to delete file"
#define TRANSLATION_MESSAGE_DELETED_SETTINGS "Deleted settings file successfully"
// --- Load File License
#define TRANSLATION_LICENSE_ERROR_HASH "Error generating SHA-256 hash"
#define TRANSLATION_LICENSE_ERROR_BASE "Error encoding to Base64"
#define TRANSLATION_LICENSE_CREATE_DIRECTORY "Could not create directory structure for Licence\\"
#define TRANSLATION_LICENSE_NO_CREATE_FILE "Could not create licence file"
#define TRANSLATION_LICENSE_CREATE_LICENSE_FILE "The license file has been created"
#define TRANSLATION_LICENSE_RETRY "License file does not match current inputs"
#define TRANSLATION_LICENSE_TO_CREATE "Creation of license file was successful"
#define TRANSLATION_LICENSE_FAILET_TO_OPEN_FILE "Failed to open license file for verification"
#define TRANSLATION_LICENSE_NO_VERIFY_INPUTS "License file does not match current inputs. Recreating file..."
#define TRANSLATION_LICENSE_FAILED_RETRY_CREATE "Retrying license verification (Attempt "
#define TRANSLATION_LICENSE_FAILED_RETRY_CREATE2 " of "
#define TRANSLATION_LICENSE_FAILED_RETRY_ERROR1 "License verification failed after 2 attempts. Please check:"
#define TRANSLATION_LICENSE_FAILED_RETRY_ERROR2 "1. Your license file is correctly placed."
#define TRANSLATION_LICENSE_FAILED_RETRY_ERROR3 "2. Your license information matches the expected details."
#define TRANSLATION_LICENSE_FAILED_RETRY_ERROR4 "3. Contact support if the issue persists. We're here to help!"
#define TRANSLATION_LICENSE_ERROR_RESPONSE "Error in WebRequest. Error code ="
#define TRANSLATION_LICENSE_ADD_URL "Add the address "
#define TRANSLATION_LICENSE_ADD_URL2 " in the list of allowed URLs"
#define TRANSLATION_LICENSE_ERROE_UNEXPECTED "Unexpected response code"
#define TRANSLATION_LICENSE_NO_OPEN_FILE "Could not open licence file"
#define TRANSLATION_LICENSE_INVALID_LICENSE_SERVER "Licence server is not valid"
#define TRANSLATION_LICENSE_INVALID_LICENSE_FILE "Licence file is not valid"
#define TRANSLATION_LICENSE_VERIFY_LICENSE "License check failed. Ensure your license is valid"
#define TRANSLATION_LICENSE_AUTHORIZED "Access Denied: Trading is restricted to authorized account types"
#define TRANSLATION_LICENSE_EXPIRY "This Version of EA Expired on : "
#define TRANSLATION_LICENSE_ERROR_404 "The requested address was not found on the server. Please check the "
#define TRANSLATION_LICENSE_ERROR_404_2 "security settings in the license folder, otherwise contact support. We are here to help!"
#define TRANSLATION_LICENSE_FILED_TO_OPEN_ "Failed to open file setting for writing"
#define TRANSLATION_LICENSE_TRYING_TO_SAVE_FILE "Trying to save security to file "
#define TRANSLATION_LICENSE_TRYING_TO_LOAD "Trying to load security from file. Error: "
#define TRANSLATION_LICENSE_NO_SETTINGS "No settings file security to load. Error: "
#define TRANSLATION_LICENSE_FAILED_TO_OPEN_FILE_READING "Failed to open file security for reading"
#define TRANSLATION_LICENSE_LOADED_DONE "Loaded security successfully. Error: "
// --- mqh
#define TRANSLATION_MQH_MATRIX "Interference matrix contains an out-of-bounds index. "
// --- Server
#define TRANSLATION_SERVER_PLEASE_WAITE "[INFO] Checking server status. Please wait..."
#define TRANSLATION_SERVER_ATTEMPT "[INFO] Attempt "
#define TRANSLATION_SERVER_OF " of "
#define TRANSLATION_SERVER_RETRYING ". Retrying in 2 seconds..."
#define TRANSLATION_SERVER_RESPONSE_SUCCESSFUL "[INFO] Server is online. Response: "
#define TRANSLATION_SERVER_RESPONSE_UNREACHABLE "[WARNING] Server is unreachable. HTTP Response Code: "
#define TRANSLATION_SERVER_ERROR_AFTER "[ERROR] Server is unreachable after "
#define TRANSLATION_SERVER_CHECK_SUPPORT " attempts. Please check your connection or contact support."
#define TRANSLATION_SERVER_ERROR_OPENNING "❌ Error opening file"
#define TRANSLATION_SERVER_ERROR_REOPENNING "❌ Error reopening file"
#define TRANSLATION_SERVER_NO_UPLOAD "✔️ No upload needed, file already exists"
#define TRANSLATION_SERVER_RESPONSE_SERVER "Server response: "
#define TRANSLATION_SERVER_SAVE_ROWS "Rows saved in database: "
#define TRANSLATION_SERVER_NOT_PARSE "❌ Could not parse rows_saved from server response"
#define TRANSLATION_SERVER_NOT_FIND "❌ Could not find rows_saved in server response"
#define TRANSLATION_SERVER_ERROR_UPLOAD "❌ Error uploading file. Response: "
+189
View File
@@ -0,0 +1,189 @@
//--- Message
#define TRANSLATION_MESSAGE_FAILED_CREATE_INDICATOR "Fehler beim Erstellen des Indikator-Handles. Error: "
#define TRANSLATION_MESSAGE_FAILED_LODED_FILE "Fehler beim Laden der Datei. Error: "
#define TRANSLATION_MESSAGE_ERROR " . Error: "
#define TRANSLATION_MESSAGE_FAILED_GET_RATES "Fehler beim Abrufen der Kurse. Error: "
#define TRANSLATION_MESSAGE_FILED_GET_INDICATOR "Fehler beim Abrufen der Indikatorwerte. Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_BUY "Margin BUY (Order) kann nicht berechnet werden. Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_SELL "Margin SELL (Order) kann nicht berechnet werden. Error: "
#define TRANSLATION_MESSAGE_CANNOT_RETRIEVE "Kann die Tick-Größe für nicht abrufen. Error: "
#define TRANSLATION_MESSAGE_LOOKS_LIKE ". Es scheint, dass das Instrument nicht mehr verfügbar ist. Die Berechnung könnte ungenau sein. Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_POSITIONS_BUY "Margin BUY (Position) kann nicht berechnet werden. Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_POSITIONS_SELL "Margin SELL (Position) kann nicht berechnet werden. Error: "
#define TRANSLATION_MESSAGE_FAILLED_GET_ORDER "Fehler beim Abrufen des Order-Tickets. Error: "
#define TRANSLATION_MESSAGE_FILLED_SELECT_ORDER "Fehler beim Auswählen der Orders. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_MAGIC_ORDER "Fehler beim Abrufen der Order-Magicnummer. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_TYPE_ORDER "Fehler beim Abrufen des Order-Typs. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_TICKET "Fehler beim Abrufen des Positionstickets. Error: "
#define TRANSLATION_MESSAGE_FILLED_SELECT_POSITION "Fehler beim Auswählen der Position. Error: "
#define TRANSLATION_MESSAGE_FAILLED_GET_MAGIC_POSITION "Fehler beim Abrufen der Position-Magicnummer. Error: "
#define TRANSLATION_MESSAGE_FAILLED_GET_TYPE_POSITION "Fehler beim Abrufen des Positionstyps. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_CURRENT "Fehler beim Abrufen des aktuellen Symbol-Ticks. Error: "
#define TRANSLATION_MESSAGE_TRAIL_NOT_PERFORMED "Trailing-Stop wurde nicht ausgeführt, da die Eingaben unzureichend sind. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_STOPLOSS_POSITION "Fehler beim Abrufen des Stop-Loss der Position. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_PROFIT_POSITION "Fehler beim Abrufen des Take-Profit der Position. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_PRICE_POSITION "Fehler beim Abrufen des Eröffnungspreises der Position. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_SYMBOL_POSITION "Fehler beim Abrufen des Symbols der Position. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_VOLUME_POSITION "Fehler beim Abrufen des Volumens der Position. Error: "
#define TRANSLATION_MESSAGE_PIPVALUE_BUY "Der Pip-Wert BUY wurde nicht berechnet. Error: "
#define TRANSLATION_MESSAGE_INSIDE_SELL "SELL innerhalb des Stop-Levels. Error: "
#define TRANSLATION_MESSAGE_INSIDE_BUY "BUY innerhalb des Stop-Levels. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_COMMENT_ORDER "Fehler beim Abrufen des Order-Kommentars. Error: "
#define TRANSLATION_MESSAGE_REPETITIVE_ORDER "Order ist wiederholend. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_COMMENT_POSITION "Fehler beim Abrufen des Positions-Kommentars. Error: "
#define TRANSLATION_MESSAGE_REPETITIVE_POSITION "Position ist wiederholend. Error: "
#define TRANSLATION_MESSAGE_VOLUME_ZERO "Volumen ist null. Error: "
#define TRANSLATION_MESSAGE_MARGIN_CANNOT_ERROR "Margen können nicht berechnet werden. Error: "
#define TRANSLATION_MESSAGE_MARGIN_CANNOT "Margen können nicht berechnet werden."
#define TRANSLATION_MESSAGE_FILLED_CALCULATE_TOTALSTOPLOSS "Fehler bei der Berechnung (CalculateTotalstopLoss). Error: "
#define TRANSLATION_MESSAGE_FAILLED_CALCULATE_LOTSIZE "Fehler bei der Berechnung der Lotgröße. Error: "
#define TRANSLATION_MESSAGE_FAILLED_PIP_CALCULATE "Der Pip-Wert wurde nicht berechnet. Error: "
#define TRANSLATION_MESSAGE_STOPLOSS_POSITION " hat keinen Stop-Loss. Bitte überprüfen Sie die Position."
#define TRANSLATION_MESSAGE_PROFIT_POSITION "hat keinen Take-Profit. Bitte überprüfen Sie die Position."
#define TRANSLATION_MESSAGE_PROFIT_STOPLOSS_POSITION " hat keinen Take-Profit und Stop-Loss. Bitte überprüfen Sie die Position."
#define TRANSLATION_MESSAGE_STOPLOSS_ORDER "hat keinen Stop-Loss. Bitte überprüfen Sie die Order."
#define TRANSLATION_MESSAGE_PROFIT_ORDER "hat keinen Take-Profit. Bitte überprüfen Sie die Order."
#define TRANSLATION_MESSAGE_PROFIT_STOPLOSS_ORDER " hat keinen Take-Profit und Stop-Loss. Bitte überprüfen Sie die Order."
#define TRANSLATION_MESSAGE_ERROR_SETTING_TIMER "Fehler beim Einstellen des Timers"
#define TRANSLATION_MESSAGE_FAILED_DELETE_INI "Die .ini-Datei des Retrace-Bedienfelds konnte nicht gelöscht werden"
//--- retcode ID
#define TRANSLATION_RETCODE_10004 "Der Preis hat sich geändert, und die Bestellung benötigt einen neuen Preis."
#define TRANSLATION_RETCODE_10006 "Der Server hat die Handelsanfrage abgelehnt."
#define TRANSLATION_RETCODE_10007 "Die Anfrage wurde vom Händler abgebrochen."
#define TRANSLATION_RETCODE_10008 "Die Bestellung wurde erfolgreich aufgegeben."
#define TRANSLATION_RETCODE_10009 "Die Handelsanfrage wurde vollständig verarbeitet."
#define TRANSLATION_RETCODE_10010 "Nur ein Teil der Anfrage wurde ausgeführt."
#define TRANSLATION_RETCODE_10011 "Beim Verarbeiten der Anfrage ist ein Fehler aufgetreten."
#define TRANSLATION_RETCODE_10012 "Die Anfrage wurde aufgrund eines Timeouts abgebrochen."
#define TRANSLATION_RETCODE_10013 "Die Anfrage war fehlerhaft oder ungültig."
#define TRANSLATION_RETCODE_10014 "Das angeforderte Volumen ist falsch."
#define TRANSLATION_RETCODE_10015 "Der Preis in der Anfrage ist ungültig."
#define TRANSLATION_RETCODE_10016 "Die Stop-Loss- oder Take-Profit-Niveaus sind ungültig."
#define TRANSLATION_RETCODE_10017 "Das Handeln ist für das Konto deaktiviert."
#define TRANSLATION_RETCODE_10018 "Der Markt ist derzeit geschlossen."
#define TRANSLATION_RETCODE_10019 "Es gibt nicht genug Geld, um die Anfrage abzuschließen."
#define TRANSLATION_RETCODE_10020 "Der Preis hat sich geändert, bevor die Anfrage verarbeitet werden konnte."
#define TRANSLATION_RETCODE_10021 "Es sind keine verfügbaren Kursdaten vorhanden, um die Anfrage zu verarbeiten."
#define TRANSLATION_RETCODE_10022 "Das Ablaufdatum der Bestellung ist ungültig."
#define TRANSLATION_RETCODE_10023 "Der Bestellstatus wurde geändert."
#define TRANSLATION_RETCODE_10024 "Zu viele Anfragen werden in kurzer Zeit gesendet."
#define TRANSLATION_RETCODE_10025 "Es gibt keine Änderungen in der Anfrage."
#define TRANSLATION_RETCODE_10026 "Der Server hat den automatischen Handel deaktiviert."
#define TRANSLATION_RETCODE_10027 "Der Client-Terminal hat den automatischen Handel deaktiviert."
#define TRANSLATION_RETCODE_10028 "Die Anfrage ist derzeit zur Verarbeitung gesperrt."
#define TRANSLATION_RETCODE_10029 "Die Bestellung oder Position ist eingefroren."
#define TRANSLATION_RETCODE_10030 "Der angegebene Ausfülltyp in der Anfrage ist ungültig."
#define TRANSLATION_RETCODE_10031 "Keine Verbindung zum Handelsserver."
#define TRANSLATION_RETCODE_10032 "Die Operation ist nur für Live-Konten erlaubt."
#define TRANSLATION_RETCODE_10033 "Die maximale Anzahl an ausstehenden Bestellungen wurde erreicht."
#define TRANSLATION_RETCODE_10034 "Das maximale Volumen für das Symbol wurde erreicht."
#define TRANSLATION_RETCODE_10035 "Der Bestelltyp ist falsch oder verboten."
#define TRANSLATION_RETCODE_10036 "Die angegebene Position wurde bereits geschlossen."
#define TRANSLATION_RETCODE_UNKNOW_CODE "Unbekannter Fehlercode: "
#define TRANSLATION_RETCODE_UNKNOW_SUPPORT ". Bitte wenden Sie sich an den Support für weitere Hilfe."
//--- Trancaction Type
#define TRANSLATION_TRANSCATION_TYPE_0 "Hinzufügen einer neuen offenen Order"
#define TRANSLATION_TRANSCATION_TYPE_1 "Aktualisieren einer offenen Order"
#define TRANSLATION_TRANSCATION_TYPE_2 "Entfernen einer Order aus der offenen Liste"
#define TRANSLATION_TRANSCATION_TYPE_3 "Hinzufügen eines Handels zur Historie"
#define TRANSLATION_TRANSCATION_TYPE_4 "Aktualisieren eines Handels in der Historie"
#define TRANSLATION_TRANSCATION_TYPE_5 "Löschen eines Handels aus der Historie"
#define TRANSLATION_TRANSCATION_TYPE_6 "Hinzufügen einer Order zur Historie"
#define TRANSLATION_TRANSCATION_TYPE_7 "Ändern einer Order in der Orderhistorie"
#define TRANSLATION_TRANSCATION_TYPE_8 "Löschen einer Order aus der Orderhistorie"
#define TRANSLATION_TRANSCATION_TYPE_9 "Ändern einer Position, die nicht mit einer Handelsausführung verbunden ist"
#define TRANSLATION_TRANSCATION_TYPE_10 "Benachrichtigung über eine bearbeitete Handelsanfrage"
#define TRANSLATION_TRANSCATION_TYPE_UNKNOW "Unbekannter TRANSAKTIONS_TYP: "
//--- Order Type
#define TRANSLATION_ORDER_TYPE_UNKNOW "Unbekannter ORDER_TYP: "
//--- Order State
#define TRANSLATION_ORDER_STATE_0 "Order geprüft, aber noch nicht vom Broker akzeptiert"
#define TRANSLATION_ORDER_STATE_1 "Order akzeptiert"
#define TRANSLATION_ORDER_STATE_2 "Order vom Kunden storniert"
#define TRANSLATION_ORDER_STATE_3 "Order teilweise ausgeführt"
#define TRANSLATION_ORDER_STATE_4 "Order vollständig ausgeführt"
#define TRANSLATION_ORDER_STATE_5 "Order abgelehnt"
#define TRANSLATION_ORDER_STATE_6 "Order abgelaufen"
#define TRANSLATION_ORDER_STATE_7 "Order wird registriert (in das Handelssystem aufgenommen)"
#define TRANSLATION_ORDER_STATE_8 "Order wird geändert (Änderung der Parameter)"
#define TRANSLATION_ORDER_STATE_9 "Order wird gelöscht (aus dem Handelssystem entfernt)"
#define TRANSLATION_ORDER_STATE_UNKNOW "Unbekannter ORDER_STATUS: "
//--- Deal Type
#define TRANSLATION_DEAL_TYPE_3 "Gutschrift"
#define TRANSLATION_DEAL_TYPE_4 "Zusätzliche Gebühr"
#define TRANSLATION_DEAL_TYPE_5 "Korrektur"
#define TRANSLATION_DEAL_TYPE_7 "Zusätzliche Provision"
#define TRANSLATION_DEAL_TYPE_8 "Tägliche Provision"
#define TRANSLATION_DEAL_TYPE_9 "Monatliche Provision"
#define TRANSLATION_DEAL_TYPE_10 "Tägliche Agenturprovision"
#define TRANSLATION_DEAL_TYPE_11 "Monatliche Agenturprovision"
#define TRANSLATION_DEAL_TYPE_12 "Zinssatz"
#define TRANSLATION_DEAL_TYPE_13 "Storniertes Kaufgeschäft"
#define TRANSLATION_DEAL_TYPE_14 "Storniertes Verkaufsgeschäft"
#define TRANSLATION_DEAL_TYPE_15 "Dividendenoperationen"
#define TRANSLATION_DEAL_TYPE_16 "Frankierte (nicht steuerpflichtige) Dividendenoperationen"
#define TRANSLATION_DEAL_TYPE_17 "Steuergebühren"
#define TRANSLATION_DEAL_TYPE_UNKNOW "Unbekannter DEAL_TYPE: "
//--- Deal Entry
#define TRANSLATION_DEAL_ENTRY_UNKNOW "Unbekannter DEAL_ENTRY: "
//--- Terminals
#define TRANSLATION_TERMINAL_CLOSED_TERMINAL "Terminal wurde geschlossen"
#define TRANSLATION_TERMINAL_DELETED_CHART "Programm wurde vom Chart gelöscht"
#define TRANSLATION_TERMINAL_CLOSED_CHART "Chart wurde geschlossen"
#define TRANSLATION_TERMINAL_REMOVE_EXPERT "Experte entfernt"
#define TRANSLATION_TERMINAL_CHANGE_INPUT "Eingabeparameter wurden vom Benutzer geändert"
#define TRANSLATION_TERMINAL_NON_ZERO "OnInit() Handler hat einen Nicht-Null-Wert zurückgegeben"
//---Trade Transcation
#define TRANSLATION_TRANSCATION_DONE "Erfolgreich abgeschlossen"
//--- Save File
#define TRANSLATION_TRYING_TO_SAVE_FILE "Versuche, Einstellungen in die Datei zu speichern: "
#define TRANSLATION_FILED_TO_OPEN_FILE_WRITING "Fehler beim Öffnen der Datei zum Schreiben: "
#define TRANSLATION_SAVE_DONE "Einstellungen erfolgreich gespeichert. Fehler: "
//--- Load File
#define TRANSLATION_TRYING_TO_LOAD "Versuche, Einstellungen aus der Datei zu laden. Fehler: "
#define TRANSLATION_NO_SETTINGS "Keine Einstellungsdatei zum Laden vorhanden. Fehler: "
#define TRANSLATION_FAILED_TO_OPEN_FILE_READING "Fehler beim Öffnen der Datei zum Lesen: "
#define TRANSLATION_LOADED_DONE "Einstellungen erfolgreich geladen. Fehler: "
//--- Delet File
#define TRANSLATION_MESSAGE_NO_SETTINGS_FILE_TO_DELETE "Keine Einstellungsdatei zum Löschen vorhanden."
#define TRANSLATION_MESSAGE_TRYING_TO_DELETE_FILE "Versuche, die Einstellungsdatei zu löschen."
#define TRANSLATION_MESSAGE_FAILED_TO_DELETE_FILE "Fehler beim Löschen der Datei"
#define TRANSLATION_MESSAGE_DELETED_SETTINGS "Einstellungsdatei erfolgreich gelöscht."
//--- Verify Inputs
#define TRANSLATION_MESSAGE_INPUTS_EXTEND "Falsche Eingabe: Anzahl der Kerzen zum Verlängern der Linie < 2"
#define TRANSLATION_MESSAGE_INPUTS_CONDITION "Falsche Eingabe: Anzahl der Kerzenbedingung < 4"
#define TRANSLATION_MESSAGE_INPUTS_MAX_BUY "Falsche Eingabe: Maximale Kaufpositionen <= 0"
#define TRANSLATION_MESSAGE_INPUTS_MAX_SELL "Falsche Eingabe: Maximale Verkaufspositionen <= 0"
#define TRANSLATION_MESSAGE_INPUTS_RIWARD "Falsche Eingabe: Risiko-Rendite-Verhältnis < 1"
#define TRANSLATION_MESSAGE_INPUTS_CANDLE_EXPIRATION "Falsche Eingabe: Kerzen zum Zeitpunkt des Ablaufs der Bestellungen < 2"
#define TRANSLATION_MESSAGE_INPUTS_PERCENTAGE "Falsche Eingabe: Anfangsrisikotoleranz in Prozentpunkten <= 0"
#define TRANSLATION_MESSAGE_INPUTS_LOTSSIZE "Falsche Eingabe: Lotgröße < 0"
#define TRANSLATION_MESSAGE_INPUTS_MAX_RISK "Falsche Eingabe: Maximales Risiko <= 0"
#define TRANSLATION_MESSAGE_INPUTS_STOPLOSS "Falsche Eingabe: Stop-Loss < 0"
#define TRANSLATION_MESSAGE_INPUTS_STOPLOSS_LIMIT "Falsche Eingabe: Der Stop-Loss-Grenzwert ist kleiner als die zulässige Mindestanzahl an Pips ("
#define TRANSLATION_MESSAGE_INPUTS_STOPLOSS_DISTANCE "Falsche Eingabe: Abstand zum Stop-Loss < 0"
#define TRANSLATION_MESSAGE_INPUTS_SAVE_AND_TRAIL "Falsche Eingabe: Profitmanagement und Trailing-Stopp können nicht gleichzeitig aktiv sein."
#define TRANSLATION_MESSAGE_INPUTS_TRIGGER_TRAIL "Falsche Eingabe: Start nach Punkten/Geld < 0"
#define TRANSLATION_MESSAGE_INPUTS_VALUE_TRAIL "Falsche Eingabe: Start nach Punkten/Geld <= Speichern des Gewinns"
#define TRANSLATION_MESSAGE_INPUTS_SAVEPROFIT "Falsche Eingabe: Gewinn speichern < 0"
#define TRANSLATION_MESSAGE_INPUTS_SAVE_BIGGER_TRIGGER_SAVE "Falsche Eingabe: Gewinn speichern >= Start nach Punkten/Geld"
#define TRANSLATION_MESSAGE_INPUTS_TRIGGER_ZERO "Falsche Eingabe: Start nach Punkten Wert < 0"
#define TRANSLATION_MESSAGE_INPUTS_SAVE_SMALLER_TRIGGER_SAVE "Falsche Eingabe: Start nach Punkten/Geld Wert <= Trailing"
#define TRANSLATION_MESSAGE_INPUTS_TRAIL_ZERO "Falsche Eingabe: Trailing-Stopp < 0"
#define TRANSLATION_MESSAGE_INPUTS_TRAIL_BIGGER_SAVE "Falsche Eingabe: Trailing >= Start nach Punkten/Geld Wert"
#define TRANSLATION_MESSAGE_INPUTS_FIRST_COMMISSION "Falsche Eingabe: Der erste Provisionsposten ist ungültig."
#define TRANSLATION_MESSAGE_INPUTS_SECOND_COMMISSION "Falsche Eingabe: Der zweite Provisionsposten ist ungültig."
#define TRANSLATION_MESSAGE_INPUTS_BALANCE_ZERO "Das Kontoguthaben ist leer."
+189
View File
@@ -0,0 +1,189 @@
//--- Messege
#define TRANSLATION_MESSAGE_FAILED_CREATE_INDICATOR "ایجاد دسته‌بندی اندیکاتور ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FAILED_LODED_FILE "بارگذاری فایل ناموفق بود "
#define TRANSLATION_MESSAGE_ERROR " . Error: "
#define TRANSLATION_MESSAGE_FAILED_GET_RATES "دریافت نرخ‌ها ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FILED_GET_INDICATOR "دریافت مقادیر اندیکاتور ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_BUY "محاسبه مارجین خرید (درخواست) امکان‌پذیر نیست. Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_SELL "محاسبه مارجین فروش (درخواست) امکان‌پذیر نیست. Error: "
#define TRANSLATION_MESSAGE_CANNOT_RETRIEVE "دریافت حجم نقطه برای "
#define TRANSLATION_MESSAGE_LOOKS_LIKE ". به نظر می‌رسد ابزار در دسترس نیست. ممکن است محاسبات دقیق نباشد. Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_POSITIONS_BUY "محاسبه مارجین خرید (موضع) امکان‌پذیر نیست. Error: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_POSITIONS_SELL "محاسبه مارجین فروش (موضع) امکان‌پذیر نیست. Error: "
#define TRANSLATION_MESSAGE_FAILLED_GET_ORDER "دریافت بلیط سفارش ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FILLED_SELECT_ORDER "انتخاب سفارشات ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_MAGIC_ORDER "دریافت شماره جادوی سفارش ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_TYPE_ORDER "دریافت نوع سفارش ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_TICKET "دریافت بلیط موقعیت ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FILLED_SELECT_POSITION "انتخاب موقعیت ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FAILLED_GET_MAGIC_POSITION "دریافت شماره جادوی موقعیت ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FAILLED_GET_TYPE_POSITION "دریافت نوع موقعیت ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_CURRENT "دریافت قیمت فعلی نماد ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_TRAIL_NOT_PERFORMED "توقف تعقیبی به دلیل عدم کافی ورودی‌ها انجام نشد. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_STOPLOSS_POSITION "دریافت توقف ضرر موقعیت ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_PROFIT_POSITION "دریافت سود موقعیت ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_PRICE_POSITION "دریافت قیمت باز شدن موقعیت ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_SYMBOL_POSITION "دریافت نماد موقعیت ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_VOLUME_POSITION "دریافت حجم موقعیت ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_PIPVALUE_BUY "محاسبه ارزش پیپ برای خرید انجام نشد. Error: "
#define TRANSLATION_MESSAGE_INSIDE_SELL "فروش در سطح توقف قرار دارد. Error: "
#define TRANSLATION_MESSAGE_INSIDE_BUY "خرید در سطح توقف قرار دارد. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_COMMENT_ORDER "دریافت توضیحات سفارش ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_REPETITIVE_ORDER "سفارشات تکراری است. Error: "
#define TRANSLATION_MESSAGE_FILLED_GET_COMMENT_POSITION "دریافت توضیحات موقعیت ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_REPETITIVE_POSITION "موقعیت‌ها تکراری است. Error: "
#define TRANSLATION_MESSAGE_VOLUME_ZERO "حجم صفر است. Error: "
#define TRANSLATION_MESSAGE_MARGIN_CANNOT_ERROR "محاسبه مارجین‌ها امکان‌پذیر نیست. Error: "
#define TRANSLATION_MESSAGE_MARGIN_CANNOT "محاسبه مارجین‌ها امکان‌پذیر نیست."
#define TRANSLATION_MESSAGE_FILLED_CALCULATE_TOTALSTOPLOSS "محاسبه (CalculateTotalstopLoss) ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FAILLED_CALCULATE_LOTSIZE "محاسبه حجم لات ناموفق بود. Error: "
#define TRANSLATION_MESSAGE_FAILLED_PIP_CALCULATE "محاسبه ارزش پیپ انجام نشد. Error: "
#define TRANSLATION_MESSAGE_STOPLOSS_POSITION " هیچ توقف ضرری ندارد. لطفاً موقعیت را بررسی کنید."
#define TRANSLATION_MESSAGE_PROFIT_POSITION " هیچ سودی ندارد. لطفاً موقعیت را بررسی کنید."
#define TRANSLATION_MESSAGE_PROFIT_STOPLOSS_POSITION " هیچ سود و توقف ضرری ندارد. لطفاً موقعیت را بررسی کنید."
#define TRANSLATION_MESSAGE_STOPLOSS_ORDER " هیچ توقف ضرری ندارد. لطفاً سفارش را بررسی کنید."
#define TRANSLATION_MESSAGE_PROFIT_ORDER " هیچ سودی ندارد. لطفاً سفارش را بررسی کنید."
#define TRANSLATION_MESSAGE_PROFIT_STOPLOSS_ORDER " هیچ سود و توقف ضرری ندارد. لطفاً سفارش را بررسی کنید."
#define TRANSLATION_MESSAGE_ERROR_SETTING_TIMER "خطا در تنظیم تایمر"
#define TRANSLATION_MESSAGE_FAILED_DELETE_INI "فایل .ini پنل Retrace حذف نشد"
//--- retcode ID
#define TRANSLATION_RETCODE_10004 "قیمت تغییر کرده است، نیاز به قیمت جدید برای سفارش."
#define TRANSLATION_RETCODE_10006 "سرور درخواست تجارت را رد کرد."
#define TRANSLATION_RETCODE_10007 "سفارش توسط مشتری لغو شد."
#define TRANSLATION_RETCODE_10008 "سفارش با موفقیت ثبت شد."
#define TRANSLATION_RETCODE_10009 "درخواست تجارت به طور کامل اجرا شد."
#define TRANSLATION_RETCODE_10010 "فقط بخشی از سفارش اجرا شد."
#define TRANSLATION_RETCODE_10011 "خطا در پردازش درخواست."
#define TRANSLATION_RETCODE_10012 "سفارش به دلیل زمان‌پریشی لغو شد."
#define TRANSLATION_RETCODE_10013 "سفارش نادرست یا نامعتبر است."
#define TRANSLATION_RETCODE_10014 "حجم مورد نظر نادرست است."
#define TRANSLATION_RETCODE_10015 "قیمت در سفارش نادرست است."
#define TRANSLATION_RETCODE_10016 "سطوح توقف ضرر یا سود نادرست است."
#define TRANSLATION_RETCODE_10017 "تجارت برای حساب غیرفعال است."
#define TRANSLATION_RETCODE_10018 "بازار در حال حاضر بسته است."
#define TRANSLATION_RETCODE_10019 "پول کافی برای تکمیل سفارش وجود ندارد."
#define TRANSLATION_RETCODE_10020 "قیمت قبل از پردازش سفارش تغییر کرده است."
#define TRANSLATION_RETCODE_10021 "قیمت‌ها برای پردازش سفارش در دسترس نیستند."
#define TRANSLATION_RETCODE_10022 "تاریخ انقضای سفارش نادرست است."
#define TRANSLATION_RETCODE_10023 "وضعیت سفارش تغییر کرده است."
#define TRANSLATION_RETCODE_10024 "تعداد زیادی سفارش در مدت زمان کوتاه."
#define TRANSLATION_RETCODE_10025 "تغییرات در سفارش وجود ندارد."
#define TRANSLATION_RETCODE_10026 "تجارت خودکار توسط سرور غیرفعال شده است."
#define TRANSLATION_RETCODE_10027 "تجارت خودکار توسط طرف مشتری غیرفعال شده است."
#define TRANSLATION_RETCODE_10028 "سفارش در حال حاضر برای پردازش قفل شده است."
#define TRANSLATION_RETCODE_10029 "سفارش یا موقعیت قفل شده است."
#define TRANSLATION_RETCODE_10030 "نوع بسته‌بندی مشخص شده در سفارش نادرست است."
#define TRANSLATION_RETCODE_10031 "اتصال به سرور تجارت وجود ندارد."
#define TRANSLATION_RETCODE_10032 "فرآیند فقط برای حساب‌های زنده مجاز است."
#define TRANSLATION_RETCODE_10033 "به حداکثر تعداد سفارشات معلق رسیدید."
#define TRANSLATION_RETCODE_10034 "به حداکثر حجم نماد رسیدید."
#define TRANSLATION_RETCODE_10035 "نوع سفارش نادرست یا ممنوع است."
#define TRANSLATION_RETCODE_10036 "موقعیت مشخص شده قبلاً بسته شده است."
#define TRANSLATION_RETCODE_UNKNOW_CODE "کد خطا ناشناخته: "
#define TRANSLATION_RETCODE_UNKNOW_SUPPORT ". لطفاً برای دریافت کمک بیشتر با پشتیبانی تماس بگیرید."
//--- Trancaction Type
#define TRANSLATION_TRANSCATION_TYPE_0 "افزودن سفارش جدید باز"
#define TRANSLATION_TRANSCATION_TYPE_1 "به‌روزرسانی سفارش باز"
#define TRANSLATION_TRANSCATION_TYPE_2 "حذف سفارش از لیست باز"
#define TRANSLATION_TRANSCATION_TYPE_3 "افزودن معامله به تاریخ"
#define TRANSLATION_TRANSCATION_TYPE_4 "به‌روزرسانی معامله در تاریخ"
#define TRANSLATION_TRANSCATION_TYPE_5 "حذف معامله از تاریخ"
#define TRANSLATION_TRANSCATION_TYPE_6 "افزودن سفارش به تاریخ"
#define TRANSLATION_TRANSCATION_TYPE_7 "تغییر سفارش در تاریخ"
#define TRANSLATION_TRANSCATION_TYPE_8 "حذف سفارش از تاریخ"
#define TRANSLATION_TRANSCATION_TYPE_9 "تغییر موقعیت غیر مرتبط با اجرای معامله"
#define TRANSLATION_TRANSCATION_TYPE_10 "اعلان درخواست تجاری پردازش شده"
#define TRANSLATION_TRANSCATION_TYPE_UNKNOW "نوع معامله ناشناخته: "
//---Order Type
#define TRANSLATION_ORDER_TYPE_UNKNOW "نوع سفارش ناشناخته: "
//--- Order State
#define TRANSLATION_ORDER_STATE_0 "سفارش تکمیل شد"
#define TRANSLATION_ORDER_STATE_1 "سفارش به دلیل تغییر قیمت ناموفق بود"
#define TRANSLATION_ORDER_STATE_2 "سفارش توسط مشتری لغو شد"
#define TRANSLATION_ORDER_STATE_3 "سفارش به‌طور جزئی اجرا شد"
#define TRANSLATION_ORDER_STATE_4 "سفارش به‌طور کامل اجرا شد"
#define TRANSLATION_ORDER_STATE_5 "سفارش رد شد"
#define TRANSLATION_ORDER_STATE_6 "مهلت سفارش منقضی شد"
#define TRANSLATION_ORDER_STATE_7 "در حال ثبت سفارش (در سیستم تجارت)"
#define TRANSLATION_ORDER_STATE_8 "در حال تغییر سفارش (تغییر پارامترهای آن)"
#define TRANSLATION_ORDER_STATE_9 "در حال حذف سفارش (حذف از سیستم تجارت)"
#define TRANSLATION_ORDER_STATE_UNKNOW "حالت سفارش ناشناخته: "
//--- Deal Type
#define TRANSLATION_DEAL_TYPE_3 "اعتبار"
#define TRANSLATION_DEAL_TYPE_4 "هزینه‌های اضافی"
#define TRANSLATION_DEAL_TYPE_5 "تصحیح"
#define TRANSLATION_DEAL_TYPE_7 "کمیسیون اضافی"
#define TRANSLATION_DEAL_TYPE_8 "کمیسیون روزانه"
#define TRANSLATION_DEAL_TYPE_9 "کمیسیون ماهانه"
#define TRANSLATION_DEAL_TYPE_10 "کمیسیون نماینده روزانه"
#define TRANSLATION_DEAL_TYPE_11 "کمیسیون نماینده ماهانه"
#define TRANSLATION_DEAL_TYPE_12 "سود"
#define TRANSLATION_DEAL_TYPE_13 "معامله خرید لغو شده"
#define TRANSLATION_DEAL_TYPE_14 "معامله فروش لغو شده"
#define TRANSLATION_DEAL_TYPE_15 "توزیع سود"
#define TRANSLATION_DEAL_TYPE_16 "توزیع سود معاف از مالیات"
#define TRANSLATION_DEAL_TYPE_17 "هزینه‌های مالیاتی"
#define TRANSLATION_DEAL_TYPE_UNKNOW "نوع معامله ناشناخته: "
//--- Deal Entry
#define TRANSLATION_DEAL_ENTRY_UNKNOW "ورودی معامله ناشناخته: "
//--- Terminals
#define TRANSLATION_TERMINAL_CLOSED_TERMINAL "ترمینال بسته شد"
#define TRANSLATION_TERMINAL_DELETED_CHART "برنامه از نمودار حذف شد"
#define TRANSLATION_TERMINAL_CLOSED_CHART "نمودار بسته شد"
#define TRANSLATION_TERMINAL_REMOVE_EXPERT "کارشناس حذف شد"
#define TRANSLATION_TERMINAL_CHANGE_INPUT "پارامترهای ورودی توسط کاربر تغییر یافت"
#define TRANSLATION_TERMINAL_NON_ZERO "پردازشگر OnInit() مقدار غیرصفر را برگرداند"
//--- Trade Transcation
#define TRANSLATION_TRANSCATION_DONE "با موفقیت انجام شد"
//--- Save File
#define TRANSLATION_TRYING_TO_SAVE_FILE "در حال تلاش برای ذخیره تنظیمات در فایل: "
#define TRANSLATION_FILED_TO_OPEN_FILE_WRITING "باز کردن فایل برای نوشتن ناموفق بود: "
#define TRANSLATION_SAVE_DONE "تنظیمات با موفقیت ذخیره شد. Error: "
//--- Load File
#define TRANSLATION_TRYING_TO_LOAD "در حال تلاش برای بارگذاری تنظیمات از فایل. Error: "
#define TRANSLATION_NO_SETTINGS "فایل تنظیمات برای بارگذاری وجود ندارد. Error: "
#define TRANSLATION_FAILED_TO_OPEN_FILE_READING "باز کردن فایل برای خواندن ناموفق بود: "
#define TRANSLATION_LOADED_DONE "تنظیمات با موفقیت بارگذاری شد. Error: "
//--- Delete File
#define TRANSLATION_MESSAGE_NO_SETTINGS_FILE_TO_DELETE "فایل تنظیمات برای حذف وجود ندارد."
#define TRANSLATION_MESSAGE_TRYING_TO_DELETE_FILE "در حال تلاش برای حذف فایل تنظیمات."
#define TRANSLATION_MESSAGE_FAILED_TO_DELETE_FILE "حذف فایل ناموفق بود"
#define TRANSLATION_MESSAGE_DELETED_SETTINGS "فایل تنظیمات با موفقیت حذف شد."
//--- Verify Inputs
#define TRANSLATION_MESSAGE_INPUTS_EXTEND "ورودی نادرست: تعداد شمع‌ها برای تمدید خط < 2"
#define TRANSLATION_MESSAGE_INPUTS_CONDITION "ورودی نادرست: تعداد شرایط شمع < 4"
#define TRANSLATION_MESSAGE_INPUTS_MAX_BUY "ورودی نادرست: حداکثر موقعیت‌های خرید <= 0"
#define TRANSLATION_MESSAGE_INPUTS_MAX_SELL "ورودی نادرست: حداکثر موقعیت‌های فروش <= 0"
#define TRANSLATION_MESSAGE_INPUTS_RIWARD "ورودی نادرست: نسبت ریسک به پاداش < 1"
#define TRANSLATION_MESSAGE_INPUTS_CANDLE_EXPIRATION "ورودی نادرست: شمع‌ها هنگام انقضای سفارشات < 2"
#define TRANSLATION_MESSAGE_INPUTS_PERCENTAGE "ورودی نادرست: نرخ تحمل ریسک اولیه به درصد <= 0"
#define TRANSLATION_MESSAGE_INPUTS_LOTSSIZE "ورودی نادرست: حجم لات < 0"
#define TRANSLATION_MESSAGE_INPUTS_MAX_RISK "ورودی نادرست: حداکثر ریسک <= 0"
#define TRANSLATION_MESSAGE_INPUTS_STOPLOSS "ورودی نادرست: توقف ضرر < 0"
#define TRANSLATION_MESSAGE_INPUTS_STOPLOSS_LIMIT "ورودی نادرست: حد توقف ضرر کمتر از حداقل مجاز از نقاط ("
#define TRANSLATION_MESSAGE_INPUTS_STOPLOSS_DISTANCE "ورودی نادرست: فاصله تا توقف ضرر < 0"
#define TRANSLATION_MESSAGE_INPUTS_SAVE_AND_TRAIL "ورودی نادرست: نمی‌توان همزمان مدیریت سود و توقف تعقیبی را فعال کرد."
#define TRANSLATION_MESSAGE_INPUTS_TRIGGER_TRAIL "ورودی نادرست: شروع پس از نقاط/پول < 0"
#define TRANSLATION_MESSAGE_INPUTS_VALUE_TRAIL "ورودی نادرست: شروع پس از نقاط/پول <= ذخیره سود"
#define TRANSLATION_MESSAGE_INPUTS_SAVEPROFIT "ورودی نادرست: ذخیره سود < 0"
#define TRANSLATION_MESSAGE_INPUTS_SAVE_BIGGER_TRIGGER_SAVE "ورودی نادرست: ذخیره سود >= شروع پس از نقاط/پول"
#define TRANSLATION_MESSAGE_INPUTS_TRIGGER_ZERO "ورودی نادرست: تعداد نقاط برای شروع < 0"
#define TRANSLATION_MESSAGE_INPUTS_SAVE_SMALLER_TRIGGER_SAVE "ورودی نادرست: شروع پس از نقاط/پول <= توقف تعقیبی"
#define TRANSLATION_MESSAGE_INPUTS_TRAIL_ZERO "ورودی نادرست: توقف تعقیبی < 0"
#define TRANSLATION_MESSAGE_INPUTS_TRAIL_BIGGER_SAVE "ورودی نادرست: توقف تعقیبی >= شروع پس از نقاط/پول"
#define TRANSLATION_MESSAGE_INPUTS_FIRST_COMMISSION "ورودی نادرست: ورود کمیسیون اول نامعتبر است."
#define TRANSLATION_MESSAGE_INPUTS_SECOND_COMMISSION "ورودی نادرست: ورود کمیسیون دوم نامعتبر است."
#define TRANSLATION_MESSAGE_INPUTS_BALANCE_ZERO "حساب خالی است."
+189
View File
@@ -0,0 +1,189 @@
//--- Messege
#define TRANSLATION_MESSAGE_FAILED_CREATE_INDICATOR "Falha ao criar o identificador do indicador. Erro: "
#define TRANSLATION_MESSAGE_FAILED_LODED_FILE "Falha ao carregar o arquivo "
#define TRANSLATION_MESSAGE_ERROR " . Erro: "
#define TRANSLATION_MESSAGE_FAILED_GET_RATES "Falha ao obter as taxas. Erro: "
#define TRANSLATION_MESSAGE_FILED_GET_INDICATOR "Falha ao obter valores do indicador. Erro: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_BUY "Margem de COMPRA (ordem) não pode ser calculada. Erro: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_SELL "Margem de VENDA (ordem) não pode ser calculada. Erro: "
#define TRANSLATION_MESSAGE_CANNOT_RETRIEVE "Não é possível recuperar o tamanho do tick para "
#define TRANSLATION_MESSAGE_LOOKS_LIKE ". Parece que o instrumento não está mais disponível. O cálculo pode não ser preciso. Erro: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_POSITIONS_BUY "Margem de COMPRA (posição) não pode ser calculada. Erro: "
#define TRANSLATION_MESSAGE_CANNOT_MARGIN_POSITIONS_SELL "Margem de VENDA (posição) não pode ser calculada. Erro: "
#define TRANSLATION_MESSAGE_FAILLED_GET_ORDER "Falha ao obter o ticket de Ordens. Erro: "
#define TRANSLATION_MESSAGE_FILLED_SELECT_ORDER "Falha ao selecionar Ordens. Erro: "
#define TRANSLATION_MESSAGE_FILLED_GET_MAGIC_ORDER "Falha ao obter o número mágico da ordem. Erro: "
#define TRANSLATION_MESSAGE_FILLED_GET_TYPE_ORDER "Falha ao obter o tipo de ordem. Erro: "
#define TRANSLATION_MESSAGE_FILLED_GET_TICKET "Falha ao obter o ticket da Posição. Erro: "
#define TRANSLATION_MESSAGE_FILLED_SELECT_POSITION "Falha ao selecionar Posição. Erro: "
#define TRANSLATION_MESSAGE_FAILLED_GET_MAGIC_POSITION "Falha ao obter o número mágico da Posição. Erro: "
#define TRANSLATION_MESSAGE_FAILLED_GET_TYPE_POSITION "Falha ao obter o tipo de Posição. Erro: "
#define TRANSLATION_MESSAGE_FILLED_GET_CURRENT "Falha ao obter o tick do símbolo atual. Erro: "
#define TRANSLATION_MESSAGE_TRAIL_NOT_PERFORMED "O trailing stop não foi realizado devido às entradas insuficientes. Erro: "
#define TRANSLATION_MESSAGE_FILLED_GET_STOPLOSS_POSITION "Falha ao obter o stop loss da posição. Erro: "
#define TRANSLATION_MESSAGE_FILLED_GET_PROFIT_POSITION "Falha ao obter o take profit da posição. Erro: "
#define TRANSLATION_MESSAGE_FILLED_GET_PRICE_POSITION "Falha ao obter o preço de abertura da posição. Erro: "
#define TRANSLATION_MESSAGE_FILLED_GET_SYMBOL_POSITION "Falha ao obter o símbolo da posição. Erro: "
#define TRANSLATION_MESSAGE_FILLED_GET_VOLUME_POSITION "Falha ao obter o volume da posição. Erro: "
#define TRANSLATION_MESSAGE_PIPVALUE_BUY "O valor do pip de COMPRA não foi calculado. Erro: "
#define TRANSLATION_MESSAGE_INSIDE_SELL "VENDA dentro do nível de stop. Erro: "
#define TRANSLATION_MESSAGE_INSIDE_BUY "COMPRA dentro do nível de stop. Erro: "
#define TRANSLATION_MESSAGE_FILLED_GET_COMMENT_ORDER "Falha ao obter o comentário da Ordem. Erro: "
#define TRANSLATION_MESSAGE_REPETITIVE_ORDER "Ordem é repetitiva. Erro: "
#define TRANSLATION_MESSAGE_FILLED_GET_COMMENT_POSITION "Falha ao obter o comentário da Posição. Erro: "
#define TRANSLATION_MESSAGE_REPETITIVE_POSITION "Posição é repetitiva. Erro: "
#define TRANSLATION_MESSAGE_VOLUME_ZERO "Volume é zero. Erro: "
#define TRANSLATION_MESSAGE_MARGIN_CANNOT_ERROR "As margens não podem ser calculadas. Erro: "
#define TRANSLATION_MESSAGE_MARGIN_CANNOT "As margens não podem ser calculadas."
#define TRANSLATION_MESSAGE_FILLED_CALCULATE_TOTALSTOPLOSS "Falha ao calcular (CalculateTotalstopLoss). Erro: "
#define TRANSLATION_MESSAGE_FAILLED_CALCULATE_LOTSIZE "Falha ao calcular o tamanho do lote. Erro: "
#define TRANSLATION_MESSAGE_FAILLED_PIP_CALCULATE "O valor do pip não foi calculado. Erro: "
#define TRANSLATION_MESSAGE_STOPLOSS_POSITION " não tem stop loss. Verifique a posição."
#define TRANSLATION_MESSAGE_PROFIT_POSITION "não tem take profit. Verifique a posição."
#define TRANSLATION_MESSAGE_PROFIT_STOPLOSS_POSITION " não tem take profit e stop loss. Verifique a posição."
#define TRANSLATION_MESSAGE_STOPLOSS_ORDER "não tem stop loss. Verifique a Ordem."
#define TRANSLATION_MESSAGE_PROFIT_ORDER "não tem take profit. Verifique a Ordem."
#define TRANSLATION_MESSAGE_PROFIT_STOPLOSS_ORDER " não tem take profit e stop loss. Verifique a Ordem."
#define TRANSLATION_MESSAGE_ERROR_SETTING_TIMER "Erro ao definir o temporizador"
#define TRANSLATION_MESSAGE_FAILED_DELETE_INI "Falha ao excluir o arquivo .ini do painel Retrace"
//--- retcode ID
#define TRANSLATION_RETCODE_10004 "O preço mudou e a ordem requer um novo preço."
#define TRANSLATION_RETCODE_10006 "O servidor rejeitou a solicitação de negociação."
#define TRANSLATION_RETCODE_10007 "A solicitação foi cancelada pelo trader."
#define TRANSLATION_RETCODE_10008 "A ordem foi colocada com sucesso."
#define TRANSLATION_RETCODE_10009 "A solicitação de negociação foi totalmente processada."
#define TRANSLATION_RETCODE_10010 "Apenas parte da solicitação foi concluída."
#define TRANSLATION_RETCODE_10011 "Houve um erro ao processar a solicitação."
#define TRANSLATION_RETCODE_10012 "A solicitação foi cancelada devido a um timeout."
#define TRANSLATION_RETCODE_10013 "A solicitação estava malformada ou inválida."
#define TRANSLATION_RETCODE_10014 "O volume solicitado está incorreto."
#define TRANSLATION_RETCODE_10015 "O preço na solicitação é inválido."
#define TRANSLATION_RETCODE_10016 "Os níveis de stop-loss ou take-profit são inválidos."
#define TRANSLATION_RETCODE_10017 "A negociação está desativada para a conta."
#define TRANSLATION_RETCODE_10018 "O mercado está atualmente fechado."
#define TRANSLATION_RETCODE_10019 "Não há dinheiro suficiente para concluir a solicitação."
#define TRANSLATION_RETCODE_10020 "O preço mudou antes que a solicitação pudesse ser processada."
#define TRANSLATION_RETCODE_10021 "Não há cotações disponíveis para processar a solicitação."
#define TRANSLATION_RETCODE_10022 "A data de expiração da ordem é inválida."
#define TRANSLATION_RETCODE_10023 "O estado da ordem foi modificado."
#define TRANSLATION_RETCODE_10024 "Muitas solicitações estão sendo enviadas em um curto período de tempo."
#define TRANSLATION_RETCODE_10025 "Não há alterações na solicitação."
#define TRANSLATION_RETCODE_10026 "O servidor desativou a negociação automática."
#define TRANSLATION_RETCODE_10027 "O terminal cliente desativou a negociação automática."
#define TRANSLATION_RETCODE_10028 "A solicitação está atualmente bloqueada para processamento."
#define TRANSLATION_RETCODE_10029 "A ordem ou posição está congelada."
#define TRANSLATION_RETCODE_10030 "O tipo de preenchimento especificado na solicitação é inválido."
#define TRANSLATION_RETCODE_10031 "Sem conexão com o servidor de negociação."
#define TRANSLATION_RETCODE_10032 "A operação é permitida apenas para contas reais."
#define TRANSLATION_RETCODE_10033 "O número máximo de ordens pendentes foi atingido."
#define TRANSLATION_RETCODE_10034 "O volume máximo para o símbolo foi atingido."
#define TRANSLATION_RETCODE_10035 "O tipo de ordem está incorreto ou proibido."
#define TRANSLATION_RETCODE_10036 "A posição especificada já foi fechada."
#define TRANSLATION_RETCODE_UNKNOW_CODE "Código de erro desconhecido: "
#define TRANSLATION_RETCODE_UNKNOW_SUPPORT ". Entre em contato com o suporte para mais assistência."
//--- Trancaction Type
#define TRANSLATION_TRANSCATION_TYPE_0 "Adicionando uma nova ordem aberta"
#define TRANSLATION_TRANSCATION_TYPE_1 "Atualizando uma ordem aberta"
#define TRANSLATION_TRANSCATION_TYPE_2 "Removendo uma ordem da lista aberta"
#define TRANSLATION_TRANSCATION_TYPE_3 "Adicionando um negócio ao histórico"
#define TRANSLATION_TRANSCATION_TYPE_4 "Atualizando um negócio no histórico"
#define TRANSLATION_TRANSCATION_TYPE_5 "Excluindo um negócio do histórico"
#define TRANSLATION_TRANSCATION_TYPE_6 "Adicionando uma ordem ao histórico"
#define TRANSLATION_TRANSCATION_TYPE_7 "Alterando uma ordem no histórico de ordens"
#define TRANSLATION_TRANSCATION_TYPE_8 "Excluindo uma ordem do histórico de ordens"
#define TRANSLATION_TRANSCATION_TYPE_9 "Alterando uma posição não relacionada à execução de um negócio"
#define TRANSLATION_TRANSCATION_TYPE_10 "Notificação de uma solicitação de negociação processada"
#define TRANSLATION_TRANSCATION_TYPE_UNKNOW "Tipo de TRANSAÇÃO desconhecido: "
//---Order Type
#define TRANSLATION_ORDER_TYPE_UNKNOW "TIPO_DE_ORDEM desconhecido: "
//---Order State
#define TRANSLATION_ORDER_STATE_0 "Ordem verificada, mas ainda não aceita pelo corretor"
#define TRANSLATION_ORDER_STATE_1 "Ordem aceita"
#define TRANSLATION_ORDER_STATE_2 "Ordem cancelada pelo cliente"
#define TRANSLATION_ORDER_STATE_3 "Ordem parcialmente executada"
#define TRANSLATION_ORDER_STATE_4 "Ordem totalmente executada"
#define TRANSLATION_ORDER_STATE_5 "Ordem rejeitada"
#define TRANSLATION_ORDER_STATE_6 "Ordem expirada"
#define TRANSLATION_ORDER_STATE_7 "Ordem está sendo registrada (colocando no sistema de negociação)"
#define TRANSLATION_ORDER_STATE_8 "Ordem está sendo modificada (alterando seus parâmetros)"
#define TRANSLATION_ORDER_STATE_9 "Ordem está sendo excluída (excluindo do sistema de negociação)"
#define TRANSLATION_ORDER_STATE_UNKNOW "ESTADO_DE_ORDEM desconhecido: "
//--- Deal Type
#define TRANSLATION_DEAL_TYPE_3 "Crédito"
#define TRANSLATION_DEAL_TYPE_4 "Cobrança adicional"
#define TRANSLATION_DEAL_TYPE_5 "Correção"
#define TRANSLATION_DEAL_TYPE_7 "Comissão adicional"
#define TRANSLATION_DEAL_TYPE_8 "Comissão diária"
#define TRANSLATION_DEAL_TYPE_9 "Comissão mensal"
#define TRANSLATION_DEAL_TYPE_10 "Comissão diária do agente"
#define TRANSLATION_DEAL_TYPE_11 "Comissão mensal do agente"
#define TRANSLATION_DEAL_TYPE_12 "Taxa de juros"
#define TRANSLATION_DEAL_TYPE_13 "Negócio de compra cancelado"
#define TRANSLATION_DEAL_TYPE_14 "Negócio de venda cancelado"
#define TRANSLATION_DEAL_TYPE_15 "Operações de dividendos"
#define TRANSLATION_DEAL_TYPE_16 "Operações de dividendos isentos de impostos"
#define TRANSLATION_DEAL_TYPE_17 "Encargos fiscais"
#define TRANSLATION_DEAL_TYPE_UNKNOW "TIPO_DE_NEGÓCIO desconhecido: "
//--- Deal Entry
#define TRANSLATION_DEAL_ENTRY_UNKNOW "ENTRADA_DE_NEGÓCIO desconhecida: "
//--- Terminals
#define TRANSLATION_TERMINAL_CLOSED_TERMINAL "O terminal foi fechado"
#define TRANSLATION_TERMINAL_DELETED_CHART "O programa foi excluído do gráfico"
#define TRANSLATION_TERMINAL_CLOSED_CHART "O gráfico foi fechado"
#define TRANSLATION_TERMINAL_REMOVE_EXPERT "Especialista removido"
#define TRANSLATION_TERMINAL_CHANGE_INPUT "Parâmetros de entrada foram alterados por um usuário"
#define TRANSLATION_TERMINAL_NON_ZERO "O manipulador OnInit() retornou um valor diferente de zero"
//---Trade Transcation
#define TRANSLATION_TRANSCATION_DONE "Concluído com sucesso"
//--- Save File
#define TRANSLATION_TRYING_TO_SAVE_FILE "Tentando salvar configurações no arquivo: "
#define TRANSLATION_FILED_TO_OPEN_FILE_WRITING "Falha ao abrir o arquivo para escrita: "
#define TRANSLATION_SAVE_DONE "Configurações salvas com sucesso. Erro: "
//--- Load File
#define TRANSLATION_TRYING_TO_LOAD "Tentando carregar configurações do arquivo. Erro: "
#define TRANSLATION_NO_SETTINGS "Nenhum arquivo de configurações para carregar. Erro: "
#define TRANSLATION_FAILED_TO_OPEN_FILE_READING "Falha ao abrir o arquivo para leitura: "
#define TRANSLATION_LOADED_DONE "Configurações carregadas com sucesso. Erro: "
//--- Delet File
#define TRANSLATION_MESSAGE_NO_SETTINGS_FILE_TO_DELETE "Nenhum arquivo de configurações para excluir."
#define TRANSLATION_MESSAGE_TRYING_TO_DELETE_FILE "Tentando excluir arquivo de configurações."
#define TRANSLATION_MESSAGE_FAILED_TO_DELETE_FILE "Falha ao excluir o arquivo"
#define TRANSLATION_MESSAGE_DELETED_SETTINGS "Arquivo de configurações excluído com sucesso."
//--- Verify Inputs
#define TRANSLATION_MESSAGE_INPUTS_EXTEND "Entrada errada: Número de velas para estender a linha < 2"
#define TRANSLATION_MESSAGE_INPUTS_CONDITION "Entrada errada: número de velas para a condição < 4"
#define TRANSLATION_MESSAGE_INPUTS_MAX_BUY "Entrada errada: Máximo de posições Compra <= 0"
#define TRANSLATION_MESSAGE_INPUTS_MAX_SELL "Entrada errada: Máximo de posições Venda <= 0"
#define TRANSLATION_MESSAGE_INPUTS_RIWARD "Entrada errada: Relação Risco/Retorno < 1"
#define TRANSLATION_MESSAGE_INPUTS_CANDLE_EXPIRATION "Entrada errada: velas no momento da expiração das ordens < 2"
#define TRANSLATION_MESSAGE_INPUTS_PERCENTAGE "Entrada errada: Tolerância ao risco inicial em pontos percentuais <= 0"
#define TRANSLATION_MESSAGE_INPUTS_LOTSSIZE "Entrada errada: Tamanho do lote < 0"
#define TRANSLATION_MESSAGE_INPUTS_MAX_RISK "Entrada errada: Risco Máximo <= 0"
#define TRANSLATION_MESSAGE_INPUTS_STOPLOSS "Entrada errada: stop loss < 0"
#define TRANSLATION_MESSAGE_INPUTS_STOPLOSS_LIMIT "Entrada errada: O limite de stop loss é menor do que os pips mínimos permitidos ("
#define TRANSLATION_MESSAGE_INPUTS_STOPLOSS_DISTANCE "Entrada errada: Distância para Stop Loss < 0"
#define TRANSLATION_MESSAGE_INPUTS_SAVE_AND_TRAIL "Entrada errada: Gerenciamento de lucro e trailing stop não podem estar ativos ao mesmo tempo."
#define TRANSLATION_MESSAGE_INPUTS_TRIGGER_TRAIL "Entrada errada: Iniciar após Pontos/Dinheiro < 0"
#define TRANSLATION_MESSAGE_INPUTS_VALUE_TRAIL "Entrada errada: Iniciar após Pontos/Dinheiro <= Salvar Lucro"
#define TRANSLATION_MESSAGE_INPUTS_SAVEPROFIT "Entrada errada: Salvar Lucro < 0"
#define TRANSLATION_MESSAGE_INPUTS_SAVE_BIGGER_TRIGGER_SAVE "Entrada errada: Salvar Lucro >= Iniciar após Pontos/Dinheiro"
#define TRANSLATION_MESSAGE_INPUTS_TRIGGER_ZERO "Entrada errada: Valor de Iniciar após Pontos < 0"
#define TRANSLATION_MESSAGE_INPUTS_SAVE_SMALLER_TRIGGER_SAVE "Entrada errada: Valor de Iniciar após Pontos/Dinheiro <= Trailling"
#define TRANSLATION_MESSAGE_INPUTS_TRAIL_ZERO "Entrada errada: Trailling Stop < 0"
#define TRANSLATION_MESSAGE_INPUTS_TRAIL_BIGGER_SAVE "Entrada errada: Trailling >= Valor de Iniciar após Pontos/Dinheiro"
#define TRANSLATION_MESSAGE_INPUTS_FIRST_COMMISSION "Entrada errada: A primeira entrada de comissão é inválida."
#define TRANSLATION_MESSAGE_INPUTS_SECOND_COMMISSION "Entrada errada: A segunda entrada de comissão é inválida."
#define TRANSLATION_MESSAGE_INPUTS_BALANCE_ZERO "O saldo da conta está vazio."
Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

+340
View File
@@ -0,0 +1,340 @@
//+------------------------------------------------------------------+
//| MaximizableAppDialog.mqh |
//| Copyright (c) 2019, Marketeer |
//| https://www.mql5.com/en/users/marketeer |
//+------------------------------------------------------------------+
// #include <Controls\Dialog.mqh>
// #include <Controls\Button.mqh>
#include <Retrace/Dialog.mqh>
#include <Retrace/Button.mqh>
#resource "res\\Expand2.bmp"
#resource "res\\size6.bmp"
#resource "res\\size10.bmp"
class MaximizableAppDialog: public CAppDialog
{
protected:
CAppDialog m_AppDialog;
CBmpButton m_button_truemax;
CBmpButton m_button_size;
bool m_maximized;
CRect m_max_rect;
CSize m_size_limit;
bool m_sizing;
// window maximization
virtual bool CreateButtonMinMax(void) override;
virtual void OnClickButtonMinMax(void) override;
virtual void OnClickButtonTrueMax(void);
virtual void OnClickButtonSizeFixMe(void);
virtual void Expand(void);
virtual void Restore(void);
virtual void Minimize(void) override;
// window resizing
bool CreateButtonSize(void);
bool OnDialogSizeStart(void);
virtual bool OnDialogDragStart(void) override;
virtual bool OnDialogDragProcess(void) override;
virtual bool OnDialogDragEnd(void) override;
virtual void SelfAdjustment(const bool minimized = false) = 0;
public:
MaximizableAppDialog(): m_maximized(false), m_sizing(false) {}
virtual bool Create(const long chart, const string name, const int subwin, const int x1, const int y1, const int x2, const int y2) override;
virtual bool OnEvent(const int id, const long &lparam, const double &dparam, const string &sparam) override;
virtual bool OnChartChange(const long &lparam, const double &dparam, const string &sparam);
void ChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam);
void SetSizeLimit(const CSize &limit) { m_size_limit = limit; }
CSize GetSizeLimit() { return m_size_limit; }
};
void MaximizableAppDialog::ChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
if(id == CHARTEVENT_CHART_CHANGE)
{
if(OnChartChange(lparam, dparam, sparam)) return;
}
CAppDialog::ChartEvent(id, lparam, dparam, sparam);
}
EVENT_MAP_BEGIN(MaximizableAppDialog)
ON_EVENT(ON_CLICK, m_button_truemax, OnClickButtonTrueMax)
ON_EVENT(ON_CLICK, m_button_size, OnClickButtonSizeFixMe)
ON_EVENT(ON_DRAG_START, m_button_size, OnDialogSizeStart)
ON_EVENT_PTR(ON_DRAG_PROCESS, m_drag_object, OnDialogDragProcess)
ON_EVENT_PTR(ON_DRAG_END, m_drag_object, OnDialogDragEnd)
EVENT_MAP_END(CAppDialog)
bool MaximizableAppDialog::Create(const long chart, const string name, const int subwin, const int x1, const int y1, const int x2, const int y2)
{
// 1 * CONTROLS_BORDER_WIDTH - stays here, because the standard control library minimizes window
// when it's height is 1 pixel smaller than the entire chart height
m_max_rect.SetBound(0,
0,
(int)ChartGetInteger(ChartID(), CHART_WIDTH_IN_PIXELS) - 0 * CONTROLS_BORDER_WIDTH,
(int)ChartGetInteger(ChartID(), CHART_HEIGHT_IN_PIXELS) - 1 * CONTROLS_BORDER_WIDTH);
// if(!CAppDialog::Create(chart, name, subwin, x1, y1, x2, y2)) return false;
// if(!m_AppDialog.Create(chart, name, subwin, x1, y1, x2, y2)) return false;
if(!CreateButtonSize()) return false;
m_size_limit.cx = x2 - x1;
m_size_limit.cy = y2 - y1;
if(m_size_limit.cx >= m_max_rect.Width() || m_size_limit.cy >= m_max_rect.Height())
{
m_size_limit.cx = m_min_rect.Width() * 3;
m_size_limit.cy = m_min_rect.Height() * 7;
}
return true;
}
bool MaximizableAppDialog::CreateButtonMinMax(void) override
{
if(!CAppDialog::CreateButtonMinMax()) return false;
// add maximization button
int off = (m_panel_flag) ? 0 : 2 * CONTROLS_BORDER_WIDTH;
int x1 = Width() - off - 3 * (CONTROLS_BUTTON_SIZE + CONTROLS_DIALOG_BUTTON_OFF);
int y1 = off + CONTROLS_DIALOG_BUTTON_OFF;
int x2 = x1 + CONTROLS_BUTTON_SIZE;
int y2 = y1 + CONTROLS_BUTTON_SIZE;
if(!m_button_truemax.Create(m_chart_id, m_name + "TrueMax", m_subwin, x1, y1, x2, y2)) return false;
if(!m_button_truemax.BmpNames("::res\\Expand2.bmp", "::res\\Restore.bmp")) return false;
if(!CWndContainer::Add(m_button_truemax)) return false;
m_button_truemax.Locking(true);
m_button_truemax.Alignment(WND_ALIGN_RIGHT, 0, 0, off + 2 * CONTROLS_BUTTON_SIZE + 2 * CONTROLS_DIALOG_BUTTON_OFF, 0);
CaptionAlignment(WND_ALIGN_WIDTH, off, 0, off + 3 * (CONTROLS_BUTTON_SIZE + CONTROLS_DIALOG_BUTTON_OFF), 0);
return true;
}
bool MaximizableAppDialog::CreateButtonSize(void)
{
int off = (m_panel_flag) ? 0 : 2 * CONTROLS_BORDER_WIDTH;
int x1 = Width() - CONTROLS_BUTTON_SIZE + 1;
int y1 = Height() - CONTROLS_BUTTON_SIZE + 1;
int x2 = x1 + CONTROLS_BUTTON_SIZE - 1;
int y2 = y1 + CONTROLS_BUTTON_SIZE - 1;
if(!m_button_size.Create(m_chart_id, m_name + "Size", m_subwin, x1, y1, x2, y2)) return false;
if(!m_button_size.BmpNames("::res\\size6.bmp", "::res\\size10.bmp")) return false;
if(!CWndContainer::Add(m_button_size)) return false;
m_button_size.Alignment(WND_ALIGN_RIGHT|WND_ALIGN_BOTTOM, 0, 0, 0, 0);
m_button_size.PropFlagsSet(WND_PROP_FLAG_CAN_DRAG);
return true;
}
void MaximizableAppDialog::OnClickButtonTrueMax(void)
{
if(m_button_truemax.Pressed())
Expand();
else
Restore();
SubwinOff();
}
// This is a hack. It's required because in minimized state sizing button somehow "overlaps"
// the close button and intercepts clicks on it (which prevents exit from minimized app).
// This happens despite the fact that the sizing button is hidden, disabled and assigned
// with minimal Z-order (checked out, then removed).
// Looks like a bug in the standard control library, specifically:
// In CWnd::OnMouseEvent there must be a line:
//
// if(!IS_ENABLED || !IS_VISIBLE) return false;
//
// but it's not there, so invisible, disabled and even background objects are processed
// in the same manner as all other objects. Specifically in CWndContainer::OnMouseEvent
// there is a reverse loop through all objects (it does _not_ respect Z-order anyhow).
void MaximizableAppDialog::OnClickButtonSizeFixMe(void)
{
if(m_minimized)
{
Destroy();
}
}
void MaximizableAppDialog::Expand(void)
{
m_maximized = true;
m_minimized = false;
// m_button_minmax.Pressed(false);
Rebound(m_max_rect);
m_button_size.Hide();
m_button_size.StateFlagsReset(WND_STATE_FLAG_ENABLE);
m_button_size.PropFlagsReset(WND_PROP_FLAG_CAN_DRAG);
// if(!m_panel_flag)
// {
// m_caption.PropFlagsReset(WND_PROP_FLAG_CAN_DRAG);
// }
ClientAreaVisible(true);
SelfAdjustment();
}
//+------------------------------------------------------------------+
//| Restore dialog window |
//+------------------------------------------------------------------+
void MaximizableAppDialog::Restore(void)
{
m_maximized = false;
m_minimized = false;
// m_button_minmax.Pressed(false);
m_button_size.Show();
m_button_size.StateFlagsSet(WND_STATE_FLAG_ENABLE);
m_button_size.PropFlagsSet(WND_PROP_FLAG_CAN_DRAG);
CAppDialog::Maximize();
// if(!m_panel_flag)
// {
// m_caption.PropFlagsSet(WND_PROP_FLAG_CAN_DRAG);
// }
SelfAdjustment();
}
void MaximizableAppDialog::Minimize()
{
CAppDialog::Minimize();
m_button_size.Hide();
m_button_size.StateFlagsReset(WND_STATE_FLAG_ENABLE);
m_button_size.PropFlagsReset(WND_PROP_FLAG_CAN_DRAG);
}
bool MaximizableAppDialog::OnChartChange(const long &lparam, const double &dparam, const string &sparam)
{
m_max_rect.SetBound(0, 0,
(int)ChartGetInteger(ChartID(), CHART_WIDTH_IN_PIXELS) - 0 * CONTROLS_BORDER_WIDTH,
(int)ChartGetInteger(ChartID(), CHART_HEIGHT_IN_PIXELS) - 1 * CONTROLS_BORDER_WIDTH);
if(m_maximized)
{
if(m_rect.Width() != m_max_rect.Width() || m_rect.Height() != m_max_rect.Height())
{
Rebound(m_max_rect);
SelfAdjustment();
m_chart.Redraw();
}
return true;
}
return false;
}
void MaximizableAppDialog::OnClickButtonMinMax(void)
{
CAppDialog::OnClickButtonMinMax();
m_button_truemax.Pressed(false);
m_maximized = false;
if(m_minimized)
{
m_button_size.Hide();
m_button_size.StateFlagsReset(WND_STATE_FLAG_ENABLE);
m_button_size.PropFlagsReset(WND_PROP_FLAG_CAN_DRAG);
}
else
{
m_button_size.Show();
m_button_size.StateFlagsSet(WND_STATE_FLAG_ENABLE);
m_button_size.PropFlagsSet(WND_PROP_FLAG_CAN_DRAG);
}
// if(!m_panel_flag)
// {
// m_caption.PropFlagsSet(WND_PROP_FLAG_CAN_DRAG);
// }
SelfAdjustment(m_minimized);
}
bool MaximizableAppDialog::OnDialogSizeStart(void)
{
if(m_drag_object == NULL)
{
m_drag_object = new CDragWnd;
if(m_drag_object == NULL) return false;
}
int x1 = m_button_size.Left() - CONTROLS_DRAG_SPACING;
int y1 = m_button_size.Top() - CONTROLS_DRAG_SPACING;
int x2 = m_button_size.Right() + CONTROLS_DRAG_SPACING;
int y2 = m_button_size.Bottom() + CONTROLS_DRAG_SPACING;
m_drag_object.Create(m_chart_id, "", m_subwin, x1, y1, x2, y2);
m_drag_object.PropFlagsSet(WND_PROP_FLAG_CAN_DRAG);
CChart chart;
chart.Attach(m_chart_id);
m_drag_object.Limits(-CONTROLS_DRAG_SPACING, -CONTROLS_DRAG_SPACING,
chart.WidthInPixels() + CONTROLS_DRAG_SPACING,
chart.HeightInPixels(m_subwin) + CONTROLS_DRAG_SPACING);
chart.Detach();
m_drag_object.MouseX(m_button_size.MouseX());
m_drag_object.MouseY(m_button_size.MouseY());
m_drag_object.MouseFlags(m_button_size.MouseFlags());
m_sizing = true;
return true;
}
bool MaximizableAppDialog::OnDialogDragStart(void)
{
if(m_maximized) return false;
return CAppDialog::OnDialogDragStart();
}
//+------------------------------------------------------------------+
//| Continue dragging the dialog box |
//+------------------------------------------------------------------+
bool MaximizableAppDialog::OnDialogDragProcess(void)
{
if(!m_sizing) return CDialog::OnDialogDragProcess();
if(m_drag_object == NULL) return false;
int x = m_drag_object.Right() - Right() - CONTROLS_DRAG_SPACING;
int y = m_drag_object.Bottom() - Bottom() - CONTROLS_DRAG_SPACING;
// resize dialog
CRect r = Rect();
r.right += x;
r.bottom += y;
if(r.Width() < m_size_limit.cx) r.right = r.left + m_size_limit.cx;
if(r.Height() < m_size_limit.cy) r.bottom = r.top + m_size_limit.cy;
Rebound(r);
SelfAdjustment();
return true;
}
//+------------------------------------------------------------------+
//| End dragging the dialog box |
//+------------------------------------------------------------------+
bool MaximizableAppDialog::OnDialogDragEnd(void)
{
if(!m_sizing) return CDialog::OnDialogDragEnd();
if(m_drag_object != NULL)
{
m_button_size.MouseFlags(m_drag_object.MouseFlags());
delete m_drag_object;
m_drag_object = NULL;
}
m_norm_rect.SetBound(m_rect);
m_sizing = false;
SelfAdjustment();
return true;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 632 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 632 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 824 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB