Торговая Таблица: Сортировка списка при условии, и смещение данных при таймфреймах(M1-M12, H1-H12)

 

Добрый день, уважаемые трейдеры, программисты, любители и профи!


В программировании не долго, но пробую писать новое постоянно. Читаю форумы и статьи для самообучения.
Решил написать таблицу для Forex чтобы торговать было удобнее. Пишу без ООП, по причине "читаемости" для себя кода, и конечно же НЕ специалист в этом.

Столкнулся с некоторым вопросами, который не смог самостоятельно решить:

1) можно ли сделать сортировку списка "Pair" чтобы отображался не весь список, а только те, что подходят условию (например if(RSI[1]>80) и if(RSI[1]<20) ) и с обновлением данных, значение списка менялось на те, что подходят условию?
   как я понимаю надо что то сделать с массивом TradePairs.

надо убрать из списка те инструменты, у которых значения не подходят по условию.


2) можно ли как то обойти то, что компилятор или терминал воспринимает таймфрейм-периоды как одинаковые (это PERIOD_M1 и PERIOD_M12, так же PERIOD_H1 и PERIOD_H12)?

в таблице он почему то не отображает часть данных при обновлении (нового бара данного периода). Такое только с этими таймфреймами.

3) помогите с кодом по времени до конца бара (начиная от H1 и выше не получается нормально отобразить)



Прикладываю код таблицы, может кому и будет интересно (на здоровье!)во вкладке "Вложенное".

Сюда прикрепляю место проблемной зоны №1:

Заранее благодарю всех , кто сможет как то помочь, направить.)))

//========================================================================================================
//======================================================================================================  |
//|                              DATA_RSI_TIMEFRAME                                                | |
//======================================================================================================  |
//======================================================================================================== 
void DATA_RSI_TIMEFRAME(ENUM_TIMEFRAMES TF,int X_AXIS)
{  int   i; 
   int   Instruments=ArraySize(TradePairs); 
   for(i=0;i<Instruments;i++)
      {  //--- Arrays Handle Indicators
         RSI_handle   =iRSI(TradePairs[i],TF,MaPeriod,PRICE_CLOSE);
         if(RSI_handle<0)   {Print("RSI_handle_TIME_FRAME NOT CREATET: = ",INVALID_HANDLE);     Print("execution error = ",GetLastError());return;}
         //---
         BarsHistory=Bars(TradePairs[i],TF);
         if(BarsHistory<CountsBars)BarsHistory=BarsHistory;
         else BarsHistory=CountsBars;
         if(BarsHistory==0)BarsHistory=0;
         //--- Копируем значения хендла индикатора в буффер индикатора 
         if(CopyBuffer(RSI_handle,0,0,BarsHistory,RSI)<=0)       {Print("RSI_handle_TIME_FRAME Failed to copy indicator. Error = ",GetLastError());return;}     
         ArraySetAsSeries(RSI,true);                                                                                                              
         //---находим стандартное отклонение между средней и ценой закрытия на 1 баре
         //=============================================== 
         if(RSI[1]>50)RSIColor=clrGreen;else RSIColor=clrRed;
         //---
         if(RSI_handle!=INVALID_HANDLE)IndicatorRelease(RSI_handle);
         //---
         // здесь наверно должно быть условие чтобы список TradePairs менялся на те, что подходят условию например if(RSI[1]>80) и if(RSI[1]<20) 
         if(RSI[1]>60||RSI[1]<40)
           {
               if(!LabelCreate(0,"rLaCrRSI_"+(string)TF       +IntegerToString(i),0,X_AXIS+5,y+90+(i*16),CORNER_LEFT_UPPER,DoubleToString(RSI[1],1),"Arial",8,RSIColor,0,ANCHOR_LEFT_UPPER,false,false,true,0))return;
               if(!RectLabelCreate(0,"rReLaCrRSI_"+(string)TF +IntegerToString(i),0,X_AXIS,y+90+(i*16),60,16,clrBlack,BORDER_FLAT,CORNER_LEFT_UPPER,clrBlack,STYLE_SOLID,0,true,false,false,0))return;             
      
           }
        
      }        
} 
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Периоды графиков
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Периоды графиков
  • www.mql5.com
