Login Page - Create Account

Support Board


Date/Time: Sun, 05 May 2024 21:55:37 +0000



Post From: Getting Timely and Accurate IB Data (Interactive Brokers) with version 1148+

[2014-06-21 23:36:22]
Kiwi - Posts: 374
First version (ignore inputs and commented out code which relate to my personal requirements):


/*==========================================================================*/
SCSFExport scsf_TrueLive_2014(SCStudyInterfaceRef sc) {

SCFloatArray& O = sc.BaseDataIn[0], H = sc.BaseDataIn[1],
L = sc.BaseDataIn[2], C = sc.BaseDataIn[3],
V = sc.BaseDataIn[4], T = sc.BaseDataIn[5];
SCSubgraphRef oO = sc.Subgraph[0], oH = sc.Subgraph[1],
oL = sc.Subgraph[2], oC = sc.Subgraph[3],
oV = sc.Subgraph[4], oT = sc.Subgraph[5];
SCSubgraphRef oo = sc.Subgraph[10], oh = sc.Subgraph[11],
          ol = sc.Subgraph[12], oc = sc.Subgraph[13],
          ov = sc.Subgraph[14], ot = sc.Subgraph[15],
          o2 = sc.Subgraph[22], o3 = sc.Subgraph[23],
          o4 = sc.Subgraph[24], o5 = sc.Subgraph[25],
          o6 = sc.Subgraph[26], o7 = sc.Subgraph[27];

  if (sc.SetDefaults) {
sc.GraphName = "TrueLive";
sc.StudyDescription = "True Live using Custom Chart 2014 Release";
sc.Subgraph[0].Name = "Open";
  sc.Subgraph[1].Name = "High";
sc.Subgraph[2].Name = "Low";
  sc.Subgraph[3].Name = "Last";
sc.Subgraph[4].Name = "Volume";
  sc.Subgraph[5].Name = "# of Trades";
sc.Subgraph[6].Name = "HL";
sc.Subgraph[7].Name = "HLC";
sc.Subgraph[8].Name = "OHLC";

oO.Name="oO"; oH.Name="oH"; oL.Name="oL";
oC.Name="oC"; oV.Name="oV"; oT.Name="oT";
o2.Name="o2"; o3.Name="o3"; o4.Name="o4";
o5.Name="o5"; o6.Name="o6"; o7.Name="o7";

sc.Input[4].Name = "Fixed Scale (Set Value)";
  sc.Input[4].SetFloat(180);
sc.Input[5].Name = "Scale Increment";
  sc.Input[5].SetFloat(5);
sc.Input[6].Name = "Offset LO change direcLIon";
  sc.Input[6].SetFloat(1.5);
sc.Input[7].Name = "Use Centred (vs Const Range)";
  sc.Input[7].ValueType=YESNO_VALUE;
sc.Input[8].Name = "Show Inside Bars";
  sc.Input[8].ValueType=YESNO_VALUE;

sc.GraphRegion = 0; // First region
sc.GraphDrawType = GDT_CANDLESTICK;
sc.DisplayAsMainPriceGraph=1;
sc.IsCustomChart = 1;
sc.UpdateAlways=1;
sc.DrawZeros=0;
return;
}
sc.FreeDLL = 1;

int& ChartNumber = sc.PersistVars->i3;
int& lastVis = sc.PersistVars->i4;
float& offset = sc.Input[6].FloatValue;
float& ActiveToolIndex = sc.PersistVars->f1;
double& CurrentBarTime = sc.PersistVars->d1;

int i, j, as = sc.ArraySize-1;
  int ap = as - 1;
int& seqno = sc.PersistVars->i1;

if (sc.UpdateStartIndex == 0) {
int os = 0; // os stores the position of the out array
    seqno = 0;
sc.ResizeArrays(0);
for ( ; os < sc.ArraySize; os++) {
sc.AddElements(1);
      sc.DateTimeOut[os] = sc.BaseDateTimeIn[os];
oO[os] = O[os];
      oH[os] = H[os];
oL[os] = L[os];
      oC[os] = C[os];
oV[os] = V[os];
      oT[os] = T[os];
sc.Subgraph[SC_HL][os] = (oH[os] + oL[os]) / 2;
sc.Subgraph[SC_HLC][os] = (oH[os] + oL[os] + oC[os]) / 3;
sc.Subgraph[SC_OHLC][os] = (oH[os] + oL[os] + oC[os] + oO[os]) / 4;
}
}

  
  // First deal with underlying data
int os = sc.OutArraySize-1;
  // add an extra bar if the underlying is later than the output bar
  if( sc.BaseDateTimeIn[as] > sc.DateTimeOut[os] ) {
os++;
    sc.AddElements(1);
sc.DateTimeOut[os] = sc.BaseDateTimeIn[as];
    oO[os] = oH[os] = oL[os] = oC[os] = O[as];
}
  int op = os - 1;
if (sc.DateTimeOut[os] == sc.BaseDateTimeIn[as]) {
    // update this bar
    oO[os] = O[as];
    oH[os] = max(H[as], oH[os]);
    oL[os] = min(L[as], oL[os]);
    oC[os] = C[as];
    oV[os] = V[as];
    oT[os] = T[as];
    // match prior bar to 5 second data
    oO[op] = O[ap];
    oH[op] = H[ap];
    oL[op] = L[ap];
    oC[op] = C[ap];
    oV[op] = V[ap];
    oT[op] = T[ap];
  }
  else if (sc.DateTimeOut[op] == sc.BaseDateTimeIn[as]) {
    // must be in first 5 seconds of new bar so
    // update prior bar with 5 second data
    oO[op] = O[as];
    oH[op] = max(H[as], oH[op]);
    oL[op] = min(L[as], oL[op]);
    oC[op] = C[as];
    oV[op] = V[as];
    oT[op] = T[as];
  }

  // then look at live data
  SCTimeAndSalesArray TSArray;
  sc.GetTimeAndSales(TSArray);
  int ts = TSArray.GetArraySize() - 1;
  o4[os] = 0;
  o2[os] = TSArray[ts].Sequence - seqno;
  o3[os] = TSArray[ts].Sequence;
  if (ts >= 0 && TSArray[ts].Sequence > seqno) {
    int tp = ts, adjt = sc.TimeScaleAdjustment.GetTime();
    double adj = sc.TimeScaleAdjustment;
    while (TSArray[tp].Sequence > seqno) {tp--;}
    // tp++;
    // iterate through each time & sales value
    o5[os] = TSArray[tp].DateTime.GetTime() + adjt;
    o6[os] = sc.DateTimeOut[os].GetTime() + sc.SecondsPerBar;
    for ( ; tp <= ts; tp++) {
      if (TSArray[tp].DateTime.GetTime() + adjt >=
         sc.DateTimeOut[os].GetTime() + sc.SecondsPerBar) {
        os++;
        sc.AddElements(1);
        sc.DateTimeOut[os] = TSArray[tp].DateTime + adj;
        oO[os] = oH[os] = oL[os] = oC[os] = TSArray[tp].Price;
        oV[os] = TSArray[tp].Volume;
        o7[os] += 1;
      }
      else if (TSArray[tp].DateTime.GetTime() + adjt >=
           sc.DateTimeOut[os].GetTime()) {
        oH[os] = max(TSArray[tp].Price, oH[os]);
        if (TSArray[tp].Price > 0 && oL[os] > 0)
          oL[os] = min(TSArray[tp].Price, oL[os]);
        else
          oL[os] = max(TSArray[tp].Price, oL[os]);
        oC[os] = TSArray[tp].Price;
        oV[os] += TSArray[tp].Volume;
      }
    }
    seqno = TSArray[ts].Sequence;
  }

  sc.Subgraph[SC_HL][os] = (oH[os] + oL[os]) / 2;
  sc.Subgraph[SC_HLC][os] = (oH[os] + oL[os] + oC[os]) / 3;
  sc.Subgraph[SC_OHLC][os] = (oH[os] + oL[os] + oC[os] + oO[os]) / 4;
  sc.Subgraph[SC_HL][op] = (oH[op] + oL[op]) / 2;
  sc.Subgraph[SC_HLC][op] = (oH[op] + oL[op] + oC[op]) / 3;
  sc.Subgraph[SC_OHLC][op] = (oH[op] + oL[op] + oC[op] + oO[op]) / 4;

// // Swing Colour Marking
// if(sc.UpdateStartIndex < sc.OutArraySize)
  //   i = sc.UpdateStartIndex-1;
  // else
  //   i = sc.OutArraySize-1;
// for ( ; i <= os; i++) {
// int updown=(int)sc.Subgraph[15][i-1];
  //   if(updown==0) updown=1;
  //   float lowesLHigh=sc.Subgraph[17][i-1];
  //   float highesLLow=sc.Subgraph[18][i-1];
// float& h = sc.Subgraph[1][i];
  //   float& l = sc.Subgraph[2][i];
//
  //   if(updown== 1) { if(l>highesLLow) highesLLow=l; }
  //   else { if(h<lowesLHigh) lowesLHigh=h; }
//
// if(h>lowesLHigh+offset && l>=sc.Subgraph[2][i-1]-offset) {
  //     updown=1; highesLLow=l; lowesLHigh=h;
  //   }
  //   else if(l<highesLLow-offset && h<=sc.Subgraph[1][i-1]+offset) {
  //     updown=-1;lowesLHigh=h; highesLLow=l;
  //   }
//
// if(((L[i] > L[i-1] && H[i] <= H[i-1]) ||
  //     (L[i] >= L[i-1] && H[i] < H[i-1])) && sc.Input[8].BooleanValue) {
  //     oO.DataColor[i] = oH.DataColor[i] = sc.Subgraph[7].PrimaryColor;
  //     oL.DataColor[i] = oC.DataColor[i] = sc.Subgraph[7].PrimaryColor;
  //   } else if(updown==1) {
  //     oO.DataColor[i] = oH.DataColor[i] = sc.Subgraph[6].PrimaryColor;
  //     oL.DataColor[i] = oC.DataColor[i] = sc.Subgraph[6].PrimaryColor;
  //   } else if(updown==-1) {
  //     oO.DataColor[i] = oH.DataColor[i] = sc.Subgraph[6].SecondaryColor;
  //     oL.DataColor[i] = oC.DataColor[i] = sc.Subgraph[6].SecondaryColor;
  //   }
//
// sc.Subgraph[15][i]=updown;
  //   sc.Subgraph[17][i]=lowesLHigh;
  //   sc.Subgraph[18][i]=highesLLow;
// }
//
// // Scale adjustments driven by LogariLHmic trigger
// if(sc.ActiveToolIndex!=0) ActiveToolIndex=sc.ActiveToolIndex;
// if(sc.ScaleType == SCALE_LOGARITHMIC || sc.UpdateStartIndex == 0) {
// if(ActiveToolIndex <= sc.IndexOfLastVisibleBar && ActiveToolIndex > as-50)
// lastVis=as;
  //   else lastVis=sc.IndexOfLastVisibleBar;
//
// float mid=sc.Subgraph[3][lastVis-1], high=sc.Subgraph[1][lastVis],
  //      low=sc.Subgraph[2][lastVis], userrange=sc.Input[4].FloatValue;
// for(j=1;j<100;j++) {
  //     if(high<sc.Subgraph[1][lastVis-j]) high=sc.Subgraph[1][lastVis-j];
  //     if(low>sc.Subgraph[2][lastVis-j]) low=sc.Subgraph[2][lastVis-j];
  //   }
//
// if((high-low)<=userrange) mid=(high+low)/2;
  //     else if((mid-userrange/2)<low) mid=low+userrange/2-2;
  //       else if((mid+userrange/2)>high) mid=high-userrange/2+2;
// sc.ScaleRangeTop=mid+userrange/2;
// sc.ScaleRangeBottom=mid-userrange/2;
//
// sc.Subgraph[9][as] = sc.ActiveToolIndex;
  //   sc.Subgraph[9][as-1] = sc.IndexOfLastVisibleBar;
  //   sc.Subgraph[9][as-1]=lastVis;
//
// if(sc.ScaleType == SCALE_LOGARITHMIC) { if(sc.ScaleRangeType==SCALE_AUTO) {
// if(sc.Input[5].FloatValue != 0) sc.ScaleIncrement = sc.Input[5].FloatValue;
// if(sc.Input[4].BooleanValue) {
// if(sc.Input[7].BooleanValue) {
  //           sc.ScaleRangeType=SCALE_CONSTRANGECENTER;
  //           sc.ScaleConstRange=sc.Input[4].GetFloat();
  //         }
  //         else sc.ScaleRangeType=SCALE_USERDEFINED;
// }
// } else {
// sc.ScaleIncrement = sc.Input[5].FloatValue;
// sc.ScaleRangeType= sc.ScaleRangeType=SCALE_AUTO;
// }
// sc.ScaleType = SCALE_LINEAR;
// }
// }
}



Date Time Of Last Edit: 2014-06-21 23:42:57