Ecoer Logo
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS12.43%
Net Worth
8.813USD
STEEM
0.000STEEM
SBD
18.206SBD
Effective Power
5.007SP
├── Own SP
1.275SP
└── Incoming Deleg
+3.732SP

Detailed Balance

STEEM
balance
0.000STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
1.275SP
Delegated Out
0.000SP
Delegation In
3.732SP
Effective Power
5.007SP
Reward SP (pending)
14.543SP
SBD
sbd_balance
0.000SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
18.206SBD
{
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.000 STEEM",
  "vesting_shares": "2073.425342 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "6070.234464 VESTS",
  "sbd_balance": "0.000 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "18.206 SBD",
  "conversions": []
}

Account Info

nameaxiomier
id165600
rank1,050,236
reputation133329213694
created2017-05-20T14:42:30
recovery_accountsteem
proxyNone
post_count2
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2017-05-22T15:57:18
last_root_post2017-05-20T18:03:54
last_vote_time2017-05-30T15:56:00
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.000 STEEM
savings_balance0.000 STEEM
sbd_balance0.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares2073.425342 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares6070.234464 VESTS
reward_vesting_balance30142.367862 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update1970-01-01T00:00:00
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "id": 165600,
  "name": "axiomier",
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM4zVi3Xf4UrhgrYfv6JFtoJt7NiepUT36ofnB1A4NKC2mDPN5SF",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8eJSfu1FqEhcQLed55WudwweAGQxy1znTnMivP7P3EG3XSLpEZ",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6q7wVzcQNQZaCgiZi9kwo1pXufDFQ7VVH6CYY657AHRGmUMZEQ",
        1
      ]
    ]
  },
  "memo_key": "STM5KK8KYWNwcURCKa4JKiqvsYPSqPryi8iXMHUmvZjG5JFbTYgcA",
  "json_metadata": "",
  "posting_json_metadata": "",
  "proxy": "",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_account_update": "1970-01-01T00:00:00",
  "created": "2017-05-20T14:42:30",
  "mined": false,
  "recovery_account": "steem",
  "last_account_recovery": "1970-01-01T00:00:00",
  "reset_account": "null",
  "comment_count": 0,
  "lifetime_vote_count": 0,
  "post_count": 2,
  "can_vote": true,
  "voting_manabar": {
    "current_mana": "8143659806",
    "last_update_time": 1779054381
  },
  "downvote_manabar": {
    "current_mana": 2035914951,
    "last_update_time": 1779054381
  },
  "voting_power": 0,
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "sbd_balance": "0.000 SBD",
  "sbd_seconds": "0",
  "sbd_seconds_last_update": "1970-01-01T00:00:00",
  "sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "reward_sbd_balance": "18.206 SBD",
  "reward_steem_balance": "0.000 STEEM",
  "reward_vesting_balance": "30142.367862 VESTS",
  "reward_vesting_steem": "14.543 STEEM",
  "vesting_shares": "2073.425342 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "6070.234464 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "withdrawn": 0,
  "to_withdraw": 0,
  "withdraw_routes": 0,
  "curation_rewards": 0,
  "posting_rewards": 29085,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "witnesses_voted_for": 0,
  "last_post": "2017-05-22T15:57:18",
  "last_root_post": "2017-05-20T18:03:54",
  "last_vote_time": "2017-05-30T15:56:00",
  "post_bandwidth": 0,
  "pending_claimed_accounts": 0,
  "vesting_balance": "0.000 STEEM",
  "reputation": "133329213694",
  "transfer_history": [],
  "market_history": [],
  "post_history": [],
  "vote_history": [],
  "other_history": [],
  "witness_votes": [],
  "tags_usage": [],
  "guest_bloggers": [],
  "rank": 1050236
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 3.732 SP to @axiomier
2026/05/17 21:46:21
delegatorsteem
delegateeaxiomier
vesting shares6070.234464 VESTS
Transaction InfoBlock #106140483/Trx 9df8778ec17866d6233c209cd9467a90a7c8a64a
View Raw JSON Data
{
  "trx_id": "9df8778ec17866d6233c209cd9467a90a7c8a64a",
  "block": 106140483,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-17T21:46:21",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "6070.234464 VESTS"
    }
  ]
}
steemdelegated 2.065 SP to @axiomier
2026/05/11 18:42:54
delegatorsteem
delegateeaxiomier
vesting shares3358.024059 VESTS
Transaction InfoBlock #105964794/Trx 85fd31e1aebd23c99aab6582251d26109f4e6eab
View Raw JSON Data
{
  "trx_id": "85fd31e1aebd23c99aab6582251d26109f4e6eab",
  "block": 105964794,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-11T18:42:54",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "3358.024059 VESTS"
    }
  ]
}
steemdelegated 3.740 SP to @axiomier
2026/04/25 21:11:09
delegatorsteem
delegateeaxiomier
vesting shares6082.750220 VESTS
Transaction InfoBlock #105508207/Trx 6e4e9b06f576984a521d62ad15c47562fd475031
View Raw JSON Data
{
  "trx_id": "6e4e9b06f576984a521d62ad15c47562fd475031",
  "block": 105508207,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-04-25T21:11:09",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "6082.750220 VESTS"
    }
  ]
}
steemdelegated 2.090 SP to @axiomier
2026/01/23 01:15:24
delegatorsteem
delegateeaxiomier
vesting shares3399.570878 VESTS
Transaction InfoBlock #102843977/Trx 5d69b95ceb574cfee4feb1938be35d9bf9264ac2
View Raw JSON Data
{
  "trx_id": "5d69b95ceb574cfee4feb1938be35d9bf9264ac2",
  "block": 102843977,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-01-23T01:15:24",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "3399.570878 VESTS"
    }
  ]
}
steemdelegated 2.191 SP to @axiomier
2024/12/16 20:35:12
delegatorsteem
delegateeaxiomier
vesting shares3563.790075 VESTS
Transaction InfoBlock #91290392/Trx 280e3c2d658ee12932742b32d0b6a0c487c9589b
View Raw JSON Data
{
  "trx_id": "280e3c2d658ee12932742b32d0b6a0c487c9589b",
  "block": 91290392,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-12-16T20:35:12",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "3563.790075 VESTS"
    }
  ]
}
steemdelegated 2.295 SP to @axiomier
2023/11/13 12:21:03
delegatorsteem
delegateeaxiomier
vesting shares3732.923607 VESTS
Transaction InfoBlock #79844671/Trx 2406246b35a39a23ed319fce5e4bfe212e20db95
View Raw JSON Data
{
  "trx_id": "2406246b35a39a23ed319fce5e4bfe212e20db95",
  "block": 79844671,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-11-13T12:21:03",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "3732.923607 VESTS"
    }
  ]
}
steemdelegated 4.101 SP to @axiomier
2023/09/21 18:56:39
delegatorsteem
delegateeaxiomier
vesting shares6670.202393 VESTS
Transaction InfoBlock #78344381/Trx 74248f1dc8b9276dad95fd45c8d10d99ec090f33
View Raw JSON Data
{
  "trx_id": "74248f1dc8b9276dad95fd45c8d10d99ec090f33",
  "block": 78344381,
  "trx_in_block": 12,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-09-21T18:56:39",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "6670.202393 VESTS"
    }
  ]
}
steemdelegated 4.238 SP to @axiomier
2022/11/03 09:03:48
delegatorsteem
delegateeaxiomier
vesting shares6891.883831 VESTS
Transaction InfoBlock #69110106/Trx 7dc99d755ad50d469e51f282e0828181092c8a68
View Raw JSON Data
{
  "trx_id": "7dc99d755ad50d469e51f282e0828181092c8a68",
  "block": 69110106,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-11-03T09:03:48",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "6891.883831 VESTS"
    }
  ]
}
steemdelegated 4.373 SP to @axiomier
2022/01/17 08:32:45
delegatorsteem
delegateeaxiomier
vesting shares7112.417062 VESTS
Transaction InfoBlock #60806540/Trx 99177f927283a8c47392edaa94a41efdfd80655f
View Raw JSON Data
{
  "trx_id": "99177f927283a8c47392edaa94a41efdfd80655f",
  "block": 60806540,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-01-17T08:32:45",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "7112.417062 VESTS"
    }
  ]
}
steemdelegated 4.486 SP to @axiomier
2021/06/13 22:34:03
delegatorsteem
delegateeaxiomier
vesting shares7296.185720 VESTS
Transaction InfoBlock #54605049/Trx 8726faca0eb43a0c0d6644859fe9d035fa331dd3
View Raw JSON Data
{
  "trx_id": "8726faca0eb43a0c0d6644859fe9d035fa331dd3",
  "block": 54605049,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2021-06-13T22:34:03",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "7296.185720 VESTS"
    }
  ]
}
steemdelegated 4.602 SP to @axiomier
2020/12/11 08:56:12
delegatorsteem
delegateeaxiomier
vesting shares7483.607694 VESTS
Transaction InfoBlock #49352602/Trx a7674680b8d9ace9116c10e59926c228014842a7
View Raw JSON Data
{
  "trx_id": "a7674680b8d9ace9116c10e59926c228014842a7",
  "block": 49352602,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-11T08:56:12",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "7483.607694 VESTS"
    }
  ]
}
steemdelegated 1.176 SP to @axiomier
2020/12/06 02:33:45
delegatorsteem
delegateeaxiomier
vesting shares1912.543513 VESTS
Transaction InfoBlock #49204172/Trx f15b80b3d623ac67b7da22e3651bb3d5c643a001
View Raw JSON Data
{
  "trx_id": "f15b80b3d623ac67b7da22e3651bb3d5c643a001",
  "block": 49204172,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-06T02:33:45",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "1912.543513 VESTS"
    }
  ]
}
steemdelegated 4.612 SP to @axiomier
2020/11/25 16:34:30
delegatorsteem
delegateeaxiomier
vesting shares7500.734311 VESTS
Transaction InfoBlock #48908605/Trx 8d8d9cef042bc7104d40b69a30eae084b04ccb9a
View Raw JSON Data
{
  "trx_id": "8d8d9cef042bc7104d40b69a30eae084b04ccb9a",
  "block": 48908605,
  "trx_in_block": 16,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-11-25T16:34:30",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "7500.734311 VESTS"
    }
  ]
}
steemdelegated 4.730 SP to @axiomier
2020/05/09 03:28:33
delegatorsteem
delegateeaxiomier
vesting shares7692.620907 VESTS
Transaction InfoBlock #43214382/Trx 4ddbd496f7f6819a3cd54a9d6e204b7f314154f1
View Raw JSON Data
{
  "trx_id": "4ddbd496f7f6819a3cd54a9d6e204b7f314154f1",
  "block": 43214382,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-09T03:28:33",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "7692.620907 VESTS"
    }
  ]
}
steemdelegated 1.201 SP to @axiomier
2020/05/08 06:44:36
delegatorsteem
delegateeaxiomier
vesting shares1953.311140 VESTS
Transaction InfoBlock #43190086/Trx 9eae59d62e57a0e0e20e76a2ce00bed21c434157
View Raw JSON Data
{
  "trx_id": "9eae59d62e57a0e0e20e76a2ce00bed21c434157",
  "block": 43190086,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-08T06:44:36",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "1953.311140 VESTS"
    }
  ]
}
steemdelegated 4.738 SP to @axiomier
2020/04/15 20:10:45
delegatorsteem
delegateeaxiomier
vesting shares7705.598326 VESTS
Transaction InfoBlock #42560891/Trx 97357df41c1ac7eba65195f98e3e3356df01fbb1
View Raw JSON Data
{
  "trx_id": "97357df41c1ac7eba65195f98e3e3356df01fbb1",
  "block": 42560891,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-04-15T20:10:45",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "7705.598326 VESTS"
    }
  ]
}
2019/05/20 15:46:21
parent authoraxiomier
parent permlinkpoloniex-hts-1-api
authorsteemitboard
permlinksteemitboard-notify-axiomier-20190520t154620000z
title
bodyCongratulations @axiomier! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@axiomier/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@axiomier) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=axiomier)_</sub> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
Transaction InfoBlock #33076784/Trx 77912c696c71a7c757b224becda0fd4addb7e461
View Raw JSON Data
{
  "trx_id": "77912c696c71a7c757b224becda0fd4addb7e461",
  "block": 33076784,
  "trx_in_block": 16,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-05-20T15:46:21",
  "op": [
    "comment",
    {
      "parent_author": "axiomier",
      "parent_permlink": "poloniex-hts-1-api",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-axiomier-20190520t154620000z",
      "title": "",
      "body": "Congratulations @axiomier! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@axiomier/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@axiomier) and compare to others on the [Steem Ranking](http://steemitboard.com/ranking/index.php?name=axiomier)_</sub>\n\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}"
    }
  ]
}
steemdelegated 4.858 SP to @axiomier
2019/05/12 13:25:21
delegatorsteem
delegateeaxiomier
vesting shares7901.221131 VESTS
Transaction InfoBlock #32843710/Trx 2cbcd9f2bad86697b0f5e505b8d4a9dd1e4f391c
View Raw JSON Data
{
  "trx_id": "2cbcd9f2bad86697b0f5e505b8d4a9dd1e4f391c",
  "block": 32843710,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-05-12T13:25:21",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "7901.221131 VESTS"
    }
  ]
}
steemdelegated 4.981 SP to @axiomier
2018/05/16 20:07:06
delegatorsteem
delegateeaxiomier
vesting shares8100.773566 VESTS
Transaction InfoBlock #22489643/Trx 74fe24c3feba938028511003830e2c4a62a02267
View Raw JSON Data
{
  "trx_id": "74fe24c3feba938028511003830e2c4a62a02267",
  "block": 22489643,
  "trx_in_block": 17,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-16T20:07:06",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "8100.773566 VESTS"
    }
  ]
}
steemdelegated 17.617 SP to @axiomier
2018/01/09 06:35:03
delegatorsteem
delegateeaxiomier
vesting shares28651.763950 VESTS
Transaction InfoBlock #18819501/Trx cdb5599bc345b6f5389e678503d80b3fdfce66b9
View Raw JSON Data
{
  "trx_id": "cdb5599bc345b6f5389e678503d80b3fdfce66b9",
  "block": 18819501,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-01-09T06:35:03",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "28651.763950 VESTS"
    }
  ]
}
steemdelegated 17.772 SP to @axiomier
2017/08/04 05:21:12
delegatorsteem
delegateeaxiomier
vesting shares28902.574658 VESTS
Transaction InfoBlock #14271499/Trx a2f5d4da31334074ff7768551e9be4cd74187800
View Raw JSON Data
{
  "trx_id": "a2f5d4da31334074ff7768551e9be4cd74187800",
  "block": 14271499,
  "trx_in_block": 17,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-08-04T05:21:12",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "axiomier",
      "vesting_shares": "28902.574658 VESTS"
    }
  ]
}
2017/06/06 14:28:06
votertwinbraid
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12585444/Trx a3aa2d016ea4aca25ec5aef9ec2b8ca4cf603a4b
View Raw JSON Data
{
  "trx_id": "a3aa2d016ea4aca25ec5aef9ec2b8ca4cf603a4b",
  "block": 12585444,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-06-06T14:28:06",
  "op": [
    "vote",
    {
      "voter": "twinbraid",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
axiomierupvoted (100.00%) @maa / 2017-5-30
2017/05/30 15:56:00
voteraxiomier
authormaa
permlink2017-5-30
weight10000 (100.00%)
Transaction InfoBlock #12385792/Trx 09566fd3fc0497b0edcdbb5b87e5eda03b5bd910
View Raw JSON Data
{
  "trx_id": "09566fd3fc0497b0edcdbb5b87e5eda03b5bd910",
  "block": 12385792,
  "trx_in_block": 12,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-30T15:56:00",
  "op": [
    "vote",
    {
      "voter": "axiomier",
      "author": "maa",
      "permlink": "2017-5-30",
      "weight": 10000
    }
  ]
}
axiomierreceived 18.206 SBD, 18.534 SP author reward for @axiomier / poloniex-hts-1-api
2017/05/27 18:03:54
authoraxiomier
permlinkpoloniex-hts-1-api
sbd payout18.206 SBD
steem payout0.000 STEEM
vesting payout30142.367862 VESTS
Transaction InfoBlock #12302021/Virtual Operation #22
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 12302021,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 22,
  "timestamp": "2017-05-27T18:03:54",
  "op": [
    "author_reward",
    {
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "sbd_payout": "18.206 SBD",
      "steem_payout": "0.000 STEEM",
      "vesting_payout": "30142.367862 VESTS"
    }
  ]
}
axiomierupvoted (100.00%) @kanghamin / 54z7ub
2017/05/25 13:28:57
voteraxiomier
authorkanghamin
permlink54z7ub
weight10000 (100.00%)
Transaction InfoBlock #12238988/Trx d27c6db60465271725e1ae1288771ad3c58eef59
View Raw JSON Data
{
  "trx_id": "d27c6db60465271725e1ae1288771ad3c58eef59",
  "block": 12238988,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-25T13:28:57",
  "op": [
    "vote",
    {
      "voter": "axiomier",
      "author": "kanghamin",
      "permlink": "54z7ub",
      "weight": 10000
    }
  ]
}
2017/05/23 06:25:36
voteribank
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12172976/Trx cb8f7ad6376c04e65b2daf1f6123cbfe21fa8103
View Raw JSON Data
{
  "trx_id": "cb8f7ad6376c04e65b2daf1f6123cbfe21fa8103",
  "block": 12172976,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-23T06:25:36",
  "op": [
    "vote",
    {
      "voter": "ibank",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/22 16:07:39
voteraxiomier
authorninzacode
permlinksteemit-chapter-2-ver-1-1
weight10000 (100.00%)
Transaction InfoBlock #12155833/Trx 24bcd36aa556911ce859d425c293b53dfe6a849d
View Raw JSON Data
{
  "trx_id": "24bcd36aa556911ce859d425c293b53dfe6a849d",
  "block": 12155833,
  "trx_in_block": 10,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-22T16:07:39",
  "op": [
    "vote",
    {
      "voter": "axiomier",
      "author": "ninzacode",
      "permlink": "steemit-chapter-2-ver-1-1",
      "weight": 10000
    }
  ]
}
2017/05/22 15:57:18
parent authoraxiomier
parent permlinkpoloniex-hts-1-api
authoraxiomier
permlinkre-axiomier-poloniex-hts-1-api-20170522t155718852z
title
body감사합니다. 태그는 수정했어요.
json metadata{"tags":["kr"],"app":"steemit/0.1"}
Transaction InfoBlock #12155626/Trx 47ea3de78cb2ae0e40e948d2bafb4755fffaece7
View Raw JSON Data
{
  "trx_id": "47ea3de78cb2ae0e40e948d2bafb4755fffaece7",
  "block": 12155626,
  "trx_in_block": 10,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-22T15:57:18",
  "op": [
    "comment",
    {
      "parent_author": "axiomier",
      "parent_permlink": "poloniex-hts-1-api",
      "author": "axiomier",
      "permlink": "re-axiomier-poloniex-hts-1-api-20170522t155718852z",
      "title": "",
      "body": "감사합니다.\n태그는 수정했어요.",
      "json_metadata": "{\"tags\":[\"kr\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
axiomierpublished a new post: poloniex-hts-1-api
2017/05/22 15:55:36
parent author
parent permlinkkr
authoraxiomier
permlinkpoloniex-hts-1-api
title나만의 poloniex HTS를 만들어 보자 (1) – API 살펴보기
body나만의 poloniex HTS를 만들어 보자 (1) – API 살펴보기 안녕하세요. 평소에 가끔 들려 정보만 얻다가 저도 ‘뭔가 도움이 되는 것을 해보자‘ 라는 생각으로 가입하고 포스팅을 진행해 보았습니다. 이 포스팅은 제가 최근 만들고 있는 poloniex HTS (home trading service)를 공개하면서 다른 분들도 쉽게 따라 만들 수 있는 것을 목적으로 하고 있습니다. 저도 최근에 python을 배우면서 만들고 있는 중이라 미흡한 점이 있을 수 있습니다. 사실 대단한 것을 만드는 것은 아니지만, Poloniex에 공개된 API (Application Programming Interface)를 사용해서 자신이 만든 규칙에 따라 자동으로 시세를 확인하고 거래를 진행하는 작업에 관심이 있으신 분들이 많이 계신 듯 하여 시작하여 봤습니다. 시작하기에 앞서 포스팅에 대한 몇가지 설명을 그리고자 합니다. 1) 이 프로그램은 Python 2.7 언어로 만들어 졌습니다 (2.7.13). 제가 사용하는 환경은 윈도우10 64bit, IDE (Integrated development environment)는 PyCharm Community edition 2017.1.2 이며 anaconda 4.3.1 (64bit)를 사용하였습니다. 다른 것은 개인의 사정에 따라 맞춰가면 되지만 python 개발에 익숙하지 않으신 분은 anaconda만큼은 반드시 설치하고 따라해 주시면 되겠습니다. 2) 이 프로그램은 공개된 API의 wrapper를 사용하여 – 조금 수정하여 – 만들었습니다. 해당 프로그램을 만드는데 참고가 된 자료들은 다음과 같습니다. https://poloniex.com/support/api/ - poloniex에서 제공하는 document입니다 https://pastebin.com/fbkheaRb - 위 링크에 있는 wrapper 입니다. (필요에 따라 수정하거나 추가하였습니다.) https://github.com/Syriven/poloniex-holdings-tracker - 위 wrapper를 사용하여 간단하게 시세확인 등을 할 수 있는 예제입니다. https://wikidocs.net/53 - Python 2.7에 대한 간단한 설명이 있습니다. Python을 배우면서 많은 참고를 하였습니다. 이 포스팅은 프로그래밍 언어강좌가 아니기 대문에 python 언어를 처음 접하시는 분은 먼저 이것부터 읽고 시작하시면 많은 도움이 될 것 같습니다. 3) 자동 거래시스템은 매우 위험합니다. OTP 사용등의 검증을 거치지 않기 때문에 private key만 알면 해커들이 재산의 손실을 낼 가능성이 있고, 급등락 하는 시세에서 빠르게 거래가 이루어 지기 때문에 그에 반응하지 못하고 쉽게 큰 손실이 날 가능성도 존재합니다. 또한 프로그램에 예상치 못한 문제가 있을 가능성도 존재합니다. 따라서 모든 것은 본인의 동의와 책임하에 진행되어야 하며 저는 이 포스팅을 따라하거나 참조하여 생긴 재산상의 손실등의 어떠한 상황에 대해서도 책임을 질 수 없음을 먼저 말씀드립니다. 4) 개발 환경을 구축하고 Poloniex의 API key를 얻어내는 과정등에 대해서는 따로 적지는 않았습니다. 하지만 이 포스팅을 보고 따라하고 싶으신 분들 중에서는 프로그래밍 언어를 다뤄본 경험이 전혀 없어서 도움이 필요하신 분이 있을 가능성도 생각하고 있습니다. 구글링을 하면 어렵지 않게 찾을 수 있기는 하지만 요청이 많을 경우 환경설정을 하는 부분부터 설명 드리도록 하겠습니다. 서론이 길어지네요. 제가 앞으로 포스팅을 하려는 순서는 다음과 같습니다. 1) API 살펴보기 – 본격적으로 프로그램을 제작하기에 앞서 Poloniex 에서는 어떤 API들을 제공하고 있는지에 대해 간단하게 알아봅니다. 위에 설명한 Wrapper를 중심으로 설명하나 제 편의상 약간의 수정이나 추가된 부분들이 존재합니다. 2) Coin 정보 불러오기 – 각 coin들의 (암호화폐들을 의미합니다. 편의상 coin이라고 부르도록 하겠습니다) 최근 24시간 거래량, 최근 거래의 거래가격 등의 대략적인 정보들을 불러오는 예제를 만들어봅니다. 3) 각 Coin의 chart 정보 불러오기 – 각 coin의 chart 정보를 불러와서 그래프를 그려보는 예제를 만들어봅니다. 4) 조건에 맞는 coin을 찾고 거래하기 – 특정 조건을 지정한 후 그 조건을 만족하면 사용자에게 e-mail 알림과 거래가 진행되는 프로그램을 제작합니다. 저도 아직 만들고 있는 프로그램이기 때문에 진행도중 수정이 될 수 있습니다만 일단 이런 순서대로 진행을 계획하고 있습니다. 1-2주에 한 부씩 올리는 것을 목표로 하고있는데 과연 그럴 수 있을까요? 그러면 1부를 시작하도록 하겠습니다. 1. API 살펴보기 먼저 진행할 내용은 Poloniex의 API를 살펴보는 것입니다. API란 poloniex server와 HTS 프로그램간의 통신을 할 때 어떠한 형식으로 서버에 요청을 하는지에 양식이라고 보시면 됩니다. 우리가 은행이나 관공서에 어떠한 일을 처리해 달라고 요청을 할 때 일정한 양식에 따라 서류를 작성하여 제출하는 것과 같은 원리라고 보시면 됩니다. 우리가 poloniex 서버에 정보를 요청하거나 거래를 요청할 때도 정해진 양식에 따라 프로그램을 작성해서 요청을 해야 그에 대한 업무를 처리해 줍니다. 그런데 그런 양식은 너무나 복잡한 형태로 만들어 졌기 때문에 우리가 요청을 할 때 마다 일일이 그 양식을 적는다면 프로그램이 너무 복잡해 질 것입니다. 그래서 거래소 측은 wrapper라는 것을 제공해 줍니다. Wrapper란 요청에 사용되는 몇 개의 간단한 조건을 알려주면 거래소에서 쓰는 복잡한 양식으로 자동으로 변환해 주는 편리한 함수입니다. 아래는 앞으로 우리가 사용할 wrapper들이 어떤 것이 있는지, 그 내용들은 무엇이 있는지를 간략히 설명하도록 하겠습니다. 직접 손으로 따라 적으시면서 만들어 보시면 큰 도움이 될 것입니다. 편의상 Poloniex에 링크되어 있는 것과 약간의 차이가 있습니다. 파일명 poloniex_wrapper.py ~~~~ #import libraries import urllib import urllib2 import json import time import hmac, hashlib import datetime as DT import calendar import os ~~~~ 앞으로 사용할 libraries입니다. Library는 자주 사용되는 기능들을 쉽게 쓸 수 있도록 만들어준 함수나 class 등을 포함하고 있습니다. 앞서 말씀드린 anaconda에는 위 libraries가 모두 담겨져 있으니 우리는 해당 기능을 일일이 만들 필요 없이 그냥 가져다 사용하면 됩니다. ~~~~ def createTimeStamp(datestr, format="%Y-%m-%d %H:%M:%S"): utcTime = DT.datetime.strptime(datestr, format) return calendar.timegm(utcTime.utctimetuple()) ~~~~ Timestamp를 만들어주는 함수 입니다. Poloniex에 요청하는 자료를 만들 때는 우리가 사용하는 ‘2017년 5월 21일 1시 8분 23초’ 같은 시간이 아니라 각 시간에 대응되는 serial number를 주어야 합니다. 이 각 시간에 대응하는 serial number를 timestamp라고 합니다. 위 함수는 사람이 알아볼 수 있는 시간형식, 예를 들면 ‘2017-05-21 01:08:23’ 을 poloniex가 알아볼 수 있는 timestamp로 변환해 주는 역할을 하는 함수입니다. 참고로 poloniex는 세계 각국에서 이용되는 거래소입니다. 따라서 거래하는 사람마다 각자 국가에 따라 서로 다른 시간에 거래를 합니다. 그렇다면 거래소는 어떤 시간을 쓸까요? 바로 세계협정시(Coordinated universal time; UTC)입니다. Poloniex에 시간을 알려줄때는 반드시 UTC로 알려주어야 한다는 점, 또 poloniex에서 시간을 알려줄때도 UTC로 알려준다는 점을 반드시 알고 있으셔야 합니다. ~~~~ class poloniex: def __init__(self, APIKey, Secret): self.APIKey = APIKey self.Secret = Secret ~~~~ Class는 사람, 핸드폰 같은 특정한 실체가 없는 범주를 의미합니다. 사람이 실체가 없다는 말에 의아한 분이 있으실 텐데 이런 질문을 보시면 금방 이해가 될 것입니다. ‘사람의 나이는 어떻게 되나요?’ (인류의 역사에 대한 질문이 아닙니다.) ‘사람의 이름이 무엇인가요?’ 이름이나 나이 등의 속성은 글을 작성하는 저나 이 글을 읽고 계신 독자님 등의 개인 (객체지향 프로그래밍 언어들 에서는 object 혹은 instance라고 부릅니다) 에게 존재하는 것이지 사람이라는 범주(프로그래밍 언어에서는 class라고 부릅니다) 에 존재하는 것은 아니지요. 객체지향 프로그래밍 언어들 에서는 object는 두가지 요소로 이루어 진다고 이야기 하는데 하나는 object를 이루는 속성(variables)이고 다른 하나는 행동(method)입니다. 앞의 사람예를 다시 꺼내자면 속성이란 사람의 나이, 이름 등이고, 행동은 달리기, 밥먹기 등을 이야기 할 수 있지요. 이번에 만드는 poloniex란 class에서는 두가지 속성을 갖습니다. 그것은 바로 poloniex에 접근하기 위한 APIkey와 secretkey이죠. Object가 생성되기 전까지는 이러한 값들이 존재하지 않습니다. 이 값들은 object가 생성될 때 위의 __init__이라는 함수(함수는 앞서 말씀드린 object의 행동, 즉 method를 의미합니다)가 불리면서 받아오는 역할을 하게 됩니다. 앞에 ‘self.’ 가 붙어있는 것을 보실 수 있을 텐데 이는 함수내에 정의되는 내부 변수들과 class의 variable과의 구분을 위해 이런 식으로 접근을 합니다. 자세한 사용법은 추후에 다시 설명 드리도록 하겠습니다. ~~~~ def api_query(self, command, req={}): if (command == "returnTicker" or command == "return24Volume"): ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/public?command=' + command)) return json.loads(ret.read()) elif (command == "returnOrderBook"): ret = urllib2.urlopen(urllib2.Request( 'https://poloniex.com/public?command=' + command + '&currencyPair=' + str(req['currencyPair']))) return json.loads(ret.read()) elif (command == "returnMarketTradeHistory"): ret = urllib2.urlopen(urllib2.Request( 'https://poloniex.com/public?command=' + "returnTradeHistory" + '&currencyPair=' + str( req['currencyPair']))) return json.loads(ret.read()) else: req['command'] = command req['nonce'] = int(time.time() * 1000) post_data = urllib.urlencode(req) sign = hmac.new(self.Secret, post_data, hashlib.sha512).hexdigest() headers = { 'Sign': sign, 'Key': self.APIKey } ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/tradingApi', post_data, headers)) jsonRet = json.loads(ret.read()) return self.post_process(jsonRet) ~~~~ 아래 설명드릴 함수 (method)에서 사용되는 method입니다. 우리가 이것을 직접 사용하지는 않기 때문에 자세히 설명 드리지는 않겠지만 한가지만 집고 넘어가겠습니다. 이 코드를 보시다보면 중간중간 json이라는 단어가 나오는 것을 보실 수 있으실 겁니다. JSON은 JavaScript Object Notation의 약자로 서로 다른 프로그래밍 언어들끼리 정보를 주고받을 때 사용하는 형식입니다. “변수이름:변수의 값” 형식으로 이루어져 있으며 아래는 한가지 예를 보여주고 있습니다. "BTC_ETH":{"id":148,"last":"0.06288890","lowestAsk":"0.06288890","highestBid":"0.06260001","percentChange":"0.04034574","baseVolume":"65226.58242374","quoteVolume":"1040824.91707012","isFrozen":"0","high24hr":"0.06587350","low24hr":"0.05937060"} Python에서는 json parser를 제공해서 자동으로 변수 이름과 값을 나누어 주기 때문에 이 복잡한 형식의 문자들을 어떻게 잘라서 이름과 값을 추출해야 하지 하는 걱정은 하지 않으셔도 됩니다. JSON에 대해 더 알고싶으신 분은 짧은 강좌가 있으니 한번 들어보시면 좋을 것 같습니다. https://opentutorials.org/course/1375/6844 ~~~~ def returnTicker(self): return self.api_query("returnTicker") ~~~~ 위 api_query를 사용하여 coin들의 정보를 불러오는 함수입니다. 위의 JSON example에 BTC_ETH 있는 정보가 이 함수를 통해 얻어진 정보 중 일부입니다. ~~~~ def returnChartData(self, currencyPair, period, start, end): #currencyPair: example: BTC_XRP #period: the duration of a tic unit: min example: 15 (min) #start: start time /format="%Y-%m-%d %H:%M:%S" #end: end time /format="%Y-%m-%d %H:%M:%S" startTs = createTimeStamp(start) endTs = createTimeStamp(end) periodSec = period * 60 ret = urllib2.urlopen(urllib2.Request( 'https://poloniex.com/public?command=returnChartData&currencyPair=' + str(currencyPair) + '&start=' + str(startTs) + '&end=' + str(endTs) + '&period=' + str(periodSec) )) return json.loads(ret.read()) ~~~~ 차트 데이터를 받아오는 함수입니다. 어떠한 coin을 거래할 것인지(BTC_XRP 등), chart의 tic은 몇분으로 할 것인지 (15분 등), 자료를 받아오려는 기간의 시작과 끝은 언제 인지 (2017-05-21 2:15:26 의 형식으로 입력해야 합니다.)등을 입력하면 됩니다. 이때 시간은 반드시 UTC로 해야 원하는 답을 얻을 수 있습니다. 이렇게 요청을 했을 때 받아오는 값은 다음과 같습니다. ![](https://steemitimages.com/DQmdFPipZpXyCoV34bFpg5HxoLE4j1gwX1mvCmiGq51Ke4z/image.png) Volume: 해당 tic의 거래량(기준통화 (BTC) 단위) quoteVolume: 해당 tic의 거래량 (거래 대상 통화 (XRP) 단위) high: 해당 tic의 최고점 low: 해당 tic의 최저점 date: 해당 tic이 시작하는 timestamp close: 해당 tic이 끝날 때 (혹은 해당 tic의 가장 마지막에 거래된) 가격 weightedAverage: 해당 tic의 거래량이 반영된 평균 거래가격 open: 해당 tic이 시작할 때의 가격 ~~~~ # Places a buy order in a given market. Required POST parameters are "currencyPair", "rate", and "amount". If successful, the method will return the order number. # Inputs: # currencyPair The curreny pair # rate price the order is buying at # amount Amount of coins to buy # Outputs: # orderNumber The order number def buy(self, currencyPair, rate, amount): return self.api_query('buy', {"currencyPair": currencyPair, "rate": rate, "amount": amount}) ~~~~ 구매를 요청하는 함수입니다. 거래 통화 쌍(BTC_XRP), 구매 가격, 그리고 구매량을 적으면 구매 요청이 됩니다. 요청이 실패하거나 거절당할 수 있으니 그에 대한 대비도 필요할 수 있습니다. https://poloniex.com/support/api/ 문서를 참조해 주세요. 오늘은 앞으로 사용할 함수들에 대해 간단하게 살펴보았습니다. 사용 예정인 것들만 한번 간단하게 살펴 보았는데 제가 가지고 있는 파일을 모두 올려드리자면 아래와 같습니다. ~~~~ import urllib import urllib2 import json import time import hmac, hashlib import datetime as DT import calendar import os def createTimeStamp(datestr, format="%Y-%m-%d %H:%M:%S"): utcTime = DT.datetime.strptime(datestr, format) return calendar.timegm(utcTime.utctimetuple()) class poloniex: def __init__(self, APIKey, Secret): self.APIKey = APIKey self.Secret = Secret def post_process(self, before): after = before # Add timestamps if there isnt one but is a datetime if ('return' in after): if (isinstance(after['return'], list)): for x in xrange(0, len(after['return'])): if (isinstance(after['return'][x], dict)): if ('datetime' in after['return'][x] and 'timestamp' not in after['return'][x]): after['return'][x]['timestamp'] = float(createTimeStamp(after['return'][x]['datetime'])) return after def api_query(self, command, req={}): if (command == "returnTicker" or command == "return24Volume"): ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/public?command=' + command)) return json.loads(ret.read()) elif (command == "returnOrderBook"): ret = urllib2.urlopen(urllib2.Request( 'https://poloniex.com/public?command=' + command + '&currencyPair=' + str(req['currencyPair']))) return json.loads(ret.read()) elif (command == "returnMarketTradeHistory"): ret = urllib2.urlopen(urllib2.Request( 'https://poloniex.com/public?command=' + "returnTradeHistory" + '&currencyPair=' + str( req['currencyPair']))) return json.loads(ret.read()) else: req['command'] = command req['nonce'] = int(time.time() * 1000) post_data = urllib.urlencode(req) sign = hmac.new(self.Secret, post_data, hashlib.sha512).hexdigest() headers = { 'Sign': sign, 'Key': self.APIKey } ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/tradingApi', post_data, headers)) jsonRet = json.loads(ret.read()) return self.post_process(jsonRet) def returnTicker(self): return self.api_query("returnTicker") def return24Volume(self): return self.api_query("return24Volume") def returnOrderBook(self, currencyPair): return self.api_query("returnOrderBook", {'currencyPair': currencyPair}) def returnMarketTradeHistory(self, currencyPair): return self.api_query("returnMarketTradeHistory", {'currencyPair': currencyPair}) def returnChartData(self, currencyPair, period, start, end): #currencyPair: example: BTC_XRP #period: the duration of a tic unit: min example: 15 (min) #start: start time /format="%Y-%m-%d %H:%M:%S" #end: end time /format="%Y-%m-%d %H:%M:%S" startTs = createTimeStamp(start) endTs = createTimeStamp(end) periodSec = period * 60 ret = urllib2.urlopen(urllib2.Request( 'https://poloniex.com/public?command=returnChartData&currencyPair=' + str(currencyPair) + '&start=' + str(startTs) + '&end=' + str(endTs) + '&period=' + str(periodSec) )) return json.loads(ret.read()) # Returns all of your balances. # Outputs: # {"BTC":"0.59098578","LTC":"3.31117268", ... } def returnBalances(self): return self.api_query('returnBalances') # Returns your open orders for a given market, specified by the "currencyPair" POST parameter, e.g. "BTC_XCP" # Inputs: # currencyPair The currency pair e.g. "BTC_XCP" # Outputs: # orderNumber The order number # type sell or buy # rate Price the order is selling or buying at # Amount Quantity of order # total Total value of order (price * quantity) def returnOpenOrders(self, currencyPair): return self.api_query('returnOpenOrders', {"currencyPair": currencyPair}) # Returns your trade history for a given market, specified by the "currencyPair" POST parameter # Inputs: # currencyPair The currency pair e.g. "BTC_XCP" # Outputs: # date Date in the form: "2014-02-19 03:44:59" # rate Price the order is selling or buying at # amount Quantity of order # total Total value of order (price * quantity) # type sell or buy def returnTradeHistory(self, currencyPair): return self.api_query('returnTradeHistory', {"currencyPair": currencyPair}) # Places a buy order in a given market. Required POST parameters are "currencyPair", "rate", and "amount". If successful, the method will return the order number. # Inputs: # currencyPair The curreny pair # rate price the order is buying at # amount Amount of coins to buy # Outputs: # orderNumber The order number def buy(self, currencyPair, rate, amount): return self.api_query('buy', {"currencyPair": currencyPair, "rate": rate, "amount": amount}) # Places a sell order in a given market. Required POST parameters are "currencyPair", "rate", and "amount". If successful, the method will return the order number. # Inputs: # currencyPair The curreny pair # rate price the order is selling at # amount Amount of coins to sell # Outputs: # orderNumber The order number def sell(self, currencyPair, rate, amount): return self.api_query('sell', {"currencyPair": currencyPair, "rate": rate, "amount": amount}) # Cancels an order you have placed in a given market. Required POST parameters are "currencyPair" and "orderNumber". # Inputs: # currencyPair The curreny pair # orderNumber The order number to cancel # Outputs: # succes 1 or 0 def cancel(self, currencyPair, orderNumber): return self.api_query('cancelOrder', {"currencyPair": currencyPair, "orderNumber": orderNumber}) # Immediately places a withdrawal for a given currency, with no email confirmation. In order to use this method, the withdrawal privilege must be enabled for your API key. Required POST parameters are "currency", "amount", and "address". Sample output: {"response":"Withdrew 2398 NXT."} # Inputs: # currency The currency to withdraw # amount The amount of this coin to withdraw # address The withdrawal address # Outputs: # response Text containing message about the withdrawal def withdraw(self, currency, amount, address): return self.api_query('withdraw', {"currency": currency, "amount": amount, "address": address}) ~~~~
json metadata{"tags":["kr","coinkorea"],"image":["https://steemitimages.com/DQmdFPipZpXyCoV34bFpg5HxoLE4j1gwX1mvCmiGq51Ke4z/image.png"],"links":["https://poloniex.com/support/api/","https://pastebin.com/fbkheaRb","https://github.com/Syriven/poloniex-holdings-tracker","https://wikidocs.net/53","https://opentutorials.org/course/1375/6844"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #12155593/Trx 921f3f7c662f2968a8da65a43facb5c5053d38e3
View Raw JSON Data
{
  "trx_id": "921f3f7c662f2968a8da65a43facb5c5053d38e3",
  "block": 12155593,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-22T15:55:36",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "kr",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "title": "나만의 poloniex HTS를 만들어 보자 (1) – API 살펴보기",
      "body": "나만의 poloniex HTS를 만들어 보자 (1) – API 살펴보기\n\n안녕하세요. 평소에 가끔 들려 정보만 얻다가 저도 ‘뭔가 도움이 되는 것을 해보자‘ 라는 생각으로 가입하고 포스팅을 진행해 보았습니다. 이 포스팅은 제가 최근 만들고 있는 poloniex HTS (home trading service)를 공개하면서 다른 분들도 쉽게 따라 만들 수 있는 것을 목적으로 하고 있습니다. 저도 최근에 python을 배우면서 만들고 있는 중이라 미흡한 점이 있을 수 있습니다. 사실 대단한 것을 만드는 것은 아니지만, Poloniex에 공개된 API (Application Programming Interface)를 사용해서 자신이 만든 규칙에 따라 자동으로 시세를 확인하고 거래를 진행하는 작업에 관심이 있으신 분들이 많이 계신 듯 하여 시작하여 봤습니다.\n시작하기에 앞서 포스팅에 대한 몇가지 설명을 그리고자 합니다.\n1)\t이 프로그램은 Python 2.7 언어로 만들어 졌습니다 (2.7.13). 제가 사용하는 환경은 윈도우10 64bit, IDE (Integrated development environment)는 PyCharm Community edition 2017.1.2 이며 anaconda 4.3.1 (64bit)를 사용하였습니다. 다른 것은 개인의 사정에 따라 맞춰가면 되지만 python 개발에 익숙하지 않으신 분은 anaconda만큼은 반드시 설치하고 따라해 주시면 되겠습니다.\n2)\t이 프로그램은 공개된 API의 wrapper를 사용하여 – 조금 수정하여 – 만들었습니다. 해당 프로그램을 만드는데 참고가 된 자료들은 다음과 같습니다.\nhttps://poloniex.com/support/api/ - poloniex에서 제공하는 document입니다\nhttps://pastebin.com/fbkheaRb - 위 링크에 있는 wrapper 입니다. (필요에 따라 수정하거나 추가하였습니다.)\nhttps://github.com/Syriven/poloniex-holdings-tracker - 위 wrapper를 사용하여 간단하게 시세확인 등을 할 수 있는 예제입니다. \nhttps://wikidocs.net/53 - Python 2.7에 대한 간단한 설명이 있습니다. Python을 배우면서 많은 참고를 하였습니다. 이 포스팅은 프로그래밍 언어강좌가 아니기 대문에 python 언어를 처음 접하시는 분은 먼저 이것부터 읽고 시작하시면 많은 도움이 될 것 같습니다.\n3)\t자동 거래시스템은 매우 위험합니다. OTP 사용등의 검증을 거치지 않기 때문에 private key만 알면 해커들이 재산의 손실을 낼 가능성이 있고, 급등락 하는 시세에서 빠르게 거래가 이루어 지기 때문에 그에 반응하지 못하고 쉽게 큰 손실이 날 가능성도 존재합니다. 또한 프로그램에 예상치 못한 문제가 있을 가능성도 존재합니다. 따라서 모든 것은 본인의 동의와 책임하에 진행되어야 하며 저는 이 포스팅을 따라하거나 참조하여 생긴 재산상의 손실등의 어떠한 상황에 대해서도 책임을 질 수 없음을 먼저 말씀드립니다.\n4)\t개발 환경을 구축하고 Poloniex의 API key를 얻어내는 과정등에 대해서는 따로 적지는 않았습니다. 하지만 이 포스팅을 보고 따라하고 싶으신 분들 중에서는 프로그래밍 언어를 다뤄본 경험이 전혀 없어서 도움이 필요하신 분이 있을 가능성도 생각하고 있습니다. 구글링을 하면 어렵지 않게 찾을 수 있기는 하지만 요청이 많을 경우 환경설정을 하는 부분부터 설명 드리도록 하겠습니다.\n\n서론이 길어지네요. 제가 앞으로 포스팅을 하려는 순서는 다음과 같습니다.\n1)\tAPI 살펴보기 – 본격적으로 프로그램을 제작하기에 앞서 Poloniex 에서는 어떤 API들을 제공하고 있는지에 대해 간단하게 알아봅니다. 위에 설명한 Wrapper를 중심으로 설명하나 제 편의상 약간의 수정이나 추가된 부분들이 존재합니다.\n2)\tCoin 정보 불러오기 – 각 coin들의 (암호화폐들을 의미합니다. 편의상 coin이라고 부르도록 하겠습니다) 최근 24시간 거래량, 최근 거래의 거래가격 등의 대략적인 정보들을 불러오는 예제를 만들어봅니다.\n3)\t각 Coin의 chart 정보 불러오기 – 각 coin의 chart 정보를 불러와서 그래프를 그려보는 예제를 만들어봅니다.\n4)\t조건에 맞는 coin을 찾고 거래하기 – 특정 조건을 지정한 후 그 조건을 만족하면 사용자에게 e-mail 알림과 거래가 진행되는 프로그램을 제작합니다.\n저도 아직 만들고 있는 프로그램이기 때문에 진행도중 수정이 될 수 있습니다만 일단 이런 순서대로 진행을 계획하고 있습니다. 1-2주에 한 부씩 올리는 것을 목표로 하고있는데 과연 그럴 수 있을까요? 그러면 1부를 시작하도록 하겠습니다.\n\n\n\n\n1.\tAPI 살펴보기\n\n먼저 진행할 내용은 Poloniex의 API를 살펴보는 것입니다. API란 poloniex server와 HTS 프로그램간의 통신을 할 때 어떠한 형식으로 서버에 요청을 하는지에 양식이라고 보시면 됩니다. 우리가 은행이나 관공서에 어떠한 일을 처리해 달라고 요청을 할 때 일정한 양식에 따라 서류를 작성하여 제출하는 것과 같은 원리라고 보시면 됩니다. 우리가 poloniex 서버에 정보를 요청하거나 거래를 요청할 때도 정해진 양식에 따라 프로그램을 작성해서 요청을 해야 그에 대한 업무를 처리해 줍니다. 그런데 그런 양식은 너무나 복잡한 형태로 만들어 졌기 때문에 우리가 요청을 할 때 마다 일일이 그 양식을 적는다면 프로그램이 너무 복잡해 질 것입니다. 그래서 거래소 측은 wrapper라는 것을 제공해 줍니다. Wrapper란 요청에 사용되는 몇 개의 간단한 조건을 알려주면 거래소에서 쓰는 복잡한 양식으로 자동으로 변환해 주는 편리한 함수입니다. 아래는 앞으로 우리가 사용할 wrapper들이 어떤 것이 있는지, 그 내용들은 무엇이 있는지를 간략히 설명하도록 하겠습니다. 직접 손으로 따라 적으시면서 만들어 보시면 큰 도움이 될 것입니다. 편의상 Poloniex에 링크되어 있는 것과 약간의 차이가 있습니다.\n\n파일명 poloniex_wrapper.py\n~~~~\n#import libraries\nimport urllib\nimport urllib2\nimport json\nimport time\nimport hmac, hashlib\nimport datetime as DT\nimport calendar\nimport os\n~~~~\n앞으로 사용할 libraries입니다. Library는 자주 사용되는 기능들을 쉽게 쓸 수 있도록 만들어준 함수나 class 등을 포함하고 있습니다. 앞서 말씀드린 anaconda에는 위 libraries가 모두 담겨져 있으니 우리는 해당 기능을 일일이 만들 필요 없이 그냥 가져다 사용하면 됩니다.\n~~~~\ndef createTimeStamp(datestr, format=\"%Y-%m-%d %H:%M:%S\"):\n    utcTime = DT.datetime.strptime(datestr, format)\n    return calendar.timegm(utcTime.utctimetuple())\n~~~~\n\nTimestamp를 만들어주는 함수 입니다. Poloniex에 요청하는 자료를 만들 때는 우리가 사용하는 ‘2017년 5월 21일 1시 8분 23초’ 같은 시간이 아니라 각 시간에 대응되는 serial number를 주어야 합니다. 이 각 시간에 대응하는 serial number를 timestamp라고 합니다. 위 함수는 사람이 알아볼 수 있는 시간형식, 예를 들면 ‘2017-05-21 01:08:23’ 을 poloniex가 알아볼 수 있는 timestamp로 변환해 주는 역할을 하는 함수입니다.\n 참고로 poloniex는 세계 각국에서 이용되는 거래소입니다. 따라서 거래하는 사람마다 각자 국가에 따라 서로 다른 시간에 거래를 합니다. 그렇다면 거래소는 어떤 시간을 쓸까요? 바로 세계협정시(Coordinated universal time; UTC)입니다. Poloniex에 시간을 알려줄때는 반드시 UTC로 알려주어야 한다는 점, 또 poloniex에서 시간을 알려줄때도 UTC로 알려준다는 점을 반드시 알고 있으셔야 합니다.\n~~~~\nclass poloniex:\n    def __init__(self, APIKey, Secret):\n        self.APIKey = APIKey\n        self.Secret = Secret\n~~~~\nClass는 사람, 핸드폰 같은 특정한 실체가 없는 범주를 의미합니다. 사람이 실체가 없다는 말에 의아한 분이 있으실 텐데 이런 질문을 보시면 금방 이해가 될 것입니다.\n‘사람의 나이는 어떻게 되나요?’ (인류의 역사에 대한 질문이 아닙니다.)\n‘사람의 이름이 무엇인가요?’\n이름이나 나이 등의 속성은 글을 작성하는 저나 이 글을 읽고 계신 독자님 등의 개인 (객체지향 프로그래밍 언어들 에서는 object 혹은 instance라고 부릅니다) 에게 존재하는 것이지 사람이라는 범주(프로그래밍 언어에서는 class라고 부릅니다) 에 존재하는 것은 아니지요. 객체지향 프로그래밍 언어들 에서는 object는 두가지 요소로 이루어 진다고 이야기 하는데 하나는 object를 이루는 속성(variables)이고 다른 하나는 행동(method)입니다. 앞의 사람예를 다시 꺼내자면 속성이란 사람의 나이, 이름 등이고, 행동은 달리기, 밥먹기 등을 이야기 할 수 있지요. 이번에 만드는 poloniex란 class에서는 두가지 속성을 갖습니다. 그것은 바로 poloniex에 접근하기 위한 APIkey와 secretkey이죠. Object가 생성되기 전까지는 이러한 값들이 존재하지 않습니다. 이 값들은 object가 생성될 때 위의 __init__이라는 함수(함수는 앞서 말씀드린 object의 행동, 즉 method를 의미합니다)가 불리면서 받아오는 역할을 하게 됩니다. 앞에 ‘self.’ 가 붙어있는 것을 보실 수 있을 텐데 이는 함수내에 정의되는 내부 변수들과 class의 variable과의 구분을 위해 이런 식으로 접근을 합니다. 자세한 사용법은 추후에 다시 설명 드리도록 하겠습니다.\n~~~~\ndef api_query(self, command, req={}):\n\n        if (command == \"returnTicker\" or command == \"return24Volume\"):\n            ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/public?command=' + command))\n            return json.loads(ret.read())\n        elif (command == \"returnOrderBook\"):\n            ret = urllib2.urlopen(urllib2.Request(\n                'https://poloniex.com/public?command=' + command + '&currencyPair=' + str(req['currencyPair'])))\n            return json.loads(ret.read())\n        elif (command == \"returnMarketTradeHistory\"):\n            ret = urllib2.urlopen(urllib2.Request(\n                'https://poloniex.com/public?command=' + \"returnTradeHistory\" + '&currencyPair=' + str(\n                    req['currencyPair'])))\n            return json.loads(ret.read())\n        else:\n            req['command'] = command\n            req['nonce'] = int(time.time() * 1000)\n            post_data = urllib.urlencode(req)\n\n            sign = hmac.new(self.Secret, post_data, hashlib.sha512).hexdigest()\n            headers = {\n                'Sign': sign,\n                'Key': self.APIKey\n            }\n\n            ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/tradingApi', post_data, headers))\n            jsonRet = json.loads(ret.read())\n            return self.post_process(jsonRet)\n~~~~\n\n아래 설명드릴 함수 (method)에서 사용되는 method입니다. 우리가 이것을 직접 사용하지는 않기 때문에 자세히 설명 드리지는 않겠지만 한가지만 집고 넘어가겠습니다. 이 코드를 보시다보면 중간중간 json이라는 단어가 나오는 것을 보실 수 있으실 겁니다. JSON은 JavaScript Object Notation의 약자로 서로 다른 프로그래밍 언어들끼리 정보를 주고받을 때 사용하는 형식입니다. “변수이름:변수의 값” 형식으로 이루어져 있으며 아래는 한가지 예를 보여주고 있습니다.\n\"BTC_ETH\":{\"id\":148,\"last\":\"0.06288890\",\"lowestAsk\":\"0.06288890\",\"highestBid\":\"0.06260001\",\"percentChange\":\"0.04034574\",\"baseVolume\":\"65226.58242374\",\"quoteVolume\":\"1040824.91707012\",\"isFrozen\":\"0\",\"high24hr\":\"0.06587350\",\"low24hr\":\"0.05937060\"}\nPython에서는 json parser를 제공해서 자동으로 변수 이름과 값을 나누어 주기 때문에 이 복잡한 형식의 문자들을 어떻게 잘라서 이름과 값을 추출해야 하지 하는 걱정은 하지 않으셔도 됩니다.\nJSON에 대해 더 알고싶으신 분은 짧은 강좌가 있으니 한번 들어보시면 좋을 것 같습니다.\n\nhttps://opentutorials.org/course/1375/6844\n\n~~~~\ndef returnTicker(self):\n        return self.api_query(\"returnTicker\")\n~~~~\n위 api_query를 사용하여 coin들의 정보를 불러오는 함수입니다. 위의 JSON example에 BTC_ETH 있는 정보가 이 함수를 통해 얻어진 정보 중 일부입니다.\n~~~~\ndef returnChartData(self, currencyPair, period, start, end):\n        #currencyPair: example: BTC_XRP\n        #period: the duration of a tic unit: min example: 15 (min)\n        #start: start time /format=\"%Y-%m-%d %H:%M:%S\"\n        #end: end time /format=\"%Y-%m-%d %H:%M:%S\"\n\n        startTs = createTimeStamp(start)\n        endTs = createTimeStamp(end)\n\n        periodSec = period * 60\n        ret = urllib2.urlopen(urllib2.Request(\n            'https://poloniex.com/public?command=returnChartData&currencyPair=' + str(currencyPair) + '&start=' + str(startTs) + '&end=' + str(endTs) + '&period=' + str(periodSec)\n        ))\n\n        return json.loads(ret.read())\n~~~~\n차트 데이터를 받아오는 함수입니다. 어떠한 coin을 거래할 것인지(BTC_XRP 등), chart의 tic은 몇분으로 할 것인지 (15분 등), 자료를 받아오려는 기간의 시작과 끝은 언제 인지 (2017-05-21 2:15:26 의 형식으로 입력해야 합니다.)등을 입력하면 됩니다. 이때 시간은 반드시 UTC로 해야 원하는 답을 얻을 수 있습니다. 이렇게 요청을 했을 때 받아오는 값은 다음과 같습니다.\n ![](https://steemitimages.com/DQmdFPipZpXyCoV34bFpg5HxoLE4j1gwX1mvCmiGq51Ke4z/image.png)\nVolume: 해당 tic의 거래량(기준통화 (BTC) 단위)\nquoteVolume: 해당 tic의 거래량 (거래 대상 통화 (XRP) 단위)\nhigh: 해당 tic의 최고점\nlow: 해당 tic의 최저점\ndate: 해당 tic이 시작하는 timestamp\nclose: 해당 tic이 끝날 때 (혹은 해당 tic의 가장 마지막에 거래된) 가격\nweightedAverage: 해당 tic의 거래량이 반영된 평균 거래가격\nopen: 해당 tic이 시작할 때의 가격\n~~~~\n# Places a buy order in a given market. Required POST parameters are \"currencyPair\", \"rate\", and \"amount\". If successful, the method will return the order number.\n    # Inputs:\n    # currencyPair  The curreny pair\n    # rate          price the order is buying at\n    # amount        Amount of coins to buy\n    # Outputs:\n    # orderNumber   The order number\n    def buy(self, currencyPair, rate, amount):\n        return self.api_query('buy', {\"currencyPair\": currencyPair, \"rate\": rate, \"amount\": amount})\n~~~~\n구매를 요청하는 함수입니다. 거래 통화 쌍(BTC_XRP), 구매 가격, 그리고 구매량을 적으면 구매 요청이 됩니다. 요청이 실패하거나 거절당할 수 있으니 그에 대한 대비도 필요할 수 있습니다. https://poloniex.com/support/api/ 문서를 참조해 주세요.\n\n오늘은 앞으로 사용할 함수들에 대해 간단하게 살펴보았습니다. 사용 예정인 것들만 한번 간단하게 살펴 보았는데 제가 가지고 있는 파일을 모두 올려드리자면 아래와 같습니다.\n\n~~~~\nimport urllib\nimport urllib2\nimport json\nimport time\nimport hmac, hashlib\nimport datetime as DT\nimport calendar\nimport os\n\n\n\n\ndef createTimeStamp(datestr, format=\"%Y-%m-%d %H:%M:%S\"):\n    utcTime = DT.datetime.strptime(datestr, format)\n    return calendar.timegm(utcTime.utctimetuple())\n\n\n\n\nclass poloniex:\n    def __init__(self, APIKey, Secret):\n        self.APIKey = APIKey\n        self.Secret = Secret\n\n    def post_process(self, before):\n        after = before\n\n        # Add timestamps if there isnt one but is a datetime\n        if ('return' in after):\n            if (isinstance(after['return'], list)):\n                for x in xrange(0, len(after['return'])):\n                    if (isinstance(after['return'][x], dict)):\n                        if ('datetime' in after['return'][x] and 'timestamp' not in after['return'][x]):\n                            after['return'][x]['timestamp'] = float(createTimeStamp(after['return'][x]['datetime']))\n\n        return after\n\n    def api_query(self, command, req={}):\n\n        if (command == \"returnTicker\" or command == \"return24Volume\"):\n            ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/public?command=' + command))\n            return json.loads(ret.read())\n        elif (command == \"returnOrderBook\"):\n            ret = urllib2.urlopen(urllib2.Request(\n                'https://poloniex.com/public?command=' + command + '&currencyPair=' + str(req['currencyPair'])))\n            return json.loads(ret.read())\n        elif (command == \"returnMarketTradeHistory\"):\n            ret = urllib2.urlopen(urllib2.Request(\n                'https://poloniex.com/public?command=' + \"returnTradeHistory\" + '&currencyPair=' + str(\n                    req['currencyPair'])))\n            return json.loads(ret.read())\n        else:\n            req['command'] = command\n            req['nonce'] = int(time.time() * 1000)\n            post_data = urllib.urlencode(req)\n\n            sign = hmac.new(self.Secret, post_data, hashlib.sha512).hexdigest()\n            headers = {\n                'Sign': sign,\n                'Key': self.APIKey\n            }\n\n            ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/tradingApi', post_data, headers))\n            jsonRet = json.loads(ret.read())\n            return self.post_process(jsonRet)\n\n    def returnTicker(self):\n        return self.api_query(\"returnTicker\")\n\n    def return24Volume(self):\n        return self.api_query(\"return24Volume\")\n\n    def returnOrderBook(self, currencyPair):\n        return self.api_query(\"returnOrderBook\", {'currencyPair': currencyPair})\n\n    def returnMarketTradeHistory(self, currencyPair):\n        return self.api_query(\"returnMarketTradeHistory\", {'currencyPair': currencyPair})\n\n    def returnChartData(self, currencyPair, period, start, end):\n        #currencyPair: example: BTC_XRP\n        #period: the duration of a tic unit: min example: 15 (min)\n        #start: start time /format=\"%Y-%m-%d %H:%M:%S\"\n        #end: end time /format=\"%Y-%m-%d %H:%M:%S\"\n\n        startTs = createTimeStamp(start)\n        endTs = createTimeStamp(end)\n\n        periodSec = period * 60\n        ret = urllib2.urlopen(urllib2.Request(\n            'https://poloniex.com/public?command=returnChartData&currencyPair=' + str(currencyPair) + '&start=' + str(startTs) + '&end=' + str(endTs) + '&period=' + str(periodSec)\n        ))\n\n        return json.loads(ret.read())\n\n    # Returns all of your balances.\n    # Outputs:\n    # {\"BTC\":\"0.59098578\",\"LTC\":\"3.31117268\", ... }\n    def returnBalances(self):\n        return self.api_query('returnBalances')\n\n    # Returns your open orders for a given market, specified by the \"currencyPair\" POST parameter, e.g. \"BTC_XCP\"\n    # Inputs:\n    # currencyPair  The currency pair e.g. \"BTC_XCP\"\n    # Outputs:\n    # orderNumber   The order number\n    # type          sell or buy\n    # rate          Price the order is selling or buying at\n    # Amount        Quantity of order\n    # total         Total value of order (price * quantity)\n    def returnOpenOrders(self, currencyPair):\n        return self.api_query('returnOpenOrders', {\"currencyPair\": currencyPair})\n\n    # Returns your trade history for a given market, specified by the \"currencyPair\" POST parameter\n    # Inputs:\n    # currencyPair  The currency pair e.g. \"BTC_XCP\"\n    # Outputs:\n    # date          Date in the form: \"2014-02-19 03:44:59\"\n    # rate          Price the order is selling or buying at\n    # amount        Quantity of order\n    # total         Total value of order (price * quantity)\n    # type          sell or buy\n    def returnTradeHistory(self, currencyPair):\n        return self.api_query('returnTradeHistory', {\"currencyPair\": currencyPair})\n\n    # Places a buy order in a given market. Required POST parameters are \"currencyPair\", \"rate\", and \"amount\". If successful, the method will return the order number.\n    # Inputs:\n    # currencyPair  The curreny pair\n    # rate          price the order is buying at\n    # amount        Amount of coins to buy\n    # Outputs:\n    # orderNumber   The order number\n    def buy(self, currencyPair, rate, amount):\n        return self.api_query('buy', {\"currencyPair\": currencyPair, \"rate\": rate, \"amount\": amount})\n\n    # Places a sell order in a given market. Required POST parameters are \"currencyPair\", \"rate\", and \"amount\". If successful, the method will return the order number.\n    # Inputs:\n    # currencyPair  The curreny pair\n    # rate          price the order is selling at\n    # amount        Amount of coins to sell\n    # Outputs:\n    # orderNumber   The order number\n    def sell(self, currencyPair, rate, amount):\n        return self.api_query('sell', {\"currencyPair\": currencyPair, \"rate\": rate, \"amount\": amount})\n\n    # Cancels an order you have placed in a given market. Required POST parameters are \"currencyPair\" and \"orderNumber\".\n    # Inputs:\n    # currencyPair  The curreny pair\n    # orderNumber   The order number to cancel\n    # Outputs:\n    # succes        1 or 0\n    def cancel(self, currencyPair, orderNumber):\n        return self.api_query('cancelOrder', {\"currencyPair\": currencyPair, \"orderNumber\": orderNumber})\n\n    # Immediately places a withdrawal for a given currency, with no email confirmation. In order to use this method, the withdrawal privilege must be enabled for your API key. Required POST parameters are \"currency\", \"amount\", and \"address\". Sample output: {\"response\":\"Withdrew 2398 NXT.\"}\n    # Inputs:\n    # currency      The currency to withdraw\n    # amount        The amount of this coin to withdraw\n    # address       The withdrawal address\n    # Outputs:\n    # response      Text containing message about the withdrawal\n    def withdraw(self, currency, amount, address):\n        return self.api_query('withdraw', {\"currency\": currency, \"amount\": amount, \"address\": address})\n~~~~",
      "json_metadata": "{\"tags\":[\"kr\",\"coinkorea\"],\"image\":[\"https://steemitimages.com/DQmdFPipZpXyCoV34bFpg5HxoLE4j1gwX1mvCmiGq51Ke4z/image.png\"],\"links\":[\"https://poloniex.com/support/api/\",\"https://pastebin.com/fbkheaRb\",\"https://github.com/Syriven/poloniex-holdings-tracker\",\"https://wikidocs.net/53\",\"https://opentutorials.org/course/1375/6844\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2017/05/22 04:25:24
voterds5glf
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12141900/Trx 9a52c6b93864fcfa24a5ee5bab35dbd269572532
View Raw JSON Data
{
  "trx_id": "9a52c6b93864fcfa24a5ee5bab35dbd269572532",
  "block": 12141900,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-22T04:25:24",
  "op": [
    "vote",
    {
      "voter": "ds5glf",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/22 02:54:42
voterssm1810
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12140086/Trx d260f5ba37cf56a0a3a89dc1684401c50f3ae6a6
View Raw JSON Data
{
  "trx_id": "d260f5ba37cf56a0a3a89dc1684401c50f3ae6a6",
  "block": 12140086,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-22T02:54:42",
  "op": [
    "vote",
    {
      "voter": "ssm1810",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/21 20:44:45
voterwoo7739
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12132687/Trx b8e2dc21b01dad3f5e95130568f96f03006f9833
View Raw JSON Data
{
  "trx_id": "b8e2dc21b01dad3f5e95130568f96f03006f9833",
  "block": 12132687,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-21T20:44:45",
  "op": [
    "vote",
    {
      "voter": "woo7739",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/21 20:44:15
parent authoraxiomier
parent permlinkpoloniex-hts-1-api
authorwoo7739
permlinkre-axiomier-poloniex-hts-1-api-20170521t204413033z
title
bodyhttp://i.imgur.com/Gbhmejz.gif 안녕하세요. 스팀잇에 오신걸 환영합니다. 처음이시라면 이미 아시는 내용도 있겠지만 한번쯤 읽어보시는게 좋습니다. **스팀가이드** - 2017.5.2일 바뀐 방법으로 스팀잇 계정 만들기 (signup-process-evolution) https://steemit.com/kr/@leesunmoo/2017-5-2-signup-process-evolution - 쌩초보 입문자를 위한 팁 https://steemit.com/kr/@twinbraid/p2zak <hr> **스팀에 대한 고찰** - Steem은 사기일까? Is Steem a scam? https://steemit.com/kr/@iamstevechang/steem-is-steem-a-scam - 스팀잇이 다단계? / Steemit is multi-stage? https://steemit.com/steemit/@sochul/steemit-is-multi-stage - 스팀과 스팀잇에 대해 알아보자 About steem & steemit (updated) https://steemit.com/steem/@yoon/2yhtik - 왜 스팀잇에 글을 올리냐고? https://steemit.com/kr/@leesunmoo/5qlhpf - 나의 Steemit 1주일 사용 후기 https://steemit.com/kr/@iamstevechang/steemit-1 - 스티밋에 대한 작은 견해, my view about steemit in Korean https://steemit.com/kr/@kanghamin/my-view-about-steemit-in-korean http://etherandbitcoin.tistory.com/m/81 <hr> **스팀잇 로드맵** - 스티밋 2017 로드맵 https://steemit.com/kr/@morning/3vjnds-2017 - 스팀 다음 업뎃에 대한 단상 https://steemit.com/kr/@twinbraid/4udhbe <hr> **조금더 상세한 스팀잇** - 스팀의 채굴과 분배 그리고 총 발행량 https://steemit.com/kr/@leesunmoo/2uuswb - steemd.com/@계정명 , 보팅파워, 스팀파워, 권장보팅횟수 40 https://steemit.com/kr/@leesunmoo/steemd-com-40 - 스팀 18 하드포크가 가져다 준 막대한 이익. https://steemit.com/steem/@leesunmoo/18 - steemd.com 을 통해 알 수 있는 것과 모르는 것 https://steemit.com/kr/@leesunmoo/steemd-com - 스팀에선 누가 돈을 주나요 https://steemit.com/kr/@twinbraid/5srakg <hr> **스팀달러의 이해** - 스팀달러의 현재가치(1.14달러)가 의미하는 것. https://steemit.com/kr/@leesunmoo/1-14 - 스팀달러(SBD)에 대한 이해(스팀달러 지금 파는게 현명할까?아닐까?) https://steemit.com/kr/@leesunmoo/3kssf9-sbd <HR> **스팀을 이용한 실생활 결제** ~~~~ 스팀으로 커피를 마셔보자 ~~~~ - 대박 사건~ 카페스튜디오제이슨에서 steem 결재 받다.(Win a Star Award for Best Actress at the Cafe seutyudio) https://steemit.com/kr/@cnstlf60/steem-win-a-star-award-for-best-actress-at-the-cafe-seutyudio - blockpay 에서 steem 으로 결제하기. https://steemit.com/kr/@leesunmoo/blockpay-steem - [Block pay]Steem결제로 Cafe에서 chocolatte 마시기~! https://steemit.com/kr/@kview/steem ~~~~ 스팀으로 농산물을 사보자 ~~~~ - 가입인사 드립니다. https://steemit.com/kr/@steem.com/e4ynz - 어떻게 하면 암호화폐 사용처를 확장할 수 있을까? https://steemit.com/coinkorea/@clayop/23uppg <hr> **마크다운을 이용하여 좀더 맛깔스러운 포스팅을** - [Steemit] 스팀잇 무작정 따라해보기! - Chapter7. 무미건조한 포스팅은 이제 그만! (ver.1.1) https://steemit.com/steemit/@ninzacode/steemit-chapter7-ver-1-1 - **자작 초보용 이미지 업로드 툴** https://steemit.com/kr/@twinbraid/2lhx34 <hr> **스팀잇의 비밀번호** - 스팀잇 각 키별 사용방법 https://steemit.com/kr/@vip/2h4qyg - 스팀잇 패스워드 및 개인키 사용방법 https://steemit.com/kr/@vip/nve21<hr> **스팀잇의 기능** - 스팀잇에서 거래소로 스팀 또는 스팀달러(SBD)를 보내고 받는 방법 https://steemit.com/kr/@yoonjang0707/6eruge-sbd - 스팀 또는 스팀달러를 거래소로 잘못 전송했을때 대처방법 https://steemit.com/kr/@yoonjang0707/42q3uu - 스팀잇에는 MUTE(뮤트) 기능이 있습니다. https://steemit.com/kr/@yoonjang0707/mute - 글보상과 보팅보상 및 보팅파워율을 아는 방법 https://steemit.com/kr/@vip/5ol63t - 스팀 DApp 생태계 https://steemit.com/kr/@yoon/55yae6 <hr> **SNS로써의 스팀잇** - 당신의 시간 얼마나 스팀에 투자하고 있나요? https://steemit.com/kr/@sochul/8ocuq - 스팀잇 글쓰기에 있어 나의 수익률 https://steemit.com/kr/@sochul/my-revenue-on-steemit-writing - 글질과보팅질로 가능한 스팀의 수익성은 얼마나 될까? https://steemit.com/steem/@leesunmoo/s2z38 - kr 커뮤니티의 신성 @maa 를 아십니까? https://steemit.com/kr/@leesunmoo/kr-maa <hr> **스팀잇의 한국커뮤니티** - 네이버 스팀잇 기사 http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=105&oid=308&aid=0000019345 http://www.newsfinder.co.kr/news/articleView.html?idxno=68885 - 한글설명서 준비 https://steemit.com/kr/@iamstevechang/6b8wrw#@jay4u/re-iamstevechang-2017510t19504547z <hr> - 스팀잇 단톡방 https://steemit.com/kr/@clayop/5pnpxq https://open.kakao.com/o/gfGs1Wt https://open.kakao.com/o/gMStY0v 전 카톡을 안하다보니 방 분위기는 잘 모르겠습니다. <hr> **그외** - 제2외국어가 가능하시다면 다른나라 커뮤니티를 방문하셔서 그나라 사람과 직접적인 접촉도 가능합니다. https://steemit.com/created/ru 러시아 https://steemit.com/created/deutsch 독일 https://steemit.com/created/spanish 스페인 https://steemit.com/created/tr 터키 https://steemit.com/created/fr 프랑스 https://steemit.com/created/cn https://steemit.com/created/china 중국은 태그를 두개이용하더군요. https://steemit.com/created/japanese 일본 https://steemit.com/created/indonesia 인도네시아 - 본인만의 태그를 넣으시는게 추후 포스팅 정리에 도움이 됩니다. 영화 얘기라면 kr-movie, 음식이라면 kr-food, 노래라면 kr-song, 패션이면 kr-fashion, 자동차라면 kr-car, 취미라면 kr-hobby, 여행이라면 kr-travel 등등 제한이 없으니 다양한 태그를 만들어 보세요. 태그이용은 강요가 아닙니다. 추후 정리된 블로깅을 할수있는 한가지 팁입니다. 예를 들어 가상화폐 관련은 coinkorea를 넣어주시면 https://steemit.com/created/coinkorea 여기에 등록되며 가상화폐에 관련된 모든 정보를 볼수 있습니다. 아마 가상화폐 최대의 커뮤티니가 될겁니다. ^^ - 보팅 , 댓글쓰기, 팔로잉을 하면 사람들을 많이 사귀게 되어 그만큼 그 사람들이 추천을 눌러줄 확률이 큽니다. 강요가 아닌 좀더 좋은 보상을 위한 한가지 팁이므로 부담갖지 마시고 편하게 즐거운 스팀잇 생활이 되시기 바랍니다.
json metadata{"tags":["kr"],"users":["maa"],"image":["http://i.imgur.com/Gbhmejz.gif"],"links":["https://steemit.com/kr/@leesunmoo/2017-5-2-signup-process-evolution","https://steemit.com/kr/@twinbraid/p2zak","https://steemit.com/kr/@iamstevechang/steem-is-steem-a-scam","https://steemit.com/steemit/@sochul/steemit-is-multi-stage","https://steemit.com/steem/@yoon/2yhtik","https://steemit.com/kr/@leesunmoo/5qlhpf","https://steemit.com/kr/@iamstevechang/steemit-1","https://steemit.com/kr/@kanghamin/my-view-about-steemit-in-korean","http://etherandbitcoin.tistory.com/m/81","https://steemit.com/kr/@morning/3vjnds-2017","https://steemit.com/kr/@twinbraid/4udhbe","https://steemit.com/kr/@leesunmoo/2uuswb","https://steemit.com/kr/@leesunmoo/steemd-com-40","https://steemit.com/steem/@leesunmoo/18","https://steemit.com/kr/@leesunmoo/steemd-com","https://steemit.com/kr/@twinbraid/5srakg","https://steemit.com/kr/@leesunmoo/1-14","https://steemit.com/kr/@leesunmoo/3kssf9-sbd","https://steemit.com/kr/@cnstlf60/steem-win-a-star-award-for-best-actress-at-the-cafe-seutyudio","https://steemit.com/kr/@leesunmoo/blockpay-steem","https://steemit.com/kr/@kview/steem","https://steemit.com/kr/@steem.com/e4ynz","https://steemit.com/coinkorea/@clayop/23uppg","https://steemit.com/steemit/@ninzacode/steemit-chapter7-ver-1-1","https://steemit.com/kr/@twinbraid/2lhx34","https://steemit.com/kr/@vip/2h4qyg","https://steemit.com/kr/@vip/nve21","https://steemit.com/kr/@yoonjang0707/6eruge-sbd","https://steemit.com/kr/@yoonjang0707/42q3uu","https://steemit.com/kr/@yoonjang0707/mute","https://steemit.com/kr/@vip/5ol63t","https://steemit.com/kr/@yoon/55yae6","https://steemit.com/kr/@sochul/8ocuq","https://steemit.com/kr/@sochul/my-revenue-on-steemit-writing","https://steemit.com/steem/@leesunmoo/s2z38","https://steemit.com/kr/@leesunmoo/kr-maa","http://news.naver.com/main/read.nhn?mode=LSD&amp;mid=sec&amp;sid1=105&amp;oid=308&amp;aid=0000019345","http://www.newsfinder.co.kr/news/articleView.html?idxno=68885","https://steemit.com/kr/@iamstevechang/6b8wrw#@jay4u/re-iamstevechang-2017510t19504547z","https://steemit.com/kr/@clayop/5pnpxq","https://open.kakao.com/o/gfGs1Wt","https://open.kakao.com/o/gMStY0v","https://steemit.com/created/ru","https://steemit.com/created/deutsch","https://steemit.com/created/spanish","https://steemit.com/created/tr","https://steemit.com/created/fr","https://steemit.com/created/cn","https://steemit.com/created/china","https://steemit.com/created/japanese","https://steemit.com/created/indonesia","https://steemit.com/created/coinkorea"],"app":"steemit/0.1"}
Transaction InfoBlock #12132677/Trx 40efcadd59db9a67cb8dae338c4f96df7cdbef5a
View Raw JSON Data
{
  "trx_id": "40efcadd59db9a67cb8dae338c4f96df7cdbef5a",
  "block": 12132677,
  "trx_in_block": 14,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-21T20:44:15",
  "op": [
    "comment",
    {
      "parent_author": "axiomier",
      "parent_permlink": "poloniex-hts-1-api",
      "author": "woo7739",
      "permlink": "re-axiomier-poloniex-hts-1-api-20170521t204413033z",
      "title": "",
      "body": "http://i.imgur.com/Gbhmejz.gif\n\n안녕하세요. 스팀잇에 오신걸 환영합니다. \n처음이시라면 이미 아시는 내용도 있겠지만  한번쯤 읽어보시는게 좋습니다. \n\n**스팀가이드**\n\n- 2017.5.2일 바뀐 방법으로 스팀잇 계정 만들기 (signup-process-evolution)\n\nhttps://steemit.com/kr/@leesunmoo/2017-5-2-signup-process-evolution\n\n- 쌩초보 입문자를 위한 팁\n\nhttps://steemit.com/kr/@twinbraid/p2zak\n\n<hr>\n\n**스팀에 대한 고찰**\n \n- Steem은 사기일까? Is Steem a scam?\n\nhttps://steemit.com/kr/@iamstevechang/steem-is-steem-a-scam\n\n- 스팀잇이 다단계? / Steemit is multi-stage?\n\nhttps://steemit.com/steemit/@sochul/steemit-is-multi-stage\n\n- 스팀과 스팀잇에 대해 알아보자 About steem & steemit (updated)\n\nhttps://steemit.com/steem/@yoon/2yhtik\n\n- 왜 스팀잇에 글을 올리냐고?\n\nhttps://steemit.com/kr/@leesunmoo/5qlhpf\n\n- 나의 Steemit 1주일 사용 후기\n\nhttps://steemit.com/kr/@iamstevechang/steemit-1\n\n- 스티밋에 대한 작은 견해, my view about steemit in Korean\n\nhttps://steemit.com/kr/@kanghamin/my-view-about-steemit-in-korean\n\nhttp://etherandbitcoin.tistory.com/m/81\n\n<hr>\n\n**스팀잇 로드맵**\n\n- 스티밋 2017 로드맵\n\nhttps://steemit.com/kr/@morning/3vjnds-2017\n\n- 스팀 다음 업뎃에 대한 단상\n\nhttps://steemit.com/kr/@twinbraid/4udhbe\n\n<hr>\n\n**조금더 상세한 스팀잇**\n\n- 스팀의 채굴과 분배 그리고 총 발행량\n\nhttps://steemit.com/kr/@leesunmoo/2uuswb\n\n\n- steemd.com/@계정명 , 보팅파워, 스팀파워, 권장보팅횟수 40\n\nhttps://steemit.com/kr/@leesunmoo/steemd-com-40\n\n\n- 스팀 18 하드포크가 가져다 준 막대한 이익.\n\nhttps://steemit.com/steem/@leesunmoo/18\n\n- steemd.com 을 통해 알 수 있는 것과 모르는 것\n\nhttps://steemit.com/kr/@leesunmoo/steemd-com\n\n- 스팀에선 누가 돈을 주나요\n\nhttps://steemit.com/kr/@twinbraid/5srakg\n\n<hr>\n\n**스팀달러의 이해**\n\n- 스팀달러의 현재가치(1.14달러)가 의미하는 것.\n\nhttps://steemit.com/kr/@leesunmoo/1-14\n\n- 스팀달러(SBD)에 대한 이해(스팀달러 지금 파는게 현명할까?아닐까?)\n\nhttps://steemit.com/kr/@leesunmoo/3kssf9-sbd\n\n<HR>\n\n**스팀을 이용한 실생활 결제**\n~~~~\n스팀으로 커피를 마셔보자\n~~~~\n\n- 대박 사건~ 카페스튜디오제이슨에서 steem 결재 받다.(Win a Star Award for Best Actress at the Cafe seutyudio)\n\nhttps://steemit.com/kr/@cnstlf60/steem-win-a-star-award-for-best-actress-at-the-cafe-seutyudio\n\n- blockpay 에서 steem 으로 결제하기.\n\nhttps://steemit.com/kr/@leesunmoo/blockpay-steem\n\n- [Block pay]Steem결제로 Cafe에서 chocolatte 마시기~!\n\nhttps://steemit.com/kr/@kview/steem\n\n~~~~\n스팀으로 농산물을 사보자\n~~~~\n- 가입인사 드립니다.\n\nhttps://steemit.com/kr/@steem.com/e4ynz\n\n- 어떻게 하면 암호화폐 사용처를 확장할 수 있을까?\n\nhttps://steemit.com/coinkorea/@clayop/23uppg\n\n<hr>\n\n**마크다운을 이용하여 좀더 맛깔스러운 포스팅을**\n\n- [Steemit] 스팀잇 무작정 따라해보기! - Chapter7. 무미건조한 포스팅은 이제 그만! (ver.1.1)\n\nhttps://steemit.com/steemit/@ninzacode/steemit-chapter7-ver-1-1\n\n- **자작 초보용 이미지 업로드 툴**\n\nhttps://steemit.com/kr/@twinbraid/2lhx34\n\n\n<hr>\n\n**스팀잇의 비밀번호**\n\n- 스팀잇 각 키별 사용방법\n\nhttps://steemit.com/kr/@vip/2h4qyg\n\n- 스팀잇 패스워드 및 개인키 사용방법\n\nhttps://steemit.com/kr/@vip/nve21<hr>\n\n**스팀잇의 기능**\n\n- 스팀잇에서 거래소로 스팀 또는 스팀달러(SBD)를 보내고 받는 방법\n\nhttps://steemit.com/kr/@yoonjang0707/6eruge-sbd\n\n- 스팀 또는 스팀달러를 거래소로 잘못 전송했을때 대처방법\n\nhttps://steemit.com/kr/@yoonjang0707/42q3uu\n\n- 스팀잇에는 MUTE(뮤트) 기능이 있습니다.\n\nhttps://steemit.com/kr/@yoonjang0707/mute\n\n- 글보상과 보팅보상 및 보팅파워율을 아는 방법\n\nhttps://steemit.com/kr/@vip/5ol63t\n\n- 스팀 DApp 생태계\n\nhttps://steemit.com/kr/@yoon/55yae6\n\n<hr>\n\n**SNS로써의 스팀잇**\n- 당신의 시간 얼마나 스팀에 투자하고 있나요?\n\nhttps://steemit.com/kr/@sochul/8ocuq\n\n- 스팀잇 글쓰기에 있어 나의 수익률\n\nhttps://steemit.com/kr/@sochul/my-revenue-on-steemit-writing\n\n- 글질과보팅질로 가능한 스팀의 수익성은 얼마나 될까?\n\nhttps://steemit.com/steem/@leesunmoo/s2z38\n\n- kr 커뮤니티의 신성 @maa 를 아십니까?\n\nhttps://steemit.com/kr/@leesunmoo/kr-maa\n<hr>\n\n**스팀잇의 한국커뮤니티**\n- 네이버 스팀잇 기사 \n\nhttp://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=105&oid=308&aid=0000019345\n\nhttp://www.newsfinder.co.kr/news/articleView.html?idxno=68885\n\n- 한글설명서 준비\n\nhttps://steemit.com/kr/@iamstevechang/6b8wrw#@jay4u/re-iamstevechang-2017510t19504547z\n\n<hr>\n\n- 스팀잇 단톡방 \n\nhttps://steemit.com/kr/@clayop/5pnpxq\n\nhttps://open.kakao.com/o/gfGs1Wt\nhttps://open.kakao.com/o/gMStY0v\n\n전 카톡을 안하다보니 방 분위기는 잘 모르겠습니다. \n\n<hr>\n\n**그외**\n\n- 제2외국어가 가능하시다면 다른나라 커뮤니티를 방문하셔서 그나라 사람과 직접적인 접촉도 가능합니다. \n\nhttps://steemit.com/created/ru 러시아 \nhttps://steemit.com/created/deutsch 독일\nhttps://steemit.com/created/spanish 스페인\nhttps://steemit.com/created/tr 터키\nhttps://steemit.com/created/fr 프랑스\nhttps://steemit.com/created/cn \nhttps://steemit.com/created/china 중국은 태그를 두개이용하더군요. \nhttps://steemit.com/created/japanese 일본\nhttps://steemit.com/created/indonesia 인도네시아\n\n- 본인만의 태그를 넣으시는게 추후 포스팅 정리에 도움이 됩니다. \n\n영화 얘기라면 kr-movie, 음식이라면 kr-food, 노래라면 kr-song, 패션이면 kr-fashion, 자동차라면 kr-car, 취미라면 kr-hobby, 여행이라면 kr-travel 등등 제한이 없으니 다양한 태그를 만들어 보세요.\n태그이용은 강요가 아닙니다. 추후 정리된 블로깅을 할수있는 한가지 팁입니다.\n예를 들어 가상화폐 관련은 coinkorea를 넣어주시면 \nhttps://steemit.com/created/coinkorea\n여기에 등록되며 가상화폐에 관련된 모든 정보를 볼수 있습니다. 아마 가상화폐 최대의 커뮤티니가 될겁니다. ^^\n\n- 보팅 , 댓글쓰기, 팔로잉을 하면 사람들을 많이 사귀게 되어 그만큼 그 사람들이 추천을 눌러줄 확률이 큽니다. 강요가 아닌 좀더 좋은 보상을 위한 한가지 팁이므로 부담갖지 마시고  편하게 즐거운 스팀잇 생활이 되시기 바랍니다.",
      "json_metadata": "{\"tags\":[\"kr\"],\"users\":[\"maa\"],\"image\":[\"http://i.imgur.com/Gbhmejz.gif\"],\"links\":[\"https://steemit.com/kr/@leesunmoo/2017-5-2-signup-process-evolution\",\"https://steemit.com/kr/@twinbraid/p2zak\",\"https://steemit.com/kr/@iamstevechang/steem-is-steem-a-scam\",\"https://steemit.com/steemit/@sochul/steemit-is-multi-stage\",\"https://steemit.com/steem/@yoon/2yhtik\",\"https://steemit.com/kr/@leesunmoo/5qlhpf\",\"https://steemit.com/kr/@iamstevechang/steemit-1\",\"https://steemit.com/kr/@kanghamin/my-view-about-steemit-in-korean\",\"http://etherandbitcoin.tistory.com/m/81\",\"https://steemit.com/kr/@morning/3vjnds-2017\",\"https://steemit.com/kr/@twinbraid/4udhbe\",\"https://steemit.com/kr/@leesunmoo/2uuswb\",\"https://steemit.com/kr/@leesunmoo/steemd-com-40\",\"https://steemit.com/steem/@leesunmoo/18\",\"https://steemit.com/kr/@leesunmoo/steemd-com\",\"https://steemit.com/kr/@twinbraid/5srakg\",\"https://steemit.com/kr/@leesunmoo/1-14\",\"https://steemit.com/kr/@leesunmoo/3kssf9-sbd\",\"https://steemit.com/kr/@cnstlf60/steem-win-a-star-award-for-best-actress-at-the-cafe-seutyudio\",\"https://steemit.com/kr/@leesunmoo/blockpay-steem\",\"https://steemit.com/kr/@kview/steem\",\"https://steemit.com/kr/@steem.com/e4ynz\",\"https://steemit.com/coinkorea/@clayop/23uppg\",\"https://steemit.com/steemit/@ninzacode/steemit-chapter7-ver-1-1\",\"https://steemit.com/kr/@twinbraid/2lhx34\",\"https://steemit.com/kr/@vip/2h4qyg\",\"https://steemit.com/kr/@vip/nve21\",\"https://steemit.com/kr/@yoonjang0707/6eruge-sbd\",\"https://steemit.com/kr/@yoonjang0707/42q3uu\",\"https://steemit.com/kr/@yoonjang0707/mute\",\"https://steemit.com/kr/@vip/5ol63t\",\"https://steemit.com/kr/@yoon/55yae6\",\"https://steemit.com/kr/@sochul/8ocuq\",\"https://steemit.com/kr/@sochul/my-revenue-on-steemit-writing\",\"https://steemit.com/steem/@leesunmoo/s2z38\",\"https://steemit.com/kr/@leesunmoo/kr-maa\",\"http://news.naver.com/main/read.nhn?mode=LSD&amp;mid=sec&amp;sid1=105&amp;oid=308&amp;aid=0000019345\",\"http://www.newsfinder.co.kr/news/articleView.html?idxno=68885\",\"https://steemit.com/kr/@iamstevechang/6b8wrw#@jay4u/re-iamstevechang-2017510t19504547z\",\"https://steemit.com/kr/@clayop/5pnpxq\",\"https://open.kakao.com/o/gfGs1Wt\",\"https://open.kakao.com/o/gMStY0v\",\"https://steemit.com/created/ru\",\"https://steemit.com/created/deutsch\",\"https://steemit.com/created/spanish\",\"https://steemit.com/created/tr\",\"https://steemit.com/created/fr\",\"https://steemit.com/created/cn\",\"https://steemit.com/created/china\",\"https://steemit.com/created/japanese\",\"https://steemit.com/created/indonesia\",\"https://steemit.com/created/coinkorea\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/05/21 14:44:48
voterbehappy7
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12125488/Trx f561e194e846b99a473efe0aeab21d6c00da070a
View Raw JSON Data
{
  "trx_id": "f561e194e846b99a473efe0aeab21d6c00da070a",
  "block": 12125488,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-21T14:44:48",
  "op": [
    "vote",
    {
      "voter": "behappy7",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/21 14:02:27
votersuperremnant
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12124641/Trx d4866561a0e841a4c79581fb53dd9f4452a63f98
View Raw JSON Data
{
  "trx_id": "d4866561a0e841a4c79581fb53dd9f4452a63f98",
  "block": 12124641,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-21T14:02:27",
  "op": [
    "vote",
    {
      "voter": "superremnant",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/21 11:02:00
votercnstlf60
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12121032/Trx 7beb67d5e0f9541ebba5cf27ee7aaed86d57258c
View Raw JSON Data
{
  "trx_id": "7beb67d5e0f9541ebba5cf27ee7aaed86d57258c",
  "block": 12121032,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-21T11:02:00",
  "op": [
    "vote",
    {
      "voter": "cnstlf60",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/21 08:49:21
voterjuly01
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12118379/Trx 6f780aeab3750ceb4b8ef56e6232b4012cfd628e
View Raw JSON Data
{
  "trx_id": "6f780aeab3750ceb4b8ef56e6232b4012cfd628e",
  "block": 12118379,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-21T08:49:21",
  "op": [
    "vote",
    {
      "voter": "july01",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/21 08:49:12
parent authoraxiomier
parent permlinkpoloniex-hts-1-api
authorcoinkorea
permlinkre-axiomier-poloniex-hts-1-api-20170521t084912390z
title
body환영합니다 ^^ 블록체인 주제 관련 게시글 태그에는 한국어 태그로 #kr과 블록체인 및 암호화폐 관련 게시글 태그인 #coinkorea 태그를 붙여 주시면 더 많은 사람들이 보실 수 있을 것 같습니다. 그와 관련된 게시글을 한번 읽어주시고 동참해주시면 정말 감사하겠습니다. <a href="https://steemit.com/kr/@coinkorea/steemit-kr-coinkorea"><strong>Steemit KR 커뮤니티 CoinKorea 프로젝트</strong></a> 저도 추후 이글을 보면서 저만의 HTS를 만들어봐야겠습니다 ㅎㅎ 정말 좋은 개발 가이드가 될 것 같습니다 다음 글도 기대하고 있겠습니다. :)
json metadata{"tags":["kr","coinkorea"],"links":["https://steemit.com/kr/@coinkorea/steemit-kr-coinkorea"],"app":"steemit/0.1"}
Transaction InfoBlock #12118376/Trx 9226e025220e5f2b1140f5d3e8e7007149561e47
View Raw JSON Data
{
  "trx_id": "9226e025220e5f2b1140f5d3e8e7007149561e47",
  "block": 12118376,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-21T08:49:12",
  "op": [
    "comment",
    {
      "parent_author": "axiomier",
      "parent_permlink": "poloniex-hts-1-api",
      "author": "coinkorea",
      "permlink": "re-axiomier-poloniex-hts-1-api-20170521t084912390z",
      "title": "",
      "body": "환영합니다 ^^\n\n블록체인 주제 관련 게시글 태그에는 한국어 태그로 #kr과 블록체인 및 암호화폐 관련 게시글 태그인 #coinkorea 태그를 붙여 주시면 더 많은 사람들이 보실 수 있을 것 같습니다.\n그와 관련된 게시글을 한번 읽어주시고 동참해주시면 정말 감사하겠습니다.\n<a href=\"https://steemit.com/kr/@coinkorea/steemit-kr-coinkorea\"><strong>Steemit KR 커뮤니티 CoinKorea 프로젝트</strong></a>\n\n저도 추후 이글을 보면서 저만의 HTS를 만들어봐야겠습니다 ㅎㅎ\n정말 좋은 개발 가이드가 될 것 같습니다 다음 글도 기대하고 있겠습니다. :)",
      "json_metadata": "{\"tags\":[\"kr\",\"coinkorea\"],\"links\":[\"https://steemit.com/kr/@coinkorea/steemit-kr-coinkorea\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/05/21 08:48:09
votercoinkorea
authoraxiomier
permlinkpoloniex-hts-1-api
weight9000 (90.00%)
Transaction InfoBlock #12118355/Trx 3889cb0015ca73df69dbafd9dae2dcb1dbb23844
View Raw JSON Data
{
  "trx_id": "3889cb0015ca73df69dbafd9dae2dcb1dbb23844",
  "block": 12118355,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-21T08:48:09",
  "op": [
    "vote",
    {
      "voter": "coinkorea",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 9000
    }
  ]
}
2017/05/21 05:29:09
parent authoraxiomier
parent permlinkpoloniex-hts-1-api
authordaveks
permlinkre-axiomier-poloniex-hts-1-api-20170521t052909379z
title
bodyWelcome to Steemit!
json metadata{"tags":["kr"],"app":"steemit/0.1"}
Transaction InfoBlock #12114376/Trx d118d4e73e491eacb5b47f78c9126704c1322edf
View Raw JSON Data
{
  "trx_id": "d118d4e73e491eacb5b47f78c9126704c1322edf",
  "block": 12114376,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-21T05:29:09",
  "op": [
    "comment",
    {
      "parent_author": "axiomier",
      "parent_permlink": "poloniex-hts-1-api",
      "author": "daveks",
      "permlink": "re-axiomier-poloniex-hts-1-api-20170521t052909379z",
      "title": "",
      "body": "Welcome to Steemit!",
      "json_metadata": "{\"tags\":[\"kr\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/05/21 05:28:45
voterdaveks
authoraxiomier
permlinkpoloniex-hts-1-api
weight2000 (20.00%)
Transaction InfoBlock #12114368/Trx c59264de8c9b08ec68be0d20b884b56abeb3697b
View Raw JSON Data
{
  "trx_id": "c59264de8c9b08ec68be0d20b884b56abeb3697b",
  "block": 12114368,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-21T05:28:45",
  "op": [
    "vote",
    {
      "voter": "daveks",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 2000
    }
  ]
}
iocupvoted (100.00%) @axiomier / poloniex-hts-1-api
2017/05/21 01:26:18
voterioc
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12109524/Trx 09d9c1dba861de8cda2e53a2ccc4a8cbc746f9b4
View Raw JSON Data
{
  "trx_id": "09d9c1dba861de8cda2e53a2ccc4a8cbc746f9b4",
  "block": 12109524,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-21T01:26:18",
  "op": [
    "vote",
    {
      "voter": "ioc",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
jsgupvoted (100.00%) @axiomier / poloniex-hts-1-api
2017/05/21 01:17:21
voterjsg
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12109345/Trx 9eae5c8bd518dc8229227309370e61aac25de152
View Raw JSON Data
{
  "trx_id": "9eae5c8bd518dc8229227309370e61aac25de152",
  "block": 12109345,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-21T01:17:21",
  "op": [
    "vote",
    {
      "voter": "jsg",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/20 22:45:27
votercljg918
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12106309/Trx 79075330d89f23b23058c553481f601b6e92f769
View Raw JSON Data
{
  "trx_id": "79075330d89f23b23058c553481f601b6e92f769",
  "block": 12106309,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T22:45:27",
  "op": [
    "vote",
    {
      "voter": "cljg918",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/20 22:21:45
votersanghkaang
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12105835/Trx ce5ac595d6d5b8afd8680846bf569b1582bf1f4b
View Raw JSON Data
{
  "trx_id": "ce5ac595d6d5b8afd8680846bf569b1582bf1f4b",
  "block": 12105835,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T22:21:45",
  "op": [
    "vote",
    {
      "voter": "sanghkaang",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/20 20:27:45
voterleesunmoo
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12103557/Trx 9d37031785c6052c66704dd1081e7516b4757b13
View Raw JSON Data
{
  "trx_id": "9d37031785c6052c66704dd1081e7516b4757b13",
  "block": 12103557,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T20:27:45",
  "op": [
    "vote",
    {
      "voter": "leesunmoo",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/20 19:57:24
voteratomrigs
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12102950/Trx eb4b324e5df2bab89f8a396ef33656a6b108af5b
View Raw JSON Data
{
  "trx_id": "eb4b324e5df2bab89f8a396ef33656a6b108af5b",
  "block": 12102950,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T19:57:24",
  "op": [
    "vote",
    {
      "voter": "atomrigs",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/20 19:12:33
votercorn113
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12102054/Trx 5923600982dc21d2d776381754560d642e6410da
View Raw JSON Data
{
  "trx_id": "5923600982dc21d2d776381754560d642e6410da",
  "block": 12102054,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T19:12:33",
  "op": [
    "vote",
    {
      "voter": "corn113",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/20 18:23:06
voterdetol
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12101066/Trx 66f76824e01dc8b8f525bd95f8e898aceb5a1d74
View Raw JSON Data
{
  "trx_id": "66f76824e01dc8b8f525bd95f8e898aceb5a1d74",
  "block": 12101066,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T18:23:06",
  "op": [
    "vote",
    {
      "voter": "detol",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/20 18:23:06
voterwhalie
authoraxiomier
permlinkpoloniex-hts-1-api
weight3500 (35.00%)
Transaction InfoBlock #12101066/Trx 78255447b01bd115861ae870afafbc626af404e9
View Raw JSON Data
{
  "trx_id": "78255447b01bd115861ae870afafbc626af404e9",
  "block": 12101066,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T18:23:06",
  "op": [
    "vote",
    {
      "voter": "whalie",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 3500
    }
  ]
}
2017/05/20 18:20:57
voterdazanar
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12101023/Trx 0f147855f4b706bfaabfbef812c14ff1eefe226a
View Raw JSON Data
{
  "trx_id": "0f147855f4b706bfaabfbef812c14ff1eefe226a",
  "block": 12101023,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T18:20:57",
  "op": [
    "vote",
    {
      "voter": "dazanar",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/20 18:20:54
voterrdickey
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12101022/Trx 66b3eb8b264f1c44db0f6de84d27e7098c1770cc
View Raw JSON Data
{
  "trx_id": "66b3eb8b264f1c44db0f6de84d27e7098c1770cc",
  "block": 12101022,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T18:20:54",
  "op": [
    "vote",
    {
      "voter": "rdickey",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/20 18:18:45
voterlighthil
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12100979/Trx e8db20388e1fd01994b1c39bc942ec8c49f46a9a
View Raw JSON Data
{
  "trx_id": "e8db20388e1fd01994b1c39bc942ec8c49f46a9a",
  "block": 12100979,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T18:18:45",
  "op": [
    "vote",
    {
      "voter": "lighthil",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
2017/05/20 18:16:54
voterfyrstikken
authoraxiomier
permlinkpoloniex-hts-1-api
weight100 (1.00%)
Transaction InfoBlock #12100942/Trx e1aba46fb75d999460f77648d70ccf8ba423dc13
View Raw JSON Data
{
  "trx_id": "e1aba46fb75d999460f77648d70ccf8ba423dc13",
  "block": 12100942,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T18:16:54",
  "op": [
    "vote",
    {
      "voter": "fyrstikken",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 100
    }
  ]
}
axiomierpublished a new post: poloniex-hts-1-api
2017/05/20 18:07:42
parent author
parent permlinkkr
authoraxiomier
permlinkpoloniex-hts-1-api
title나만의 poloniex HTS를 만들어 보자 (1) – API 살펴보기
body@@ -6923,24 +6923,120 @@ %EC%A7%80 %EC%95%8A%EC%9C%BC%EC%85%94%EB%8F%84 %EB%90%A9%EB%8B%88%EB%8B%A4.%0A +JSON%EC%97%90 %EB%8C%80%ED%95%B4 %EB%8D%94 %EC%95%8C%EA%B3%A0%EC%8B%B6%EC%9C%BC%EC%8B%A0 %EB%B6%84%EC%9D%80 %EC%A7%A7%EC%9D%80 %EA%B0%95%EC%A2%8C%EA%B0%80 %EC%9E%88%EC%9C%BC%EB%8B%88 %ED%95%9C%EB%B2%88 %EB%93%A4%EC%96%B4%EB%B3%B4%EC%8B%9C%EB%A9%B4 %EC%A2%8B%EC%9D%84 %EA%B2%83 %EA%B0%99%EC%8A%B5%EB%8B%88%EB%8B%A4.%0A%0Ahttps://opentutorials.org/course/1375/6844%0A%0A ~~~~%0Adef ret
json metadata{"tags":["kr","poloniex","hts"],"image":["https://steemitimages.com/DQmdFPipZpXyCoV34bFpg5HxoLE4j1gwX1mvCmiGq51Ke4z/image.png"],"links":["https://poloniex.com/support/api/","https://pastebin.com/fbkheaRb","https://github.com/Syriven/poloniex-holdings-tracker","https://wikidocs.net/53","https://opentutorials.org/course/1375/6844"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #12100758/Trx c85d86f1daa026a70e265baad7d12c4e7703e805
View Raw JSON Data
{
  "trx_id": "c85d86f1daa026a70e265baad7d12c4e7703e805",
  "block": 12100758,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T18:07:42",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "kr",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "title": "나만의 poloniex HTS를 만들어 보자 (1) – API 살펴보기",
      "body": "@@ -6923,24 +6923,120 @@\n %EC%A7%80 %EC%95%8A%EC%9C%BC%EC%85%94%EB%8F%84 %EB%90%A9%EB%8B%88%EB%8B%A4.%0A\n+JSON%EC%97%90 %EB%8C%80%ED%95%B4 %EB%8D%94 %EC%95%8C%EA%B3%A0%EC%8B%B6%EC%9C%BC%EC%8B%A0 %EB%B6%84%EC%9D%80 %EC%A7%A7%EC%9D%80 %EA%B0%95%EC%A2%8C%EA%B0%80 %EC%9E%88%EC%9C%BC%EB%8B%88 %ED%95%9C%EB%B2%88 %EB%93%A4%EC%96%B4%EB%B3%B4%EC%8B%9C%EB%A9%B4 %EC%A2%8B%EC%9D%84 %EA%B2%83 %EA%B0%99%EC%8A%B5%EB%8B%88%EB%8B%A4.%0A%0Ahttps://opentutorials.org/course/1375/6844%0A%0A\n ~~~~%0Adef ret\n",
      "json_metadata": "{\"tags\":[\"kr\",\"poloniex\",\"hts\"],\"image\":[\"https://steemitimages.com/DQmdFPipZpXyCoV34bFpg5HxoLE4j1gwX1mvCmiGq51Ke4z/image.png\"],\"links\":[\"https://poloniex.com/support/api/\",\"https://pastebin.com/fbkheaRb\",\"https://github.com/Syriven/poloniex-holdings-tracker\",\"https://wikidocs.net/53\",\"https://opentutorials.org/course/1375/6844\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
2017/05/20 18:06:51
voterjackkang
authoraxiomier
permlinkpoloniex-hts-1-api
weight5100 (51.00%)
Transaction InfoBlock #12100741/Trx 0407c975b40afe50aa549677fb5abf71603bd654
View Raw JSON Data
{
  "trx_id": "0407c975b40afe50aa549677fb5abf71603bd654",
  "block": 12100741,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T18:06:51",
  "op": [
    "vote",
    {
      "voter": "jackkang",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 5100
    }
  ]
}
2017/05/20 18:03:54
voteraxiomier
authoraxiomier
permlinkpoloniex-hts-1-api
weight10000 (100.00%)
Transaction InfoBlock #12100682/Trx c4023bd9d87460f25d0446a3e45f60d43b68d51a
View Raw JSON Data
{
  "trx_id": "c4023bd9d87460f25d0446a3e45f60d43b68d51a",
  "block": 12100682,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T18:03:54",
  "op": [
    "vote",
    {
      "voter": "axiomier",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "weight": 10000
    }
  ]
}
axiomierpublished a new post: poloniex-hts-1-api
2017/05/20 18:03:54
parent author
parent permlinkkr
authoraxiomier
permlinkpoloniex-hts-1-api
title나만의 poloniex HTS를 만들어 보자 (1) – API 살펴보기
body나만의 poloniex HTS를 만들어 보자 (1) – API 살펴보기 안녕하세요. 평소에 가끔 들려 정보만 얻다가 저도 ‘뭔가 도움이 되는 것을 해보자‘ 라는 생각으로 가입하고 포스팅을 진행해 보았습니다. 이 포스팅은 제가 최근 만들고 있는 poloniex HTS (home trading service)를 공개하면서 다른 분들도 쉽게 따라 만들 수 있는 것을 목적으로 하고 있습니다. 저도 최근에 python을 배우면서 만들고 있는 중이라 미흡한 점이 있을 수 있습니다. 사실 대단한 것을 만드는 것은 아니지만, Poloniex에 공개된 API (Application Programming Interface)를 사용해서 자신이 만든 규칙에 따라 자동으로 시세를 확인하고 거래를 진행하는 작업에 관심이 있으신 분들이 많이 계신 듯 하여 시작하여 봤습니다. 시작하기에 앞서 포스팅에 대한 몇가지 설명을 그리고자 합니다. 1) 이 프로그램은 Python 2.7 언어로 만들어 졌습니다 (2.7.13). 제가 사용하는 환경은 윈도우10 64bit, IDE (Integrated development environment)는 PyCharm Community edition 2017.1.2 이며 anaconda 4.3.1 (64bit)를 사용하였습니다. 다른 것은 개인의 사정에 따라 맞춰가면 되지만 python 개발에 익숙하지 않으신 분은 anaconda만큼은 반드시 설치하고 따라해 주시면 되겠습니다. 2) 이 프로그램은 공개된 API의 wrapper를 사용하여 – 조금 수정하여 – 만들었습니다. 해당 프로그램을 만드는데 참고가 된 자료들은 다음과 같습니다. https://poloniex.com/support/api/ - poloniex에서 제공하는 document입니다 https://pastebin.com/fbkheaRb - 위 링크에 있는 wrapper 입니다. (필요에 따라 수정하거나 추가하였습니다.) https://github.com/Syriven/poloniex-holdings-tracker - 위 wrapper를 사용하여 간단하게 시세확인 등을 할 수 있는 예제입니다. https://wikidocs.net/53 - Python 2.7에 대한 간단한 설명이 있습니다. Python을 배우면서 많은 참고를 하였습니다. 이 포스팅은 프로그래밍 언어강좌가 아니기 대문에 python 언어를 처음 접하시는 분은 먼저 이것부터 읽고 시작하시면 많은 도움이 될 것 같습니다. 3) 자동 거래시스템은 매우 위험합니다. OTP 사용등의 검증을 거치지 않기 때문에 private key만 알면 해커들이 재산의 손실을 낼 가능성이 있고, 급등락 하는 시세에서 빠르게 거래가 이루어 지기 때문에 그에 반응하지 못하고 쉽게 큰 손실이 날 가능성도 존재합니다. 또한 프로그램에 예상치 못한 문제가 있을 가능성도 존재합니다. 따라서 모든 것은 본인의 동의와 책임하에 진행되어야 하며 저는 이 포스팅을 따라하거나 참조하여 생긴 재산상의 손실등의 어떠한 상황에 대해서도 책임을 질 수 없음을 먼저 말씀드립니다. 4) 개발 환경을 구축하고 Poloniex의 API key를 얻어내는 과정등에 대해서는 따로 적지는 않았습니다. 하지만 이 포스팅을 보고 따라하고 싶으신 분들 중에서는 프로그래밍 언어를 다뤄본 경험이 전혀 없어서 도움이 필요하신 분이 있을 가능성도 생각하고 있습니다. 구글링을 하면 어렵지 않게 찾을 수 있기는 하지만 요청이 많을 경우 환경설정을 하는 부분부터 설명 드리도록 하겠습니다. 서론이 길어지네요. 제가 앞으로 포스팅을 하려는 순서는 다음과 같습니다. 1) API 살펴보기 – 본격적으로 프로그램을 제작하기에 앞서 Poloniex 에서는 어떤 API들을 제공하고 있는지에 대해 간단하게 알아봅니다. 위에 설명한 Wrapper를 중심으로 설명하나 제 편의상 약간의 수정이나 추가된 부분들이 존재합니다. 2) Coin 정보 불러오기 – 각 coin들의 (암호화폐들을 의미합니다. 편의상 coin이라고 부르도록 하겠습니다) 최근 24시간 거래량, 최근 거래의 거래가격 등의 대략적인 정보들을 불러오는 예제를 만들어봅니다. 3) 각 Coin의 chart 정보 불러오기 – 각 coin의 chart 정보를 불러와서 그래프를 그려보는 예제를 만들어봅니다. 4) 조건에 맞는 coin을 찾고 거래하기 – 특정 조건을 지정한 후 그 조건을 만족하면 사용자에게 e-mail 알림과 거래가 진행되는 프로그램을 제작합니다. 저도 아직 만들고 있는 프로그램이기 때문에 진행도중 수정이 될 수 있습니다만 일단 이런 순서대로 진행을 계획하고 있습니다. 1-2주에 한 부씩 올리는 것을 목표로 하고있는데 과연 그럴 수 있을까요? 그러면 1부를 시작하도록 하겠습니다. 1. API 살펴보기 먼저 진행할 내용은 Poloniex의 API를 살펴보는 것입니다. API란 poloniex server와 HTS 프로그램간의 통신을 할 때 어떠한 형식으로 서버에 요청을 하는지에 양식이라고 보시면 됩니다. 우리가 은행이나 관공서에 어떠한 일을 처리해 달라고 요청을 할 때 일정한 양식에 따라 서류를 작성하여 제출하는 것과 같은 원리라고 보시면 됩니다. 우리가 poloniex 서버에 정보를 요청하거나 거래를 요청할 때도 정해진 양식에 따라 프로그램을 작성해서 요청을 해야 그에 대한 업무를 처리해 줍니다. 그런데 그런 양식은 너무나 복잡한 형태로 만들어 졌기 때문에 우리가 요청을 할 때 마다 일일이 그 양식을 적는다면 프로그램이 너무 복잡해 질 것입니다. 그래서 거래소 측은 wrapper라는 것을 제공해 줍니다. Wrapper란 요청에 사용되는 몇 개의 간단한 조건을 알려주면 거래소에서 쓰는 복잡한 양식으로 자동으로 변환해 주는 편리한 함수입니다. 아래는 앞으로 우리가 사용할 wrapper들이 어떤 것이 있는지, 그 내용들은 무엇이 있는지를 간략히 설명하도록 하겠습니다. 직접 손으로 따라 적으시면서 만들어 보시면 큰 도움이 될 것입니다. 편의상 Poloniex에 링크되어 있는 것과 약간의 차이가 있습니다. 파일명 poloniex_wrapper.py ~~~~ #import libraries import urllib import urllib2 import json import time import hmac, hashlib import datetime as DT import calendar import os ~~~~ 앞으로 사용할 libraries입니다. Library는 자주 사용되는 기능들을 쉽게 쓸 수 있도록 만들어준 함수나 class 등을 포함하고 있습니다. 앞서 말씀드린 anaconda에는 위 libraries가 모두 담겨져 있으니 우리는 해당 기능을 일일이 만들 필요 없이 그냥 가져다 사용하면 됩니다. ~~~~ def createTimeStamp(datestr, format="%Y-%m-%d %H:%M:%S"): utcTime = DT.datetime.strptime(datestr, format) return calendar.timegm(utcTime.utctimetuple()) ~~~~ Timestamp를 만들어주는 함수 입니다. Poloniex에 요청하는 자료를 만들 때는 우리가 사용하는 ‘2017년 5월 21일 1시 8분 23초’ 같은 시간이 아니라 각 시간에 대응되는 serial number를 주어야 합니다. 이 각 시간에 대응하는 serial number를 timestamp라고 합니다. 위 함수는 사람이 알아볼 수 있는 시간형식, 예를 들면 ‘2017-05-21 01:08:23’ 을 poloniex가 알아볼 수 있는 timestamp로 변환해 주는 역할을 하는 함수입니다. 참고로 poloniex는 세계 각국에서 이용되는 거래소입니다. 따라서 거래하는 사람마다 각자 국가에 따라 서로 다른 시간에 거래를 합니다. 그렇다면 거래소는 어떤 시간을 쓸까요? 바로 세계협정시(Coordinated universal time; UTC)입니다. Poloniex에 시간을 알려줄때는 반드시 UTC로 알려주어야 한다는 점, 또 poloniex에서 시간을 알려줄때도 UTC로 알려준다는 점을 반드시 알고 있으셔야 합니다. ~~~~ class poloniex: def __init__(self, APIKey, Secret): self.APIKey = APIKey self.Secret = Secret ~~~~ Class는 사람, 핸드폰 같은 특정한 실체가 없는 범주를 의미합니다. 사람이 실체가 없다는 말에 의아한 분이 있으실 텐데 이런 질문을 보시면 금방 이해가 될 것입니다. ‘사람의 나이는 어떻게 되나요?’ (인류의 역사에 대한 질문이 아닙니다.) ‘사람의 이름이 무엇인가요?’ 이름이나 나이 등의 속성은 글을 작성하는 저나 이 글을 읽고 계신 독자님 등의 개인 (객체지향 프로그래밍 언어들 에서는 object 혹은 instance라고 부릅니다) 에게 존재하는 것이지 사람이라는 범주(프로그래밍 언어에서는 class라고 부릅니다) 에 존재하는 것은 아니지요. 객체지향 프로그래밍 언어들 에서는 object는 두가지 요소로 이루어 진다고 이야기 하는데 하나는 object를 이루는 속성(variables)이고 다른 하나는 행동(method)입니다. 앞의 사람예를 다시 꺼내자면 속성이란 사람의 나이, 이름 등이고, 행동은 달리기, 밥먹기 등을 이야기 할 수 있지요. 이번에 만드는 poloniex란 class에서는 두가지 속성을 갖습니다. 그것은 바로 poloniex에 접근하기 위한 APIkey와 secretkey이죠. Object가 생성되기 전까지는 이러한 값들이 존재하지 않습니다. 이 값들은 object가 생성될 때 위의 __init__이라는 함수(함수는 앞서 말씀드린 object의 행동, 즉 method를 의미합니다)가 불리면서 받아오는 역할을 하게 됩니다. 앞에 ‘self.’ 가 붙어있는 것을 보실 수 있을 텐데 이는 함수내에 정의되는 내부 변수들과 class의 variable과의 구분을 위해 이런 식으로 접근을 합니다. 자세한 사용법은 추후에 다시 설명 드리도록 하겠습니다. ~~~~ def api_query(self, command, req={}): if (command == "returnTicker" or command == "return24Volume"): ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/public?command=' + command)) return json.loads(ret.read()) elif (command == "returnOrderBook"): ret = urllib2.urlopen(urllib2.Request( 'https://poloniex.com/public?command=' + command + '&currencyPair=' + str(req['currencyPair']))) return json.loads(ret.read()) elif (command == "returnMarketTradeHistory"): ret = urllib2.urlopen(urllib2.Request( 'https://poloniex.com/public?command=' + "returnTradeHistory" + '&currencyPair=' + str( req['currencyPair']))) return json.loads(ret.read()) else: req['command'] = command req['nonce'] = int(time.time() * 1000) post_data = urllib.urlencode(req) sign = hmac.new(self.Secret, post_data, hashlib.sha512).hexdigest() headers = { 'Sign': sign, 'Key': self.APIKey } ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/tradingApi', post_data, headers)) jsonRet = json.loads(ret.read()) return self.post_process(jsonRet) ~~~~ 아래 설명드릴 함수 (method)에서 사용되는 method입니다. 우리가 이것을 직접 사용하지는 않기 때문에 자세히 설명 드리지는 않겠지만 한가지만 집고 넘어가겠습니다. 이 코드를 보시다보면 중간중간 json이라는 단어가 나오는 것을 보실 수 있으실 겁니다. JSON은 JavaScript Object Notation의 약자로 서로 다른 프로그래밍 언어들끼리 정보를 주고받을 때 사용하는 형식입니다. “변수이름:변수의 값” 형식으로 이루어져 있으며 아래는 한가지 예를 보여주고 있습니다. "BTC_ETH":{"id":148,"last":"0.06288890","lowestAsk":"0.06288890","highestBid":"0.06260001","percentChange":"0.04034574","baseVolume":"65226.58242374","quoteVolume":"1040824.91707012","isFrozen":"0","high24hr":"0.06587350","low24hr":"0.05937060"} Python에서는 json parser를 제공해서 자동으로 변수 이름과 값을 나누어 주기 때문에 이 복잡한 형식의 문자들을 어떻게 잘라서 이름과 값을 추출해야 하지 하는 걱정은 하지 않으셔도 됩니다. ~~~~ def returnTicker(self): return self.api_query("returnTicker") ~~~~ 위 api_query를 사용하여 coin들의 정보를 불러오는 함수입니다. 위의 JSON example에 BTC_ETH 있는 정보가 이 함수를 통해 얻어진 정보 중 일부입니다. ~~~~ def returnChartData(self, currencyPair, period, start, end): #currencyPair: example: BTC_XRP #period: the duration of a tic unit: min example: 15 (min) #start: start time /format="%Y-%m-%d %H:%M:%S" #end: end time /format="%Y-%m-%d %H:%M:%S" startTs = createTimeStamp(start) endTs = createTimeStamp(end) periodSec = period * 60 ret = urllib2.urlopen(urllib2.Request( 'https://poloniex.com/public?command=returnChartData&currencyPair=' + str(currencyPair) + '&start=' + str(startTs) + '&end=' + str(endTs) + '&period=' + str(periodSec) )) return json.loads(ret.read()) ~~~~ 차트 데이터를 받아오는 함수입니다. 어떠한 coin을 거래할 것인지(BTC_XRP 등), chart의 tic은 몇분으로 할 것인지 (15분 등), 자료를 받아오려는 기간의 시작과 끝은 언제 인지 (2017-05-21 2:15:26 의 형식으로 입력해야 합니다.)등을 입력하면 됩니다. 이때 시간은 반드시 UTC로 해야 원하는 답을 얻을 수 있습니다. 이렇게 요청을 했을 때 받아오는 값은 다음과 같습니다. ![](https://steemitimages.com/DQmdFPipZpXyCoV34bFpg5HxoLE4j1gwX1mvCmiGq51Ke4z/image.png) Volume: 해당 tic의 거래량(기준통화 (BTC) 단위) quoteVolume: 해당 tic의 거래량 (거래 대상 통화 (XRP) 단위) high: 해당 tic의 최고점 low: 해당 tic의 최저점 date: 해당 tic이 시작하는 timestamp close: 해당 tic이 끝날 때 (혹은 해당 tic의 가장 마지막에 거래된) 가격 weightedAverage: 해당 tic의 거래량이 반영된 평균 거래가격 open: 해당 tic이 시작할 때의 가격 ~~~~ # Places a buy order in a given market. Required POST parameters are "currencyPair", "rate", and "amount". If successful, the method will return the order number. # Inputs: # currencyPair The curreny pair # rate price the order is buying at # amount Amount of coins to buy # Outputs: # orderNumber The order number def buy(self, currencyPair, rate, amount): return self.api_query('buy', {"currencyPair": currencyPair, "rate": rate, "amount": amount}) ~~~~ 구매를 요청하는 함수입니다. 거래 통화 쌍(BTC_XRP), 구매 가격, 그리고 구매량을 적으면 구매 요청이 됩니다. 요청이 실패하거나 거절당할 수 있으니 그에 대한 대비도 필요할 수 있습니다. https://poloniex.com/support/api/ 문서를 참조해 주세요. 오늘은 앞으로 사용할 함수들에 대해 간단하게 살펴보았습니다. 사용 예정인 것들만 한번 간단하게 살펴 보았는데 제가 가지고 있는 파일을 모두 올려드리자면 아래와 같습니다. ~~~~ import urllib import urllib2 import json import time import hmac, hashlib import datetime as DT import calendar import os def createTimeStamp(datestr, format="%Y-%m-%d %H:%M:%S"): utcTime = DT.datetime.strptime(datestr, format) return calendar.timegm(utcTime.utctimetuple()) class poloniex: def __init__(self, APIKey, Secret): self.APIKey = APIKey self.Secret = Secret def post_process(self, before): after = before # Add timestamps if there isnt one but is a datetime if ('return' in after): if (isinstance(after['return'], list)): for x in xrange(0, len(after['return'])): if (isinstance(after['return'][x], dict)): if ('datetime' in after['return'][x] and 'timestamp' not in after['return'][x]): after['return'][x]['timestamp'] = float(createTimeStamp(after['return'][x]['datetime'])) return after def api_query(self, command, req={}): if (command == "returnTicker" or command == "return24Volume"): ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/public?command=' + command)) return json.loads(ret.read()) elif (command == "returnOrderBook"): ret = urllib2.urlopen(urllib2.Request( 'https://poloniex.com/public?command=' + command + '&currencyPair=' + str(req['currencyPair']))) return json.loads(ret.read()) elif (command == "returnMarketTradeHistory"): ret = urllib2.urlopen(urllib2.Request( 'https://poloniex.com/public?command=' + "returnTradeHistory" + '&currencyPair=' + str( req['currencyPair']))) return json.loads(ret.read()) else: req['command'] = command req['nonce'] = int(time.time() * 1000) post_data = urllib.urlencode(req) sign = hmac.new(self.Secret, post_data, hashlib.sha512).hexdigest() headers = { 'Sign': sign, 'Key': self.APIKey } ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/tradingApi', post_data, headers)) jsonRet = json.loads(ret.read()) return self.post_process(jsonRet) def returnTicker(self): return self.api_query("returnTicker") def return24Volume(self): return self.api_query("return24Volume") def returnOrderBook(self, currencyPair): return self.api_query("returnOrderBook", {'currencyPair': currencyPair}) def returnMarketTradeHistory(self, currencyPair): return self.api_query("returnMarketTradeHistory", {'currencyPair': currencyPair}) def returnChartData(self, currencyPair, period, start, end): #currencyPair: example: BTC_XRP #period: the duration of a tic unit: min example: 15 (min) #start: start time /format="%Y-%m-%d %H:%M:%S" #end: end time /format="%Y-%m-%d %H:%M:%S" startTs = createTimeStamp(start) endTs = createTimeStamp(end) periodSec = period * 60 ret = urllib2.urlopen(urllib2.Request( 'https://poloniex.com/public?command=returnChartData&currencyPair=' + str(currencyPair) + '&start=' + str(startTs) + '&end=' + str(endTs) + '&period=' + str(periodSec) )) return json.loads(ret.read()) # Returns all of your balances. # Outputs: # {"BTC":"0.59098578","LTC":"3.31117268", ... } def returnBalances(self): return self.api_query('returnBalances') # Returns your open orders for a given market, specified by the "currencyPair" POST parameter, e.g. "BTC_XCP" # Inputs: # currencyPair The currency pair e.g. "BTC_XCP" # Outputs: # orderNumber The order number # type sell or buy # rate Price the order is selling or buying at # Amount Quantity of order # total Total value of order (price * quantity) def returnOpenOrders(self, currencyPair): return self.api_query('returnOpenOrders', {"currencyPair": currencyPair}) # Returns your trade history for a given market, specified by the "currencyPair" POST parameter # Inputs: # currencyPair The currency pair e.g. "BTC_XCP" # Outputs: # date Date in the form: "2014-02-19 03:44:59" # rate Price the order is selling or buying at # amount Quantity of order # total Total value of order (price * quantity) # type sell or buy def returnTradeHistory(self, currencyPair): return self.api_query('returnTradeHistory', {"currencyPair": currencyPair}) # Places a buy order in a given market. Required POST parameters are "currencyPair", "rate", and "amount". If successful, the method will return the order number. # Inputs: # currencyPair The curreny pair # rate price the order is buying at # amount Amount of coins to buy # Outputs: # orderNumber The order number def buy(self, currencyPair, rate, amount): return self.api_query('buy', {"currencyPair": currencyPair, "rate": rate, "amount": amount}) # Places a sell order in a given market. Required POST parameters are "currencyPair", "rate", and "amount". If successful, the method will return the order number. # Inputs: # currencyPair The curreny pair # rate price the order is selling at # amount Amount of coins to sell # Outputs: # orderNumber The order number def sell(self, currencyPair, rate, amount): return self.api_query('sell', {"currencyPair": currencyPair, "rate": rate, "amount": amount}) # Cancels an order you have placed in a given market. Required POST parameters are "currencyPair" and "orderNumber". # Inputs: # currencyPair The curreny pair # orderNumber The order number to cancel # Outputs: # succes 1 or 0 def cancel(self, currencyPair, orderNumber): return self.api_query('cancelOrder', {"currencyPair": currencyPair, "orderNumber": orderNumber}) # Immediately places a withdrawal for a given currency, with no email confirmation. In order to use this method, the withdrawal privilege must be enabled for your API key. Required POST parameters are "currency", "amount", and "address". Sample output: {"response":"Withdrew 2398 NXT."} # Inputs: # currency The currency to withdraw # amount The amount of this coin to withdraw # address The withdrawal address # Outputs: # response Text containing message about the withdrawal def withdraw(self, currency, amount, address): return self.api_query('withdraw', {"currency": currency, "amount": amount, "address": address}) ~~~~
json metadata{"tags":["kr","poloniex","hts"],"image":["https://steemitimages.com/DQmdFPipZpXyCoV34bFpg5HxoLE4j1gwX1mvCmiGq51Ke4z/image.png"],"links":["https://poloniex.com/support/api/","https://pastebin.com/fbkheaRb","https://github.com/Syriven/poloniex-holdings-tracker","https://wikidocs.net/53"],"app":"steemit/0.1","format":"markdown"}
Transaction InfoBlock #12100682/Trx c4023bd9d87460f25d0446a3e45f60d43b68d51a
View Raw JSON Data
{
  "trx_id": "c4023bd9d87460f25d0446a3e45f60d43b68d51a",
  "block": 12100682,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T18:03:54",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "kr",
      "author": "axiomier",
      "permlink": "poloniex-hts-1-api",
      "title": "나만의 poloniex HTS를 만들어 보자 (1) – API 살펴보기",
      "body": "나만의 poloniex HTS를 만들어 보자 (1) – API 살펴보기\n\n안녕하세요. 평소에 가끔 들려 정보만 얻다가 저도 ‘뭔가 도움이 되는 것을 해보자‘ 라는 생각으로 가입하고 포스팅을 진행해 보았습니다. 이 포스팅은 제가 최근 만들고 있는 poloniex HTS (home trading service)를 공개하면서 다른 분들도 쉽게 따라 만들 수 있는 것을 목적으로 하고 있습니다. 저도 최근에 python을 배우면서 만들고 있는 중이라 미흡한 점이 있을 수 있습니다. 사실 대단한 것을 만드는 것은 아니지만, Poloniex에 공개된 API (Application Programming Interface)를 사용해서 자신이 만든 규칙에 따라 자동으로 시세를 확인하고 거래를 진행하는 작업에 관심이 있으신 분들이 많이 계신 듯 하여 시작하여 봤습니다.\n시작하기에 앞서 포스팅에 대한 몇가지 설명을 그리고자 합니다.\n1)\t이 프로그램은 Python 2.7 언어로 만들어 졌습니다 (2.7.13). 제가 사용하는 환경은 윈도우10 64bit, IDE (Integrated development environment)는 PyCharm Community edition 2017.1.2 이며 anaconda 4.3.1 (64bit)를 사용하였습니다. 다른 것은 개인의 사정에 따라 맞춰가면 되지만 python 개발에 익숙하지 않으신 분은 anaconda만큼은 반드시 설치하고 따라해 주시면 되겠습니다.\n2)\t이 프로그램은 공개된 API의 wrapper를 사용하여 – 조금 수정하여 – 만들었습니다. 해당 프로그램을 만드는데 참고가 된 자료들은 다음과 같습니다.\nhttps://poloniex.com/support/api/ - poloniex에서 제공하는 document입니다\nhttps://pastebin.com/fbkheaRb - 위 링크에 있는 wrapper 입니다. (필요에 따라 수정하거나 추가하였습니다.)\nhttps://github.com/Syriven/poloniex-holdings-tracker - 위 wrapper를 사용하여 간단하게 시세확인 등을 할 수 있는 예제입니다. \nhttps://wikidocs.net/53 - Python 2.7에 대한 간단한 설명이 있습니다. Python을 배우면서 많은 참고를 하였습니다. 이 포스팅은 프로그래밍 언어강좌가 아니기 대문에 python 언어를 처음 접하시는 분은 먼저 이것부터 읽고 시작하시면 많은 도움이 될 것 같습니다.\n3)\t자동 거래시스템은 매우 위험합니다. OTP 사용등의 검증을 거치지 않기 때문에 private key만 알면 해커들이 재산의 손실을 낼 가능성이 있고, 급등락 하는 시세에서 빠르게 거래가 이루어 지기 때문에 그에 반응하지 못하고 쉽게 큰 손실이 날 가능성도 존재합니다. 또한 프로그램에 예상치 못한 문제가 있을 가능성도 존재합니다. 따라서 모든 것은 본인의 동의와 책임하에 진행되어야 하며 저는 이 포스팅을 따라하거나 참조하여 생긴 재산상의 손실등의 어떠한 상황에 대해서도 책임을 질 수 없음을 먼저 말씀드립니다.\n4)\t개발 환경을 구축하고 Poloniex의 API key를 얻어내는 과정등에 대해서는 따로 적지는 않았습니다. 하지만 이 포스팅을 보고 따라하고 싶으신 분들 중에서는 프로그래밍 언어를 다뤄본 경험이 전혀 없어서 도움이 필요하신 분이 있을 가능성도 생각하고 있습니다. 구글링을 하면 어렵지 않게 찾을 수 있기는 하지만 요청이 많을 경우 환경설정을 하는 부분부터 설명 드리도록 하겠습니다.\n\n서론이 길어지네요. 제가 앞으로 포스팅을 하려는 순서는 다음과 같습니다.\n1)\tAPI 살펴보기 – 본격적으로 프로그램을 제작하기에 앞서 Poloniex 에서는 어떤 API들을 제공하고 있는지에 대해 간단하게 알아봅니다. 위에 설명한 Wrapper를 중심으로 설명하나 제 편의상 약간의 수정이나 추가된 부분들이 존재합니다.\n2)\tCoin 정보 불러오기 – 각 coin들의 (암호화폐들을 의미합니다. 편의상 coin이라고 부르도록 하겠습니다) 최근 24시간 거래량, 최근 거래의 거래가격 등의 대략적인 정보들을 불러오는 예제를 만들어봅니다.\n3)\t각 Coin의 chart 정보 불러오기 – 각 coin의 chart 정보를 불러와서 그래프를 그려보는 예제를 만들어봅니다.\n4)\t조건에 맞는 coin을 찾고 거래하기 – 특정 조건을 지정한 후 그 조건을 만족하면 사용자에게 e-mail 알림과 거래가 진행되는 프로그램을 제작합니다.\n저도 아직 만들고 있는 프로그램이기 때문에 진행도중 수정이 될 수 있습니다만 일단 이런 순서대로 진행을 계획하고 있습니다. 1-2주에 한 부씩 올리는 것을 목표로 하고있는데 과연 그럴 수 있을까요? 그러면 1부를 시작하도록 하겠습니다.\n\n\n\n\n1.\tAPI 살펴보기\n\n먼저 진행할 내용은 Poloniex의 API를 살펴보는 것입니다. API란 poloniex server와 HTS 프로그램간의 통신을 할 때 어떠한 형식으로 서버에 요청을 하는지에 양식이라고 보시면 됩니다. 우리가 은행이나 관공서에 어떠한 일을 처리해 달라고 요청을 할 때 일정한 양식에 따라 서류를 작성하여 제출하는 것과 같은 원리라고 보시면 됩니다. 우리가 poloniex 서버에 정보를 요청하거나 거래를 요청할 때도 정해진 양식에 따라 프로그램을 작성해서 요청을 해야 그에 대한 업무를 처리해 줍니다. 그런데 그런 양식은 너무나 복잡한 형태로 만들어 졌기 때문에 우리가 요청을 할 때 마다 일일이 그 양식을 적는다면 프로그램이 너무 복잡해 질 것입니다. 그래서 거래소 측은 wrapper라는 것을 제공해 줍니다. Wrapper란 요청에 사용되는 몇 개의 간단한 조건을 알려주면 거래소에서 쓰는 복잡한 양식으로 자동으로 변환해 주는 편리한 함수입니다. 아래는 앞으로 우리가 사용할 wrapper들이 어떤 것이 있는지, 그 내용들은 무엇이 있는지를 간략히 설명하도록 하겠습니다. 직접 손으로 따라 적으시면서 만들어 보시면 큰 도움이 될 것입니다. 편의상 Poloniex에 링크되어 있는 것과 약간의 차이가 있습니다.\n\n파일명 poloniex_wrapper.py\n~~~~\n#import libraries\nimport urllib\nimport urllib2\nimport json\nimport time\nimport hmac, hashlib\nimport datetime as DT\nimport calendar\nimport os\n~~~~\n앞으로 사용할 libraries입니다. Library는 자주 사용되는 기능들을 쉽게 쓸 수 있도록 만들어준 함수나 class 등을 포함하고 있습니다. 앞서 말씀드린 anaconda에는 위 libraries가 모두 담겨져 있으니 우리는 해당 기능을 일일이 만들 필요 없이 그냥 가져다 사용하면 됩니다.\n~~~~\ndef createTimeStamp(datestr, format=\"%Y-%m-%d %H:%M:%S\"):\n    utcTime = DT.datetime.strptime(datestr, format)\n    return calendar.timegm(utcTime.utctimetuple())\n~~~~\n\nTimestamp를 만들어주는 함수 입니다. Poloniex에 요청하는 자료를 만들 때는 우리가 사용하는 ‘2017년 5월 21일 1시 8분 23초’ 같은 시간이 아니라 각 시간에 대응되는 serial number를 주어야 합니다. 이 각 시간에 대응하는 serial number를 timestamp라고 합니다. 위 함수는 사람이 알아볼 수 있는 시간형식, 예를 들면 ‘2017-05-21 01:08:23’ 을 poloniex가 알아볼 수 있는 timestamp로 변환해 주는 역할을 하는 함수입니다.\n 참고로 poloniex는 세계 각국에서 이용되는 거래소입니다. 따라서 거래하는 사람마다 각자 국가에 따라 서로 다른 시간에 거래를 합니다. 그렇다면 거래소는 어떤 시간을 쓸까요? 바로 세계협정시(Coordinated universal time; UTC)입니다. Poloniex에 시간을 알려줄때는 반드시 UTC로 알려주어야 한다는 점, 또 poloniex에서 시간을 알려줄때도 UTC로 알려준다는 점을 반드시 알고 있으셔야 합니다.\n~~~~\nclass poloniex:\n    def __init__(self, APIKey, Secret):\n        self.APIKey = APIKey\n        self.Secret = Secret\n~~~~\nClass는 사람, 핸드폰 같은 특정한 실체가 없는 범주를 의미합니다. 사람이 실체가 없다는 말에 의아한 분이 있으실 텐데 이런 질문을 보시면 금방 이해가 될 것입니다.\n‘사람의 나이는 어떻게 되나요?’ (인류의 역사에 대한 질문이 아닙니다.)\n‘사람의 이름이 무엇인가요?’\n이름이나 나이 등의 속성은 글을 작성하는 저나 이 글을 읽고 계신 독자님 등의 개인 (객체지향 프로그래밍 언어들 에서는 object 혹은 instance라고 부릅니다) 에게 존재하는 것이지 사람이라는 범주(프로그래밍 언어에서는 class라고 부릅니다) 에 존재하는 것은 아니지요. 객체지향 프로그래밍 언어들 에서는 object는 두가지 요소로 이루어 진다고 이야기 하는데 하나는 object를 이루는 속성(variables)이고 다른 하나는 행동(method)입니다. 앞의 사람예를 다시 꺼내자면 속성이란 사람의 나이, 이름 등이고, 행동은 달리기, 밥먹기 등을 이야기 할 수 있지요. 이번에 만드는 poloniex란 class에서는 두가지 속성을 갖습니다. 그것은 바로 poloniex에 접근하기 위한 APIkey와 secretkey이죠. Object가 생성되기 전까지는 이러한 값들이 존재하지 않습니다. 이 값들은 object가 생성될 때 위의 __init__이라는 함수(함수는 앞서 말씀드린 object의 행동, 즉 method를 의미합니다)가 불리면서 받아오는 역할을 하게 됩니다. 앞에 ‘self.’ 가 붙어있는 것을 보실 수 있을 텐데 이는 함수내에 정의되는 내부 변수들과 class의 variable과의 구분을 위해 이런 식으로 접근을 합니다. 자세한 사용법은 추후에 다시 설명 드리도록 하겠습니다.\n~~~~\ndef api_query(self, command, req={}):\n\n        if (command == \"returnTicker\" or command == \"return24Volume\"):\n            ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/public?command=' + command))\n            return json.loads(ret.read())\n        elif (command == \"returnOrderBook\"):\n            ret = urllib2.urlopen(urllib2.Request(\n                'https://poloniex.com/public?command=' + command + '&currencyPair=' + str(req['currencyPair'])))\n            return json.loads(ret.read())\n        elif (command == \"returnMarketTradeHistory\"):\n            ret = urllib2.urlopen(urllib2.Request(\n                'https://poloniex.com/public?command=' + \"returnTradeHistory\" + '&currencyPair=' + str(\n                    req['currencyPair'])))\n            return json.loads(ret.read())\n        else:\n            req['command'] = command\n            req['nonce'] = int(time.time() * 1000)\n            post_data = urllib.urlencode(req)\n\n            sign = hmac.new(self.Secret, post_data, hashlib.sha512).hexdigest()\n            headers = {\n                'Sign': sign,\n                'Key': self.APIKey\n            }\n\n            ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/tradingApi', post_data, headers))\n            jsonRet = json.loads(ret.read())\n            return self.post_process(jsonRet)\n~~~~\n\n아래 설명드릴 함수 (method)에서 사용되는 method입니다. 우리가 이것을 직접 사용하지는 않기 때문에 자세히 설명 드리지는 않겠지만 한가지만 집고 넘어가겠습니다. 이 코드를 보시다보면 중간중간 json이라는 단어가 나오는 것을 보실 수 있으실 겁니다. JSON은 JavaScript Object Notation의 약자로 서로 다른 프로그래밍 언어들끼리 정보를 주고받을 때 사용하는 형식입니다. “변수이름:변수의 값” 형식으로 이루어져 있으며 아래는 한가지 예를 보여주고 있습니다.\n\"BTC_ETH\":{\"id\":148,\"last\":\"0.06288890\",\"lowestAsk\":\"0.06288890\",\"highestBid\":\"0.06260001\",\"percentChange\":\"0.04034574\",\"baseVolume\":\"65226.58242374\",\"quoteVolume\":\"1040824.91707012\",\"isFrozen\":\"0\",\"high24hr\":\"0.06587350\",\"low24hr\":\"0.05937060\"}\nPython에서는 json parser를 제공해서 자동으로 변수 이름과 값을 나누어 주기 때문에 이 복잡한 형식의 문자들을 어떻게 잘라서 이름과 값을 추출해야 하지 하는 걱정은 하지 않으셔도 됩니다.\n~~~~\ndef returnTicker(self):\n        return self.api_query(\"returnTicker\")\n~~~~\n위 api_query를 사용하여 coin들의 정보를 불러오는 함수입니다. 위의 JSON example에 BTC_ETH 있는 정보가 이 함수를 통해 얻어진 정보 중 일부입니다.\n~~~~\ndef returnChartData(self, currencyPair, period, start, end):\n        #currencyPair: example: BTC_XRP\n        #period: the duration of a tic unit: min example: 15 (min)\n        #start: start time /format=\"%Y-%m-%d %H:%M:%S\"\n        #end: end time /format=\"%Y-%m-%d %H:%M:%S\"\n\n        startTs = createTimeStamp(start)\n        endTs = createTimeStamp(end)\n\n        periodSec = period * 60\n        ret = urllib2.urlopen(urllib2.Request(\n            'https://poloniex.com/public?command=returnChartData&currencyPair=' + str(currencyPair) + '&start=' + str(startTs) + '&end=' + str(endTs) + '&period=' + str(periodSec)\n        ))\n\n        return json.loads(ret.read())\n~~~~\n차트 데이터를 받아오는 함수입니다. 어떠한 coin을 거래할 것인지(BTC_XRP 등), chart의 tic은 몇분으로 할 것인지 (15분 등), 자료를 받아오려는 기간의 시작과 끝은 언제 인지 (2017-05-21 2:15:26 의 형식으로 입력해야 합니다.)등을 입력하면 됩니다. 이때 시간은 반드시 UTC로 해야 원하는 답을 얻을 수 있습니다. 이렇게 요청을 했을 때 받아오는 값은 다음과 같습니다.\n ![](https://steemitimages.com/DQmdFPipZpXyCoV34bFpg5HxoLE4j1gwX1mvCmiGq51Ke4z/image.png)\nVolume: 해당 tic의 거래량(기준통화 (BTC) 단위)\nquoteVolume: 해당 tic의 거래량 (거래 대상 통화 (XRP) 단위)\nhigh: 해당 tic의 최고점\nlow: 해당 tic의 최저점\ndate: 해당 tic이 시작하는 timestamp\nclose: 해당 tic이 끝날 때 (혹은 해당 tic의 가장 마지막에 거래된) 가격\nweightedAverage: 해당 tic의 거래량이 반영된 평균 거래가격\nopen: 해당 tic이 시작할 때의 가격\n~~~~\n# Places a buy order in a given market. Required POST parameters are \"currencyPair\", \"rate\", and \"amount\". If successful, the method will return the order number.\n    # Inputs:\n    # currencyPair  The curreny pair\n    # rate          price the order is buying at\n    # amount        Amount of coins to buy\n    # Outputs:\n    # orderNumber   The order number\n    def buy(self, currencyPair, rate, amount):\n        return self.api_query('buy', {\"currencyPair\": currencyPair, \"rate\": rate, \"amount\": amount})\n~~~~\n구매를 요청하는 함수입니다. 거래 통화 쌍(BTC_XRP), 구매 가격, 그리고 구매량을 적으면 구매 요청이 됩니다. 요청이 실패하거나 거절당할 수 있으니 그에 대한 대비도 필요할 수 있습니다. https://poloniex.com/support/api/ 문서를 참조해 주세요.\n\n오늘은 앞으로 사용할 함수들에 대해 간단하게 살펴보았습니다. 사용 예정인 것들만 한번 간단하게 살펴 보았는데 제가 가지고 있는 파일을 모두 올려드리자면 아래와 같습니다.\n\n~~~~\nimport urllib\nimport urllib2\nimport json\nimport time\nimport hmac, hashlib\nimport datetime as DT\nimport calendar\nimport os\n\n\n\n\ndef createTimeStamp(datestr, format=\"%Y-%m-%d %H:%M:%S\"):\n    utcTime = DT.datetime.strptime(datestr, format)\n    return calendar.timegm(utcTime.utctimetuple())\n\n\n\n\nclass poloniex:\n    def __init__(self, APIKey, Secret):\n        self.APIKey = APIKey\n        self.Secret = Secret\n\n    def post_process(self, before):\n        after = before\n\n        # Add timestamps if there isnt one but is a datetime\n        if ('return' in after):\n            if (isinstance(after['return'], list)):\n                for x in xrange(0, len(after['return'])):\n                    if (isinstance(after['return'][x], dict)):\n                        if ('datetime' in after['return'][x] and 'timestamp' not in after['return'][x]):\n                            after['return'][x]['timestamp'] = float(createTimeStamp(after['return'][x]['datetime']))\n\n        return after\n\n    def api_query(self, command, req={}):\n\n        if (command == \"returnTicker\" or command == \"return24Volume\"):\n            ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/public?command=' + command))\n            return json.loads(ret.read())\n        elif (command == \"returnOrderBook\"):\n            ret = urllib2.urlopen(urllib2.Request(\n                'https://poloniex.com/public?command=' + command + '&currencyPair=' + str(req['currencyPair'])))\n            return json.loads(ret.read())\n        elif (command == \"returnMarketTradeHistory\"):\n            ret = urllib2.urlopen(urllib2.Request(\n                'https://poloniex.com/public?command=' + \"returnTradeHistory\" + '&currencyPair=' + str(\n                    req['currencyPair'])))\n            return json.loads(ret.read())\n        else:\n            req['command'] = command\n            req['nonce'] = int(time.time() * 1000)\n            post_data = urllib.urlencode(req)\n\n            sign = hmac.new(self.Secret, post_data, hashlib.sha512).hexdigest()\n            headers = {\n                'Sign': sign,\n                'Key': self.APIKey\n            }\n\n            ret = urllib2.urlopen(urllib2.Request('https://poloniex.com/tradingApi', post_data, headers))\n            jsonRet = json.loads(ret.read())\n            return self.post_process(jsonRet)\n\n    def returnTicker(self):\n        return self.api_query(\"returnTicker\")\n\n    def return24Volume(self):\n        return self.api_query(\"return24Volume\")\n\n    def returnOrderBook(self, currencyPair):\n        return self.api_query(\"returnOrderBook\", {'currencyPair': currencyPair})\n\n    def returnMarketTradeHistory(self, currencyPair):\n        return self.api_query(\"returnMarketTradeHistory\", {'currencyPair': currencyPair})\n\n    def returnChartData(self, currencyPair, period, start, end):\n        #currencyPair: example: BTC_XRP\n        #period: the duration of a tic unit: min example: 15 (min)\n        #start: start time /format=\"%Y-%m-%d %H:%M:%S\"\n        #end: end time /format=\"%Y-%m-%d %H:%M:%S\"\n\n        startTs = createTimeStamp(start)\n        endTs = createTimeStamp(end)\n\n        periodSec = period * 60\n        ret = urllib2.urlopen(urllib2.Request(\n            'https://poloniex.com/public?command=returnChartData&currencyPair=' + str(currencyPair) + '&start=' + str(startTs) + '&end=' + str(endTs) + '&period=' + str(periodSec)\n        ))\n\n        return json.loads(ret.read())\n\n    # Returns all of your balances.\n    # Outputs:\n    # {\"BTC\":\"0.59098578\",\"LTC\":\"3.31117268\", ... }\n    def returnBalances(self):\n        return self.api_query('returnBalances')\n\n    # Returns your open orders for a given market, specified by the \"currencyPair\" POST parameter, e.g. \"BTC_XCP\"\n    # Inputs:\n    # currencyPair  The currency pair e.g. \"BTC_XCP\"\n    # Outputs:\n    # orderNumber   The order number\n    # type          sell or buy\n    # rate          Price the order is selling or buying at\n    # Amount        Quantity of order\n    # total         Total value of order (price * quantity)\n    def returnOpenOrders(self, currencyPair):\n        return self.api_query('returnOpenOrders', {\"currencyPair\": currencyPair})\n\n    # Returns your trade history for a given market, specified by the \"currencyPair\" POST parameter\n    # Inputs:\n    # currencyPair  The currency pair e.g. \"BTC_XCP\"\n    # Outputs:\n    # date          Date in the form: \"2014-02-19 03:44:59\"\n    # rate          Price the order is selling or buying at\n    # amount        Quantity of order\n    # total         Total value of order (price * quantity)\n    # type          sell or buy\n    def returnTradeHistory(self, currencyPair):\n        return self.api_query('returnTradeHistory', {\"currencyPair\": currencyPair})\n\n    # Places a buy order in a given market. Required POST parameters are \"currencyPair\", \"rate\", and \"amount\". If successful, the method will return the order number.\n    # Inputs:\n    # currencyPair  The curreny pair\n    # rate          price the order is buying at\n    # amount        Amount of coins to buy\n    # Outputs:\n    # orderNumber   The order number\n    def buy(self, currencyPair, rate, amount):\n        return self.api_query('buy', {\"currencyPair\": currencyPair, \"rate\": rate, \"amount\": amount})\n\n    # Places a sell order in a given market. Required POST parameters are \"currencyPair\", \"rate\", and \"amount\". If successful, the method will return the order number.\n    # Inputs:\n    # currencyPair  The curreny pair\n    # rate          price the order is selling at\n    # amount        Amount of coins to sell\n    # Outputs:\n    # orderNumber   The order number\n    def sell(self, currencyPair, rate, amount):\n        return self.api_query('sell', {\"currencyPair\": currencyPair, \"rate\": rate, \"amount\": amount})\n\n    # Cancels an order you have placed in a given market. Required POST parameters are \"currencyPair\" and \"orderNumber\".\n    # Inputs:\n    # currencyPair  The curreny pair\n    # orderNumber   The order number to cancel\n    # Outputs:\n    # succes        1 or 0\n    def cancel(self, currencyPair, orderNumber):\n        return self.api_query('cancelOrder', {\"currencyPair\": currencyPair, \"orderNumber\": orderNumber})\n\n    # Immediately places a withdrawal for a given currency, with no email confirmation. In order to use this method, the withdrawal privilege must be enabled for your API key. Required POST parameters are \"currency\", \"amount\", and \"address\". Sample output: {\"response\":\"Withdrew 2398 NXT.\"}\n    # Inputs:\n    # currency      The currency to withdraw\n    # amount        The amount of this coin to withdraw\n    # address       The withdrawal address\n    # Outputs:\n    # response      Text containing message about the withdrawal\n    def withdraw(self, currency, amount, address):\n        return self.api_query('withdraw', {\"currency\": currency, \"amount\": amount, \"address\": address})\n~~~~",
      "json_metadata": "{\"tags\":[\"kr\",\"poloniex\",\"hts\"],\"image\":[\"https://steemitimages.com/DQmdFPipZpXyCoV34bFpg5HxoLE4j1gwX1mvCmiGq51Ke4z/image.png\"],\"links\":[\"https://poloniex.com/support/api/\",\"https://pastebin.com/fbkheaRb\",\"https://github.com/Syriven/poloniex-holdings-tracker\",\"https://wikidocs.net/53\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}"
    }
  ]
}
steemcreated a new account: @axiomier
2017/05/20 14:42:30
fee1.000 STEEM
delegation301000.000000 VESTS
creatorsteem
new account nameaxiomier
owner{"weight_threshold":1,"account_auths":[],"key_auths":[["STM4zVi3Xf4UrhgrYfv6JFtoJt7NiepUT36ofnB1A4NKC2mDPN5SF",1]]}
active{"weight_threshold":1,"account_auths":[],"key_auths":[["STM8eJSfu1FqEhcQLed55WudwweAGQxy1znTnMivP7P3EG3XSLpEZ",1]]}
posting{"weight_threshold":1,"account_auths":[],"key_auths":[["STM6q7wVzcQNQZaCgiZi9kwo1pXufDFQ7VVH6CYY657AHRGmUMZEQ",1]]}
memo keySTM5KK8KYWNwcURCKa4JKiqvsYPSqPryi8iXMHUmvZjG5JFbTYgcA
json metadata
extensions[]
Transaction InfoBlock #12096658/Trx 68a5e499e95faf9a87acdbb6e6cb0b611949957a
View Raw JSON Data
{
  "trx_id": "68a5e499e95faf9a87acdbb6e6cb0b611949957a",
  "block": 12096658,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-05-20T14:42:30",
  "op": [
    "account_create_with_delegation",
    {
      "fee": "1.000 STEEM",
      "delegation": "301000.000000 VESTS",
      "creator": "steem",
      "new_account_name": "axiomier",
      "owner": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM4zVi3Xf4UrhgrYfv6JFtoJt7NiepUT36ofnB1A4NKC2mDPN5SF",
            1
          ]
        ]
      },
      "active": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM8eJSfu1FqEhcQLed55WudwweAGQxy1znTnMivP7P3EG3XSLpEZ",
            1
          ]
        ]
      },
      "posting": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM6q7wVzcQNQZaCgiZi9kwo1pXufDFQ7VVH6CYY657AHRGmUMZEQ",
            1
          ]
        ]
      },
      "memo_key": "STM5KK8KYWNwcURCKa4JKiqvsYPSqPryi8iXMHUmvZjG5JFbTYgcA",
      "json_metadata": "",
      "extensions": []
    }
  ]
}

Account Metadata

POSTING JSON METADATA
None
JSON METADATA
None
{
  "posting_json_metadata": {},
  "json_metadata": {}
}

Auth Keys

Owner
Single Signature
Public Keys
STM4zVi3Xf4UrhgrYfv6JFtoJt7NiepUT36ofnB1A4NKC2mDPN5SF1/1
Active
Single Signature
Public Keys
STM8eJSfu1FqEhcQLed55WudwweAGQxy1znTnMivP7P3EG3XSLpEZ1/1
Posting
Single Signature
Public Keys
STM6q7wVzcQNQZaCgiZi9kwo1pXufDFQ7VVH6CYY657AHRGmUMZEQ1/1
Memo
STM5KK8KYWNwcURCKa4JKiqvsYPSqPryi8iXMHUmvZjG5JFbTYgcA
{
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM4zVi3Xf4UrhgrYfv6JFtoJt7NiepUT36ofnB1A4NKC2mDPN5SF",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8eJSfu1FqEhcQLed55WudwweAGQxy1znTnMivP7P3EG3XSLpEZ",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6q7wVzcQNQZaCgiZi9kwo1pXufDFQ7VVH6CYY657AHRGmUMZEQ",
        1
      ]
    ]
  },
  "memo": "STM5KK8KYWNwcURCKa4JKiqvsYPSqPryi8iXMHUmvZjG5JFbTYgcA"
}

Witness Votes

0 / 30
No active witness votes.
[]