//============================================================================================= MQL5 === // LibreInfoPDO Main_5 v1.006 MQL5 // Модуль обработки событий // LibreCoin (c)2014-2018 //====================================================================================================== #property strict //============================================================================================= MQL5 === // INCLUDE - подключаемые модули //------------------------------------------------------------------------------------------------------ //----- Обратные ссылки на основной файл проекта #include "LIP_Ref_5_v1.006.mqh" //============================================================================================= MQL5 === // EVENT PROCESSING MODULE //------------------------------------------------------------------------------------------------------ // //============================================================================================= MQL5 === // On_Init() - инициализация советника //------------------------------------------------------------------------------------------------------ ENUM_INIT_RETCODE On_Init() { //----- Счетчики и настройки счетчиков gnTick=0; gInTimer=false; //----- Определяем имя программы ProgramName=MQLInfoString(MQL_PROGRAM_NAME); //----- Рассчитываем короткое имя индикатора ChartID_Str=IntegerToString(ChartID()); IndicatorShortName=vers+" "+StringSubstr(ChartID_Str,StringLen(ChartID_Str)-3); IndicatorSetString(INDICATOR_SHORTNAME,IndicatorShortName); //----- Глобальные параметры TheSymbol=Symbol(); //----- Настройка массивов ArrayResize(inSelectSym,nSymSelectList); ArrayResize(inEliminatSym,nSymEliminatList); ArrayResize(inSelectMag,nMagSelectList); ArrayResize(inEliminatMag,nMagEliminatList); ArrayResize(inSelectTick,nTickSelectList); ArrayResize(inEliminatTick,nTickEliminatList); //----- Настройки для отбора по инструменту {switch(SelSym) { case SelSym_all: { inSelectSym[0]=""; break; } case SelSym_curr: { inSelectSym[0]=TheSymbol; break; } case SelSym_user: { inSelectSym[0]=SelectorSymbol; break; } case SelSym_but: { inEliminatSym[0]=SelectorSymbol; break; } case SelSym_list: { FillSymSelect(inSelectSym); break; } case SelSym_butlist: { FillSymEliminat(inEliminatSym); break; } case SelSym_listbutlist: { FillSymSelect(inSelectSym); FillSymEliminat(inEliminatSym); break; } default: { inSelectSym[0]=""; } }}//switch(SelSym) //----- Настройки для отбора по магику {switch(SelMag) { case SelMag_all: { inSelectMag[0]=0; break; } case SelMag_user: { inSelectMag[0]=SelectorMagic; break; } case SelMag_but: { inEliminatMag[0]=SelectorMagic; break; } case SelMag_list: { FillMagSelect(inSelectMag); break; } case SelMag_butlist: { FillMagEliminat(inEliminatMag); break; } case SelMag_listbutlist: { FillMagSelect(inSelectMag); FillMagEliminat(inEliminatMag); break; } default: { inSelectMag[0]=0; } }}//switch(SelMag) //----- Настройки для отбора по тикету {switch(SelTick) { case SelTick_all: { inSelectTick[0]=0; break; } case SelTick_user: { inSelectTick[0]=SelectorTicket; break; } case SelTick_but: { inEliminatTick[0]=SelectorTicket; break; } case SelTick_list: { FillTickSelect(inSelectTick); break; } case SelTick_butlist: { FillTickEliminat(inEliminatTick); break; } case SelTick_listbutlist: { FillTickSelect(inSelectTick); FillTickEliminat(inEliminatTick); break; } default: { inSelectTick[0]=0; } }}//switch(SelMag) //----- Настройки таймера {if(!MQLInfoInteger(MQL_TESTER)) //Не тестирование { int err=-1; int count=50; {while((err!=0)&&(count>0)) { ResetLastError(); EventSetMillisecondTimer(SetMSTimer); //Установка таймера XXX миллисекунд err=GetLastError(); {if(err!=0) { Sleep(50); Print("EventSetMillisecondTimer n=",count," err >>",err); }}//if(err!=0) count--; }}//while((err!=0)&&(count>0)) }}//if(!MQLInfoInteger(MQL_TESTER)) //----- Установка и расчет параметров окна индикатора IndicatorSetInteger(INDICATOR_DIGITS,0); nSubWindow=ChartWindowFind(0,IndicatorShortName); //Что странно, ожидалось что будет работать ProgramName IndHeigh=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,nSubWindow); IndicatorSetDouble(INDICATOR_MINIMUM,0.0); IndicatorSetDouble(INDICATOR_MAXIMUM,IndHeigh); nFirstBar=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR); kScale=((ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)>0) //Расчет масштаба графика (баров на пиксел) ?((double)ChartGetInteger(0,CHART_WIDTH_IN_BARS)/ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)) :(1)); //----- Запрашиваем историю сделок и ордеров за указанный период серверного времени. {if(!HistorySelect(0,TimeCurrent())) { Print("HistorySelect Error!"); return(INIT_FAILED); }}//Если неудачно - выходим //----- Определение количества ордеров, сделок, позиций. Создание графических объектов. nColo=0; //Счетчик колонок вывода //----- Открытые позиции {if(PositionsView) { Positions_Total=PositionsTotal(); //Текущие позиции Sel_Positions_Total=CalcPositionsTotal(inSelectSym,inEliminatSym,SelSym, //Текущие позиции отобранные inSelectMag,inEliminatMag,SelMag, inSelectTick,inEliminatTick,SelTick); CreateColoLabel("LIP",ColoStep*nColo, "Position="+IntegerToString(Sel_Positions_Total)+"/"+IntegerToString(Positions_Total));//Создаём графический объект заголовка колонки CreateColo("LIP",ColoStep*nColo,Positions_Total); //Создаём графический объект для колонки позиций Positions_Total_Old=Positions_Total; //Текущие позиции в буфер Sel_Positions_Total_Old=Sel_Positions_Total; //Текущие позиции отобранные в буфер nColo++; }}//if(PositionsView) //----- Позиции в истории {if(PositionsHistoryView) { //Positions_Total=PositionsTotal(); //Текущие позиции //Sel_Positions_Total=CalcPositionsTotal(inSelectSym,inEliminatSym,SelSym, //Текущие позиции отобранные // inSelectMag,inEliminatMag,SelMag, // inSelectTick,inEliminatTick,SelTick); CreateColoLabel("LHP",ColoStep*nColo, "PositionHistory="); //Создаём графический объект заголовка колонки CreateColo("LHP",ColoStep*nColo,1); //Создаём графический объект для колонки позиций //Positions_Total_Old=Positions_Total; //Текущие позиции в буфер //Sel_Positions_Total_Old=Sel_Positions_Total; //Текущие позиции отобранные в буфер nColo++; }}//if(PositionsView) //----- Открытые отложенные ордера {if(OrdersView) { Orders_Total=OrdersTotal(); //Текущие лимитные ордера Sel_Orders_Total=CalcOrdersTotal(inSelectSym,inEliminatSym,SelSym, //Текущие лимитные ордера отобранные inSelectMag,inEliminatMag,SelMag, inSelectTick,inEliminatTick,SelTick); CreateColoLabel("LIO",ColoStep*nColo, //Создаём графический объект заголовка колонки "Order="+IntegerToString(Sel_Orders_Total)+"/"+IntegerToString(Orders_Total)); CreateColo("LIO",ColoStep*nColo,Orders_Total); //Создаём графический объект для колонки ордеров Orders_Total_Old=Orders_Total; //Текущие лимитные ордера в буфер Sel_Orders_Total_Old=Sel_Orders_Total; //Текущие лимитные ордера отобранные в буфер nColo++; }}//if(OrdersView) //----- Выполненные ордера в истории {if(OrdersHistoryView) { Orders_History_Total=HistoryOrdersTotal(); //Закрытые рыночные ордера Sel_Orders_History_Total=CalcHistoryOrdersTotal(inSelectSym,inEliminatSym,SelSym, //Закрытые рыночные ордера отобранные inSelectMag,inEliminatMag,SelMag, inSelectTick,inEliminatTick,SelTick); CreateColoLabel("LHO",ColoStep*nColo, "History_Order="+IntegerToString(Sel_Orders_History_Total)+"/"+IntegerToString(Orders_History_Total));//Создаём графический объект заголовка колонки CreateColo("LHO",ColoStep*nColo,Orders_History_Total); //Создаём графический объект для колонки ордеров в истории Orders_History_Total_Old=Orders_History_Total; //Закрытые рыночные ордера в буфер Sel_Orders_History_Total_Old=Sel_Orders_History_Total; //Закрытые рыночные ордера отобранные в буфер nColo++; }}//if(OrdersHistoryView) //----- Сделки в истории {if(DealsHistoryView) { Deals_History_Total=HistoryDealsTotal(); //Совершенные сделки (выполненные ордера) Sel_Deals_History_Total=CalcHistoryDealsTotal(inSelectSym,inEliminatSym,SelSym, //Совершенные сделки (выполненные ордера) отобранные inSelectMag,inEliminatMag,SelMag, inSelectTick,inEliminatTick,SelTick); CreateColoLabel("LHD",ColoStep*nColo, "History_Deal="+IntegerToString(Sel_Deals_History_Total)+"/"+IntegerToString(Deals_History_Total));//Создаём графический объект заголовка колонки CreateColo("LHD",ColoStep*nColo,Deals_History_Total); //Создаём графический объект для колонки сделок в истории Deals_History_Total_Old=Deals_History_Total; //Совершенные сделки (выполненные ордера) в буфер Sel_Deals_History_Total_Old=Sel_Deals_History_Total; //Совершенные сделки (выполненные ордера) отобранные в буфер nColo++; }}//if(DealsHistoryView) //----- return(INIT_SUCCEEDED); }//On_Init() // //============================================================================================= MQL5 === // On_Tick() - Основной обработчик тиков //------------------------------------------------------------------------------------------------------ void On_Tick() { //----- Прерываем загрузку, если индикатор уже есть {if((ChartWindowFind(0,IndicatorShortName)>=0)&&(ChartWindowFind(0,ProgramName)>=0)) { Print("Abort loading indicator: ",ProgramName); ChartIndicatorDelete(0,ChartWindowFind(0,ProgramName),ProgramName); }}//if(ChartWindowFind(0,IndicatorShortName)>=0) //----- //{if(!gInTimer) //{ gnTick++; // gInTimer=false; //}}//if(!InTimer) {if(gnTick>4294967000) { gnTick=100; }}//if(gnTick>4294967000) //----- Установка и расчет параметров окна индикатора ChartID_Str=IntegerToString(ChartID()); IndicatorShortName=vers+" "+StringSubstr(ChartID_Str,StringLen(ChartID_Str)-3); //ProgramName=MQLInfoString(MQL_PROGRAM_NAME); nSubWindow=ChartWindowFind(0,IndicatorShortName); IndHeigh=ChartGetInteger(0,CHART_HEIGHT_IN_PIXELS,nSubWindow); IndicatorSetDouble(INDICATOR_MINIMUM,0.0); IndicatorSetDouble(INDICATOR_MAXIMUM,IndHeigh); nFirstBar=(int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR); kScale=((ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)>0) //Расчет масштаба графика (баров на пиксел) ?((double)ChartGetInteger(0,CHART_WIDTH_IN_BARS)/ChartGetInteger(0,CHART_WIDTH_IN_PIXELS)) :(1)); //----- Запрашиваем историю сделок и ордеров за указанный период серверного времени. {if(!HistorySelect(0,TimeCurrent())) { Print("HistorySelect Error!"); return; }}//Если неудачно - выходим //----- Определение количества ордеров, сделок, позиций. Вывод графических объектов. nColo=0; //Счетчик колонок вывода //----- Список открытых позиций {if(PositionsView) { Positions_Total=PositionsTotal(); //Текущие позиции Sel_Positions_Total=CalcPositionsTotal(inSelectSym,inEliminatSym,SelSym, inSelectMag,inEliminatMag,SelMag, inSelectTick,inEliminatTick,SelTick); //Текущие позиции отобранные {if(Sel_Positions_Total!=Sel_Positions_Total_Old) //Пересчет - перерисовка при изменении количества { DeleteColo("LIP",Positions_Total_Old); //Колонка позиций CreateColo("LIP",ColoStep*nColo,Positions_Total); }}//if(Sel_Positions_Total!=Sel_Positions_Total_Old) MoveColoLabel( "LIP", //Заголовок колонки ColoStep*nColo, "Position="+ IntegerToString(Sel_Positions_Total)+"/"+ IntegerToString(Positions_Total)+ ((SummView) ?(" ="+DoubleToString(CalcPositionsSumm(inSelectSym,inEliminatSym,SelSym, inSelectMag,inEliminatMag,SelMag, inSelectTick,inEliminatTick,SelTick),2)+" ") :(""))+ "" ); //----- {if(Positions_Total>=0) { nRow=0; CopyTime(TheSymbol,PERIOD_CURRENT,(nFirstBar-(int)((ColoStep*nColo+ColoShift)*kScale)),1,gTime); {for(int i=Positions_Total-1;i>=0;i--) { sTXW="LIP_"+IntegerToString(i); //Устанавливаем имя для текcтового объекта ObjectSetString(0,sTXW,OBJPROP_TEXT," "); //Обнуление строки вывода ulong Pos_Tick=PositionGetTicket(i); //Выбираем позицию по номеру в списке {if(Pos_Tick<=0){continue;}} //Неудачно - следующий {if(!CheckSym(PositionGetString(POSITION_SYMBOL),inSelectSym,inEliminatSym,SelSym)){continue;}}//Не тот символ - следующий {if(!CheckMag(PositionGetInteger(POSITION_MAGIC),inSelectMag,inEliminatMag,SelMag)){continue;}}//Проверка соответствия магика модели по критерию выбора {if(!CheckTick(PositionGetInteger(POSITION_TICKET),inSelectTick,inEliminatTick,SelTick)){continue;}}//Проверка соответствия тикета модели по критерию выбора ENUM_POSITION_TYPE OrdType=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); TypeStringPos=EnumToString(OrdType); StringReplace(TypeStringPos,"POSITION_TYPE_",""); DataStringPos= " "+ IntegerToString(i)+"."+ PositionGetString(POSITION_SYMBOL)+" "+ TypeStringPos+" ["+ IntegerToString(Pos_Tick)+"-"+ IntegerToString(PositionGetInteger(POSITION_MAGIC))+"-"+ DoubleToString(PositionGetDouble(POSITION_VOLUME),2)+"-"+ DoubleToString(PositionGetDouble(POSITION_PRICE_OPEN), (int)SymbolInfoInteger(PositionGetString(POSITION_SYMBOL),SYMBOL_DIGITS))+"]="+ DoubleToString(PositionGetDouble(POSITION_PROFIT),2)+" "+ ""; ResetLastError(); {if(!ObjectSetInteger( 0, //Идентификатор чарта sTXW, //Имя объекта OBJPROP_TIME, //Изменяем координату времени объекта gTime[0] )) { Print("ObjectSetInteger0 Error=",GetLastError()); continue; }}//if(!ObjectSetInteger(... ResetLastError(); {if(!ObjectSetDouble( 0, //Идентификатор чарта sTXW, //Имя объекта OBJPROP_PRICE, //Изменяем координату цены объекта IndHeigh-11*(nRow+1) )) { Print("ObjectSetDouble0 Error=",GetLastError()); continue; }else{ nRow++; }}//if(!ObjectSetDouble(... ObjectSetString(0,sTXW,OBJPROP_TEXT,DataStringPos+""); }}//for(int i=Positions_Total-1;i>=0;i--) }}//if(Positions_Total>=0) //----- Запомним текущие счетчики Positions_Total_Old=Positions_Total; //Текущие позиции Sel_Positions_Total_Old=Sel_Positions_Total; //Текущие позиции отобранные //----- Инкремент счетчика колонок nColo++; }}//if(PositionsView) //----- Список позиций в истории //Перебрать сделки - сформировать массив позиций {if(PositionsHistoryView) { Deals_History_Total=HistoryDealsTotal(); //Совершенные сделки (выполненные ордера) //Print("407. HistoryDealsTotal()=",Deals_History_Total," TimeCurrent()=",TimeCurrent()); int nPosition=0; Positions_History_Total=0; {if(Deals_History_Total>0) { nPosition=0; //Текущая позиция Positions_History_Total=0; //Общее количество позиций ArrayResize(Positions,nPosition+1); //Если мы тут, то одна позиция точно есть Positions[0].ID=0; Positions[0].Symbol=""; {for(int i=0;i<=Deals_History_Total-1;i++) { //if(i>0)break; ulong Deal_Tick=(ulong)HistoryDealGetTicket(i); //Выбираем сделку по номеру в списке {if(Deal_Tick<=0){continue;}} //Неудачно - следующий //Print("423. i=",i," Deal_Tick=",Deal_Tick); //bool Deal_Select=HistoryDealSelect(Deal_Tick); //Выбираем сделку по тикету сделки //--- HistoryDealGetInteger() long DealPositionID=HistoryDealGetInteger(Deal_Tick,DEAL_POSITION_ID); //Идентификатор позиции, в открытии, изменении или закрытии которой участвовала эта сделка. long DealTicket=HistoryDealGetInteger(Deal_Tick,DEAL_TICKET); //Тикет сделки. Уникальное число, которое присваивается каждой сделке long DealOrder=HistoryDealGetInteger(Deal_Tick,DEAL_ORDER); //Ордер, на основание которого выполнена сделка datetime DealTime=(datetime)HistoryDealGetInteger(Deal_Tick,DEAL_TIME); //Время совершения сделки long DealTimeMSC=HistoryDealGetInteger(Deal_Tick,DEAL_TIME_MSC); //Время совершения сделки в миллисекундах с 01.01.1970 ENUM_DEAL_TYPE DealType=(ENUM_DEAL_TYPE)HistoryDealGetInteger(Deal_Tick,DEAL_TYPE); //Тип сделки ENUM_DEAL_ENTRY DealEntry=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(Deal_Tick,DEAL_ENTRY); //Направление сделки – вход в рынок, выход из рынка или разворот long DealMagic=HistoryDealGetInteger(Deal_Tick,DEAL_MAGIC); //Magic number для сделки (смотри ORDER_MAGIC) ENUM_DEAL_REASON DealReson=(ENUM_DEAL_REASON) HistoryDealGetInteger(Deal_Tick,DEAL_REASON); //Причина или источник проведения сделки //--- HistoryDealGetDouble() double DealVolume=HistoryDealGetDouble(Deal_Tick,DEAL_VOLUME); //Объем сделки double DealPrice=HistoryDealGetDouble(Deal_Tick,DEAL_PRICE); //Цена сделки double DealComission=HistoryDealGetDouble(Deal_Tick,DEAL_COMMISSION); //Комиссия по сделке double DealSwap=HistoryDealGetDouble(Deal_Tick,DEAL_SWAP); //Накопленный своп при закрытии double DealProfit=HistoryDealGetDouble(Deal_Tick,DEAL_PROFIT); //Финансовый результат сделки //--- HistoryDealGetString() string DealSymbol=HistoryDealGetString(Deal_Tick,DEAL_SYMBOL); //Имя символа, по которому произведена сделка string DealComment=HistoryDealGetString(Deal_Tick,DEAL_COMMENT); //Комментарий к сделке string DealExternalID=HistoryDealGetString(Deal_Tick,DEAL_EXTERNAL_ID); //Идентификатор сделки во внешней торговой системе (на бирже) //--- Перебор позиций, поиск позиции текущей сделки bool PositionNew=true; {if(i>0) { //{for(int j=0;j<=MaxPosition;j++)//тут возможно лучше считать от конца {for(int j=Positions_History_Total;j>=0;j--)//тут лучше считать от конца { //if( true // && ((j==4)||(j==5)) // && (DealTicket==5087854) // //&& (DealEntry==DEAL_ENTRY_IN) // ) //Print("450. j=",j, // " DealTicket=",DealTicket," DealPositionID=",DealPositionID," DealType=",EnumToString(DealType)," DealEntry=",EnumToString(DealEntry), // " ArraySize()=",ArraySize(Positions)," Positions[j].ID=",Positions[j].ID); {if(Positions[j].ID==DealPositionID) { //if(DealTicket==6643501)Print("446. j=",j," DealTicket=",DealTicket," DealPositionID=",DealPositionID," ArraySize()=",ArraySize(Positions)," Positions[j].ID=",Positions[j].ID);//7370160 PositionNew=false; nPosition=j; break; }}//if(Positions[j].ID==DealPositionID) }}//for(int j=Positions_History_Total;j>=0;j--) }}//if(i>0) //--- Обработка новой или ранее найденной позиции {if(PositionNew) { //Обработка вновь найденной позиции {if(i>0) { Positions_History_Total++; nPosition=Positions_History_Total; ArrayResize(Positions,nPosition+1); //Проверить на количество элементов }}//if(i>0) Positions[nPosition].Profit=0.0; Positions[nPosition].Swap=0.0; Positions[nPosition].Magic=0; {switch(DealEntry) { case DEAL_ENTRY_IN: { //Positions[nPosition].Profit=DealProfit; Positions[nPosition].Type=DealType; Positions[nPosition].Magic=DealMagic; Positions[nPosition].VolumeOpen=DealVolume; Positions[nPosition].VolumeClose=0; Positions[nPosition].PriceOpen=DealPrice; break; } case DEAL_ENTRY_OUT: { Positions[nPosition].VolumeClose=DealVolume; break; } default: break; }}//switch(DealEntry) //Print("490. ArraySize()=",ArraySize(Positions)); }else{ //Обработка ранее найденной позиции {switch(DealEntry) { case DEAL_ENTRY_IN: { Positions[nPosition].VolumeOpen+=DealVolume; break; } case DEAL_ENTRY_OUT: { Positions[nPosition].Magic=DealMagic; Positions[nPosition].Profit+=DealProfit; Positions[nPosition].Swap+=DealSwap; Positions[nPosition].VolumeClose+=DealVolume; Positions[nPosition].PriceClose=DealPrice; break; } default: break; }}//switch(DealEntry) }}//if(PositionNew) {if((DealType==DEAL_TYPE_BUY)||(DealType==DEAL_TYPE_SELL)) { Positions[nPosition].Symbol=DealSymbol; Positions[nPosition].Magic=DealMagic; Positions[nPosition].ID=DealPositionID; }else{ Positions[nPosition].Symbol="BALANCE"; Positions[nPosition].Magic=0; Positions[nPosition].ID=0; }}//if((DealType==DEAL_TYPE_BUY)||(DealType==DEAL_TYPE_SELL)) //if( true // //&& (nPosition==5) // && (DealTicket==5087854) // //&& (DealEntry==DEAL_ENTRY_IN) // ) //Print("505. n=",nPosition," PositionNew=",PositionNew, // " DealTicket=",DealTicket," DealPositionID=",DealPositionID," DealType=",EnumToString(DealType)," DealEntry=",EnumToString(DealEntry), // " ArraySize()=",ArraySize(Positions)," Positions[n].ID=",Positions[nPosition].ID," Positions[n].Type=",EnumToString(Positions[nPosition].Type));//7370160 //Print("441. i=",i," HistoryDealsTotal()=",Deals_History_Total," DealPositionID=",DealPositionID," nPosition=",nPosition," Positions[nPosition].Symbol=",Positions[nPosition].Symbol); }}//for(int j=Positions_History_Total;j>=0;j--) Positions_History_Total++; }}//if(Deals_History_Total>0) //Закрытые позиции отобранные Sel_Positions_History_Total=CalcPositionsHistoryTotal(inSelectSym,inEliminatSym,SelSym, inSelectMag,inEliminatMag,SelMag, inSelectTick,inEliminatTick,SelTick, Positions_History_Total); {if(Sel_Positions_History_Total!=Sel_Positions_History_Total_Old) //Пересчет - перерисовка при изменении количества { DeleteColo("LHP",Positions_History_Total_Old); //Колонка позиций CreateColo("LHP",ColoStep*nColo,Positions_History_Total); }}//if(Sel_History_Deals_Total!=Sel_History_Deals_Total_Old) //----- MoveColoLabel( "LHP", //Заголовок колонки ColoStep*nColo, "PositionHistory="+ IntegerToString(Sel_Positions_History_Total)+"/"+ IntegerToString(Positions_History_Total)+ ((SummView) ?(" ="+DoubleToString(CalcPositionsHistorySumm( inSelectSym,inEliminatSym,SelSym, inSelectMag,inEliminatMag,SelMag, inSelectTick,inEliminatTick,SelTick, Positions_History_Total),2)+" ") :(""))+ "" ); //----- {if((HistoryDealsTotal()>0)&&(Positions_History_Total>0)) //Тут подумать над условием { nRow=0; CopyTime(TheSymbol,PERIOD_CURRENT,(nFirstBar-(int)((ColoStep*nColo+ColoShift)*kScale)),1,gTime); {for(int i=Positions_History_Total-1;i>=0;i--) { //Print("503. i=",i," ArraySize()=",ArraySize(Positions)); sTXW="LHP_"+IntegerToString(i); //Устанавливаем имя для текcтового объекта ObjectSetString(0,sTXW,OBJPROP_TEXT," "); //Обнуление строки вывода {if(!CheckSym(Positions[i].Symbol,inSelectSym,inEliminatSym,SelSym)){continue;}} //Проверка соответствия символа модели по критерию выбора {if(!CheckMag(Positions[i].Magic,inSelectMag,inEliminatMag,SelMag)){continue;}} //Проверка соответствия магика модели по критерию выбора {if(!CheckTick(Positions[i].ID,inSelectTick,inEliminatTick,SelTick)){continue;}} //Проверка соответствия тикета модели по критерию выбора PositionTypeString=EnumToString(Positions[i].Type); StringReplace(PositionTypeString,"DEAL_TYPE_",""); DataStringPos= ""+ IntegerToString(i)+"."+ Positions[i].Symbol+" "+ PositionTypeString+ "["+ IntegerToString(Positions[i].ID)+"-"+ IntegerToString(Positions[i].Magic)+"-"+ DoubleToString(Positions[i].VolumeOpen,2)+"/"+ DoubleToString(Positions[i].VolumeClose,2)+"-"+ DoubleToString(Positions[i].PriceOpen,(int)SymbolInfoInteger(Positions[i].Symbol,SYMBOL_DIGITS))+"/"+ DoubleToString(Positions[i].PriceClose,(int)SymbolInfoInteger(Positions[i].Symbol,SYMBOL_DIGITS))+ "]="+ DoubleToString(Positions[i].Profit,2)+" "+ ""; ResetLastError(); {if(!ObjectSetInteger( 0, //Идентификатор чарта sTXW, //Имя объекта OBJPROP_TIME, //Изменяем координату времени объекта gTime[0] )) { Print("ObjectSetInteger0 Error=",GetLastError()); continue; }}//if(!ObjectSetInteger(... ResetLastError(); {if(!ObjectSetDouble( 0, //Идентификатор чарта sTXW, //Имя объекта OBJPROP_PRICE, //Изменяем координату цены объекта IndHeigh-11*(nRow+1) )) { Print("ObjectSetDouble0 Error=",GetLastError()); continue; }else{ nRow++; }}//if(!ObjectSetDouble(... ObjectSetString(0,sTXW,OBJPROP_TEXT,DataStringPos+""); }}//for(int i=Positions_History_Total-1;i>=0;i--) }}//if((HistoryDealsTotal()>0)&&(Positions_History_Total>0)) //----- Запомним текущие счетчики Positions_History_Total_Old=Positions_History_Total; //Закрытые позиции Sel_Positions_History_Total_Old=Sel_Positions_History_Total; //Закрытые позиции отобранные //----- Инкремент счетчика колонок nColo++; }}//if(PositionsHistoryView) //----- Список открытых отложенных ордеров {if(OrdersView) { Orders_Total=OrdersTotal(); //Текущие лимитные ордера Sel_Orders_Total=CalcOrdersTotal(inSelectSym,inEliminatSym,SelSym, inSelectMag,inEliminatMag,SelMag, inSelectTick,inEliminatTick,SelTick); //Текущие лимитные ордера отобранные {if(Sel_Orders_Total!=Sel_Orders_Total_Old) //Пересчет - перерисовка при изменении количества { DeleteColo("LIO",Orders_Total_Old); //Колонка ордеров CreateColo("LIO",ColoStep*nColo,Orders_Total); }}//if(Sel_Orders_Total!=Sel_Orders_Total_Old) MoveColoLabel("LIO",ColoStep*nColo,"Order="+IntegerToString(Sel_Orders_Total)+"/"+IntegerToString(Orders_Total));//Заголовок колонки //----- {if(Orders_Total>=0) { nRow=0; CopyTime(TheSymbol,PERIOD_CURRENT,(nFirstBar-(int)((ColoStep*nColo+ColoShift)*kScale)),1,gTime); {for(int i=Orders_Total-1;i>=0;i--) { sTXW="LIO_"+IntegerToString(i); //Устанавливаем имя для текcтового объекта ObjectSetString(0,sTXW,OBJPROP_TEXT," "); //Обнуление строки вывода ulong Ord_Tick=OrderGetTicket(i); //Выбираем ордер по номеру в списке {if(Ord_Tick<=0){continue;}} //Неудачно - следующий {if(!CheckSym(OrderGetString(ORDER_SYMBOL),inSelectSym,inEliminatSym,SelSym)){continue;}} //Не тот символ - следующий {if(!CheckMag(OrderGetInteger(ORDER_MAGIC),inSelectMag,inEliminatMag,SelMag)){continue;}} //Проверка соответствия магика модели по критерию выбора {if(!CheckTick(OrderGetInteger(ORDER_TICKET),inSelectTick,inEliminatTick,SelTick)){continue;}}//Проверка соответствия тикета модели по критерию выбора ENUM_ORDER_TYPE OrdType=(ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE); TypeStringOrd=EnumToString(OrdType); StringReplace(TypeStringOrd,"ORDER_TYPE_",""); DataStringOrd= " "+ IntegerToString(i)+"."+ OrderGetString(ORDER_SYMBOL)+" "+ TypeStringOrd+" ["+ IntegerToString(Ord_Tick)+"-"+ IntegerToString(OrderGetInteger(ORDER_MAGIC))+"-"+ DoubleToString(OrderGetDouble(ORDER_VOLUME_CURRENT),2)+"-"+ DoubleToString(OrderGetDouble(ORDER_PRICE_OPEN),(int)SymbolInfoInteger(OrderGetString(ORDER_SYMBOL),SYMBOL_DIGITS))+"]"+ ""; ResetLastError(); {if(!ObjectSetInteger( 0, //Идентификатор чарта sTXW, //Имя объекта OBJPROP_TIME, //Изменяем координату времени объекта gTime[0] )) { Print("ObjectSetInteger1 Error=",GetLastError()); continue; }}//if(!ObjectSetInteger(... ResetLastError(); {if(!ObjectSetDouble( 0, //Идентификатор чарта sTXW, //Имя объекта OBJPROP_PRICE, //Изменяем координату цены объекта IndHeigh-11*(nRow+1) )) { Print("ObjectSetDouble1 Error=",GetLastError()); continue; }else{ nRow++; }}//if(!ObjectSetDouble(... ObjectSetString(0,sTXW,OBJPROP_TEXT,DataStringOrd+""); }}//for(int i=Orders_Total-1;i>=0;i--) }}//if(Orders_Total>=0) //----- Запомним текущие счетчики Orders_Total_Old=Orders_Total; //Текущие лимитные ордера Sel_Orders_Total_Old=Sel_Orders_Total; //Текущие лимитные ордера отобранные //----- Инкремент счетчика колонок nColo++; }}//if(OrdersView) //----- Список ордеров в истории {if(OrdersHistoryView) { Orders_History_Total=HistoryOrdersTotal(); //Закрытые рыночные ордера Sel_Orders_History_Total=CalcHistoryOrdersTotal(inSelectSym,inEliminatSym,SelSym, inSelectMag,inEliminatMag,SelMag, inSelectTick,inEliminatTick,SelTick); //Закрытые рыночные ордера отобранные {if(Sel_Orders_History_Total!=Sel_Orders_History_Total_Old) //Пересчет - перерисовка при изменении количества { DeleteColo("LHO",Orders_History_Total_Old); //Колонка истории ордеров CreateColo("LHO",ColoStep*nColo,Orders_History_Total); }}//if(Sel_History_Orders_Total!=Sel_History_Orders_Total_Old) MoveColoLabel("LHO",ColoStep*nColo,"History Order="+IntegerToString(Sel_Orders_History_Total)+"/"+IntegerToString(Orders_History_Total));//Заголовок колонки //----- {if(Orders_History_Total>=0) { nRow=0; CopyTime(TheSymbol,PERIOD_CURRENT,(nFirstBar-(int)((ColoStep*nColo+ColoShift)*kScale)),1,gTime); {for(int i=Orders_History_Total-1;i>=0;i--) { sTXW="LHO_"+IntegerToString(i); //Устанавливаем имя для текcтового объекта ObjectSetString(0,sTXW,OBJPROP_TEXT," "); //Обнуление строки вывода ulong Ord_Tick=HistoryOrderGetTicket(i); //Выбираем ордер по номеру в списке {if(Ord_Tick<=0){continue;}} //Неудачно - следующий {if(!CheckSym(HistoryOrderGetString(Ord_Tick,ORDER_SYMBOL),inSelectSym,inEliminatSym,SelSym)){continue;}}//Не тот символ - следующий {if(!CheckMag(HistoryOrderGetInteger(Ord_Tick,ORDER_MAGIC),inSelectMag,inEliminatMag,SelMag)){continue;}}//Проверка соответствия магика модели по критерию выбора {if(!CheckTick(HistoryOrderGetInteger(Ord_Tick,ORDER_TICKET),inSelectTick,inEliminatTick,SelTick)){continue;}}//Проверка соответствия тикета модели по критерию выбора ENUM_ORDER_TYPE OrdType=(ENUM_ORDER_TYPE)HistoryOrderGetInteger(Ord_Tick,ORDER_TYPE); TypeStringOrd=EnumToString(OrdType); StringReplace(TypeStringOrd,"ORDER_TYPE_",""); DataStringOrd= " "+ IntegerToString(i)+"."+ HistoryOrderGetString(Ord_Tick,ORDER_SYMBOL)+" "+ TypeStringOrd+" ["+ IntegerToString(Ord_Tick)+"-"+ IntegerToString(HistoryOrderGetInteger(Ord_Tick,ORDER_MAGIC))+"-"+ DoubleToString(HistoryOrderGetDouble(Ord_Tick,ORDER_VOLUME_INITIAL),2)+"-"+ DoubleToString(HistoryOrderGetDouble(Ord_Tick,ORDER_PRICE_OPEN), (int)SymbolInfoInteger(HistoryOrderGetString(Ord_Tick,ORDER_SYMBOL),SYMBOL_DIGITS))+"]"+ ""; ResetLastError(); {if(!ObjectSetInteger( 0, //Идентификатор чарта sTXW, //Имя объекта OBJPROP_TIME, //Изменяем координату времени объекта gTime[0] )) { Print("ObjectSetInteger2 Error=",GetLastError()); continue; }}//if(!ObjectSetInteger(... ResetLastError(); {if(!ObjectSetDouble( 0, //Идентификатор чарта sTXW, //Имя объекта OBJPROP_PRICE, //Изменяем координату цены объекта IndHeigh-11*(nRow+1) )) { Print("ObjectSetDouble2 Error=",GetLastError()); continue; }else{ nRow++; }}//if(!ObjectSetDouble(... ObjectSetString(0,sTXW,OBJPROP_TEXT,DataStringOrd+""); }}//for(int i=History_Orders_Total-1;i>=0;i--) }}//if(History_Orders_Total>=0) //----- Запомним текущие счетчики Orders_History_Total_Old=Orders_History_Total; //Закрытые рыночные ордера Sel_Orders_History_Total_Old=Sel_Orders_History_Total; //Закрытые рыночные ордера отобранные //----- Инкремент счетчика колонок nColo++; }}//if(OrdersHistoryView) //----- Список сделок в истории {if(DealsHistoryView) { Deals_History_Total=HistoryDealsTotal(); //Совершенные сделки (выполненные ордера) Sel_Deals_History_Total=CalcHistoryDealsTotal(inSelectSym,inEliminatSym,SelSym, inSelectMag,inEliminatMag,SelMag, inSelectTick,inEliminatTick,SelTick); //Совершенные сделки (выполненные ордера) отобранные {if(Sel_Deals_History_Total!=Sel_Deals_History_Total_Old) //Пересчет - перерисовка при изменении количества { DeleteColo("LHD",Deals_History_Total_Old); //Колонка истории позиций CreateColo("LHD",ColoStep*nColo,Deals_History_Total); }}//if(Sel_History_Deals_Total!=Sel_History_Deals_Total_Old) MoveColoLabel( "LHD", //Заголовок колонки ColoStep*nColo, "History Dial="+ IntegerToString(Sel_Deals_History_Total)+"/"+ IntegerToString(Deals_History_Total)+ ((SummView) ?(" ="+DoubleToString(CalcHistoryDealsSumm( inSelectSym,inEliminatSym,SelSym, inSelectMag,inEliminatMag,SelMag, inSelectTick,inEliminatTick,SelTick),2)+" ") :(""))+ "" ); //----- {if(Deals_History_Total>=0) { nRow=0; CopyTime(TheSymbol,PERIOD_CURRENT,(nFirstBar-(int)((ColoStep*nColo+ColoShift)*kScale)),1,gTime); {for(int i=Deals_History_Total-1;i>=0;i--) { sTXW="LHD_"+IntegerToString(i); //Устанавливаем имя для текcтового объекта ObjectSetString(0,sTXW,OBJPROP_TEXT," "); //Обнуление строки вывода ulong Deal_Tick=HistoryDealGetTicket(i); //Выбираем ордер по номеру в списке {if(Deal_Tick<=0){continue;}} //Неудачно - следующий {if(!CheckSym(HistoryDealGetString(Deal_Tick,DEAL_SYMBOL),inSelectSym,inEliminatSym,SelSym)){continue;}}//Не тот символ - следующий {if(!CheckMag(HistoryDealGetInteger(Deal_Tick,DEAL_MAGIC),inSelectMag,inEliminatMag,SelMag)){continue;}}//Проверка соответствия магика модели по критерию выбора {if(!CheckTick(HistoryDealGetInteger(Deal_Tick,DEAL_TICKET),inSelectTick,inEliminatTick,SelTick)){continue;}}//Проверка соответствия тикета модели по критерию выбора ENUM_DEAL_TYPE DealType=(ENUM_DEAL_TYPE)HistoryDealGetInteger(Deal_Tick,DEAL_TYPE); DealTypeString=EnumToString(DealType); StringReplace(DealTypeString,"DEAL_TYPE_",""); DataStringDeal= " "+ IntegerToString(i)+"."+ HistoryDealGetString(Deal_Tick,DEAL_SYMBOL)+" "+ DealTypeString+" ["+ IntegerToString(Deal_Tick)+"-"+ IntegerToString(HistoryDealGetInteger(Deal_Tick,DEAL_MAGIC))+"-"+ DoubleToString(HistoryDealGetDouble(Deal_Tick,DEAL_VOLUME),2)+"-"+ DoubleToString(HistoryDealGetDouble(Deal_Tick,DEAL_PRICE), (int)SymbolInfoInteger(HistoryDealGetString(Deal_Tick,DEAL_SYMBOL),SYMBOL_DIGITS))+"]="+ DoubleToString(HistoryDealGetDouble(Deal_Tick,DEAL_PROFIT),2)+" "+ IntegerToString(HistoryDealGetInteger(Deal_Tick,DEAL_POSITION_ID))+" "+ //Идентификатор позиции, в открытии, изменении или закрытии которой участвовала эта сделка. ""; ResetLastError(); {if(!ObjectSetInteger( 0, //Идентификатор чарта sTXW, //Имя объекта OBJPROP_TIME, //Изменяем координату времени объекта gTime[0] )) { Print("ObjectSetInteger3 Error=",GetLastError()); continue; }}//if(!ObjectSetInteger(... ResetLastError(); {if(!ObjectSetDouble( 0, //Идентификатор чарта sTXW, //Имя объекта OBJPROP_PRICE, //Изменяем координату цены объекта IndHeigh-11*(nRow+1) )) { Print("ObjectSetDouble3 Error=",GetLastError()); continue; }else{ nRow++; }}//if(!ObjectSetDouble(... ObjectSetString(0,sTXW,OBJPROP_TEXT,DataStringDeal+""); }}//for(int i=History_Deals_Total-1;i>=0;i--) }}//if(History_Deals_Total>=0) //----- Запомним текущие счетчики Deals_History_Total_Old=Deals_History_Total; //Совершенные сделки (выполненные ордера) Sel_Deals_History_Total_Old=Sel_Deals_History_Total; //Совершенные сделки (выполненные ордера) отобранные //----- Инкремент счетчика колонок nColo++; }}//if(DealsHistoryView) //----- Формируем строку комментария на чарте {if(CommentView) { CommentLine[0]=""+ "PositionsTotal="+IntegerToString(Positions_Total)+" "+ "OrdersTotal="+IntegerToString(Orders_Total)+" "+ ""; CommentLine[1]=""+ "PositionsHistoryTotal="+IntegerToString(Positions_History_Total)+" "+ "OrdersHistoryTotal="+IntegerToString(Orders_History_Total)+" "+ "DealsHistoryTotal="+IntegerToString(Deals_History_Total)+" "+ ""; Comment( CommentLine[0]+" "+CommentLine[1]+" "+ (string)(datetime)(TimeCurrent()-ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0)*PeriodSeconds(PERIOD_CURRENT))+" "+ _n+"Ticks>>"+IntegerToString(gnTick)+" Tims>>"+IntegerToString(gnTimer)); }}//if(CommentView) //----- Перерисовка чарта ChartRedraw(); //----- return; }//On_Tick() // //============================================================================================= MQL5 === // On_Timer - Обработка событий по таймеру //------------------------------------------------------------------------------------------------------ void On_Timer() { //----- gnTimer++; {if(gnTimer>4294967000) { gnTimer=100; }}//if(gnTimer>4294967000) gInTimer=true; On_Tick(); }//On_Timer()