diff --git a/README.md b/README.md index 1e14ad22..2d6dd575 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ A cryptocurrency trading bot supporting multiple exchanges written in Golang. ** NA means not applicable as the Exchange does not support the feature. ## Current Features -+ Support for BTC/LTC primarily, will be expanded to the available exchanges cryptocurrencies. ++ Support for all Exchange fiat and digital currencies. + REST API support for all exchanges. + Ability to turn off/on certain exchanges. + Ability to adjust manual polling timer for exchanges. diff --git a/config_example.json b/config_example.json index 071ce6e7..04e90dd3 100644 --- a/config_example.json +++ b/config_example.json @@ -98,8 +98,8 @@ }, { "Name": "Cryptsy", - "AvailablePairs": "42BTC,42XRP,ACBTC,ACXRP,ACOINBTC,ADTLTC,AEROBTC,AEROXRP,AGSBTC,ALFBTC,ALNBTC,ALNXRP,AMCBTC,ANCBTC,ANCLTC,ANCXRP,APEXBTC,APEXXRP,ARCHBTC,ARGBTC,ARGXRP,ARIBTC,ASCLTC,AURBTC,AURLTC,AURXRP,AXRBTC,BATLTC,BCXBTC,BENBTC,BETBTC,BITBBTC,BLKBTC,BLKLTC,BLKXRP,BLUBTC,BLUXRP,BNCRBTC,BOSTBTC,BQCBTC,BTBBTC,BTBXRP,BTCUSD,BTCDBTC,BTCDXRP,BTEBTC,BTGBTC,BTGXRP,BTMBTC,BTMXRP,BUKBTC,CACHBTC,CAIxBTC,CANNBTC,CANNXRP,CAPBTC,CAPXRP,CASHBTC,CATBTC,CBXBTC,CBXLTC,CBXXRP,CCNBTC,CENTXRP,CINBTC,CINNIBTC,CKCBTC,CKCXRP,CLAMBTC,CLOAKBTC,CLOAKLTC,CLOAKXRP,CLRBTC,CLRXRP,CMCBTC,CNCBTC,CNCLTC,CNCXRP,CNLBTC,COLLTC,COLXRP,COMMBTC,COOLBTC,CPRLTC,CRACKBTC,CRACKXRP,CRAIGBTC,CRAIGXRP,CRCBTC,CRYPTBTC,CRYPTLTC,CRYPTXRP,CSCBTC,CTMLTC,DBLLTC,DEMBTC,DEMXRP,DGBBTC,DGBXRP,DGCBTC,DGCLTC,DGCXRP,DIMELTC,DMCLTC,DMDBTC,DMDXRP,DOGEBTC,DOGELTC,DOGEUSD,DOGEXRP,DOGEDBTC,DRKBTC,DRKLTC,DRKUSD,DRKXRP,DRKCBTC,DRKCXRP,DSBBTC,DTBTC,DTXRP,DVCBTC,DVCLTC,DVCXRP,EACBTC,EACLTC,EACXRP,EFLBTC,ELCBTC,ELPLTC,EMC2BTC,EMC2XRP,EMDBTC,EXCLBTC,EXEBTC,EXEXRP,EZCBTC,EZCLTC,FC2BTC,FFCBTC,FFCXRP,FIBREBTC,FIBREXRP,FLAPLTC,FLAPXRP,FLOLTC,FLOXRP,FLTBTC,FLTXRP,FRACBTC,FRCBTC,FRCXRP,FRKBTC,FRKLTC,FRKXRP,FSTBTC,FSTLTC,FTCBTC,FTCLTC,FTCUSD,FTCXRP,GBBTC,GBXRP,GDCBTC,GLCBTC,GLDBTC,GLDLTC,GLDXRP,GLXBTC,GLYPHBTC,GLYPHLTC,GLYPHXRP,GMELTC,GMLBTC,GUEBTC,GUELTC,HALBTC,HALXRP,HBNBTC,HBNXRP,HTML5LTC,HTML5XRP,HUCBTC,HUCXRP,HVCBTC,HVCXRP,HYPBTC,ICBBTC,ICBXRP,IFCBTC,IFCLTC,IFCXRP,IOCBTC,IOCXRP,IXCBTC,IXCXRP,JBSBTC,JKCBTC,JUDGEBTC,JUDGEXRP,KARMLTC,KARMXRP,KDCBTC,KEYBTC,KEYXRP,KGCBTC,LABBTC,LEAFLTC,LEAFXRP,LGDBTC,LK7BTC,LKYBTC,LKYXRP,LOTLTC,LOTXRP,LSDBTC,LSDXRP,LTBBTC,LTBXRP,LTCBTC,LTCUSD,LTCXRP,LTCDBTC,LTCDXRP,LTCXBTC,LTCXLTC,LXCBTC,LXCXRP,LYCBTC,MAXBTC,MAXLTC,MAXXRP,MECBTC,MECLTC,MECXRP,MEDBTC,MEMLTC,MEOWLTC,MEOWXRP,MINBTC,MINTBTC,MINTXRP,MNBTC,MNCBTC,MNCXRP,MNEBTC,MOONLTC,MOONXRP,MRYBTC,MRYXRP,MSTLTC,MYRBTC,MYRXRP,MYSTBTC,MZCBTC,MZCXRP,NANBTC,NAUTBTC,NAUTXRP,NAVBTC,NAVXRP,NBLBTC,NECBTC,NECXRP,NETBTC,NETLTC,NETXRP,NMBBTC,NMBXRP,NMCBTC,NMCXRP,NOBLBTC,NRBBTC,NRSBTC,NVCBTC,NVCXRP,NXTBTC,NXTLTC,NXTUSD,NXTXRP,NYANBTC,NYANLTC,OPALBTC,OPALXRP,ORBBTC,ORBXRP,OSCBTC,OSCXRP,PHSBTC,PHSXRP,PointsBTC,POTBTC,POTXRP,PPCBTC,PPCLTC,PPCUSD,PPCXRP,PSEUDBTC,PTSBTC,PTSXRP,PXCBTC,PXCLTC,PXCXRP,PYCBTC,QRKBTC,QRKLTC,QRKXRP,RBBTLTC,RDDBTC,RDDLTC,RDDUSD,RDDXRP,REDLTC,RIPOBTC,RPCBTC,RT2BTC,RYCBTC,RZRBTC,RZRLTC,RZRXRP,SAT2BTC,SBCBTC,SBCLTC,SDCBTC,SDCXRP,SFRBTC,SFRXRP,SHADEBTC,SHADEXRP,SHLDBTC,SILKBTC,SILKXRP,SLGBTC,SLGXRP,SMCBTC,SOLEBTC,SPABTC,SPAXRP,SPTBTC,SRCBTC,SRCXRP,SSVBTC,SSVXRP,STRBTC,SUPERBTC,SUPERLTC,SUPERXRP,SWIFTBTC,SXCBTC,SXCLTC,SXCXRP,SYNCBTC,SYSBTC,SYSXRP,TAGBTC,TAGXRP,TAKBTC,TEKBTC,TEKXRP,TESBTC,TESLTC,TESXRP,TGCBTC,TIPSLTC,TIPSXRP,TITBTC,TIXLTC,TORBTC,TRCBTC,TRCXRP,TTCBTC,ULTCBTC,UNBBTC,UNBXRP,UNOBTC,UNOXRP,UROBTC,UROXRP,USDeBTC,USDeXRP,UTCBTC,UTCXRP,UTILBTC,VDOBTC,VIABTC,VIAXRP,VOOTBTC,VRCBTC,VRCLTC,VRCXRP,VTCBTC,VTCLTC,VTCXRP,WCBTC,WCXRP,WDCBTC,WDCLTC,WDCXRP,XAIBTC,XBOTBTC,XBOTXRP,XCBTC,XCLTC,XCXRP,XCASHBTC,XCRBTC,XCRXRP,XJOBTC,XLBBTC,XNCLTC,XPMBTC,XPMLTC,XPMXRP,XPYBTC,XPYUSD,XRPBTC,XRPUSD,XSTBTC,XSTXRP,XXXBTC,XXXXRP,YACBTC,YACLTC,YACXRP,YBCBTC,ZCCBTC,ZEDBTC,ZEITLTC,ZEITXRP,ZETBTC,ZETLTC,ZETXRP,ZRCBTC,ZRCUSD", - "EnabledPairs": "42BTC,42XRP,ACBTC,ACXRP,ACOINBTC,ADTLTC,AEROBTC,AEROXRP,AGSBTC,ALFBTC,ALNBTC,ALNXRP,AMCBTC,ANCBTC,ANCLTC,ANCXRP,APEXBTC,APEXXRP,ARCHBTC,ARGBTC,ARGXRP,ARIBTC,ASCLTC,AURBTC,AURLTC,AURXRP,AXRBTC,BATLTC,BCXBTC,BENBTC,BETBTC,BITBBTC,BLKBTC,BLKLTC,BLKXRP,BLUBTC,BLUXRP,BNCRBTC,BOSTBTC,BQCBTC,BTBBTC,BTBXRP,BTCUSD,BTCDBTC,BTCDXRP,BTEBTC,BTGBTC,BTGXRP,BTMBTC,BTMXRP,BUKBTC,CACHBTC,CAIxBTC,CANNBTC,CANNXRP,CAPBTC,CAPXRP,CASHBTC,CATBTC,CBXBTC,CBXLTC,CBXXRP,CCNBTC,CENTXRP,CINBTC,CINNIBTC,CKCBTC,CKCXRP,CLAMBTC,CLOAKBTC,CLOAKLTC,CLOAKXRP,CLRBTC,CLRXRP,CMCBTC,CNCBTC,CNCLTC,CNCXRP,CNLBTC,COLLTC,COLXRP,COMMBTC,COOLBTC,CPRLTC,CRACKBTC,CRACKXRP,CRAIGBTC,CRAIGXRP,CRCBTC,CRYPTBTC,CRYPTLTC,CRYPTXRP,CSCBTC,CTMLTC,DBLLTC,DEMBTC,DEMXRP,DGBBTC,DGBXRP,DGCBTC,DGCLTC,DGCXRP,DIMELTC,DMCLTC,DMDBTC,DMDXRP,DOGEBTC,DOGELTC,DOGEUSD,DOGEXRP,DOGEDBTC,DRKBTC,DRKLTC,DRKUSD,DRKXRP,DRKCBTC,DRKCXRP,DSBBTC,DTBTC,DTXRP,DVCBTC,DVCLTC,DVCXRP,EACBTC,EACLTC,EACXRP,EFLBTC,ELCBTC,ELPLTC,EMC2BTC,EMC2XRP,EMDBTC,EXCLBTC,EXEBTC,EXEXRP,EZCBTC,EZCLTC,FC2BTC,FFCBTC,FFCXRP,FIBREBTC,FIBREXRP,FLAPLTC,FLAPXRP,FLOLTC,FLOXRP,FLTBTC,FLTXRP,FRACBTC,FRCBTC,FRCXRP,FRKBTC,FRKLTC,FRKXRP,FSTBTC,FSTLTC,FTCBTC,FTCLTC,FTCUSD,FTCXRP,GBBTC,GBXRP,GDCBTC,GLCBTC,GLDBTC,GLDLTC,GLDXRP,GLXBTC,GLYPHBTC,GLYPHLTC,GLYPHXRP,GMELTC,GMLBTC,GUEBTC,GUELTC,HALBTC,HALXRP,HBNBTC,HBNXRP,HTML5LTC,HTML5XRP,HUCBTC,HUCXRP,HVCBTC,HVCXRP,HYPBTC,ICBBTC,ICBXRP,IFCBTC,IFCLTC,IFCXRP,IOCBTC,IOCXRP,IXCBTC,IXCXRP,JBSBTC,JKCBTC,JUDGEBTC,JUDGEXRP,KARMLTC,KARMXRP,KDCBTC,KEYBTC,KEYXRP,KGCBTC,LABBTC,LEAFLTC,LEAFXRP,LGDBTC,LK7BTC,LKYBTC,LKYXRP,LOTLTC,LOTXRP,LSDBTC,LSDXRP,LTBBTC,LTBXRP,LTCBTC,LTCUSD,LTCXRP,LTCDBTC,LTCDXRP,LTCXBTC,LTCXLTC,LXCBTC,LXCXRP,LYCBTC,MAXBTC,MAXLTC,MAXXRP,MECBTC,MECLTC,MECXRP,MEDBTC,MEMLTC,MEOWLTC,MEOWXRP,MINBTC,MINTBTC,MINTXRP,MNBTC,MNCBTC,MNCXRP,MNEBTC,MOONLTC,MOONXRP,MRYBTC,MRYXRP,MSTLTC,MYRBTC,MYRXRP,MYSTBTC,MZCBTC,MZCXRP,NANBTC,NAUTBTC,NAUTXRP,NAVBTC,NAVXRP,NBLBTC,NECBTC,NECXRP,NETBTC,NETLTC,NETXRP,NMBBTC,NMBXRP,NMCBTC,NMCXRP,NOBLBTC,NRBBTC,NRSBTC,NVCBTC,NVCXRP,NXTBTC,NXTLTC,NXTUSD,NXTXRP,NYANBTC,NYANLTC,OPALBTC,OPALXRP,ORBBTC,ORBXRP,OSCBTC,OSCXRP,PHSBTC,PHSXRP,PointsBTC,POTBTC,POTXRP,PPCBTC,PPCLTC,PPCUSD,PPCXRP,PSEUDBTC,PTSBTC,PTSXRP,PXCBTC,PXCLTC,PXCXRP,PYCBTC,QRKBTC,QRKLTC,QRKXRP,RBBTLTC,RDDBTC,RDDLTC,RDDUSD,RDDXRP,REDLTC,RIPOBTC,RPCBTC,RT2BTC,RYCBTC,RZRBTC,RZRLTC,RZRXRP,SAT2BTC,SBCBTC,SBCLTC,SDCBTC,SDCXRP,SFRBTC,SFRXRP,SHADEBTC,SHADEXRP,SHLDBTC,SILKBTC,SILKXRP,SLGBTC,SLGXRP,SMCBTC,SOLEBTC,SPABTC,SPAXRP,SPTBTC,SRCBTC,SRCXRP,SSVBTC,SSVXRP,STRBTC,SUPERBTC,SUPERLTC,SUPERXRP,SWIFTBTC,SXCBTC,SXCLTC,SXCXRP,SYNCBTC,SYSBTC,SYSXRP,TAGBTC,TAGXRP,TAKBTC,TEKBTC,TEKXRP,TESBTC,TESLTC,TESXRP,TGCBTC,TIPSLTC,TIPSXRP,TITBTC,TIXLTC,TORBTC,TRCBTC,TRCXRP,TTCBTC,ULTCBTC,UNBBTC,UNBXRP,UNOBTC,UNOXRP,UROBTC,UROXRP,USDeBTC,USDeXRP,UTCBTC,UTCXRP,UTILBTC,VDOBTC,VIABTC,VIAXRP,VOOTBTC,VRCBTC,VRCLTC,VRCXRP,VTCBTC,VTCLTC,VTCXRP,WCBTC,WCXRP,WDCBTC,WDCLTC,WDCXRP,XAIBTC,XBOTBTC,XBOTXRP,XCBTC,XCLTC,XCXRP,XCASHBTC,XCRBTC,XCRXRP,XJOBTC,XLBBTC,XNCLTC,XPMBTC,XPMLTC,XPMXRP,XPYBTC,XPYUSD,XRPBTC,XRPUSD,XSTBTC,XSTXRP,XXXBTC,XXXXRP,YACBTC,YACLTC,YACXRP,YBCBTC,ZCCBTC,ZEDBTC,ZEITLTC,ZEITXRP,ZETBTC,ZETLTC,ZETXRP,ZRCBTC,ZRCUSD", + "AvailablePairs": "AEROXRP,DBLLTC,GLYPHLTC,GMLBTC,HBNBTC,MNCBTC,MOONXRP,CKCBTC,LGDBTC,PXCLTC,XBSBTC,DMDXRP,ARIBTC,BTCEUR,CINBTC,CLOAKLTC,CRYPTLTC,DGCBTC,DMCLTC,EKNBTC,ICBBTC,NMCBTC,SRCBTC,SXCLTC,SFRBTC,ADTLTC,AGSBTC,DEMXRP,EFLBTC,IOCBTC,PHSBTC,PXCBTC,TITBTC,ZRCBTC,VIABTC,GDCBTC,IFCBTC,JKCBTC,MYRBTC,NBLBTC,STARTBTC,TESBTC,ZEDBTC,ASCLTC,BLKBTC,GLDLTC,LSDBTC,TRCBTC,UROXRP,XPMBTC,SPABTC,BTCUSD,IXCBTC,MNEBTC,MRYBTC,MSTLTC,NXTBTC,PPCXRP,IXCXRP,BENBTC,COLXRP,CRAVEBTC,DGBBTC,EMC2BTC,GMELTC,HALBTC,MECLTC,NMBBTC,NXTXRP,SPAXRP,VRCBTC,UROBTC,CCNBTC,COLLTC,DOGEXRP,KDCBTC,LTCUSD,MINBTC,NXTLTC,DOGEBTC,FSTLTC,IFCXRP,MEMLTC,MYRXRP,PPCLTC,VIAXRP,TESLTC,DEMBTC,DGBXRP,EMC2XRP,IFCLTC,NAUTBTC,NECBTC,RYCBTC,VRCXRP,XAUBTC,NMCXRP,ALFBTC,BTEBTC,CPRLTC,DGCXRP,EACLTC,GLXBTC,ICBXRP,PSEUDBTC,SRCXRP,SUPERLTC,VTCLTC,GLCBTC,ARGBTC,BLKXRP,CLOAKBTC,CRYPTBTC,CYPBTC,DGCLTC,FLOXRP,PYCBTC,SAT2BTC,SXCBTC,TRCXRP,XPMXRP,KGCBTC,LABBTC,MECBTC,RDDUSD,TIXLTC,VRCLTC,EMDBTC,GLYPHBTC,MEDBTC,UTCBTC,LTBXRP,SHLDBTC,XCLTC,SDCBTC,BTBBTC,CATBTC,CKCXRP,CTMLTC,LYCBTC,PPCUSD,RZRLTC,SSVBTC,YBCBTC,AURXRP,NETBTC,SLGXRP,SWIFTBTC,TEKXRP,XSTBTC,TGCBTC,ACOINBTC,AURLTC,BQCBTC,CRCBTC,DOGEUSD,EZCLTC,SBCBTC,XLBBTC,DSBBTC,8BITBTC,ALNBTC,AXRBTC,BCXBTC,BLUBTC,BTMBTC,CADUSD,WBBBTC,EURUSD,JBSBTC,LTCBTC,NETLTC,NVCBTC,SHADEBTC,SYSBTC,UNBXRP,ANCBTC,CAPBTC,CLRXRP,HVCXRP,LKYBTC,MZCBTC,TAGBTC,UNOBTC,WDCBTC,FRKLTC,GUEBTC,KEYBTC,POTBTC,STRBTC,YACBTC,ZETBTC,APEXBTC,BUKBTC,CRACKBTC,MAXBTC,RDDBTC,XAIBTC,SPTBTC,CBXLTC,FRCBTC,LXCBTC,MAXXRP,PTSBTC,RDDXRP,REDLTC,ZRCUSD,EACXRP,HUCBTC,JUDGEXRP,MAXLTC,RDDLTC,TAKBTC,VTCXRP,RPCBTC,CAIxBTC,CAPXRP,CINNIBTC,EACBTC,HTML5XRP,JUDGEBTC,MZCXRP,SUPERBTC,UNOXRP,VTCBTC,WDCXRP,ANCLTC,FLTBTC,FRCXRP,HTML5LTC,NRBBTC,WDCLTC,BATLTC,DVCLTC,FTCLTC,LOTLTC,LTCDBTC,SLGBTC,AURBTC,CRAIGBTC,EXEBTC,EZCBTC,KEYXRP,POTXRP,SBCLTC,TEKBTC,XXXBTC,YACXRP,ZCCBTC,ZETXRP,UNBBTC,BETBTC,BTBXRP,CBXBTC,CLRBTC,HVCBTC,NXTUSD,OSCBTC,VDOBTC,XJOBTC,LTBBTC,RZRBTC,XRPBTC,LTCXBTC,NANBTC,NETXRP,BTCDBTC,SOLEBTC,WCXRP,DRKCBTC,MINTBTC,NYANLTC,BITBBTC,KARMLTC,FIBREBTC,XCBTC,ACBTC,DASHBTC,CASHBTC,DASHXRP,NAVBTC,ZEITXRP,DASHLTC,DVCXRP,EXCLBTC,FTCXRP,OPALBTC,ZEITLTC,XPYBTC,AMCBTC,BTGBTC,CENTXRP,CSCBTC,DVCBTC,FTCBTC,TIPSXRP,DTBTC,FLAPXRP,FRACBTC,NAVXRP,TIPSLTC,ULTCBTC,ELPLTC,MINTXRP,NYANBTC,WCBTC,XCXRP,COOLBTC,FLAPLTC,NOBLBTC,ALNXRP,BLUXRP,LTCXRP,NVCXRP,SYSXRP,XCRBTC,BLKLTC,CMCBTC,DMDBTC,FLOLTC,GLDBTC,NRSBTC,TORBTC,XPMLTC,BTCDXRP,KARMXRP,QRKBTC,RT2BTC,42XRP,AEROBTC,GBBTC,XBOTBTC,XCASHBTC,BOSTBTC,FTCUSD,RBBTLTC,XPYUSD,DIMELTC,MNBTC,MOONLTC,SYNCBTC,DOGEDBTC,FC2BTC,LTCXLTC,MONABTC,MYSTBTC,XRPUSD,CNCBTC,COMMBTC,ELCBTC,UTILBTC,007BTC,CACHBTC,CNCXRP,LEAFXRP,TRONBTC,CNCLTC,LEAFLTC,BNCRBTC,SILKBTC,BTCCAD,CANNBTC,LK7BTC,VOOTBTC,DOGELTC,FFCBTC,FSTBTC,HYPBTC,ORBBTC,PPCBTC,TTCBTC,42BTC,MEOWLTC,NTRNBTC,CLAMBTC,CNLBTC,DASHUSD,QRKXRP,ARCHBTC,QRKLTC,RIPOBTC,XNCLTC,FRKBTC,GUELTC,PointsBTC,SLINGBTC,SMCBTC,USDeBTC,UTCXRP,YACLTC,ZETLTC", + "EnabledPairs": "AEROXRP,DBLLTC,GLYPHLTC,GMLBTC,HBNBTC,MNCBTC,MOONXRP,CKCBTC,LGDBTC,PXCLTC,XBSBTC,DMDXRP,ARIBTC,BTCEUR,CINBTC,CLOAKLTC,CRYPTLTC,DGCBTC,DMCLTC,EKNBTC,ICBBTC,NMCBTC,SRCBTC,SXCLTC,SFRBTC,ADTLTC,AGSBTC,DEMXRP,EFLBTC,IOCBTC,PHSBTC,PXCBTC,TITBTC,ZRCBTC,VIABTC,GDCBTC,IFCBTC,JKCBTC,MYRBTC,NBLBTC,STARTBTC,TESBTC,ZEDBTC,ASCLTC,BLKBTC,GLDLTC,LSDBTC,TRCBTC,UROXRP,XPMBTC,SPABTC,BTCUSD,IXCBTC,MNEBTC,MRYBTC,MSTLTC,NXTBTC,PPCXRP,IXCXRP,BENBTC,COLXRP,CRAVEBTC,DGBBTC,EMC2BTC,GMELTC,HALBTC,MECLTC,NMBBTC,NXTXRP,SPAXRP,VRCBTC,UROBTC,CCNBTC,COLLTC,DOGEXRP,KDCBTC,LTCUSD,MINBTC,NXTLTC,DOGEBTC,FSTLTC,IFCXRP,MEMLTC,MYRXRP,PPCLTC,VIAXRP,TESLTC,DEMBTC,DGBXRP,EMC2XRP,IFCLTC,NAUTBTC,NECBTC,RYCBTC,VRCXRP,XAUBTC,NMCXRP,ALFBTC,BTEBTC,CPRLTC,DGCXRP,EACLTC,GLXBTC,ICBXRP,PSEUDBTC,SRCXRP,SUPERLTC,VTCLTC,GLCBTC,ARGBTC,BLKXRP,CLOAKBTC,CRYPTBTC,CYPBTC,DGCLTC,FLOXRP,PYCBTC,SAT2BTC,SXCBTC,TRCXRP,XPMXRP,KGCBTC,LABBTC,MECBTC,RDDUSD,TIXLTC,VRCLTC,EMDBTC,GLYPHBTC,MEDBTC,UTCBTC,LTBXRP,SHLDBTC,XCLTC,SDCBTC,BTBBTC,CATBTC,CKCXRP,CTMLTC,LYCBTC,PPCUSD,RZRLTC,SSVBTC,YBCBTC,AURXRP,NETBTC,SLGXRP,SWIFTBTC,TEKXRP,XSTBTC,TGCBTC,ACOINBTC,AURLTC,BQCBTC,CRCBTC,DOGEUSD,EZCLTC,SBCBTC,XLBBTC,DSBBTC,8BITBTC,ALNBTC,AXRBTC,BCXBTC,BLUBTC,BTMBTC,CADUSD,WBBBTC,EURUSD,JBSBTC,LTCBTC,NETLTC,NVCBTC,SHADEBTC,SYSBTC,UNBXRP,ANCBTC,CAPBTC,CLRXRP,HVCXRP,LKYBTC,MZCBTC,TAGBTC,UNOBTC,WDCBTC,FRKLTC,GUEBTC,KEYBTC,POTBTC,STRBTC,YACBTC,ZETBTC,APEXBTC,BUKBTC,CRACKBTC,MAXBTC,RDDBTC,XAIBTC,SPTBTC,CBXLTC,FRCBTC,LXCBTC,MAXXRP,PTSBTC,RDDXRP,REDLTC,ZRCUSD,EACXRP,HUCBTC,JUDGEXRP,MAXLTC,RDDLTC,TAKBTC,VTCXRP,RPCBTC,CAIxBTC,CAPXRP,CINNIBTC,EACBTC,HTML5XRP,JUDGEBTC,MZCXRP,SUPERBTC,UNOXRP,VTCBTC,WDCXRP,ANCLTC,FLTBTC,FRCXRP,HTML5LTC,NRBBTC,WDCLTC,BATLTC,DVCLTC,FTCLTC,LOTLTC,LTCDBTC,SLGBTC,AURBTC,CRAIGBTC,EXEBTC,EZCBTC,KEYXRP,POTXRP,SBCLTC,TEKBTC,XXXBTC,YACXRP,ZCCBTC,ZETXRP,UNBBTC,BETBTC,BTBXRP,CBXBTC,CLRBTC,HVCBTC,NXTUSD,OSCBTC,VDOBTC,XJOBTC,LTBBTC,RZRBTC,XRPBTC,LTCXBTC,NANBTC,NETXRP,BTCDBTC,SOLEBTC,WCXRP,DRKCBTC,MINTBTC,NYANLTC,BITBBTC,KARMLTC,FIBREBTC,XCBTC,ACBTC,DASHBTC,CASHBTC,DASHXRP,NAVBTC,ZEITXRP,DASHLTC,DVCXRP,EXCLBTC,FTCXRP,OPALBTC,ZEITLTC,XPYBTC,AMCBTC,BTGBTC,CENTXRP,CSCBTC,DVCBTC,FTCBTC,TIPSXRP,DTBTC,FLAPXRP,FRACBTC,NAVXRP,TIPSLTC,ULTCBTC,ELPLTC,MINTXRP,NYANBTC,WCBTC,XCXRP,COOLBTC,FLAPLTC,NOBLBTC,ALNXRP,BLUXRP,LTCXRP,NVCXRP,SYSXRP,XCRBTC,BLKLTC,CMCBTC,DMDBTC,FLOLTC,GLDBTC,NRSBTC,TORBTC,XPMLTC,BTCDXRP,KARMXRP,QRKBTC,RT2BTC,42XRP,AEROBTC,GBBTC,XBOTBTC,XCASHBTC,BOSTBTC,FTCUSD,RBBTLTC,XPYUSD,DIMELTC,MNBTC,MOONLTC,SYNCBTC,DOGEDBTC,FC2BTC,LTCXLTC,MONABTC,MYSTBTC,XRPUSD,CNCBTC,COMMBTC,ELCBTC,UTILBTC,007BTC,CACHBTC,CNCXRP,LEAFXRP,TRONBTC,CNCLTC,LEAFLTC,BNCRBTC,SILKBTC,BTCCAD,CANNBTC,LK7BTC,VOOTBTC,DOGELTC,FFCBTC,FSTBTC,HYPBTC,ORBBTC,PPCBTC,TTCBTC,42BTC,MEOWLTC,NTRNBTC,CLAMBTC,CNLBTC,DASHUSD,QRKXRP,ARCHBTC,QRKLTC,RIPOBTC,XNCLTC,FRKBTC,GUELTC,PointsBTC,SLINGBTC,SMCBTC,USDeBTC,UTCXRP,YACLTC,ZETLTC", "ClientID": "Password", "APIKey": "Key", "APISecret": "Secret", diff --git a/cryptsyhttp.go b/cryptsyhttp.go index f90de500..c728a8ae 100644 --- a/cryptsyhttp.go +++ b/cryptsyhttp.go @@ -1,6 +1,7 @@ package main import ( + "errors" "fmt" "log" "net/url" @@ -41,6 +42,10 @@ type Cryptsy struct { BaseCurrencies []string AvailablePairs []string EnabledPairs []string + Market map[string]CryptsyMarket + Ticker map[string]CryptsyTicker + Volume map[string]CryptsyVolume + Currencies map[string]CryptsyCurrency } type CryptsyMarket struct { @@ -136,6 +141,10 @@ func (c *Cryptsy) SetDefaults() { c.MakerFee = 0.33 c.Verbose = false c.RESTPollingDelay = 10 + c.Market = make(map[string]CryptsyMarket) + c.Ticker = make(map[string]CryptsyTicker) + c.Volume = make(map[string]CryptsyVolume) + c.Currencies = make(map[string]CryptsyCurrency) } func (c *Cryptsy) GetName() string { @@ -162,23 +171,26 @@ func (c *Cryptsy) Run() { if c.Verbose { log.Printf("%s Websocket: %s.", c.GetName(), IsEnabled(c.Websocket)) log.Printf("%s polling delay: %ds.\n", c.GetName(), c.RESTPollingDelay) + log.Printf("%s %d currencies enabled: %s.\n", c.GetName(), len(c.EnabledPairs), c.EnabledPairs) } if c.Websocket { - go c.PusherClient([]string{"213", "2", "1", "155", "466", "132", "3"}) + go c.PusherClient() } for c.Enabled { - go func() { - CryptsyBTC := c.GetMarkets("BTCUSD") - log.Printf("Cryptsy BTC: Last %f High %f Low %f Volume %f\n", CryptsyBTC[0].LastTrade.Price, CryptsyBTC[0].DayStats.PriceHigh, CryptsyBTC[0].DayStats.PriceLow, CryptsyBTC[0].DayStats.Volume) - AddExchangeInfo(c.GetName(), "BTC", CryptsyBTC[0].LastTrade.Price, CryptsyBTC[0].DayStats.Volume) - }() - go func() { - CryptsyLTC := c.GetMarkets("LTCUSD") - log.Printf("Cryptsy LTC: Last %f High %f Low %f Volume %f\n", CryptsyLTC[0].LastTrade.Price, CryptsyLTC[0].DayStats.PriceHigh, CryptsyLTC[0].DayStats.PriceLow, CryptsyLTC[0].DayStats.Volume) - AddExchangeInfo(c.GetName(), "LTC", CryptsyLTC[0].LastTrade.Price, CryptsyLTC[0].DayStats.Volume) - }() + err := c.GetMarkets() + if err != nil { + log.Println(err) + } else { + for _, x := range c.EnabledPairs { + market := c.Market[x] + if market.ID != "" { + log.Printf("Cryptsy %s: Last %f High %f Low %f Volume %f\n", x, market.LastTrade.Price, market.DayStats.PriceHigh, market.DayStats.PriceLow, market.DayStats.Volume) + AddExchangeInfo(c.GetName(), x, market.LastTrade.Price, market.DayStats.Volume) + } + } + } time.Sleep(time.Second * c.RESTPollingDelay) } } @@ -188,97 +200,77 @@ func (c *Cryptsy) SetAPIKeys(apiKey, apiSecret string) { c.APISecret = apiSecret } -func (c *Cryptsy) GetMarkets(id string) []CryptsyMarket { +func (c *Cryptsy) GetMarkets() error { type Response struct { Data []CryptsyMarket `json:"data"` Success bool `json:"success"` } + response := Response{} err := SendHTTPGetRequest(CRYPTSY_API_URL+CRYPTSY_MARKETS, true, &response) + if err != nil { - log.Println(err) - return []CryptsyMarket{} + return err } if !response.Success { - return []CryptsyMarket{} + return errors.New("Unable to retrieve Cryptsy market data.") } - if len(id) > 0 { - for _, x := range response.Data { - label := strings.Replace(x.Label, "/", "", -1) - if label == id { - result := make([]CryptsyMarket, 0) - result = append(result, x) - return result - } - } - log.Println("Unable to find market id.") - return []CryptsyMarket{} + for _, x := range response.Data { + label := strings.Replace(x.Label, "/", "", -1) + x.Label = label + c.Market[label] = x } - return response.Data + return nil } -func (c *Cryptsy) GetVolume(id string) []CryptsyVolume { +func (c *Cryptsy) GetVolume(id string) error { type Response struct { Data []CryptsyVolume `json:"data"` Success bool `json:"success"` } + response := Response{} path := fmt.Sprintf("%s/%s", CRYPTSY_API_URL+CRYPTSY_MARKETS, CRYPTSY_VOLUME) err := SendHTTPGetRequest(path, true, &response) + if err != nil { - log.Println(err) - return []CryptsyVolume{} + return err } if !response.Success { - return []CryptsyVolume{} + return errors.New("Unable to retrieve Cryptsy volume data.") } - if len(id) > 0 { - for _, x := range response.Data { - if x.ID == id { - result := make([]CryptsyVolume, 0) - result = append(result, x) - return result - } - } - log.Println("Unable to find market id.") - return []CryptsyVolume{} + for _, x := range response.Data { + c.Volume[x.ID] = x } - return response.Data + return nil } -func (c *Cryptsy) GetTicker(id string) []CryptsyTicker { +func (c *Cryptsy) GetTickers() error { type Response struct { Data []CryptsyTicker `json:"data"` Success bool `json:"success"` } + response := Response{} path := fmt.Sprintf("%s/%s", CRYPTSY_API_URL+CRYPTSY_MARKETS, CRYPTSY_TICKER) err := SendHTTPGetRequest(path, true, &response) + if err != nil { - log.Println(err) - return []CryptsyTicker{} + return err } if !response.Success { - return []CryptsyTicker{} + return errors.New("Unable to fetch market ticker data.") } - if len(id) > 0 { - for _, x := range response.Data { - if x.ID == id { - result := make([]CryptsyTicker, 0) - result = append(result, x) - return result - } - } - log.Println("Unable to find market id.") - return []CryptsyTicker{} + for _, x := range response.Data { + c.Ticker[x.ID] = x } - return response.Data + return nil } func (c *Cryptsy) GetMarketFees(id string) { @@ -339,7 +331,7 @@ func (c *Cryptsy) GetOHLC(id string) { log.Println(response) } -func (c *Cryptsy) GetCurrencies(id string) []CryptsyCurrency { +func (c *Cryptsy) GetCurrencies() error { type Response struct { Data []CryptsyCurrency `json:"data"` Success bool `json:"success"` @@ -348,26 +340,17 @@ func (c *Cryptsy) GetCurrencies(id string) []CryptsyCurrency { response := Response{} err := SendHTTPGetRequest(CRYPTSY_API_URL+CRYPTSY_CURRENCIES, true, &response) if err != nil { - log.Println(err) - return []CryptsyCurrency{} + return err } if !response.Success { - return []CryptsyCurrency{} + return errors.New("Unable to get Cryptsy currency data.") } - if len(id) > 0 { - for _, x := range response.Data { - if x.ID == id { - result := make([]CryptsyCurrency, 0) - result = append(result, x) - return result - } - } - log.Println("Unable to find market id.") - return []CryptsyCurrency{} + for _, x := range response.Data { + c.Currencies[x.ID] = x } - return response.Data + return nil } func (c *Cryptsy) GetInfo() { diff --git a/cryptsywebsocket.go b/cryptsywebsocket.go index 869695b6..17590d5e 100644 --- a/cryptsywebsocket.go +++ b/cryptsywebsocket.go @@ -3,6 +3,7 @@ package main import ( "github.com/toorop/go-pusher" "log" + "time" ) type CryptsyPusherTrade struct { @@ -40,7 +41,7 @@ const ( CRYPTSY_PUSHER_KEY = "cb65d0a7a72cd94adf1f" ) -func (c *Cryptsy) PusherClient(marketID []string) { +func (c *Cryptsy) PusherClient() { for c.Enabled && c.Websocket { pusherClient, err := pusher.NewClient(CRYPTSY_PUSHER_KEY) if err != nil { @@ -48,7 +49,27 @@ func (c *Cryptsy) PusherClient(marketID []string) { continue } + if c.Verbose { + log.Printf("%s Pusher client connected.\n", c.GetName()) + } + + for len(c.Market) == 0 { + time.Sleep(time.Second * 1) + } + + marketID := []string{} + for _, x := range c.EnabledPairs { + marketID = append(marketID, c.Market[x].ID) + } + + if c.Verbose { + log.Printf("%s Websocket subscribing to %d channels.\n", c.GetName(), len(marketID)) + } + for i := 0; i < len(marketID); i++ { + if marketID[i] == "" { + continue + } err = pusherClient.Subscribe("trade." + marketID[i]) if err != nil { @@ -66,7 +87,6 @@ func (c *Cryptsy) PusherClient(marketID []string) { log.Printf("%s Websocket Bind error: ", c.GetName(), err) continue } - log.Printf("%s Pusher client connected.\n", c.GetName()) for c.Enabled && c.Websocket { select { diff --git a/events.go b/events.go index d195820d..ec067293 100644 --- a/events.go +++ b/events.go @@ -115,8 +115,8 @@ func (e *Event) CheckCondition() bool { lastPrice = bot.exchange.bitstamp.GetTicker().Last } else if bot.exchange.coinbase.GetName() == e.Exchange { lastPrice = bot.exchange.coinbase.GetTicker("BTC-USD").Price - } else if bot.exchange.coinbase.GetName() == e.Exchange { - lastPrice = bot.exchange.cryptsy.GetMarkets("BTCUSD")[0].LastTrade.Price + } else if bot.exchange.cryptsy.GetName() == e.Exchange { + lastPrice = bot.exchange.cryptsy.Market["BTCUSD"].LastTrade.Price } else if bot.exchange.lakebtc.GetName() == e.Exchange { lastPrice = bot.exchange.lakebtc.GetTicker().CNY.Last } else if bot.exchange.btcchina.GetName() == e.Exchange { diff --git a/itbithttp.go b/itbithttp.go index 13849576..92511fe8 100644 --- a/itbithttp.go +++ b/itbithttp.go @@ -86,14 +86,18 @@ func (i *ItBit) GetFee(maker bool) float64 { func (i *ItBit) Run() { if i.Verbose { log.Printf("%s polling delay: %ds.\n", i.GetName(), i.RESTPollingDelay) + log.Printf("%s %d currencies enabled: %s.\n", i.GetName(), len(i.EnabledPairs), i.EnabledPairs) } for i.Enabled { - go func() { - ItbitBTC := i.GetTicker("XBTUSD") - log.Printf("ItBit BTC: Last %f High %f Low %f Volume %f\n", ItbitBTC.LastPrice, ItbitBTC.High24h, ItbitBTC.Low24h, ItbitBTC.Volume24h) - AddExchangeInfo(i.GetName(), "BTC", ItbitBTC.LastPrice, ItbitBTC.Volume24h) - }() + for _, x := range i.EnabledPairs { + currency := x + go func() { + ticker := i.GetTicker(currency) + log.Printf("ItBit %s: Last %f High %f Low %f Volume %f\n", currency, ticker.LastPrice, ticker.High24h, ticker.Low24h, ticker.Volume24h) + AddExchangeInfo(i.GetName(), currency, ticker.LastPrice, ticker.Volume24h) + }() + } time.Sleep(time.Second * i.RESTPollingDelay) } } diff --git a/lakebtchttp.go b/lakebtchttp.go index 8fbf285b..04604d11 100644 --- a/lakebtchttp.go +++ b/lakebtchttp.go @@ -95,18 +95,24 @@ func (l *LakeBTC) Run() { if l.Verbose { log.Printf("%s Websocket: %s. (url: %s).\n", l.GetName(), IsEnabled(l.Websocket), LAKEBTC_WEBSOCKET_URL) log.Printf("%s polling delay: %ds.\n", l.GetName(), l.RESTPollingDelay) + log.Printf("%s %d currencies enabled: %s.\n", l.GetName(), len(l.EnabledPairs), l.EnabledPairs) } if l.Websocket { - l.WebsocketClient() + go l.WebsocketClient() } for l.Enabled { - go func() { - LakeBTCTickerResponse := l.GetTicker() - log.Printf("LakeBTC USD: Last %f (%f) High %f (%f) Low %f (%f) Volume US %f (CNY %f)\n", LakeBTCTickerResponse.USD.Last, LakeBTCTickerResponse.CNY.Last, LakeBTCTickerResponse.USD.High, LakeBTCTickerResponse.CNY.High, LakeBTCTickerResponse.USD.Low, LakeBTCTickerResponse.CNY.Low, LakeBTCTickerResponse.USD.Volume, LakeBTCTickerResponse.CNY.Volume) - AddExchangeInfo(l.GetName(), "BTC", LakeBTCTickerResponse.USD.Last, LakeBTCTickerResponse.USD.Volume) - }() + ticker := l.GetTicker() + for _, x := range l.EnabledPairs { + if x == "BTCUSD" { + log.Printf("LakeBTC BTC USD: Last %f High %f Low %f Volume %f\n", ticker.USD.Last, ticker.USD.High, ticker.USD.Low, ticker.USD.Volume) + AddExchangeInfo(l.GetName(), "BTCUSD", ticker.USD.Last, ticker.USD.Volume) + } else if x == "BTCCNY" { + log.Printf("LakeBTC BTC CNY: Last %f High %f Low %f Volume %f\n", ticker.CNY.Last, ticker.CNY.High, ticker.CNY.Low, ticker.CNY.Volume) + AddExchangeInfo(l.GetName(), "BTCCNY", ticker.CNY.Last, ticker.CNY.Volume) + } + } time.Sleep(time.Second * l.RESTPollingDelay) } } diff --git a/lakebtcwebsocket.go b/lakebtcwebsocket.go index 665e05e6..cd0f3a1d 100644 --- a/lakebtcwebsocket.go +++ b/lakebtcwebsocket.go @@ -75,8 +75,10 @@ func (l *LakeBTC) WebsocketClient() { switch event { case "client_connected": WSRailsSubscribe("ticker", conn) - WSRailsSubscribe("orderbook_CNY", conn) - WSRailsSubscribe("orderbook_USD", conn) + for _, x := range l.EnabledPairs { + currency := x[3:] + WSRailsSubscribe(fmt.Sprintf("orderbook_%s", currency), conn) + } case "websocket_rails.subscribe": case "websocket_rails.ping": WSRailsPong("null", conn) diff --git a/okcoinhttp.go b/okcoinhttp.go index bc95288f..f058e159 100644 --- a/okcoinhttp.go +++ b/okcoinhttp.go @@ -31,6 +31,7 @@ type OKCoin struct { BaseCurrencies []string AvailablePairs []string EnabledPairs []string + FuturesValues []string } type OKCoinTicker struct { @@ -157,6 +158,7 @@ func (o *OKCoin) SetDefaults() { o.Verbose = false o.Websocket = false o.RESTPollingDelay = 10 + o.FuturesValues = []string{"this_week", "next_week", "quarter"} } func (o *OKCoin) GetName() string { @@ -196,77 +198,40 @@ func (o *OKCoin) Run() { if o.Verbose { log.Printf("%s Websocket: %s. (url: %s).\n", o.GetName(), IsEnabled(o.Websocket), o.WebsocketURL) log.Printf("%s polling delay: %ds.\n", o.GetName(), o.RESTPollingDelay) + log.Printf("%s %d currencies enabled: %s.\n", o.GetName(), len(o.EnabledPairs), o.EnabledPairs) } if o.Websocket { - if o.WebsocketURL == OKCOIN_WEBSOCKET_URL { - go o.WebsocketClient([]string{"btcusd", "ltcusd"}) - } else { - go o.WebsocketClient([]string{"btccny", "ltccny"}) - } + go o.WebsocketClient() } for o.Enabled { - if o.APIUrl == OKCOIN_API_URL { - go func() { - OKCoinChinaIntlBTC := o.GetTicker("btc_usd") - log.Printf("OKCoin Intl BTC: Last %f High %f Low %f Volume %f\n", OKCoinChinaIntlBTC.Last, OKCoinChinaIntlBTC.High, OKCoinChinaIntlBTC.Low, OKCoinChinaIntlBTC.Vol) - AddExchangeInfo(o.GetName(), "BTC", OKCoinChinaIntlBTC.Last, OKCoinChinaIntlBTC.Vol) - }() - - go func() { - OKCoinChinaIntlLTC := o.GetTicker("ltc_usd") - log.Printf("OKCoin Intl LTC: Last %f High %f Low %f Volume %f\n", OKCoinChinaIntlLTC.Last, OKCoinChinaIntlLTC.High, OKCoinChinaIntlLTC.Low, OKCoinChinaIntlLTC.Vol) - AddExchangeInfo(o.GetName(), "LTC", OKCoinChinaIntlLTC.Last, OKCoinChinaIntlLTC.Vol) - }() - - go func() { - OKCoinFuturesBTC := o.GetFuturesTicker("btc_usd", "this_week") - log.Printf("OKCoin BTC Futures (weekly): Last %f High %f Low %f Volume %f\n", OKCoinFuturesBTC.Last, OKCoinFuturesBTC.High, OKCoinFuturesBTC.Low, OKCoinFuturesBTC.Vol) - }() - - go func() { - OKCoinFuturesBTC := o.GetFuturesTicker("ltc_usd", "this_week") - log.Printf("OKCoin LTC Futures (weekly): Last %f High %f Low %f Volume %f\n", OKCoinFuturesBTC.Last, OKCoinFuturesBTC.High, OKCoinFuturesBTC.Low, OKCoinFuturesBTC.Vol) - }() - - go func() { - OKCoinFuturesBTC := o.GetFuturesTicker("btc_usd", "next_week") - log.Printf("OKCoin BTC Futures (biweekly): Last %f High %f Low %f Volume %f\n", OKCoinFuturesBTC.Last, OKCoinFuturesBTC.High, OKCoinFuturesBTC.Low, OKCoinFuturesBTC.Vol) - }() - - go func() { - OKCoinFuturesBTC := o.GetFuturesTicker("ltc_usd", "next_week") - log.Printf("OKCoin LTC Futures (biweekly): Last %f High %f Low %f Volume %f\n", OKCoinFuturesBTC.Last, OKCoinFuturesBTC.High, OKCoinFuturesBTC.Low, OKCoinFuturesBTC.Vol) - }() - - go func() { - OKCoinFuturesBTC := o.GetFuturesTicker("btc_usd", "quarter") - log.Printf("OKCoin BTC Futures (quarterly): Last %f High %f Low %f Volume %f\n", OKCoinFuturesBTC.Last, OKCoinFuturesBTC.High, OKCoinFuturesBTC.Low, OKCoinFuturesBTC.Vol) - }() - - go func() { - OKCoinFuturesBTC := o.GetFuturesTicker("ltc_usd", "quarter") - log.Printf("OKCoin LTC Futures (quarterly): Last %f High %f Low %f Volume %f\n", OKCoinFuturesBTC.Last, OKCoinFuturesBTC.High, OKCoinFuturesBTC.Low, OKCoinFuturesBTC.Vol) - }() - } else { - go func() { - OKCoinChinaBTC := o.GetTicker("btc_cny") - OKCoinChinaBTCLastUSD, _ := ConvertCurrency(OKCoinChinaBTC.Last, "CNY", "USD") - OKCoinChinaBTCHighUSD, _ := ConvertCurrency(OKCoinChinaBTC.High, "CNY", "USD") - OKCoinChinaBTCLowUSD, _ := ConvertCurrency(OKCoinChinaBTC.Low, "CNY", "USD") - log.Printf("OKCoin China: Last %f (%f) High %f (%f) Low %f (%f) Volume %f\n", OKCoinChinaBTCLastUSD, OKCoinChinaBTC.Last, OKCoinChinaBTCHighUSD, OKCoinChinaBTC.High, OKCoinChinaBTCLowUSD, OKCoinChinaBTC.Low, OKCoinChinaBTC.Vol) - AddExchangeInfo(o.GetName(), "BTC", OKCoinChinaBTCLastUSD, OKCoinChinaBTC.Vol) - }() - - go func() { - OKCoinChinaLTC := o.GetTicker("ltc_cny") - OKCoinChinaLTCLastUSD, _ := ConvertCurrency(OKCoinChinaLTC.Last, "CNY", "USD") - OKCoinChinaLTCHighUSD, _ := ConvertCurrency(OKCoinChinaLTC.High, "CNY", "USD") - OKCoinChinaLTCLowUSD, _ := ConvertCurrency(OKCoinChinaLTC.Low, "CNY", "USD") - log.Printf("OKCoin China: Last %f (%f) High %f (%f) Low %f (%f) Volume %f\n", OKCoinChinaLTCLastUSD, OKCoinChinaLTC.Last, OKCoinChinaLTCHighUSD, OKCoinChinaLTC.High, OKCoinChinaLTCLowUSD, OKCoinChinaLTC.Low, OKCoinChinaLTC.Vol) - AddExchangeInfo(o.GetName(), "LTC", OKCoinChinaLTCLastUSD, OKCoinChinaLTC.Vol) - }() + for _, x := range o.EnabledPairs { + currency := StringToLower(x[0:3] + "_" + x[3:]) + if o.APIUrl == OKCOIN_API_URL { + for _, y := range o.FuturesValues { + futuresValue := y + go func() { + ticker := o.GetFuturesTicker(currency, futuresValue) + log.Printf("OKCoin Intl Futures %s (%s): Last %f High %f Low %f Volume %f\n", currency, futuresValue, ticker.Last, ticker.High, ticker.Low, ticker.Vol) + AddExchangeInfo(o.GetName(), currency, ticker.Last, ticker.Vol) + }() + } + go func() { + ticker := o.GetTicker(currency) + log.Printf("OKCoin Intl Spot %s: Last %f High %f Low %f Volume %f\n", currency, ticker.Last, ticker.High, ticker.Low, ticker.Vol) + AddExchangeInfo(o.GetName(), currency, ticker.Last, ticker.Vol) + }() + } else { + go func() { + ticker := o.GetTicker(currency) + tickerLastUSD, _ := ConvertCurrency(ticker.Last, "CNY", "USD") + tickerHighUSD, _ := ConvertCurrency(ticker.High, "CNY", "USD") + tickerLowUSD, _ := ConvertCurrency(ticker.Low, "CNY", "USD") + log.Printf("OKCoin China %s: Last %f (%f) High %f (%f) Low %f (%f) Volume %f\n", currency, tickerLastUSD, ticker.Last, tickerHighUSD, ticker.High, tickerLowUSD, ticker.Low, ticker.Vol) + AddExchangeInfo(o.GetName(), currency, ticker.Last, ticker.Vol) + }() + } } time.Sleep(time.Second * o.RESTPollingDelay) } diff --git a/okcoinwebsocket.go b/okcoinwebsocket.go index 14345701..90be0a33 100644 --- a/okcoinwebsocket.go +++ b/okcoinwebsocket.go @@ -327,6 +327,7 @@ func (o *OKCoin) WebsocketFuturesOrderInfo(symbol, contractType string, orderID values["status"] = strconv.Itoa(orderStatus) values["current_page"] = strconv.Itoa(currentPage) values["page_length"] = strconv.Itoa(pageLength) + log.Println(values) o.AddChannelAuthenticated(OKCOIN_WEBSOCKET_FUTURES_ORDER_INFO, values) } @@ -384,10 +385,16 @@ func (o *OKCoin) RemoveChannelAuthenticated(conn *websocket.Conn, channel string } } -func (o *OKCoin) WebsocketClient(currencies []string) { - if len(currencies) == 0 { - log.Println("No currencies for Websocket client specified.") - return +func (o *OKCoin) WebsocketClient() { + klineValues := []string{"1min", "3min", "5min", "15min", "30min", "1hour", "2hour", "4hour", "6hour", "12hour", "day", "3day", "week"} + currencyChan, userinfoChan := "", "" + + if o.WebsocketURL == OKCOIN_WEBSOCKET_URL_CHINA { + currencyChan = OKCOIN_WEBSOCKET_CNY_REALTRADES + userinfoChan = OKCOIN_WEBSOCKET_SPOTCNY_USERINFO + } else { + currencyChan = OKCOIN_WEBSOCKET_USD_REALTRADES + userinfoChan = OKCOIN_WEBSOCKET_SPOTUSD_USERINFO } for o.Enabled && o.Websocket { @@ -400,53 +407,40 @@ func (o *OKCoin) WebsocketClient(currencies []string) { continue } - log.Printf("%s Connected to Websocket.\n", o.GetName()) - OKConnWebsocket.SetPingHandler(o.PingHandler) - currencyChan, userinfoChan := "", "" - futuruesContractValues := []string{"this_week", "next_week", "quarter"} - klineValues := []string{"1min", "3min", "5min", "15min", "30min", "1hour", "2hour", "4hour", "6hour", "12hour", "day", "3day", "week"} + if o.Verbose { + log.Printf("%s Connected to Websocket.\n", o.GetName()) + } - if o.WebsocketURL == OKCOIN_WEBSOCKET_URL_CHINA { - currencyChan = OKCOIN_WEBSOCKET_CNY_REALTRADES - userinfoChan = OKCOIN_WEBSOCKET_SPOTCNY_USERINFO - o.WebsocketSpotOrderInfo("btc_cny", -1) - o.WebsocketSpotOrderInfo("ltc_cny", -1) - } else { - currencyChan = OKCOIN_WEBSOCKET_USD_REALTRADES - userinfoChan = OKCOIN_WEBSOCKET_SPOTUSD_USERINFO - o.WebsocketSpotOrderInfo("btc_usd", -1) - o.WebsocketSpotOrderInfo("ltc_usd", -1) + OKConnWebsocket.SetPingHandler(o.PingHandler) + if o.WebsocketURL == OKCOIN_WEBSOCKET_URL { o.AddChannelAuthenticated(OKCOIN_WEBSOCKET_FUTURES_REALTRADES, map[string]string{}) o.AddChannelAuthenticated(OKCOIN_WEBSOCKET_FUTURES_USERINFO, map[string]string{}) - - // get all unfilled futures orders for both currencies - for _, y := range futuruesContractValues { - o.WebsocketFuturesOrderInfo("btc_usd", y, -1, 1, 1, 50) - o.WebsocketFuturesOrderInfo("ltc_usd", y, -1, 1, 1, 50) - } } o.AddChannelAuthenticated(currencyChan, map[string]string{}) o.AddChannelAuthenticated(userinfoChan, map[string]string{}) - //spot - for _, x := range currencies { - o.AddChannel(fmt.Sprintf("ok_%s_ticker", x)) - o.AddChannel(fmt.Sprintf("ok_%s_depth60", x)) - o.AddChannel(fmt.Sprintf("ok_%s_trades_v1", x)) - for _, y := range klineValues { - o.AddChannel(fmt.Sprintf("ok_%s_kline_%s", x, y)) - } - } + for _, x := range o.EnabledPairs { + currency := StringToLower(x) + currencyUL := currency[0:3] + "_" + currency[3:] + o.WebsocketSpotOrderInfo(currencyUL, -1) + if o.WebsocketURL == OKCOIN_WEBSOCKET_URL { + o.AddChannel(fmt.Sprintf("ok_%s_future_index", currency)) + for _, y := range o.FuturesValues { + o.WebsocketFuturesOrderInfo(currencyUL, y, -1, 1, 1, 50) + o.AddChannel(fmt.Sprintf("ok_%s_future_ticker_%s", currency, y)) + o.AddChannel(fmt.Sprintf("ok_%s_future_depth_%s_60", currency, y)) + o.AddChannel(fmt.Sprintf("ok_%s_future_trade_v1_%s", currency, y)) + for _, z := range klineValues { + o.AddChannel(fmt.Sprintf("ok_future_%s_kline_%s_%s", currency, y, z)) + } + } + } else { + o.AddChannel(fmt.Sprintf("ok_%s_ticker", currency)) + o.AddChannel(fmt.Sprintf("ok_%s_depth60", currency)) + o.AddChannel(fmt.Sprintf("ok_%s_trades_v1", currency)) - //futures - for _, x := range currencies { - o.AddChannel(fmt.Sprintf("ok_%s_future_index", x)) - for _, y := range futuruesContractValues { - o.AddChannel(fmt.Sprintf("ok_%s_future_ticker_%s", x, y)) - o.AddChannel(fmt.Sprintf("ok_%s_future_depth_%s_60", x, y)) - o.AddChannel(fmt.Sprintf("ok_%s_future_trade_v1_%s", x, y)) - for _, z := range klineValues { - o.AddChannel(fmt.Sprintf("ok_future_%s_kline_%s_%s", x, y, z)) + for _, y := range klineValues { + o.AddChannel(fmt.Sprintf("ok_%s_kline_%s", currency, y)) } } }