This commit is contained in:
jl777
2016-11-27 11:10:13 -03:00
parent 3f8696e576
commit 295e677f20

View File

@@ -308,94 +308,15 @@ void komodo_pvals(int32_t height,uint32_t *pvals,uint8_t numpvals)
} }
} }
uint64_t komodo_paxcalc(uint32_t *pvals,int32_t baseid,int32_t relid,uint64_t basevolume) uint64_t komodo_paxcorrelation(uint64_t *votes,int32_t numvotes,uint64_t seed,uint64_t basevolume)
{ {
uint32_t pvalb,pvalr,kmdbtc,btcusd; uint64_t usdvol,baseusd,usdkmd,baserel,ranked[32]; int32_t i,j,k,ind,zeroes,wt,nonz; int64_t delta; uint64_t lastprice,tolerance,den,densum,sum=0;
if ( basevolume > 10000*COIN )
{
printf("paxcalc overflow %.8f\n",dstr(basevolume));
return(0);
}
if ( (pvalb= pvals[baseid]) != 0 )
{
if ( relid == MAX_CURRENCIES )
{
if ( (kmdbtc= pvals[MAX_CURRENCIES]) < 25000 )
kmdbtc = 25000;
btcusd = pvals[MAX_CURRENCIES + 1];
if ( pvals[USD] != 0 && kmdbtc != 0 && btcusd != 0 )
{
baseusd = ((uint64_t)pvalb * 1000000000) / pvals[USD];
usdvol = komodo_paxvol(basevolume,baseusd) / MINDENOMS[baseid];
usdkmd = ((uint64_t)btcusd * 1000000000) / kmdbtc;
//printf("base -> USD %llu, BTC %llu KMDUSD %llu\n",(long long)baseusd,(long long)btcusd,(long long)kmdusd);
//printf("usdkmd.%llu basevolume.%llu baseusd.%llu paxvol.%llu usdvol.%llu -> %.8f\n",(long long)usdkmd,(long long)basevolume,(long long)baseusd,(long long)komodo_paxvol(basevolume,baseusd),(long long)usdvol,dstr(MINDENOMS[USD] * komodo_paxvol(usdvol,usdkmd)));
return(MINDENOMS[USD] * komodo_paxvol(usdvol,usdkmd));
} //else printf("zero val in KMD conv %llu %llu %llu\n",(long long)pvals[USD],(long long)kmdbtc,(long long)btcusd);
}
else if ( baseid == relid )
{
if ( baseid != MAX_CURRENCIES )
{
pax_rank(ranked,pvals);
//printf("%s M1 percentage %.8f\n",CURRENCIES[baseid],dstr(10 * ranked[baseid]));
return(10 * ranked[baseid]); // scaled percentage of M1 total
} else return(basevolume);
}
else if ( (pvalr= pvals[relid]) != 0 )
{
baserel = ((uint64_t)pvalb * 1000000000) / pvalr;
//printf("baserel.%lld %lld %lld %.8f %.8f\n",(long long)baserel,(long long)MINDENOMS[baseid],(long long)MINDENOMS[relid],dstr(MINDENOMS[baseid]/MINDENOMS[relid]),dstr(MINDENOMS[relid]/MINDENOMS[baseid]));
if ( MINDENOMS[baseid] > MINDENOMS[relid] )
basevolume /= (MINDENOMS[baseid] / MINDENOMS[relid]);
else if ( MINDENOMS[baseid] < MINDENOMS[relid] )
basevolume *= (MINDENOMS[relid] / MINDENOMS[baseid]);
return(komodo_paxvol(basevolume,baserel));
}
else printf("null pval for %s\n",CURRENCIES[relid]);
} else printf("null pval for %s\n",CURRENCIES[baseid]);
return(0);
}
uint64_t _komodo_paxprice(int32_t height,char *base,char *rel,uint64_t basevolume)
{
int32_t baseid=-1,relid=-1,i; uint32_t *ptr;
if ( height > 10 )
height -= 10;
if ( (baseid= komodo_baseid(base)) >= 0 && (relid= komodo_baseid(rel)) >= 0 )
{
for (i=NUM_PRICES-1; i>=0; i--)
{
ptr = &PVALS[36 * i];
if ( *ptr < height )
return(komodo_paxcalc(&ptr[1],baseid,relid,basevolume));
}
} else printf("paxprice invalid base.%s %d, rel.%s %d\n",base,baseid,rel,relid);
return(0);
}
uint64_t komodo_paxprice(uint64_t *seedp,int32_t height,char *base,char *rel,uint64_t basevolume)
{
int32_t i,j,k,ind,zeroes,numvotes,wt,nonz; int64_t delta; uint64_t lastprice,seed,tolerance,den,densum,sum=0,votes[539];
if ( basevolume > 10000*COIN )
{
printf("komodo_paxprice overflow %.8f\n",dstr(basevolume));
return(0);
}
numvotes = (int32_t)(sizeof(Peggy_inds)/sizeof(*Peggy_inds));
memset(votes,0,sizeof(votes));
for (sum=i=zeroes=nonz=0; i<numvotes; i++) for (sum=i=zeroes=nonz=0; i<numvotes; i++)
{ {
if ( (votes[numvotes-1-i]= _komodo_paxprice(height-i,base,rel,100000)) == 0 ) if ( votes[i] == 0 )
{
zeroes++; zeroes++;
//printf("null price height.%d\n",height-i); else sum += votes[i], nonz++;
//return(0);
} else sum += votes[i], nonz++;
//printf("%.8f, ",dstr(votes[i]));
} }
if ( nonz <= (numvotes >> 1) )
return(0);
sum /= nonz; sum /= nonz;
lastprice = sum; lastprice = sum;
for (i=0; i<numvotes; i++) for (i=0; i<numvotes; i++)
@@ -404,8 +325,6 @@ uint64_t komodo_paxprice(uint64_t *seedp,int32_t height,char *base,char *rel,uin
votes[i] = lastprice; votes[i] = lastprice;
else lastprice = votes[i]; else lastprice = votes[i];
} }
//printf("\n}; // numvotes.%d\n\n",numvotes);
*seedp = seed = komodo_seed(height);
tolerance = sum / 50; tolerance = sum / 50;
for (k=0; k<numvotes; k++) for (k=0; k<numvotes; k++)
{ {
@@ -439,7 +358,7 @@ uint64_t komodo_paxprice(uint64_t *seedp,int32_t height,char *base,char *rel,uin
sum += (den * votes[(ind + j) % numvotes]); sum += (den * votes[(ind + j) % numvotes]);
} }
sum /= densum; sum /= densum;
sum = (sum * basevolume) / 100000; sum = (sum * basevolume);
//printf("paxprice seed.%llx sum %.8f densum %.8f basevol %.8f height.%d\n",(long long)seed,dstr(sum),dstr(densum),dstr(basevolume),height); //printf("paxprice seed.%llx sum %.8f densum %.8f basevol %.8f height.%d\n",(long long)seed,dstr(sum),dstr(densum),dstr(basevolume),height);
break; break;
} }
@@ -447,6 +366,110 @@ uint64_t komodo_paxprice(uint64_t *seedp,int32_t height,char *base,char *rel,uin
return(sum); return(sum);
} }
uint64_t komodo_paxcalc(uint32_t *pvals,int32_t baseid,int32_t relid,uint64_t basevolume,uint64_t kmdbtc,uint64_t btcusd)
{
uint32_t pvalb,pvalr; uint64_t usdvol,baseusd,usdkmd,baserel,ranked[32];
if ( basevolume > 10000*COIN )
{
printf("paxcalc overflow %.8f\n",dstr(basevolume));
return(0);
}
if ( (pvalb= pvals[baseid]) != 0 )
{
if ( relid == MAX_CURRENCIES )
{
if ( kmdbtc == 0 )
kmdbtc = pvals[MAX_CURRENCIES];
if ( btcusd == 0 )
btcusd = pvals[MAX_CURRENCIES + 1];
if ( kmdbtc < 25000 )
kmdbtc = 25000;
if ( pvals[USD] != 0 && kmdbtc != 0 && btcusd != 0 )
{
baseusd = ((uint64_t)pvalb * 1000000000) / pvals[USD];
usdvol = komodo_paxvol(basevolume,baseusd) / MINDENOMS[baseid];
usdkmd = ((uint64_t)btcusd * 1000000000) / kmdbtc;
printf("base -> USD %llu, BTC %llu KMDUSD %llu\n",(long long)baseusd,(long long)btcusd,(long long)kmdusd);
printf("usdkmd.%llu basevolume.%llu baseusd.%llu paxvol.%llu usdvol.%llu -> %.8f\n",(long long)usdkmd,(long long)basevolume,(long long)baseusd,(long long)komodo_paxvol(basevolume,baseusd),(long long)usdvol,dstr(MINDENOMS[USD] * komodo_paxvol(usdvol,usdkmd)));
return(MINDENOMS[USD] * komodo_paxvol(usdvol,usdkmd));
} //else printf("zero val in KMD conv %llu %llu %llu\n",(long long)pvals[USD],(long long)kmdbtc,(long long)btcusd);
}
else if ( baseid == relid )
{
if ( baseid != MAX_CURRENCIES )
{
pax_rank(ranked,pvals);
//printf("%s M1 percentage %.8f\n",CURRENCIES[baseid],dstr(10 * ranked[baseid]));
return(10 * ranked[baseid]); // scaled percentage of M1 total
} else return(basevolume);
}
else if ( (pvalr= pvals[relid]) != 0 )
{
baserel = ((uint64_t)pvalb * 1000000000) / pvalr;
//printf("baserel.%lld %lld %lld %.8f %.8f\n",(long long)baserel,(long long)MINDENOMS[baseid],(long long)MINDENOMS[relid],dstr(MINDENOMS[baseid]/MINDENOMS[relid]),dstr(MINDENOMS[relid]/MINDENOMS[baseid]));
if ( MINDENOMS[baseid] > MINDENOMS[relid] )
basevolume /= (MINDENOMS[baseid] / MINDENOMS[relid]);
else if ( MINDENOMS[baseid] < MINDENOMS[relid] )
basevolume *= (MINDENOMS[relid] / MINDENOMS[baseid]);
return(komodo_paxvol(basevolume,baserel));
}
else printf("null pval for %s\n",CURRENCIES[relid]);
} else printf("null pval for %s\n",CURRENCIES[baseid]);
return(0);
}
uint64_t _komodo_paxprice(uint64_t *kmdbtcp,uint64_t *btcusdp,int32_t height,char *base,char *rel,uint64_t basevolume,uint64_t kmdbtc,uint64_t btcusd)
{
int32_t baseid=-1,relid=-1,i; uint32_t *ptr;
if ( height > 10 )
height -= 10;
if ( (baseid= komodo_baseid(base)) >= 0 && (relid= komodo_baseid(rel)) >= 0 )
{
for (i=NUM_PRICES-1; i>=0; i--)
{
ptr = &PVALS[36 * i];
if ( *ptr < height )
{
*kmdbtcp = pvals[MAX_CURRENCIES + 1];
*btcusdp = pvals[MAX_CURRENCIES + 2];
if ( kmdbtc != 0 && btcusd != 0 )
return(komodo_paxcalc(&ptr[1],baseid,relid,basevolume,kmdbtc,btcusd));
else return(0);
}
}
} else printf("paxprice invalid base.%s %d, rel.%s %d\n",base,baseid,rel,relid);
return(0);
}
uint64_t komodo_paxprice(uint64_t *seedp,int32_t height,char *base,char *rel,uint64_t basevolume)
{
int32_t i,j,k,ind,zeroes,numvotes,wt,nonz; int64_t delta; uint64_t lastprice,seed,tolerance,den,densum,sum=0,votes[539],btcusds[539],kmdbtcs[539],kmdbtc,btcusd;
if ( basevolume > 10000*COIN )
{
printf("komodo_paxprice overflow %.8f\n",dstr(basevolume));
return(0);
}
numvotes = (int32_t)(sizeof(Peggy_inds)/sizeof(*Peggy_inds));
memset(votes,0,sizeof(votes));
memset(btcusds,0,sizeof(btcusds));
memset(kmdbtcs,0,sizeof(kmdbtcs));
for (i=0; i<numvotes; i++)
_komodo_paxprice(&kmdbtcs[numvotes-1-i],&btcusds[numvotes-1-i],height-i,base,rel,100000,0,0);
*seedp = seed = komodo_seed(height);
kmdbtc = komodo_paxcorrelation(kmdbtcs,numvotes,seed,100000);
btcusd = komodo_paxcorrelation(btcusds,numvotes,seed,100000);
printf("kmdbtc %llu btcusd %llu\n",(long long)kmdbtc,(long long)btcusd);
for (i=nonz=0; i<numvotes; i++)
{
if ( (votes[numvotes-1-i]= _komodo_paxprice(&kmdbtc[numvotes-1-i],&btcusd[numvotes-1-i],height-i,base,rel,100000,kmdbtc,btcusd)) == 0 )
zeroes++;
else nonz++;
}
if ( nonz <= (numvotes >> 1) )
return(0);
return(komodo_paxcorrelation(votes,numvotes,seed,basevolume) / 100000);
}
int32_t komodo_paxprices(int32_t *heights,uint64_t *prices,int32_t max,char *base,char *rel) int32_t komodo_paxprices(int32_t *heights,uint64_t *prices,int32_t max,char *base,char *rel)
{ {
int32_t baseid=-1,relid=-1,i,num = 0; uint32_t *ptr; int32_t baseid=-1,relid=-1,i,num = 0; uint32_t *ptr;
@@ -456,7 +479,7 @@ int32_t komodo_paxprices(int32_t *heights,uint64_t *prices,int32_t max,char *bas
{ {
ptr = &PVALS[36 * i]; ptr = &PVALS[36 * i];
heights[num] = *ptr; heights[num] = *ptr;
prices[num] = komodo_paxcalc(&ptr[1],baseid,relid,COIN); prices[num] = komodo_paxcalc(&ptr[1],baseid,relid,COIN,0,0);
num++; num++;
if ( num >= max ) if ( num >= max )
return(num); return(num);