char *DEX_balance(char *exchange,char *base,char *coinaddr) { char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); if ( strcmp(exchange,"DEX") == 0 ) { sprintf(postdata,"{\"agent\":\"dex\",\"method\":\"getbalance\",\"address\":\"%s\",\"symbol\":\"%s\"}",coinaddr,base); return(bitcoind_RPC(0,"dex",url,0,"getbalance",postdata)); } else { sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"balance\",\"exchange\":\"%s\",\"base\":\"%s\"}",exchange,base); return(bitcoind_RPC(0,"InstantDEX",url,0,"balance",postdata)); } }
char *DEX_apikeypair(char *exchange,char *apikey,char *apisecret) { char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"apikeypair\",\"exchange\":\"%s\",\"apikey\":\"%s\",\"apisecret\":\"%s\"}",exchange,apikey,apisecret); return(bitcoind_RPC(0,"InstantDEX",url,0,"apikeypair",postdata)); }
char *DEX_cancelorder(char *exchange,char *orderid) { char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"cancelorder\",\"exchange\":\"%s\",\"orderid\":\"%s\"}",exchange,orderid); return(bitcoind_RPC(0,"InstantDEX",url,0,"cancelorder",postdata)); }
char *DEX_amlp(char *blocktrail) { char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"amlp\",\"blocktrail\":\"%s\"}",blocktrail); return(bitcoind_RPC(0,"tradebot",url,0,"amlp",postdata)); }
char *DEX_tradehistory(char *exchange) { char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"tradehistory\",\"exchange\":\"%s\"}",exchange); return(bitcoind_RPC(0,"InstantDEX",url,0,"tradehistory",postdata)); }
char *iguana_walletpassphrase(char *passphrase,int32_t timeout) { char url[512],postdata[1024]; sprintf(url,"%s/coin=KMD&agent=bitcoinrpc&method=walletpassphrase?",IGUANA_URL); sprintf(postdata,"[\"%s\", %d]",passphrase,timeout); return(bitcoind_RPC(0,"",url,0,"walletpassphrase",postdata)); }
char *DEX_withdraw(char *exchange,char *base,char *destaddr,double amount) { char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"withdraw\",\"exchange\":\"%s\",\"destaddr\":\"%s\",\"amount\":%.8f}",exchange,destaddr,amount); return(bitcoind_RPC(0,"InstantDEX",url,0,"withdraw",postdata)); }
char *DEX_setuserid(char *exchange,char *userid,char *tradepassword) { char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"setuserid\",\"exchange\":\"%s\",\"userid\":\"%s\",\"tradepassword\":\"%s\"}",exchange,userid,tradepassword); return(bitcoind_RPC(0,"InstantDEX",url,0,"setuserid",postdata)); }
char *DEX_trade(char *exchange,char *base,char *rel,int32_t dir,double price,double volume) { char url[512],postdata[1024]; sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"InstantDEX\",\"method\":\"%s\",\"exchange\":\"%s\",\"base\":\"%s\",\"rel\":\"%s\",\"price\":%.8f,\"volume\":%.8f,\"dotrade\":1}",dir>0?"buy":"sell",exchange,base,rel,price,volume); //printf("DEX_trade.(%s)\n",postdata); return(bitcoind_RPC(0,"InstantDEX",url,0,dir>0?"buy":"sell",postdata)); }
char *bitcoind_passthru(char *coinstr,char *serverport,char *userpass,char *method,char *params) { return(bitcoind_RPC(0,coinstr,serverport,userpass,method,params,0)); }
int32_t marketmaker_spread(char *exchange,char *base,char *rel,double bid,double bidvol,double ask,double askvol,double separation) { int32_t nearflags[2],i,n = 0; struct mmpending_order *ptr; cJSON *retjson,*vals; char *retstr,postdata[1024],url[128]; double vol,spread_ratio; memset(nearflags,0,sizeof(nearflags)); if ( strcmp("DEX",exchange) != 0 ) { for (i=0; i<Num_Pending; i++) { ptr = &Pending_orders[i]; if ( strcmp(exchange,ptr->exchange) != 0 || strcmp(base,ptr->base) != 0 || strcmp(rel,ptr->rel) != 0 ) continue; if ( ptr->pending != 0 && ptr->cancelstarted == 0 ) { if ( bid > SMALLVAL && bidvol > SMALLVAL && ptr->dir > 0 && fabs(bid - ptr->price) < separation ) nearflags[0]++; if ( ask > SMALLVAL && askvol > SMALLVAL && ptr->dir < 0 && fabs(ask - ptr->price) < separation ) nearflags[1]++; } } } //printf("spread.%s (%.8f %.6f) (%.8f %.6f)\n",exchange,bid,bidvol,ask,askvol); if ( bid > SMALLVAL && bidvol > SMALLVAL && nearflags[0] == 0 ) { if ( strcmp("DEX",exchange) == 0 && strcmp(base,"KMD") == 0 && strcmp(rel,"BTC") == 0 ) { if ( ask > SMALLVAL && askvol > SMALLVAL ) { /*li.profit = jdouble(vals,"profit"); li.refprice = jdouble(vals,"refprice"); li.bid = jdouble(vals,"bid"); li.ask = jdouble(vals,"ask"); if ( (li.minvol= jdouble(vals,"minvol")) <= 0. ) li.minvol = (strcmp("BTC",base) == 0) ? 0.0001 : 0.001; if ( (li.maxvol= jdouble(vals,"maxvol")) < li.minvol ) li.maxvol = li.minvol;*/ //curl --url "http://127.0.0.1:7778" --data "{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"MVP\",\"vals\":{\"rel\":\"USD\",\"bid\":0.09,\"ask\":0.11,\"maxvol\":100}}" vals = cJSON_CreateObject(); jaddstr(vals,"rel","BTC"); jaddnum(vals,"bid",bid); jaddnum(vals,"ask",ask); vol = bidvol > askvol ? askvol : bidvol; jaddnum(vals,"maxvol",vol); jaddnum(vals,"minvol",vol*0.1 > 100 ? 100 : vol * 0.1); sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"%s\",\"vals\":%s}",base,jprint(vals,1)); printf("(%s)\n",postdata); if ( (retstr= bitcoind_RPC(0,"tradebot",url,0,"liqudity",postdata)) != 0 ) { //printf("(%s) -> (%s)\n",postdata,retstr); free(retstr); } spread_ratio = .5 * ((ask - bid) / (bid + ask)); for (i=0; i<sizeof(CURRENCIES)/sizeof(*CURRENCIES); i++) { if ( PAXPRICES[i] > SMALLVAL ) { vals = cJSON_CreateObject(); jaddstr(vals,"rel",CURRENCIES[i]); jaddnum(vals,"bid",PAXPRICES[i] * (1. - spread_ratio)); jaddnum(vals,"ask",PAXPRICES[i] * (1. + spread_ratio)); jaddnum(vals,"maxvol",vol * PAXPRICES[i]); jaddnum(vals,"minvol",MAX(1,(int32_t)(vol * 0.01 * PAXPRICES[i]))); sprintf(url,"%s/?",IGUANA_URL); sprintf(postdata,"{\"agent\":\"tradebot\",\"method\":\"liquidity\",\"targetcoin\":\"%s\",\"vals\":%s}","KMD",jprint(vals,1)); if ( (retstr= bitcoind_RPC(0,"tradebot",url,0,"liqudity",postdata)) != 0 ) { //printf("(%s) -> (%s)\n",postdata,retstr); free(retstr); } } break; } } else printf("unsupported ask only for DEX %s/%s\n",base,rel); } else if ( (retstr= DEX_trade(exchange,base,rel,1,bid,bidvol)) != 0 ) { //printf("DEX_trade.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { marketmaker_queue(exchange,base,rel,1,bid,bidvol,retjson); free_json(retjson); } free(retstr); } } if ( ask > SMALLVAL && askvol > SMALLVAL && nearflags[1] == 0 && strcmp("DEX",exchange) != 0 ) { if ( (retstr= DEX_trade(exchange,base,rel,-1,ask,askvol)) != 0 ) { //printf("DEX_trade.(%s)\n",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { marketmaker_queue(exchange,base,rel,-1,ask,askvol,retjson); free_json(retjson); } free(retstr); } } return(n); }