Все предопределенные периоды графиков имеют уникальные идентификаторы. Идентификатор PERIOD_CURRENT означает текущий период графика, на котором запущена mql5-программа.
Файлы:
 

начал пробовать условие пока только на одном ТФ, что удалось сделать за некоторое время:


1) получилось прописать условие и как результат отображение нужных инструментов "Pair" 


2) получилось удалять данные при обновлении которые не подошли условию.




Остается все тот же вопрос:

Как удалить "не прошедшие условия" данные и заполнить таблицу только с данными по условию???

void DATA_RSI_TIMEFRAME(ENUM_TIMEFRAMES TF,int X_AXIS)
{  int   i; 
   int   Instruments=ArraySize(TradePairs); 
   for(i=0;i<Instruments;i++)
      {  
         //--- Arrays Handle Indicators
         RSI_handle   =iRSI(TradePairs[i],TF,MaPeriod,PRICE_CLOSE);
         if(RSI_handle<0)   {Print("RSI_handle_TIME_FRAME NOT CREATET: = ",INVALID_HANDLE);     Print("execution error = ",GetLastError());return;}
         //---
         BarsHistory=Bars(TradePairs[i],TF);
         if(BarsHistory<CountsBars)BarsHistory=BarsHistory;
         else BarsHistory=CountsBars;
         if(BarsHistory==0)BarsHistory=0;
         //--- Копируем значения хендла индикатора в буффер индикатора 
         if(CopyBuffer(RSI_handle,0,0,BarsHistory,RSI)<=0)       {Print("RSI_handle_TIME_FRAME Failed to copy indicator. Error = ",GetLastError());return;}     
         ArraySetAsSeries(RSI,true);                                                                                                              
         //---находим стандартное отклонение между средней и ценой закрытия на 1 баре
         //=============================================== 
         if(RSI[1]>50)RSIColor=clrGreen;else RSIColor=clrRed;
         //---
         if(RSI_handle!=INVALID_HANDLE)IndicatorRelease(RSI_handle);
         //---
         
         if(RSI[1]>60||RSI[1]<40)
           {   
               
               
               RectLabelCreate(0,"rTable",       0,3,y+88,1600,(i*17),clrGray,BORDER_FLAT,CORNER_LEFT_UPPER,clrBlack,STYLE_SOLID,0,true,false,false,0);   
               RectLabelCreate(0,"rTableDN",     0,3,y+90+(i*16),1600,60,clrGray,BORDER_FLAT,CORNER_LEFT_UPPER,clrBlack,STYLE_SOLID,0,true,false,true,0);   
               //====
               RectLabelCreate(0,"rRange%MN1"   +IntegerToString(i),0,7,y+90+(i*16),35,16,clrBlack,BORDER_FLAT,CORNER_LEFT_UPPER,clrBlack,STYLE_SOLID,0,true,false,false,0);   
               RectLabelCreate(0,"rRangePpMN1"  +IntegerToString(i),0,41,y+90+(i*16),35,16,clrBlack,BORDER_FLAT,CORNER_LEFT_UPPER,clrBlack,STYLE_SOLID,0,true,false,false,0);   
               RectLabelCreate(0,"rRange%W1"    +IntegerToString(i),0,76,y+90+(i*16),35,16,clrBlack,BORDER_FLAT,CORNER_LEFT_UPPER,clrBlack,STYLE_SOLID,0,true,false,false,0);   
               RectLabelCreate(0,"rRangePpW1"   +IntegerToString(i),0,110,y+90+(i*16),35,16,clrBlack,BORDER_FLAT,CORNER_LEFT_UPPER,clrBlack,STYLE_SOLID,0,true,false,false,0);   
               RectLabelCreate(0,"rRange%D1"    +IntegerToString(i),0,145,y+90+(i*16),35,16,clrBlack,BORDER_FLAT,CORNER_LEFT_UPPER,clrBlack,STYLE_SOLID,0,true,false,false,0);   
               RectLabelCreate(0,"rRangePpD1"   +IntegerToString(i),0,179,y+90+(i*16),35,16,clrBlack,BORDER_FLAT,CORNER_LEFT_UPPER,clrBlack,STYLE_SOLID,0,true,false,false,0);   
               //===
               RectLabelCreate(0,"rLastBid"     +IntegerToString(i),0,215,y+90+(i*16),60,16,clrBlack,BORDER_FLAT,CORNER_LEFT_UPPER,clrBlack,STYLE_SOLID,0,true,false,false,0);    
               //===
               RectLabelCreate(0,"rColors"      +IntegerToString(i),0,275,y+90+(i*16),8,16,clrBlack,BORDER_FLAT,CORNER_LEFT_UPPER,clrBlack,STYLE_SOLID,0,true,false,false,0);    
               ButtonCreate(0,"Pair"            +IntegerToString(i),0,283,y+90+(i*16),55,17,CORNER_LEFT_UPPER,StringSubstr(TradePairs[i],0,6),"Arial",8,clrBlack,clrWhiteSmoke,clrNONE,false,false,true,0);     
               //===   
               RectLabelCreate(0,"rTools"       +IntegerToString(i),0,1602,y+90+(i*16),53,16,clrBlack,BORDER_FLAT,CORNER_LEFT_UPPER,clrBlack,STYLE_SOLID,0,true,false,false,0);   
               LabelCreate(0,"rTools_"          +IntegerToString(i),0,1607,y+90+(i*16),CORNER_LEFT_UPPER,StringSubstr(TradePairs[i],0,6),"Arial",8,clrWhite,0,ANCHOR_LEFT_UPPER,false,false,true,0);
   
               if(!LabelCreate(0,"rLaCrRSI_"       +IntegerToString(i),0,X_AXIS+5,y+90+(i*16),CORNER_LEFT_UPPER,DoubleToString(RSI[1],1),"Arial",8,RSIColor,0,ANCHOR_LEFT_UPPER,false,false,true,0))return;
               if(!RectLabelCreate(0,"rReLaCrRSI_" +IntegerToString(i),0,X_AXIS,y+90+(i*16),60,16,clrBlack,BORDER_FLAT,CORNER_LEFT_UPPER,clrBlack,STYLE_SOLID,0,true,false,false,0))return;              
           }
                  
         if(RSI[1]<60 && RSI[1]>40)
           {
               ObjectDelete(0,"rRange%MN1" +IntegerToString(i));   
               ObjectDelete(0,"rRangePpMN1"+IntegerToString(i));   
               ObjectDelete(0,"rRange%W1"  +IntegerToString(i));   
               ObjectDelete(0,"rRangePpW1" +IntegerToString(i));   
               ObjectDelete(0,"rRange%D1"  +IntegerToString(i));   
               ObjectDelete(0,"rRangePpD1" +IntegerToString(i));   
               ObjectDelete(0,"rLastBid"   +IntegerToString(i));    
               ObjectDelete(0,"rColors"    +IntegerToString(i));    
               ObjectDelete(0,"Pair"       +IntegerToString(i));     
               ObjectDelete(0,"rTools"     +IntegerToString(i));   
               ObjectDelete(0,"rTools_"    +IntegerToString(i));
               ObjectDelete(0,"rLaCrRSI_"  +IntegerToString(i));
               ObjectDelete(0,"rReLaCrRSI_"+IntegerToString(i));                
           }
      
      }      
} 
Файлы:
Причина обращения: