//============================================================================================= 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