int assetHistorySC(string theAsset, int theBP)
{
if (!Init) return 0;
int barperiod = theBP;
//----------------------------------
// setup start and end dates
//----------------------------------
int M1back = (LookBack*BarPeriod)/(7*60); // days of lback
int DailyLBack = (LookBack+2*UnstablePeriod);
int start = min(ymd(wdate(NOW)-6*365), ymd(dmy(StartDate)-2*ifelse(barperiod<1440,M1back, DailyLBack))); //6 years or more
int end;
if (!EndDate)
if (hour(NOW)>=21) EndDate = ymd(wdate(NOW));
else EndDate = ymd(wdate(NOW)-1);
string t6Out[100];
if (barperiod<1440) {
sprintf(t6Out,strf("History\\%s%s",theAsset,History));
barperiod = 1;
end = ymd(wdate(NOW)+1); // +1 to get most current M1 bar
}
else {
sprintf(t6Out,"History\\%s.t6",theAsset);
if (hour(NOW)>=21) end = ymd(wdate(NOW));
else end = ymd(wdate(NOW)-1); // -1 to get up to yesterday
}
//-------------------------------------
// check to see if exiting t6 is in range
//-------------------------------------
if (file_length(t6Out)) {
int records = dataLoad(33,t6Out,7);
int fileStart = ymd(dataVar(33,-1,0));
int fileEnd = ymd(dataVar(33,0,0));
//printf("fileStart=%d fileEnd=%d\n",fileStart, fileEnd);
// if Test or Train, don't download if data in range
if ( (!Live && EndDate<=fileEnd && barperiod==1440)
|| (Live && end<=fileEnd && barperiod==1440)
)
{
if (Live || DEBUG) printf("\n[%s] historical data up to date... no download\n");
dataNew(33,0,0);
return 0; // range already inside
}
// if not enough data, its probably a newly listed stock/asset with limited history
if (start<fileStart)
if (Live || DEBUG) printf("\nWARNING: historical data for [%s] may not be early enough\n",theAsset);
// set start to last date in file, to upate to current date
start = fileEnd;
}
if (start==end) return 0;
if (Live || DEBUG) printf("Downloading data [%s]... Start=%d End=%d\n", theAsset, start, end);
//----------------------------------
// index symbol conversions
//----------------------------------
if (theAsset == "SPX") theAsset = "$SPX";
if (theAsset == "DJI") theAsset = "$DOWI";
if (theAsset == "INX") theAsset = "$INX";
//----------------------------------
// get data
//----------------------------------
if(once(Init)) connectToSierraChart();
int reqbars = (int) (dmy(end) - dmy(start))*ifelse(barperiod==1440,1,1440); // D1 or M1 data only
//printf("SC: items allocated = %d\n",reqbars+10);
T6* myT6=malloc((reqbars+10)*sizeof(T6));
int items = 0;
int i;
for (i=0;i<=2;i++)
{
items = BrokerHistory2 (theAsset, dmy(start), dmy(end), barperiod, -1, myT6);
if (Live || DEBUG) printf("SC: items received = %d\n",items);
if (!items) {
if (Live || DEBUG) printf("ERROR: No historical data returned from SierraChart... maybe out of data cache range.\n");
connectToSierraChart();
wait(1000);
}
else {
break;
}
}
FILE *fp;
string tempT6 = strf("History\\temp-%s.t6",theAsset);
fp = fopen(tempT6, "wb");
fwrite(myT6 , sizeof(T6), items, fp );
fclose(fp);
free(myT6);
dataLoad(33,tempT6,7); // load it into 33
dataSort(33); // make sure it's sorted
//---------------------------------
// pre-pend to existing t6
//---------------------------------
if (file_length(t6Out)>0) {
dataLoad(22,t6Out,7);
dataMerge(22,33);
dataSave(22,t6Out);
dataNew(22,0,0);
}
else {
dataSave(33,t6Out);
dataNew(33,0,0);
}
file_delete(tempT6);
return 0;
}