schartssynchroscroll_v1

Author: Integer
Price Data Components
0 Views
0 Downloads
0 Favorites
schartssynchroscroll_v1
#property copyright "Integer"
#property link      "http://dmffx.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   long h[];
   int Charts;

   Charts=fChartGetIDList(h);

   long FVBFL[];
   long MSH[];
   long LS[];
   datetime tm[1];
   datetime tm2[];

   ArrayResize(FVBFL,Charts);
   ArrayResize(MSH,Charts);
   ArrayResize(LS,Charts);

   for(int i=0;i<Charts;i++)
     {
      ChartSetInteger(h[i],CHART_AUTOSCROLL,false);
      ChartSetInteger(h[i],CHART_SHIFT,true);
      ChartRedraw(h[i]);
      FVBFL[i]=fChartGetLeftVisBarFromLeft(h[i]);
      MSH[i]=fChartGetMarkerShift(h[i]);
      LS[i]=ChartGetInteger(h[i],CHART_SCALE);
     }

   long MainChartID=ChartID();
   long MainChartMarkerShift=fChartGetMarkerShift(ChartID());
   int MainIndex;

   MainIndex=0;
   for(int i=0;i<Charts;i++)
     {
      if(MainChartID==h[i])
        {
         MainIndex=i;
         break;
        }
     }

   datetime LT=0;

   while(!IsStopped())
     {

      bool f=false;

      for(int i=0;i<Charts;i++)
        {
         ChartRedraw(h[i]);
         if(LS[i]!=ChartGetInteger(h[i],CHART_SCALE))
           {
            LS[i]=ChartGetInteger(h[i],CHART_SCALE);
            MSH[i]=fChartGetMarkerShift(h[i]);
            f=true;
           }
         long fvbfl=fChartGetLeftVisBarFromLeft(h[i]);
         if(fvbfl>0 && fvbfl!=FVBFL[i])
           {
            if(MainChartID!=h[i])
              {
               MainChartID=h[i];
               MainChartMarkerShift=MSH[i];
               MainIndex=i;
              }
            FVBFL[i]=fvbfl;
           }
        }

      MainChartMarkerShift=MSH[MainIndex];
      long MainIndexAtMarker=ChartGetInteger(MainChartID,CHART_FIRST_VISIBLE_BAR)-MainChartMarkerShift;
      if(MainIndexAtMarker<0)MainIndexAtMarker=0;
      CopyTime(ChartSymbol(MainChartID),ChartPeriod(MainChartID),int(MainIndexAtMarker),1,tm);
      fObjVLine(MQL5InfoString(MQL5_PROGRAM_NAME)+"_1_"+IntegerToString(MainIndex),tm[0],"",0,Blue,1,STYLE_SOLID,MainChartID,true,true,false,OBJ_ALL_PERIODS);
      fObjVLine(MQL5InfoString(MQL5_PROGRAM_NAME)+"_2_"+IntegerToString(MainIndex),tm[0],"",0,Red,1,STYLE_DOT,MainChartID,false,true,false,OBJ_ALL_PERIODS);
      ChartRedraw(MainChartID);
      if(LT!=tm[0] || f)
        {
         LT=tm[0];
         for(int j=0;j<Charts;j++)
           {
            if(MainChartID!=h[j])
              {
               ArrayResize(tm2,Bars(ChartSymbol(h[j]),ChartPeriod(h[j])));
               CopyTime(ChartSymbol(h[j]),ChartPeriod(h[j]),0,Bars(ChartSymbol(h[j]),ChartPeriod(h[j])),tm2);
               int p=ArrayBsearch(tm2,tm[0]);
               if(p<0)
                 {
                  p=0;
                 }
               if(p>=ArraySize(tm2))
                 {
                  p=ArraySize(tm2)-1;
                 }
               if(tm2[p]>tm[0])
                 {
                  p--;
                 }
               if(p<0)
                 {
                  p=0;
                 }
               long a=Bars(ChartSymbol(h[j]),ChartPeriod(h[j]))-p-1;
               ChartNavigate(h[j],CHART_END,int(a));
               fObjVLine(MQL5InfoString(MQL5_PROGRAM_NAME)+"_1_"+IntegerToString(j),tm2[p],"",0,Blue,1,STYLE_SOLID,h[j],true,true,false,OBJ_ALL_PERIODS);
               fObjVLine(MQL5InfoString(MQL5_PROGRAM_NAME)+"_2_"+IntegerToString(j),tm2[p],"",0,Red,1,STYLE_DOT,h[j],false,true,false,OBJ_ALL_PERIODS);
               ChartRedraw(h[j]);
               long x=fChartGetLeftVisBarFromLeft(h[j]);
               if(x>0)FVBFL[j]=x;

              }
           }
        }

      Sleep(1);

     }

   Comment("");

   for(int i=0;i<Charts;i++)
     {
      fObjDeleteByPrefix(MQL5InfoString(MQL5_PROGRAM_NAME),h[i]);
     }

   return;

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
long fChartGetMarkerShift(long aChartID)
  {
   long LeftBar=ChartGetInteger(aChartID,CHART_FIRST_VISIBLE_BAR);
   ChartNavigate(aChartID,CHART_END,0);
   ChartRedraw(aChartID);
   long MarkerShift=ChartGetInteger(aChartID,CHART_FIRST_VISIBLE_BAR);
   ChartNavigate(aChartID,CHART_END,int(LeftBar-MarkerShift));
   ChartRedraw(aChartID);
   return(MarkerShift);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
long fChartGetLeftVisBarFromLeft(long aChartID)
  {
   return(Bars(ChartSymbol(aChartID),ChartPeriod(aChartID))-1-ChartGetInteger(aChartID,CHART_FIRST_VISIBLE_BAR));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int fChartGetIDList(long  &aList[])
  {
   ArrayResize(aList,0);
   long p_handle=0;
   long handle=ChartNext(p_handle);
   while(handle!=-1)
     {
      p_handle=handle;
      ArrayResize(aList,ArraySize(aList)+1);
      aList[ArraySize(aList)-1]=handle;
      handle=ChartNext(p_handle);
     }
   return(ArraySize(aList));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int fObjVLine(string   aObjName,
              datetime aTime,
              string   aText       =  "",
              int      aWindow     =  0,
              color    aColor      =  Red,
              color    aWidth      =  1,
              color    aStyle      =  0,
              long     aChartID    =  0,
              bool     aBack       =  true,
              bool     aSelectable =  true,
              bool     aSelected   =  false,
              long     aTimeFrames =  OBJ_ALL_PERIODS
              )
  {
   if(aText=="")
     {
      aText=TimeToString(aTime);
     }
   int Rv=0;
   int wn=ObjectFind(aChartID,aObjName);
   if(wn!=aWindow)
     {
      Rv=1;
      if(wn>=0)
        {
         ObjectDelete(aChartID,aObjName);
         Rv=2;
        }
      ObjectCreate(aChartID,aObjName,OBJ_VLINE,aWindow,aTime,0);
     }

   ObjectSetInteger(aChartID,aObjName,OBJPROP_BACK,aBack);
   ObjectSetInteger(aChartID,aObjName,OBJPROP_COLOR,aColor);
   ObjectSetInteger(aChartID,aObjName,OBJPROP_SELECTABLE,aSelectable);
   ObjectSetInteger(aChartID,aObjName,OBJPROP_SELECTED,aSelected);
   ObjectSetInteger(aChartID,aObjName,OBJPROP_TIMEFRAMES,aTimeFrames);
   ObjectSetString(aChartID,aObjName,OBJPROP_TEXT,aText);
   ObjectSetInteger(aChartID,aObjName,OBJPROP_WIDTH,aWidth);
   ObjectSetInteger(aChartID,aObjName,OBJPROP_STYLE,aStyle);
   ObjectMove(aChartID,aObjName,0,aTime,0);
   return(Rv);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string fNameChartByID(long aChartID)
  {
   return(ChartSymbol(aChartID)+" "+fNameTimeFrame(ChartPeriod(aChartID)));
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string fNameTimeFrame(int arg)
  {
   if(arg==0)
     {
      arg=Period();
     }
   switch(arg)
     {
      case PERIOD_M1:return("M1");
      case PERIOD_M2:return("M2");
      case PERIOD_M3:return("M3");
      case PERIOD_M4:return("M4");
      case PERIOD_M5:return("M5");
      case PERIOD_M6:return("M6");
      case PERIOD_M10:return("M10");
      case PERIOD_M12:return("M12");
      case PERIOD_M15:return("M15");
      case PERIOD_M20:return("M20");
      case PERIOD_M30:return("M30");
      case PERIOD_H1:return("H1");
      case PERIOD_H2:return("H2");
      case PERIOD_H3:return("H3");
      case PERIOD_H4:return("H4");
      case PERIOD_H6:return("H6");
      case PERIOD_H8:return("H8");
      case PERIOD_H12:return("H12");
      case PERIOD_D1:return("D1");
      case PERIOD_W1:return("W1");
      case PERIOD_MN1:return("MN1");
      default:return("M"+IntegerToString(arg));
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void fObjDeleteByPrefix(string aPrefix,long aChartID=0)
  {
   for(int i=ObjectsTotal(aChartID)-1;i>=0;i--)
     {
      if(StringFind(ObjectName(aChartID,i),aPrefix,0)==0)
        {
         ObjectDelete(aChartID,ObjectName(aChartID,i));
        }
     }
  }
//+------------------------------------------------------------------+

Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---