Article-15346-MQL5-Trade-Mo.../Select.mqh

532 lines
44 KiB
MQL5
Raw Permalink Normal View History

2026-03-23 13:19:06 +07:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| Select.mqh |
//| Copyright 2024, MetaQuotes Software Corp. |
//| https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Software Corp."
#property link "https://mql5.com/ru/users/artmedia70"
#property version "1.00"
enum ENUM_COMPARER_TYPE // 568<K A@02=5=8O
{
EQUAL, // 02=>
MORE, // >;LH5
LESS, // 5=LH5
NO_EQUAL, // 5 @02=>
EQUAL_OR_MORE, // >;LH5 8;8 @02=>
EQUAL_OR_LESS // 5=LH5 8;8 @02=>
};
//+------------------------------------------------------------------+
//| :;NG05<K5 D09;K |
//+------------------------------------------------------------------+
#include "Deal.mqh"
#include "Position.mqh"
//+------------------------------------------------------------------+
//| !?8A>:-E@0=8;8I5 |
//+------------------------------------------------------------------+
CArrayObj ListStorage; // 1J5:B-E@0=8;8I5 4;O E@0=5=8O A>@B8@>20==KE A?8A:>2 :>;;5:F89
//+------------------------------------------------------------------+
//| ;0AA 4;O 2K1>@:8 >1J5:B>2, C4>2;5B2>@ONI8E :@8B5@8N |
//+------------------------------------------------------------------+
class CSelect
{
private:
//--- 5B>4 A@02=5=8O 42CE 25;8G8=
template<typename T>
static bool CompareValues(T value1,T value2,ENUM_COMPARER_TYPE mode);
public:
//+------------------------------------------------------------------+
//| 5B>4K @01>BK A> A45;:0<8 |
//+------------------------------------------------------------------+
//--- >72@0I05B A?8A>: A45;>:, C :>B>@KE >4=> 87 (1) F5;>G8A;5==KE, (2) 25I5AB25==KE 8 (3) AB@>:>2KE A2>9AB2 C4>2;5B2>@O5B 7040==><C :@8B5@8N
static CArrayObj *ByDealProperty(CArrayObj *list_source,ENUM_DEAL_PROPERTY_INT property,long value,ENUM_COMPARER_TYPE mode);
static CArrayObj *ByDealProperty(CArrayObj *list_source,ENUM_DEAL_PROPERTY_DBL property,double value,ENUM_COMPARER_TYPE mode);
static CArrayObj *ByDealProperty(CArrayObj *list_source,ENUM_DEAL_PROPERTY_STR property,string value,ENUM_COMPARER_TYPE mode);
//--- >72@0I05B 8=45:A A45;:8 2 A?8A:5 A <0:A8<0;L=K< 7=0G5=85< (1) F5;>G8A;5==>3>, (2) 25I5AB25==>3> 8 (3) AB@>:>2>3> A2>9AB20
static int FindDealMax(CArrayObj *list_source,ENUM_DEAL_PROPERTY_INT property);
static int FindDealMax(CArrayObj *list_source,ENUM_DEAL_PROPERTY_DBL property);
static int FindDealMax(CArrayObj *list_source,ENUM_DEAL_PROPERTY_STR property);
//--- >72@0I05B 8=45:A A45;:8 2 A?8A:5 A <8=8<0;L=K< 7=0G5=85< (1) F5;>G8A;5==>3>, (2) 25I5AB25==>3> 8 (3) AB@>:>2>3> A2>9AB20
static int FindDealMin(CArrayObj *list_source,ENUM_DEAL_PROPERTY_INT property);
static int FindDealMin(CArrayObj *list_source,ENUM_DEAL_PROPERTY_DBL property);
static int FindDealMin(CArrayObj *list_source,ENUM_DEAL_PROPERTY_STR property);
//+------------------------------------------------------------------+
//| 5B>4K @01>BK A ?>78F8O<8 |
//+------------------------------------------------------------------+
//--- >72@0I05B A?8A>: ?>78F89, C :>B>@KE >4=> 87 (1) F5;>G8A;5==KE, (2) 25I5AB25==KE 8 (3) AB@>:>2KE A2>9AB2 C4>2;5B2>@O5B 7040==><C :@8B5@8N
static CArrayObj *ByPositionProperty(CArrayObj *list_source,ENUM_POSITION_PROPERTY_INT property,long value,ENUM_COMPARER_TYPE mode);
static CArrayObj *ByPositionProperty(CArrayObj *list_source,ENUM_POSITION_PROPERTY_DBL property,double value,ENUM_COMPARER_TYPE mode);
static CArrayObj *ByPositionProperty(CArrayObj *list_source,ENUM_POSITION_PROPERTY_STR property,string value,ENUM_COMPARER_TYPE mode);
//--- >72@0I05B 8=45:A ?>78F88 2 A?8A:5 A <0:A8<0;L=K< 7=0G5=85< (1) F5;>G8A;5==>3>, (2) 25I5AB25==>3> 8 (3) AB@>:>2>3> A2>9AB20
static int FindPositionMax(CArrayObj *list_source,ENUM_POSITION_PROPERTY_INT property);
static int FindPositionMax(CArrayObj *list_source,ENUM_POSITION_PROPERTY_DBL property);
static int FindPositionMax(CArrayObj *list_source,ENUM_POSITION_PROPERTY_STR property);
//--- >72@0I05B 8=45:A ?>78F88 2 A?8A:5 A <8=8<0;L=K< 7=0G5=85< (1) F5;>G8A;5==>3>, (2) 25I5AB25==>3> 8 (3) AB@>:>2>3> A2>9AB20
static int FindPositionMin(CArrayObj *list_source,ENUM_POSITION_PROPERTY_INT property);
static int FindPositionMin(CArrayObj *list_source,ENUM_POSITION_PROPERTY_DBL property);
static int FindPositionMin(CArrayObj *list_source,ENUM_POSITION_PROPERTY_STR property);
};
//+------------------------------------------------------------------+
//| 5B>4 A@02=5=8O 42CE 25;8G8= |
//+------------------------------------------------------------------+
template<typename T>
bool CSelect::CompareValues(T value1,T value2,ENUM_COMPARER_TYPE mode)
{
switch(mode)
{
case EQUAL : return(value1==value2 ? true : false);
case NO_EQUAL : return(value1!=value2 ? true : false);
case MORE : return(value1>value2 ? true : false);
case LESS : return(value1<value2 ? true : false);
case EQUAL_OR_MORE : return(value1>=value2 ? true : false);
case EQUAL_OR_LESS : return(value1<=value2 ? true : false);
default : return false;
}
}
//+------------------------------------------------------------------+
//| 5B>4K @01>BK A> A?8A:0<8 A45;>: |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| >72@0I05B A?8A>: A45;>:, C :>B>@KE >4=> 87 F5;>G8A;5==KE |
//| A2>9AB2 C4>2;5B2>@O5B 7040==><C :@8B5@8N |
//+------------------------------------------------------------------+
CArrayObj *CSelect::ByDealProperty(CArrayObj *list_source,ENUM_DEAL_PROPERTY_INT property,long value,ENUM_COMPARER_TYPE mode)
{
if(list_source==NULL)
return NULL;
CArrayObj *list=new CArrayObj();
if(list==NULL)
return NULL;
list.FreeMode(false);
if(!ListStorage.Add(list))
{
delete list;
return NULL;
}
int total=list_source.Total();
for(int i=0; i<total; i++)
{
CDeal *obj=list_source.At(i);
long obj_prop=obj.GetProperty(property);
if(CompareValues(obj_prop, value, mode))
list.Add(obj);
}
return list;
}
//+------------------------------------------------------------------+
//| >72@0I05B A?8A>: A45;>:, C :>B>@KE >4=> 87 25I5AB25==KE |
//| A2>9AB2 C4>2;5B2>@O5B 7040==><C :@8B5@8N |
//+------------------------------------------------------------------+
CArrayObj *CSelect::ByDealProperty(CArrayObj *list_source,ENUM_DEAL_PROPERTY_DBL property,double value,ENUM_COMPARER_TYPE mode)
{
if(list_source==NULL)
return NULL;
CArrayObj *list=new CArrayObj();
if(list==NULL)
return NULL;
list.FreeMode(false);
if(!ListStorage.Add(list))
{
delete list;
return NULL;
}
for(int i=0; i<list_source.Total(); i++)
{
CDeal *obj=list_source.At(i);
double obj_prop=obj.GetProperty(property);
if(CompareValues(obj_prop,value,mode))
list.Add(obj);
}
return list;
}
//+------------------------------------------------------------------+
//| >72@0I05B A?8A>: A45;>:, C :>B>@KE >4=> 87 AB@>:>2KE |
//| A2>9AB2 C4>2;5B2>@O5B 7040==><C :@8B5@8N |
//+------------------------------------------------------------------+
CArrayObj *CSelect::ByDealProperty(CArrayObj *list_source,ENUM_DEAL_PROPERTY_STR property,string value,ENUM_COMPARER_TYPE mode)
{
if(list_source==NULL)
return NULL;
CArrayObj *list=new CArrayObj();
if(list==NULL)
return NULL;
list.FreeMode(false);
if(!ListStorage.Add(list))
{
delete list;
return NULL;
}
for(int i=0; i<list_source.Total(); i++)
{
CDeal *obj=list_source.At(i);
string obj_prop=obj.GetProperty(property);
if(CompareValues(obj_prop,value,mode))
list.Add(obj);
}
return list;
}
//+------------------------------------------------------------------+
//| >72@0I05B 8=45:A A45;:8 2 A?8A:5 |
//| A <0:A8<0;L=K< 7=0G5=85< F5;>G8A;5==>3> A2>9AB20 |
//+------------------------------------------------------------------+
int CSelect::FindDealMax(CArrayObj *list_source,ENUM_DEAL_PROPERTY_INT property)
{
if(list_source==NULL)
return WRONG_VALUE;
int index=0;
CDeal *max_obj=NULL;
int total=list_source.Total();
if(total==0)
return WRONG_VALUE;
for(int i=1; i<total; i++)
{
CDeal *obj=list_source.At(i);
long obj1_prop=obj.GetProperty(property);
max_obj=list_source.At(index);
long obj2_prop=max_obj.GetProperty(property);
if(CompareValues(obj1_prop,obj2_prop,MORE))
index=i;
}
return index;
}
//+------------------------------------------------------------------+
//| >72@0I05B 8=45:A A45;:8 2 A?8A:5 |
//| A <0:A8<0;L=K< 7=0G5=85< 25I5AB25==>3> A2>9AB20 |
//+------------------------------------------------------------------+
int CSelect::FindDealMax(CArrayObj *list_source,ENUM_DEAL_PROPERTY_DBL property)
{
if(list_source==NULL)
return WRONG_VALUE;
int index=0;
CDeal *max_obj=NULL;
int total=list_source.Total();
if(total==0)
return WRONG_VALUE;
for(int i=1; i<total; i++)
{
CDeal *obj=list_source.At(i);
double obj1_prop=obj.GetProperty(property);
max_obj=list_source.At(index);
double obj2_prop=max_obj.GetProperty(property);
if(CompareValues(obj1_prop,obj2_prop,MORE))
index=i;
}
return index;
}
//+------------------------------------------------------------------+
//| >72@0I05B 8=45:A A45;:8 2 A?8A:5 |
//| A <0:A8<0;L=K< 7=0G5=85< AB@>:>2>3> A2>9AB20 |
//+------------------------------------------------------------------+
int CSelect::FindDealMax(CArrayObj *list_source,ENUM_DEAL_PROPERTY_STR property)
{
if(list_source==NULL)
return WRONG_VALUE;
int index=0;
CDeal *max_obj=NULL;
int total=list_source.Total();
if(total==0) return WRONG_VALUE;
for(int i=1; i<total; i++)
{
CDeal *obj=list_source.At(i);
string obj1_prop=obj.GetProperty(property);
max_obj=list_source.At(index);
string obj2_prop=max_obj.GetProperty(property);
if(CompareValues(obj1_prop,obj2_prop,MORE))
index=i;
}
return index;
}
//+------------------------------------------------------------------+
//| >72@0I05B 8=45:A A45;:8 2 A?8A:5 |
//| A <8=8<0;L=K< 7=0G5=85< F5;>G8A;5==>3> A2>9AB20 |
//+------------------------------------------------------------------+
int CSelect::FindDealMin(CArrayObj* list_source,ENUM_DEAL_PROPERTY_INT property)
{
int index=0;
CDeal *min_obj=NULL;
int total=list_source.Total();
if(total==0)
return WRONG_VALUE;
for(int i=1; i<total; i++)
{
CDeal *obj=list_source.At(i);
long obj1_prop=obj.GetProperty(property);
min_obj=list_source.At(index);
long obj2_prop=min_obj.GetProperty(property);
if(CompareValues(obj1_prop,obj2_prop,LESS))
index=i;
}
return index;
}
//+------------------------------------------------------------------+
//| >72@0I05B 8=45:A A45;:8 2 A?8A:5 |
//| A <8=8<0;L=K< 7=0G5=85< 25I5AB25==>3> A2>9AB20 |
//+------------------------------------------------------------------+
int CSelect::FindDealMin(CArrayObj* list_source,ENUM_DEAL_PROPERTY_DBL property)
{
int index=0;
CDeal *min_obj=NULL;
int total=list_source.Total();
if(total==0)
return WRONG_VALUE;
for(int i=1; i<total; i++)
{
CDeal *obj=list_source.At(i);
double obj1_prop=obj.GetProperty(property);
min_obj=list_source.At(index);
double obj2_prop=min_obj.GetProperty(property);
if(CompareValues(obj1_prop,obj2_prop,LESS))
index=i;
}
return index;
}
//+------------------------------------------------------------------+
//| >72@0I05B 8=45:A A45;:8 2 A?8A:5 |
//| A <8=8<0;L=K< 7=0G5=85< AB@>:>2>3> A2>9AB20 |
//+------------------------------------------------------------------+
int CSelect::FindDealMin(CArrayObj* list_source,ENUM_DEAL_PROPERTY_STR property)
{
int index=0;
CDeal *min_obj=NULL;
int total=list_source.Total();
if(total==0)
return WRONG_VALUE;
for(int i=1; i<total; i++)
{
CDeal *obj=list_source.At(i);
string obj1_prop=obj.GetProperty(property);
min_obj=list_source.At(index);
string obj2_prop=min_obj.GetProperty(property);
if(CompareValues(obj1_prop,obj2_prop,LESS))
index=i;
}
return index;
}
//+------------------------------------------------------------------+
//| 5B>4K @01>BK A> A?8A:0<8 ?>78F89 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| >72@0I05B A?8A>: ?>78F89, C :>B>@KE >4=> 87 F5;>G8A;5==KE |
//| A2>9AB2 C4>2;5B2>@O5B 7040==><C :@8B5@8N |
//+------------------------------------------------------------------+
CArrayObj *CSelect::ByPositionProperty(CArrayObj *list_source,ENUM_POSITION_PROPERTY_INT property,long value,ENUM_COMPARER_TYPE mode)
{
if(list_source==NULL)
return NULL;
CArrayObj *list=new CArrayObj();
if(list==NULL)
return NULL;
list.FreeMode(false);
if(!ListStorage.Add(list))
{
delete list;
return NULL;
}
int total=list_source.Total();
for(int i=0; i<total; i++)
{
CPosition *obj=list_source.At(i);
long obj_prop=obj.GetProperty(property);
if(CompareValues(obj_prop, value, mode))
list.Add(obj);
}
return list;
}
//+------------------------------------------------------------------+
//| >72@0I05B A?8A>: ?>78F89, C :>B>@KE >4=> 87 25I5AB25==KE |
//| A2>9AB2 C4>2;5B2>@O5B 7040==><C :@8B5@8N |
//+------------------------------------------------------------------+
CArrayObj *CSelect::ByPositionProperty(CArrayObj *list_source,ENUM_POSITION_PROPERTY_DBL property,double value,ENUM_COMPARER_TYPE mode)
{
if(list_source==NULL)
return NULL;
CArrayObj *list=new CArrayObj();
if(list==NULL)
return NULL;
list.FreeMode(false);
if(!ListStorage.Add(list))
{
delete list;
return NULL;
}
for(int i=0; i<list_source.Total(); i++)
{
CPosition *obj=list_source.At(i);
double obj_prop=obj.GetProperty(property);
if(CompareValues(obj_prop,value,mode))
list.Add(obj);
}
return list;
}
//+------------------------------------------------------------------+
//| >72@0I05B A?8A>: ?>78F89, C :>B>@KE >4=> 87 AB@>:>2KE |
//| A2>9AB2 C4>2;5B2>@O5B 7040==><C :@8B5@8N |
//+------------------------------------------------------------------+
CArrayObj *CSelect::ByPositionProperty(CArrayObj *list_source,ENUM_POSITION_PROPERTY_STR property,string value,ENUM_COMPARER_TYPE mode)
{
if(list_source==NULL)
return NULL;
CArrayObj *list=new CArrayObj();
if(list==NULL)
return NULL;
list.FreeMode(false);
if(!ListStorage.Add(list))
{
delete list;
return NULL;
}
for(int i=0; i<list_source.Total(); i++)
{
CPosition *obj=list_source.At(i);
string obj_prop=obj.GetProperty(property);
if(CompareValues(obj_prop,value,mode))
list.Add(obj);
}
return list;
}
//+------------------------------------------------------------------+
//| >72@0I05B 8=45:A ?>78F88 2 A?8A:5 |
//| A <0:A8<0;L=K< 7=0G5=85< F5;>G8A;5==>3> A2>9AB20 |
//+------------------------------------------------------------------+
int CSelect::FindPositionMax(CArrayObj *list_source,ENUM_POSITION_PROPERTY_INT property)
{
if(list_source==NULL)
return WRONG_VALUE;
int index=0;
CPosition *max_obj=NULL;
int total=list_source.Total();
if(total==0)
return WRONG_VALUE;
for(int i=1; i<total; i++)
{
CPosition *obj=list_source.At(i);
long obj1_prop=obj.GetProperty(property);
max_obj=list_source.At(index);
long obj2_prop=max_obj.GetProperty(property);
if(CompareValues(obj1_prop,obj2_prop,MORE))
index=i;
}
return index;
}
//+------------------------------------------------------------------+
//| >72@0I05B 8=45:A ?>78F88 2 A?8A:5 |
//| A <0:A8<0;L=K< 7=0G5=85< 25I5AB25==>3> A2>9AB20 |
//+------------------------------------------------------------------+
int CSelect::FindPositionMax(CArrayObj *list_source,ENUM_POSITION_PROPERTY_DBL property)
{
if(list_source==NULL)
return WRONG_VALUE;
int index=0;
CPosition *max_obj=NULL;
int total=list_source.Total();
if(total==0)
return WRONG_VALUE;
for(int i=1; i<total; i++)
{
CPosition *obj=list_source.At(i);
double obj1_prop=obj.GetProperty(property);
max_obj=list_source.At(index);
double obj2_prop=max_obj.GetProperty(property);
if(CompareValues(obj1_prop,obj2_prop,MORE))
index=i;
}
return index;
}
//+------------------------------------------------------------------+
//| >72@0I05B 8=45:A ?>78F88 2 A?8A:5 |
//| A <0:A8<0;L=K< 7=0G5=85< AB@>:>2>3> A2>9AB20 |
//+------------------------------------------------------------------+
int CSelect::FindPositionMax(CArrayObj *list_source,ENUM_POSITION_PROPERTY_STR property)
{
if(list_source==NULL)
return WRONG_VALUE;
int index=0;
CPosition *max_obj=NULL;
int total=list_source.Total();
if(total==0) return WRONG_VALUE;
for(int i=1; i<total; i++)
{
CPosition *obj=list_source.At(i);
string obj1_prop=obj.GetProperty(property);
max_obj=list_source.At(index);
string obj2_prop=max_obj.GetProperty(property);
if(CompareValues(obj1_prop,obj2_prop,MORE))
index=i;
}
return index;
}
//+------------------------------------------------------------------+
//| >72@0I05B 8=45:A ?>78F88 2 A?8A:5 |
//| A <8=8<0;L=K< 7=0G5=85< F5;>G8A;5==>3> A2>9AB20 |
//+------------------------------------------------------------------+
int CSelect::FindPositionMin(CArrayObj* list_source,ENUM_POSITION_PROPERTY_INT property)
{
int index=0;
CPosition *min_obj=NULL;
int total=list_source.Total();
if(total==0)
return WRONG_VALUE;
for(int i=1; i<total; i++)
{
CPosition *obj=list_source.At(i);
long obj1_prop=obj.GetProperty(property);
min_obj=list_source.At(index);
long obj2_prop=min_obj.GetProperty(property);
if(CompareValues(obj1_prop,obj2_prop,LESS))
index=i;
}
return index;
}
//+------------------------------------------------------------------+
//| >72@0I05B 8=45:A ?>78F88 2 A?8A:5 |
//| A <8=8<0;L=K< 7=0G5=85< 25I5AB25==>3> A2>9AB20 |
//+------------------------------------------------------------------+
int CSelect::FindPositionMin(CArrayObj* list_source,ENUM_POSITION_PROPERTY_DBL property)
{
int index=0;
CPosition *min_obj=NULL;
int total=list_source.Total();
if(total==0)
return WRONG_VALUE;
for(int i=1; i<total; i++)
{
CPosition *obj=list_source.At(i);
double obj1_prop=obj.GetProperty(property);
min_obj=list_source.At(index);
double obj2_prop=min_obj.GetProperty(property);
if(CompareValues(obj1_prop,obj2_prop,LESS))
index=i;
}
return index;
}
//+------------------------------------------------------------------+
//| >72@0I05B 8=45:A ?>78F88 2 A?8A:5 |
//| A <8=8<0;L=K< 7=0G5=85< AB@>:>2>3> A2>9AB20 |
//+------------------------------------------------------------------+
int CSelect::FindPositionMin(CArrayObj* list_source,ENUM_POSITION_PROPERTY_STR property)
{
int index=0;
CPosition *min_obj=NULL;
int total=list_source.Total();
if(total==0)
return WRONG_VALUE;
for(int i=1; i<total; i++)
{
CPosition *obj=list_source.At(i);
string obj1_prop=obj.GetProperty(property);
min_obj=list_source.At(index);
string obj2_prop=min_obj.GetProperty(property);
if(CompareValues(obj1_prop,obj2_prop,LESS))
index=i;
}
return index;
}
//+------------------------------------------------------------------+