Add files via upload
@@ -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
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -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);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -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 );
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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=
|
||||
@@ -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;
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -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 ×eries_1[],const double ×eries_2[]);
|
||||
bool UpdateTimeseries(const double ×eries_1[],const double ×eries_2[],uint timeserie=0);
|
||||
|
||||
};
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
CScatter::CScatter()
|
||||
{
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
CScatter::~CScatter()
|
||||
{
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
//| |
|
||||
//+------------------------------------------------------------------+
|
||||
int CScatter::AddTimeseries(const double ×eries_1[],const double ×eries_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 ×eries_1[],const double ×eries_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;
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -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);
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -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)
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -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());
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -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");
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
//+------------------------------------------------------------------+
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
|
||||
@@ -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 "رصيد الحساب فارغ."
|
||||
@@ -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 "账户余额为空。"
|
||||
|
||||
@@ -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: "
|
||||
@@ -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."
|
||||
@@ -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 "حساب خالی است."
|
||||
@@ -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."
|
||||
|
After Width: | Height: | Size: 576 B |
|
After Width: | Height: | Size: 576 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 824 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 824 B |
|
After Width: | Height: | Size: 1.1 KiB |
@@ -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;
|
||||
}
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 632 B |
|
After Width: | Height: | Size: 632 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 824 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 568 B |
|
After Width: | Height: | Size: 568 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 824 B |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |