746 lines
70 KiB
MQL5
746 lines
70 KiB
MQL5
//============================================================================================= MQL5 ===
|
|
// LibreCLOP Function1_5 v1.005 MQL5
|
|
// Основные функции алгоритма
|
|
// Librecoin (c)2014-2017
|
|
//======================================================================================================
|
|
#property strict
|
|
//============================================================================================= MQL5 ===
|
|
// INCLUDE - подключаемые модули
|
|
//------------------------------------------------------------------------------------------------------
|
|
//----- Обратные ссылки на основной файл проекта
|
|
#include "LCL_Ref_5_v1.005.mqh"
|
|
//============================================================================================= MQL5 ===
|
|
// MAIN FUNCTIONS
|
|
//------------------------------------------------------------------------------------------------------
|
|
//
|
|
//============================================================================================= MQL5 ===
|
|
// CalcPositionsTotal() - подсчет количества позиций с отбором по инструменту магику тикету
|
|
// Вход:
|
|
// iSymbol - инструмент
|
|
// iSelSym - режим отбора по инструменту
|
|
// iMagic - magic
|
|
// iSelMag - режим отбора по magic
|
|
// iTicket - тикет
|
|
// iSelTick - режим отбора по тикету
|
|
//------------------------------------------------------------------------------------------------------
|
|
int CalcPositionsTotal( string &iSymSelect[],
|
|
string &iSymEliminat[],
|
|
enSelSymMode iSelSym,
|
|
ulong &iMagSelect[],
|
|
ulong &iMagEliminat[],
|
|
enSelMagMode iSelMag,
|
|
long &iTickSelect[],
|
|
long &iTickEliminat[],
|
|
enSelTickMode iSelTick){
|
|
//-----
|
|
int
|
|
nPosition=0;
|
|
//-----
|
|
int iPositionsTotal=PositionsTotal();
|
|
{if(iPositionsTotal>0)
|
|
{
|
|
{for(int i=PositionsTotal()-1;i>=0;i--)
|
|
{
|
|
ulong Pos_Tick=PositionGetTicket(i); //Выбираем позицию по номеру в списке
|
|
{if(Pos_Tick<=0){continue;}} //Неудачно - следующий
|
|
string PosSymbol=PositionGetString(POSITION_SYMBOL);
|
|
{if(!CheckSym(PosSymbol,iSymSelect,iSymEliminat,iSelSym)){continue;}}//Проверка соответствия символа модели по критерию выбора
|
|
ulong PosMagic=PositionGetInteger(POSITION_MAGIC);
|
|
{if(!CheckMag(PosMagic,iMagSelect,iMagEliminat,iSelMag)){continue;}}//Проверка соответствия магика модели по критерию выбора
|
|
long PosTicket=PositionGetInteger(POSITION_TICKET);
|
|
{if(!CheckTick(PosTicket,inSelectTick,inEliminatTick,iSelTick)){continue;}}//Проверка соответствия тикета модели по критерию выбора
|
|
nPosition++;
|
|
}}//for(int i=PositionsTotal()-1;i>=0;i--)
|
|
}}//if(PositionsTotal()>0)
|
|
return(nPosition);
|
|
}//CalcPositionsTotal()
|
|
//
|
|
//============================================================================================= MQL5 ===
|
|
// CalcOrdersTotal() - подсчет количества ордеров с отбором по инструменту магику тикету
|
|
// Вход:
|
|
// iSymbol - инструмент
|
|
// iSelSym - режим отбора по инструменту
|
|
// iMagic - magic
|
|
// iSelMag - режим отбора по magic
|
|
// iTicket - тикет
|
|
// iSelTick - режим отбора по тикету
|
|
//------------------------------------------------------------------------------------------------------
|
|
int CalcOrdersTotal( string &iSymSelect[],
|
|
string &iSymEliminat[],
|
|
enSelSymMode iSelSym,
|
|
ulong &iMagSelect[],
|
|
ulong &iMagEliminat[],
|
|
enSelMagMode iSelMag,
|
|
long &iTickSelect[],
|
|
long &iTickEliminat[],
|
|
enSelTickMode iSelTick){
|
|
int
|
|
nOrder=0;
|
|
//-----
|
|
{if(OrdersTotal()>0)
|
|
{
|
|
{for(int i=OrdersTotal()-1;i>=0;i--)
|
|
{
|
|
ulong Ord_Tick=OrderGetTicket(i); //Выбираем ордер по номеру в списке
|
|
{if(Ord_Tick<=0){continue;}} //Неудачно - следующий
|
|
{if(!CheckSym(OrderGetString(ORDER_SYMBOL),iSymSelect,iSymEliminat,iSelSym)){continue;}}//Проверка соответствия символа модели по критерию выбора
|
|
{if(!CheckMag(OrderGetInteger(ORDER_MAGIC),iMagSelect,iMagEliminat,iSelMag)){continue;}}//Проверка соответствия магика модели по критерию выбора
|
|
{if(!CheckTick(OrderGetInteger(ORDER_TICKET),inSelectTick,inEliminatTick,iSelTick)){continue;}}//Проверка соответствия тикета модели по критерию выбора
|
|
nOrder++;
|
|
}}//for(int i=OrdersTotal()-1;i>=0;i--)
|
|
}}//if(OrdersTotal()>0)
|
|
return(nOrder);
|
|
}//CalcOrdersTotal()
|
|
//
|
|
//============================================================================================= MQL5 ===
|
|
// CalcHistoryOrdersTotal() - подсчет количества ордеров в истории с отбором по инструменту магику тикету
|
|
// Вход:
|
|
// iSymbol - инструмент
|
|
// iSelSym - режим отбора по инструменту
|
|
// iMagic - magic
|
|
// iSelMag - режим отбора по magic
|
|
// iTicket - тикет
|
|
// iSelTick - режим отбора по тикету
|
|
//------------------------------------------------------------------------------------------------------
|
|
int CalcHistoryOrdersTotal(string &iSymSelect[],
|
|
string &iSymEliminat[],
|
|
enSelSymMode iSelSym,
|
|
ulong &iMagSelect[],
|
|
ulong &iMagEliminat[],
|
|
enSelMagMode iSelMag,
|
|
long &iTickSelect[],
|
|
long &iTickEliminat[],
|
|
enSelTickMode iSelTick){
|
|
int
|
|
nOrder=0;
|
|
//-----
|
|
{if(HistoryOrdersTotal()>0)
|
|
{
|
|
{for(int i=HistoryOrdersTotal()-1;i>=0;i--)
|
|
{
|
|
ulong Ord_Tick=HistoryOrderGetTicket(i); //Выбираем ордер в истории по номеру в списке
|
|
{if(Ord_Tick<=0){continue;}} //Неудачно - следующий
|
|
{if(!CheckSym(HistoryOrderGetString(Ord_Tick,ORDER_SYMBOL),iSymSelect,iSymEliminat,iSelSym)){continue;}}//Проверка соответствия символа модели по критерию выбора
|
|
{if(!CheckMag(HistoryOrderGetInteger(Ord_Tick,ORDER_MAGIC),iMagSelect,iMagEliminat,iSelMag)){continue;}}//Проверка соответствия магика модели по критерию выбора
|
|
{if(!CheckTick(HistoryOrderGetInteger(Ord_Tick,ORDER_TICKET),inSelectTick,inEliminatTick,iSelTick)){continue;}}//Проверка соответствия тикета модели по критерию выбора
|
|
nOrder++;
|
|
}}//for(int i=HistoryOrdersTotal()-1;i>=0;i--)
|
|
}}//if(HistoryOrdersTotal()>0)
|
|
return(nOrder);
|
|
}//CalcHistoryOrdersTotal()
|
|
//
|
|
//============================================================================================= MQL5 ===
|
|
// CalcHistoryDealsTotal() - подсчет количества сделок с отбором по инструменту магику тикету
|
|
// Вход:
|
|
// iSymbol - инструмент
|
|
// iSelSym - режим отбора по инструменту
|
|
// iMagic - magic
|
|
// iSelMag - режим отбора по magic
|
|
// iTicket - тикет
|
|
// iSelTick - режим отбора по тикету
|
|
//------------------------------------------------------------------------------------------------------
|
|
int CalcHistoryDealsTotal( string &iSymSelect[],
|
|
string &iSymEliminat[],
|
|
enSelSymMode iSelSym,
|
|
ulong &iMagSelect[],
|
|
ulong &iMagEliminat[],
|
|
enSelMagMode iSelMag,
|
|
long &iTickSelect[],
|
|
long &iTickEliminat[],
|
|
enSelTickMode iSelTick){
|
|
int
|
|
nDeal=0;
|
|
//-----
|
|
{if(HistoryDealsTotal()>0)
|
|
{
|
|
{for(int i=HistoryDealsTotal()-1;i>=0;i--)
|
|
{
|
|
ulong Deal_Tick=HistoryDealGetTicket(i); //Выбираем сделку по номеру в списке
|
|
{if(Deal_Tick<=0){continue;}} //Неудачно - следующий
|
|
{if(!CheckSym(HistoryDealGetString(Deal_Tick,DEAL_SYMBOL),iSymSelect,iSymEliminat,iSelSym)){continue;}}//Проверка соответствия символа модели по критерию выбора
|
|
{if(!CheckMag(HistoryDealGetInteger(Deal_Tick,DEAL_MAGIC),iMagSelect,iMagEliminat,iSelMag)){continue;}}//Проверка соответствия магика модели по критерию выбора
|
|
{if(!CheckTick(HistoryDealGetInteger(Deal_Tick,DEAL_TICKET),inSelectTick,inEliminatTick,iSelTick)){continue;}}//Проверка соответствия тикета модели по критерию выбора
|
|
nDeal++;
|
|
}}//for(int i=HistoryDealsTotal()-1;i>=0;i--)
|
|
}}//if(HistoryOrdersTotal()>0)
|
|
return(nDeal);
|
|
}//CalcHistoryDealsTotal()
|
|
//
|
|
//============================================================================================= MQL5 ===
|
|
// CheckSym() - Проверка соответствия символа модели по критерию выбора
|
|
// Вход:
|
|
// aSymbol - проверяемый инструмент
|
|
// iSymSelect - массив отбора образцов
|
|
// iSymEliminat- массив отсева образцов
|
|
// iSelSym - критерий выбора
|
|
//------------------------------------------------------------------------------------------------------
|
|
bool CheckSym(string aSymbol,
|
|
string &iSymSelect[],
|
|
string &iSymEliminat[],
|
|
enSelSymMode iSelSym){
|
|
//-----
|
|
bool Result=false;
|
|
//-----
|
|
{switch(iSelSym)
|
|
{
|
|
case SelSym_all:
|
|
{
|
|
Result=true;
|
|
break;
|
|
}
|
|
case SelSym_curr:
|
|
{
|
|
{if((aSymbol!=iSymSelect[0])&&(iSymSelect[0]!="")){break;}}//Отбор по символу
|
|
Result=true;
|
|
break;
|
|
}
|
|
case SelSym_user:
|
|
{
|
|
{if((aSymbol!=iSymSelect[0])&&(iSymSelect[0]!="")){break;}}//Отбор по символу
|
|
Result=true;
|
|
break;
|
|
}
|
|
case SelSym_but:
|
|
{
|
|
{if((aSymbol==iSymEliminat[0])&&(iSymEliminat[0]!="")){break;}}//Отбор по символу
|
|
Result=true;
|
|
break;
|
|
}
|
|
case SelSym_list://по списку отбора
|
|
{
|
|
//Проверка наличия символа в списке отбора
|
|
Result=false;
|
|
{for(int i=0;i<=nSymSelectList-1;i++)
|
|
{
|
|
{if((aSymbol==iSymSelect[i])&&(iSymSelect[i]!=""))//Отбор по символу
|
|
{
|
|
Result=true;
|
|
break;
|
|
}}//if((aSymbol==iSymSelect[i])&&(iSymSelect[i]!=""))
|
|
}}//for(int i=0;i<=nSymSelectList-1;i++)
|
|
break;
|
|
}
|
|
case SelSym_butlist://по списку отсева
|
|
{
|
|
//Проверка наличия символа в списке отсева
|
|
Result=true;
|
|
{for(int i=0;i<=nSymEliminatList-1;i++)
|
|
{
|
|
{if((aSymbol==iSymEliminat[i])&&(iSymEliminat[i]!=""))//Отсев по символу
|
|
{
|
|
Result=false;
|
|
break;
|
|
}}//if((aSymbol==iSymEliminat[i])&&(iSymEliminat[i]!=""))
|
|
}}//for(int i=0;i<=nSymSelectList-1;i++)
|
|
break;
|
|
}
|
|
case SelSym_listbutlist://по спискам отбора и отсева
|
|
{
|
|
//Проверка наличия символа в списке отбора
|
|
Result=false;
|
|
{for(int i=0;i<=nSymSelectList-1;i++)
|
|
{
|
|
{if((aSymbol==iSymSelect[i])&&(iSymSelect[i]!=""))//Отбор по символу
|
|
{
|
|
//Проверка наличия символа в списке отсева
|
|
Result=true;
|
|
{for(int j=0;j<=nSymEliminatList-1;j++)
|
|
{
|
|
{if((aSymbol==iSymEliminat[j])&&(iSymEliminat[j]!=""))//Отсев по символу
|
|
{
|
|
Result=false;
|
|
break;
|
|
}}//if((aSymbol==iSymEliminat[j])&&(iSymEliminat[j]!=""))
|
|
}}//for(int j=0;j<=nSymEliminatList-1;j++)
|
|
break;
|
|
}}//if((aSymbol==iSymSelect[i])&&(iSymSelect[i]!=""))
|
|
}}//for(int i=0;i<=nSymSelectList-1;i++)
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}}//switch(iSelSym)
|
|
return(Result);
|
|
}//CheckSym()
|
|
//
|
|
//============================================================================================= MQL5 ===
|
|
// CheckMag() - Проверка соответствия магика по критерию выбора
|
|
// Вход:
|
|
// aMagic - проверяемый магик
|
|
// iMagSelect - массив отбора образцов
|
|
// iMagEliminat - массив отсева образцов
|
|
// iSelMag - критерий выбора
|
|
//------------------------------------------------------------------------------------------------------
|
|
bool CheckMag(ulong aMagic,
|
|
ulong &iMagSelect[],
|
|
ulong &iMagEliminat[],
|
|
enSelMagMode iSelMag){
|
|
//-----
|
|
bool Result=false;
|
|
//-----
|
|
{switch(iSelMag)
|
|
{
|
|
case SelMag_all:
|
|
{
|
|
Result=true;
|
|
break;
|
|
}
|
|
case SelMag_user:
|
|
{
|
|
{if(aMagic!=iMagSelect[0]){break;}}//Отбор по магику
|
|
Result=true;
|
|
break;
|
|
}
|
|
case SelMag_but:
|
|
{
|
|
{if(aMagic==iMagEliminat[0]){break;}}//Отбор по магику
|
|
Result=true;
|
|
break;
|
|
}
|
|
case SelMag_list://по списку отбора
|
|
{
|
|
//Проверка наличия магика в списке отбора
|
|
Result=false;
|
|
{for(int i=0;i<=nMagSelectList-1;i++)
|
|
{
|
|
{if(aMagic==iMagSelect[i])//Отбор по магику
|
|
{
|
|
Result=true;
|
|
break;
|
|
}}//if((aMagic==iMagSelect[i])&&(iMagSelect[i]!=0))
|
|
}}//for(int i=0;i<=nMagSelectList-1;i++)
|
|
break;
|
|
}
|
|
case SelMag_butlist://по списку отсева
|
|
{
|
|
//Проверка наличия магика в списке отсева
|
|
Result=true;
|
|
{for(int i=0;i<=nMagEliminatList-1;i++)
|
|
{
|
|
{if(aMagic==iMagEliminat[i])//Отсев по магику
|
|
{
|
|
Result=false;
|
|
break;
|
|
}}//if((aMagic==iMagEliminat[i])&&(iMagEliminat[i]!=0))
|
|
}}//for(int i=0;i<=nMagSelectList-1;i++)
|
|
break;
|
|
}
|
|
case SelMag_listbutlist://по спискам отбора и отсева
|
|
{
|
|
//Проверка наличия магика в списке отбора
|
|
Result=false;
|
|
{for(int i=0;i<=nMagSelectList-1;i++)
|
|
{
|
|
{if(aMagic==iMagSelect[i])//Отбор по магику
|
|
{
|
|
//Проверка наличия магика в списке отсева
|
|
Result=true;
|
|
{for(int j=0;j<=nMagEliminatList-1;j++)
|
|
{
|
|
{if(aMagic==iMagEliminat[j])//Отсев по магику
|
|
{
|
|
Result=false;
|
|
break;
|
|
}}//if((aMagic==iMagEliminat[j])&&(iMagEliminat[j]!=0))
|
|
}}//for(int j=0;j<=nMagEliminatList-1;j++)
|
|
break;
|
|
}}//if((aMagic==iMagSelect[i])&&(iMagSelect[i]!=0))
|
|
}}//for(int i=0;i<=nMagSelectList-1;i++)
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}}//switch(iSelSym)
|
|
return(Result);
|
|
}//CheckMag()
|
|
//
|
|
//============================================================================================= MQL5 ===
|
|
// CheckTick() - Проверка соответствия тикета по критерию выбора
|
|
// Вход:
|
|
// aTicket - проверяемый тикет
|
|
// iTickSelect - массив отбора образцов
|
|
// iTickEliminat - массив отсева образцов
|
|
// iSelTick - критерий выбора
|
|
//------------------------------------------------------------------------------------------------------
|
|
bool CheckTick( long aTicket,
|
|
long &iTickSelect[],
|
|
long &iTickEliminat[],
|
|
enSelTickMode iSelTick){
|
|
//-----
|
|
bool Result=false;
|
|
//-----
|
|
{switch(iSelTick)
|
|
{
|
|
case SelTick_all:
|
|
{
|
|
Result=true;
|
|
break;
|
|
}
|
|
case SelTick_user:
|
|
{
|
|
{if((aTicket!=iTickSelect[0])&&(iTickSelect[0]!=0)){break;}}//Отбор по тикету
|
|
Result=true;
|
|
break;
|
|
}
|
|
case SelTick_but:
|
|
{
|
|
{if((aTicket==iTickEliminat[0])&&(iTickEliminat[0]!=0)){break;}}//Отбор по тикету
|
|
Result=true;
|
|
break;
|
|
}
|
|
case SelTick_list://по списку отбора
|
|
{
|
|
//Проверка наличия тикета в списке отбора
|
|
Result=false;
|
|
{for(int i=0;i<=nTickSelectList-1;i++)
|
|
{
|
|
{if((aTicket==iTickSelect[i])&&(iTickSelect[i]!=0))//Отбор по тикету
|
|
{
|
|
Result=true;
|
|
break;
|
|
}}//if((aTicket==iTickSelect[i])&&(iTickSelect[i]!=0))
|
|
}}//for(int i=0;i<=nTickSelectList-1;i++)
|
|
break;
|
|
}
|
|
case SelTick_butlist://по списку отсева
|
|
{
|
|
//Проверка наличия тикета в списке отсева
|
|
Result=true;
|
|
{for(int i=0;i<=nTickEliminatList-1;i++)
|
|
{
|
|
{if((aTicket==iTickEliminat[i])&&(iTickEliminat[i]!=0))//Отсев по тикету
|
|
{
|
|
Result=false;
|
|
break;
|
|
}}//if((aTicket==iTickSelect[i])&&(iTickSelect[i]!=0))
|
|
}}//for(int i=0;i<=nTickSelectList-1;i++)
|
|
break;
|
|
}
|
|
case SelTick_listbutlist://по спискам отбора и отсева
|
|
{
|
|
//Проверка наличия тикета в списке отбора
|
|
Result=false;
|
|
{for(int i=0;i<=nTickSelectList-1;i++)
|
|
{
|
|
{if((aTicket==iTickSelect[i])&&(iTickSelect[i]!=0))//Отбор по тикету
|
|
{
|
|
//Проверка наличия тикета в списке отсева
|
|
Result=true;
|
|
{for(int j=0;j<=nTickEliminatList-1;j++)
|
|
{
|
|
{if((aTicket==iTickEliminat[j])&&(iTickEliminat[j]!=0))//Отсев по тикету
|
|
{
|
|
Result=false;
|
|
break;
|
|
}}//if((aTicket==iTickEliminat[j])&&(iTickEliminat[j]!=0))
|
|
}}//for(int j=0;j<=nTickEliminatList-1;j++)
|
|
break;
|
|
}}//if((aTicket==iTickSelect[i])&&(iTickSelect[i]!=0))
|
|
}}//for(int i=0;i<=nTickSelectList-1;i++)
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
break;
|
|
}
|
|
}}//switch(iSelSym)
|
|
return(Result);
|
|
}//CheckTick()
|
|
//
|
|
//============================================================================================= MQL5 ===
|
|
// CalcPositionsSumm() - подсчет суммы позиций с отбором по инструменту магику тикету
|
|
// Вход:
|
|
// iSymbol - инструмент
|
|
// iSelSym - режим отбора по инструменту
|
|
// iMagic - magic
|
|
// iSelMag - режим отбора по magic
|
|
// iTicket - тикет
|
|
// iSelTick - режим отбора по тикету
|
|
//------------------------------------------------------------------------------------------------------
|
|
double CalcPositionsSumm( string &iSymSelect[],
|
|
string &iSymEliminat[],
|
|
enSelSymMode iSelSym,
|
|
ulong &iMagSelect[],
|
|
ulong &iMagEliminat[],
|
|
enSelMagMode iSelMag,
|
|
long &iTickSelect[],
|
|
long &iTickEliminat[],
|
|
enSelTickMode iSelTick){
|
|
//-----
|
|
double
|
|
PosSumm=0.0;
|
|
//-----
|
|
int iPositionsTotal=PositionsTotal();
|
|
{if(iPositionsTotal>0)
|
|
{
|
|
{for(int i=PositionsTotal()-1;i>=0;i--)
|
|
{
|
|
ulong Pos_Tick=PositionGetTicket(i); //Выбираем позицию по номеру в списке
|
|
{if(Pos_Tick<=0){continue;}} //Неудачно - следующий
|
|
string PosSymbol=PositionGetString(POSITION_SYMBOL);
|
|
{if(!CheckSym(PosSymbol,iSymSelect,iSymEliminat,iSelSym)){continue;}}//Проверка соответствия символа модели по критерию выбора
|
|
ulong PosMagic=PositionGetInteger(POSITION_MAGIC);
|
|
{if(!CheckMag(PosMagic,iMagSelect,iMagEliminat,iSelMag)){continue;}}//Проверка соответствия магика модели по критерию выбора
|
|
long PosTicket=PositionGetInteger(POSITION_TICKET);
|
|
{if(!CheckTick(PosTicket,inSelectTick,inEliminatTick,iSelTick)){continue;}}//Проверка соответствия тикета модели по критерию выбора
|
|
PosSumm+=PositionGetDouble(POSITION_PROFIT)+PositionGetDouble(POSITION_SWAP);
|
|
}}//for(int i=PositionsTotal()-1;i>=0;i--)
|
|
}}//if(PositionsTotal()>0)
|
|
return(PosSumm);
|
|
}//CalcPositionsSumm()
|
|
//
|
|
//============================================================================================= MQL5 ===
|
|
// CalcHistoryDealsSumm() - подсчет суммы сделок с отбором по инструменту магику тикету
|
|
// Вход:
|
|
// iSymbol - инструмент
|
|
// iSelSym - режим отбора по инструменту
|
|
// iMagic - magic
|
|
// iSelMag - режим отбора по magic
|
|
// iTicket - тикет
|
|
// iSelTick - режим отбора по тикету
|
|
//------------------------------------------------------------------------------------------------------
|
|
double CalcHistoryDealsSumm( string &iSymSelect[],
|
|
string &iSymEliminat[],
|
|
enSelSymMode iSelSym,
|
|
ulong &iMagSelect[],
|
|
ulong &iMagEliminat[],
|
|
enSelMagMode iSelMag,
|
|
long &iTickSelect[],
|
|
long &iTickEliminat[],
|
|
enSelTickMode iSelTick){
|
|
double
|
|
DealSumm=0.0;
|
|
//-----
|
|
{if(HistoryDealsTotal()>0)
|
|
{
|
|
{for(int i=HistoryDealsTotal()-1;i>=0;i--)
|
|
{
|
|
ulong Deal_Tick=HistoryDealGetTicket(i); //Выбираем сделку по номеру в списке
|
|
{if(Deal_Tick<=0){continue;}} //Неудачно - следующий
|
|
{if(!CheckSym(HistoryDealGetString(Deal_Tick,DEAL_SYMBOL),iSymSelect,iSymEliminat,iSelSym)){continue;}}//Проверка соответствия символа модели по критерию выбора
|
|
{if(!CheckMag(HistoryDealGetInteger(Deal_Tick,DEAL_MAGIC),iMagSelect,iMagEliminat,iSelMag)){continue;}}//Проверка соответствия магика модели по критерию выбора
|
|
{if(!CheckTick(HistoryDealGetInteger(Deal_Tick,DEAL_TICKET),inSelectTick,inEliminatTick,iSelTick)){continue;}}//Проверка соответствия тикета модели по критерию выбора
|
|
DealSumm+=HistoryDealGetDouble(Deal_Tick,DEAL_PROFIT)+HistoryDealGetDouble(Deal_Tick,DEAL_SWAP);
|
|
}}//for(int i=HistoryDealsTotal()-1;i>=0;i--)
|
|
}}//if(HistoryOrdersTotal()>0)
|
|
return(DealSumm);
|
|
}//CalcHistoryDealsSumm()
|
|
//
|
|
//======================================================================================================
|
|
// PositionOrderSend() - Отправка запроса на выставление ордера
|
|
// Вход:
|
|
// iSymbol - инструмент позиции
|
|
// iType - тип позиции
|
|
//======================================================================================================
|
|
uint PositionOrderSend( string iSymbol,
|
|
ENUM_ORDER_TYPE iType,
|
|
double iVol,
|
|
double iPrice,
|
|
ulong iSlip,
|
|
double iSL,
|
|
double iTP,
|
|
string iComment,
|
|
ulong iMagic,
|
|
datetime iExpir,
|
|
ulong &iDeal){
|
|
bool
|
|
iOrd_inf=false;
|
|
//--- обнуление значений запроса и результата
|
|
MqlTradeRequest Request={0};
|
|
MqlTradeResult Result={0};
|
|
//ZeroMemory(Request);
|
|
//ZeroMemory(Result);
|
|
//--- подготовим запрос
|
|
Request.action =TRADE_ACTION_DEAL;
|
|
Request.magic =iMagic;
|
|
Request.type =iType;
|
|
Request.symbol =iSymbol;
|
|
Request.volume =iVol;
|
|
Request.price =iPrice;
|
|
Request.sl =iSL;
|
|
Request.tp =iTP;
|
|
Request.deviation =iSlip;
|
|
Request.comment =iComment;
|
|
Request.expiration =iExpir;
|
|
//--- отправка запроса
|
|
//ResetLastError();
|
|
iOrd_inf=OrderSend(Request,Result);
|
|
//Print("ERR 20=",GetLastError());
|
|
iDeal=Result.deal;
|
|
return(Result.retcode);
|
|
}//PositionOrderSend()
|
|
//
|
|
//======================================================================================================
|
|
// PositionCloseOne() - Закрытие позиции. Добавить цикличность до победы
|
|
// Вход:
|
|
// iPosTick - тикет позиции
|
|
//======================================================================================================
|
|
bool PositionCloseOne( ulong iPosTick,
|
|
ulong iSlip ){
|
|
//Print("PositionCloseOne>>");
|
|
//----- Получим дополнительную информацию по позиции
|
|
//int q=0;
|
|
{if(!PositionSelectByTicket(iPosTick))
|
|
{
|
|
Print("Close select error iPosTick=",iPosTick);
|
|
return(false);
|
|
}}//if(!PositionSelectByTicket(iPosTick))
|
|
//Print(q,". Close select OK iPosTick=",iPosTick);//А эта выводится... или наоборот
|
|
ENUM_POSITION_TYPE Position_Type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // тип позиции
|
|
string Position_Symbol=PositionGetString(POSITION_SYMBOL); // символ
|
|
//double Position_Volume=PositionGetDouble(POSITION_VOLUME); // объем позиции
|
|
//double Position_Price=PositionGetDouble(POSITION_PRICE_OPEN); // цена позиции
|
|
//Print("Position>> Type=",EnumToString(Position_Type),
|
|
// " Volume=",DoubleToString(Position_Volume,2),
|
|
// " Price Open=",DoubleToString(Position_Price,5),
|
|
// " gBid=",gBid,
|
|
// " gAsk=",gAsk);
|
|
bool iOrd_inf=false;
|
|
//--- обнуление значений запроса и результата
|
|
MqlTradeRequest Request={0};
|
|
MqlTradeResult Result={0};
|
|
//ZeroMemory(Request);
|
|
//ZeroMemory(Result);
|
|
//--- подготовим запрос
|
|
Request.action =TRADE_ACTION_DEAL;
|
|
Request.position =iPosTick; // тикет позиции
|
|
Request.volume =PositionGetDouble(POSITION_VOLUME); // объем позиции
|
|
Request.deviation =iSlip;
|
|
Request.symbol =PositionGetString(POSITION_SYMBOL); // символ позиции
|
|
Request.magic =PositionGetInteger(POSITION_MAGIC);
|
|
// Request.type =iType;
|
|
Request.symbol =Position_Symbol;
|
|
// Request.price =iPrice;
|
|
// Request.sl =iSL;
|
|
// Request.tp =iTP;
|
|
// Request.comment =iComment;
|
|
// Request.expiration =iExpir;
|
|
// //--- установка параметров операции
|
|
// request.volume =volume; // объем позиции
|
|
// request.deviation=5; // допустимое отклонение от цены
|
|
// request.magic =EXPERT_MAGIC; // MagicNumber позиции
|
|
//--- установка цены и типа ордера в зависимости от типа позиции
|
|
{if(Position_Type==POSITION_TYPE_BUY)
|
|
{
|
|
//Request.price = SymbolInfoDouble(Position_Symbol,SYMBOL_ASK);
|
|
Request.price = SymbolInfoDouble(Position_Symbol,SYMBOL_BID);
|
|
Request.type = ORDER_TYPE_SELL;
|
|
//Request.price = Position_Price;
|
|
}else{
|
|
//Request.price = SymbolInfoDouble(Position_Symbol,SYMBOL_BID);
|
|
Request.price = SymbolInfoDouble(Position_Symbol,SYMBOL_ASK);
|
|
Request.type = ORDER_TYPE_BUY;
|
|
//Request.price = Position_Price;
|
|
}}//if(type==POSITION_TYPE_BUY)
|
|
//--- последняя проверка и отправка запроса
|
|
{if(PositionSelectByTicket(iPosTick))
|
|
{
|
|
iOrd_inf=OrderSend(Request,Result);
|
|
{if(PrintDebug){Print("Close select OK iPosTick=",iPosTick);}}//Эта строка в тестере упорно не выводится...
|
|
}else{
|
|
Print("Close select error iPosTick=",iPosTick);
|
|
return(false);
|
|
}}//if(!PositionSelectByTicket(iPosTick))
|
|
return(iOrd_inf);
|
|
}//PositionCloseOne()
|
|
//
|
|
//======================================================================================================
|
|
// Indicator_Delete_Name() - Удаление индикатора с текущего чарта по имени
|
|
// Вход:
|
|
// iIndicatorName - имя индикатора
|
|
//======================================================================================================
|
|
bool Indicator_Delete_Name(string iIndicatorName){
|
|
//-----
|
|
int Chart_Windows_Total=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL); //Количество окон на графике (всегда есть хотя бы одно главное окно)
|
|
{for(int nWindow=0;nWindow<Chart_Windows_Total;nWindow++) //Проход по окнам
|
|
{
|
|
int Chart_Indicators_Total=ChartIndicatorsTotal(0,nWindow); //Сколько индикаторов в данном окне/подокне
|
|
{for(int nIndicator=0;nIndicator<Chart_Indicators_Total;nIndicator++) //Переберем все индикаторы в окне
|
|
{
|
|
string Chart_Indicator_Name=ChartIndicatorName(0,nWindow,nIndicator); //Получим короткое имя индикатора
|
|
int Indicator_Handle=ChartIndicatorGet(0,nWindow,Chart_Indicator_Name); //Получим хэндл индикатора
|
|
{if(Chart_Indicator_Name==iIndicatorName) //Сравниваем найденное и искомое имена индикаторов
|
|
{
|
|
IndicatorRelease(Indicator_Handle); //Освобождаем хендл индикатора, как только он становится ненужным
|
|
{if(ChartIndicatorDelete(0,nWindow,iIndicatorName)) //Попытка удаления индикатора
|
|
{
|
|
return(true);
|
|
}}//if(ChartIndicatorDelete(0,nWindow,iIndicatorName))
|
|
}}//if(Chart_Indicator_Name==iIndicatorName)
|
|
}}//for(int nIndicator=0;nIndicator<Chart_Indicators_Total;nIndicator++)
|
|
}}//for(int nWindow=0;nWindow<Chart_Windows_Total;nWindow++)
|
|
return(false);
|
|
}//Indicator_Delete_Name()
|
|
//
|
|
//======================================================================================================
|
|
// Indicator_Delete_Handle() - Удаление индикатора с текущего чарта по хендлу
|
|
// Вход:
|
|
// iIndicatorHandle - хендл индикатора
|
|
// Выход:
|
|
// Chart_Indicator_Name - имя индикатора
|
|
//======================================================================================================
|
|
bool Indicator_Delete_Handle(int iIndicatorHandle,string &Chart_Indicator_Name){
|
|
//-----
|
|
int Chart_Windows_Total=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL); //Количество окон на графике (всегда есть хотя бы одно главное окно)
|
|
Print("Indicator_Search_Handle "," Chart_Windows_Total=",Chart_Windows_Total);
|
|
{for(int nWindow=0;nWindow<Chart_Windows_Total;nWindow++) //Проход по окнам
|
|
{
|
|
int Chart_Indicators_Total=ChartIndicatorsTotal(0,nWindow); //Сколько индикаторов в данном окне/подокне
|
|
Print("Indicator_Search_Handle "," Chart_Indicators_Total=",Chart_Indicators_Total);
|
|
{for(int nIndicator=0;nIndicator<Chart_Indicators_Total;nIndicator++) //Переберем все индикаторы в окне
|
|
{
|
|
Chart_Indicator_Name=ChartIndicatorName(0,nWindow,nIndicator); //Получим короткое имя индикатора
|
|
Print("Indicator_Search_Handle "," Chart_Indicator_Name=",Chart_Indicator_Name);
|
|
int Indicator_Handle=ChartIndicatorGet(0,nWindow,Chart_Indicator_Name); //Получим хэндл индикатора
|
|
{if(Indicator_Handle==iIndicatorHandle) //Сравниваем найденное и искомое значения хендлов
|
|
{
|
|
IndicatorRelease(Indicator_Handle); //Освобождаем хендл индикатора, как только он становится ненужным
|
|
{if(ChartIndicatorDelete(0,nWindow,Chart_Indicator_Name)) //Попытка удаления индикатора
|
|
{
|
|
return(true);
|
|
}}//if(ChartIndicatorDelete(0,nWindow,iIndicatorName))
|
|
}}//if(Chart_Indicator_Name==iIndicatorName)
|
|
}}//for(int nIndicator=0;nIndicator<Chart_Indicators_Total;nIndicator++)
|
|
}}//for(int nWindow=0;nWindow<Chart_Windows_Total;nWindow++)
|
|
return(false);
|
|
}//Indicator_Delete_Handle()
|
|
//
|
|
//======================================================================================================
|
|
// Indicator_Search_Handle() - Поиск короткого имени по хендлу
|
|
// Вход:
|
|
// iIndicatorHandle - хендл индикатора
|
|
// Выход:
|
|
// iChart_Indicator_Name - имя индикатора
|
|
// iChart_Indicator_nWindow - номер окна индикатора
|
|
// iChart_Indicator_nIndicator - номер индикатора в окне
|
|
//======================================================================================================
|
|
bool Indicator_Search_Handle( int iIndicatorHandle,
|
|
string &iChart_Indicator_Name,
|
|
int &iChart_Indicator_Window,
|
|
int &iChart_Indicator_N){
|
|
//-----
|
|
int Chart_Windows_Total=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL); //Количество окон на графике (всегда есть хотя бы одно главное окно)
|
|
Print("Indicator_Search_Handle "," Chart_Windows_Total=",Chart_Windows_Total);
|
|
{for(int nWindow=0;nWindow<Chart_Windows_Total;nWindow++) //Проход по окнам
|
|
{
|
|
int Chart_Indicators_Total=ChartIndicatorsTotal(0,nWindow); //Сколько индикаторов в данном окне/подокне
|
|
Print("Indicator_Search_Handle "," Chart_Indicators_Total=",Chart_Indicators_Total);
|
|
{for(int nIndicator=0;nIndicator<Chart_Indicators_Total;nIndicator++) //Переберем все индикаторы в окне
|
|
{
|
|
iChart_Indicator_Name=ChartIndicatorName(0,nWindow,nIndicator); //Получим короткое имя индикатора
|
|
Print("Indicator_Search_Handle "," iChart_Indicator_Name=",iChart_Indicator_Name);
|
|
int Indicator_Handle=ChartIndicatorGet(0,nWindow,iChart_Indicator_Name); //Получим хэндл индикатора
|
|
{if(Indicator_Handle==iIndicatorHandle) //Сравниваем найденное и искомое значения хендлов
|
|
{
|
|
iChart_Indicator_Window=nWindow;
|
|
iChart_Indicator_N=nIndicator;
|
|
return(true);
|
|
}}//if(Chart_Indicator_Name==iIndicatorName)
|
|
}}//for(int nIndicator=0;nIndicator<Chart_Indicators_Total;nIndicator++)
|
|
}}//for(int nWindow=0;nWindow<Chart_Windows_Total;nWindow++)
|
|
return(false);
|
|
}//Indicator_Search_Handle()
|