01BTC10 (OP)
VIP
Hero Member
Offline
Activity: 756
Merit: 503
|
|
June 17, 2013, 06:36:01 AM |
|
I paid for this bot but I'm giving it to the community for free. You need to have some amount of currency in all 3 currencies (USD/LTC/BTC) to use it. Then as you run it, your USD/LTC balance will decrement and your BTC balance will increment. <?php
// Trade API settings $key = ''; // your API-key $secret = ''; // your Secret-key
// Limits for trading size (BTC) // Setting the increment too small will have a negative effect on speed $min_amount = 0.1; $max_amount = 0.6; $increment = 0.02;
// Minimum profit in percent // Must be higher than BTC-E fee * 3 to be profitable $min_profit = 1.0;
// Margin of price // Trades will be executed this much higher/lower to make "sure" they go through // 1.05 = 5 % and so on $price_margin = 1.05;
// Delay between requests (ms), check with BTC-E how high value they allow // setting this too high could cause BTC-E to potentially block the bot. $delay = 100;
// Specify a minimum time between 2 trades (s). Whenever an inbalance between prices exists // we want to quickly execute the FIRST trade, but let other arbitrage bots (with bigger balances) // clean up the rest. Otherwise there seems to be big risk for losing trades. $time_between_trades = 10; $last_trade_time = 0;
// Required for BTC-E API $mt = explode(' ', microtime()); $nonce = $mt[1];
// http://pastebin.com/QyjS3U9M function btce_query($method, array $req = array()) { global $key, $secret, $nonce;
$req['method'] = $method; $req['nonce'] = $nonce++;
// generate the POST data string $post_data = http_build_query($req, '', '&');
$sign = hash_hmac("sha512", $post_data, $secret);
// generate the extra headers $headers = array( 'Sign: '.$sign, 'Key: '.$key, );
// our curl handle (initialize if required) static $ch = null; if (is_null($ch)) { $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; BTC-E PHP client; '.php_uname('s').'; PHP/'.phpversion().')'); } curl_setopt($ch, CURLOPT_URL, 'https://btc-e.com/tapi/'); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
// run the query $res = curl_exec($ch); if ($res === false) exit('Trade API error: Connection error: ' . curl_error($ch));
$dec = json_decode($res, true); if (!$dec) exit('Trade API error: Invalid JSON.');
return $dec; }
function perform_trade($trade, $show_balance) { global $last_trade_time;
$last_trade_time = time();
$reply = btce_query('Trade', $trade);
if ($reply['success'] != 1) exit('Trade error: ' . $reply['error']);
if ($show_balance) print_balance($reply); }
function print_balance($response = false) { if (!$response) $response = btce_query('getInfo');
$str = "";
foreach ($response['return']['funds'] as $key => $val) { if ($val > 0) { if (strlen($str) > 0) $str .= ",";
$str .= " " . $val . " " . strtoupper($key); } }
echo date("H:i:s") . ' Balance:' . $str . "\n"; }
// Fetch order book for a given currency pair function order_book($pair) { $orders = file_get_contents('https://btc-e.com/api/2/' . $pair . '/depth');
if ($orders === false) exit('Public API error: Connection error.');
$dec = json_decode($orders); if (!$dec) echo date("H:i:s") . " ERROR: Unable to fetch order book for " . $pair . ".\n";
return $dec; }
// Return how big volume we can get with the given amount function ask_volume($orders, $amount) { $vol = 0; $value = 0;
for ($i = 0; $i < count($orders->asks) && $value < $amount; $i++) { $this_value = min($orders->asks[$i][0] * $orders->asks[$i][1], $amount - $value); $this_vol = $this_value / $orders->asks[$i][0];
$value += $this_value; $vol += $this_vol; }
return $vol; }
function bid_volume($orders, $amount) { $vol = 0; $value = 0;
for ($i = 0; $i < count($orders->bids) && $value < $amount; $i++) { $this_value = min($orders->bids[$i][1], $amount - $value); $this_vol = $this_value * $orders->bids[$i][0];
$value += $this_value; $vol += $this_vol; }
return $vol; }
function best_bid($orders) { return $orders->bids[0][0]; }
function best_ask($orders) { return $orders->asks[0][0]; }
// The main function of the program function main_loop() { global $min_amount, $max_amount, $increment, $min_profit, $delay, $price_margin, $time_between_trades, $last_trade_time;
// Print some starting information echo "BTC-E Arbitrage Bot v0.1 (CTRL+C to exit)\n"; echo "Trade amount (min/increment/max): " . $min_amount . " / " . $increment . " / " . $max_amount . "\n"; echo "Minimum profit: " . $min_profit . " %\n"; echo "Price margin: " . $price_margin . "\n"; echo "Delay between checks: " . $delay . " ms\n"; echo "Min time between trades: " . $time_between_trades . " s\n";
print_balance();
// Loop indefinitely (press CTRL+C to exit) while (true) { // Fetch order books for all currency pairs $btc_usd_orders = order_book('btc_usd'); $ltc_btc_orders = order_book('ltc_btc'); $ltc_usd_orders = order_book('ltc_usd');
// Proceed if we have orders for all pairs if ($btc_usd_orders && $ltc_btc_orders && $ltc_usd_orders) { $best_case = 0; $best_profit = 0; $best_amount = 0; $best_trades = array();
// Loop through different order sizes to find the one with most profit for ($amt = $min_amount; $amt <= $max_amount; $amt += $increment) { // Case 1: BTC -> LTC -> USD -> BTC $c1_ltc = ask_volume($ltc_btc_orders, $amt); $c1_usd = bid_volume($ltc_usd_orders, $c1_ltc); $c1_btc = ask_volume($btc_usd_orders, $c1_usd);
$c1_profit = $c1_btc - $amt; $c1_profit_percent = ($c1_profit * 100) / $amt;
if ($c1_profit > $best_profit && $c1_profit_percent > $min_profit) { $best_case = 1; $best_profit = $c1_profit; $best_amount = $amt; $best_trades = array ( array('pair' => 'ltc_btc', 'type' => 'buy', 'amount' => round($c1_ltc, 6), 'rate' => round(best_ask($ltc_btc_orders) * $price_margin, 3)), array('pair' => 'ltc_usd', 'type' => 'sell', 'amount' => round($c1_ltc, 6), 'rate' => round(best_bid($ltc_usd_orders) / $price_margin, 3)), array('pair' => 'btc_usd', 'type' => 'buy', 'amount' => round($c1_btc, 6), 'rate' => round(best_ask($btc_usd_orders) * $price_margin, 3)) ); }
// Case 2: BTC -> USD -> LTC -> BTC $c2_usd = bid_volume($btc_usd_orders, $amt); $c2_ltc = ask_volume($ltc_usd_orders, $c2_usd); $c2_btc = bid_volume($ltc_btc_orders, $c2_ltc);
$c2_profit = $c2_btc - $amt; $c2_profit_percent = ($c2_profit * 100) / $amt;
if ($c2_profit > $best_profit && $c2_profit_percent > $min_profit) { $best_case = 2; $best_profit = $c2_profit; $best_amount = $amt; $best_trades = array ( array('pair' => 'btc_usd', 'type' => 'sell', 'amount' => round($amt, 6), 'rate' => round(best_bid($btc_usd_orders) / $price_margin, 3)), array('pair' => 'ltc_usd', 'type' => 'buy', 'amount' => round($c2_ltc, 6), 'rate' => round(best_ask($ltc_usd_orders) * $price_margin, 3)), array('pair' => 'ltc_btc', 'type' => 'sell', 'amount' => round($c2_ltc, 6), 'rate' => round(best_bid($ltc_btc_orders) / $price_margin, 3)) ); } }
// Execute the trades if we found one if ($best_case > 0) { echo date("H:i:s") . ($best_case == 1 ? " LTC -> USD" : " USD -> LTC") . ", Amount " . $best_amount . ", Expected Profit " . number_format($best_profit, 4) . " (" . number_format(($best_profit * 100) / $best_amount, 2) . " %)\n";
// Check that enough time has passed from the last trade if ((time() - $last_trade_time) < $time_between_trades) { echo date("H:i:s") . " Rejected (not enough time passed from last trade.\n"; } else { perform_trade($best_trades[0], false); perform_trade($best_trades[1], false); perform_trade($best_trades[2], true); } } }
// Sleep for a bit usleep($delay * 1000); } }
// Execute the main loop function main_loop();
Credit: MadAlphaIf you enjoy this post you can send me a donation. BTC: 1DB5BC85mqwdQbJaed47tWFpmn96i1YyWn LTC: LahP2YUhSiJQaupn2AYB2iUgRSFg3n57uZ
|
|
|
|
keatonatron
Sr. Member
Offline
Activity: 308
Merit: 250
Jack of oh so many trades.
|
|
June 17, 2013, 06:46:31 AM |
|
Thanks for sharing!
|
1KEATSvAhbB7yj2baLB5xkyJSnkfqPGAqk
|
|
|
01BTC10 (OP)
VIP
Hero Member
Offline
Activity: 756
Merit: 503
|
|
June 17, 2013, 06:52:13 AM |
|
Some fine tuning need to be done like min/max amount. If you run it on a VPS with low latency then 100ms delay will get the bot a temp ban from BTC-E. Still a very nice code for those who want to learn.
|
|
|
|
snowcrashed
|
|
June 18, 2013, 03:09:22 AM |
|
Thank you for sharing. What has your experience been with this bot? Was it successful, did you see a profit? How long have you had this code? Also, I assume it does not output anything until something happens?
|
|
|
|
01BTC10 (OP)
VIP
Hero Member
Offline
Activity: 756
Merit: 503
|
|
June 18, 2013, 03:13:05 AM |
|
It does log every trade on the screen and return error message.
I did not run it for a very long time. I can't tell if it's profitable.
|
|
|
|
Factory
|
|
June 21, 2013, 06:16:22 AM |
|
It does log every trade on the screen and return error message.
I did not run it for a very long time. I can't tell if it's profitable.
Unfortunately, as with any automated system , you would need an extremely large sample size to determine the relative profitability (or lack there of.) Running it in short bursts will likely give you very skewed results based on variance. Unless you have an excellent idea of what you are doing and are willing to risk a large amount of currency to tune it (as well as deal with extended drawdowns), I would recommend staying away from such things.
|
|
|
|
btc-mike
|
|
September 04, 2013, 07:33:21 PM |
|
Anyone play with this?
I am running on my shared hosting with about 0.1BTC. It seems to make a little bit.
|
|
|
|
imrer
|
|
September 04, 2013, 11:44:20 PM |
|
Thanks for sharing this bot.
|
|
|
|
|
smitelrh
Jr. Member
Offline
Activity: 59
Merit: 10
|
|
September 14, 2013, 01:19:43 PM |
|
Thanks for share
|
|
|
|
mangox
|
|
September 17, 2013, 02:49:03 PM |
|
Thanks for sharing
|
|
|
|
Jumpy
|
|
September 17, 2013, 03:59:53 PM |
|
Would anyone be interested in posting the results of running this script for some amount of time? (I'm thinking minimum 3 days).
Notes on what kind of balancing is necessary will be helpful as well.
|
PM me if you want to advertise on this signature.
|
|
|
btc-mike
|
|
September 17, 2013, 07:48:52 PM |
|
Would anyone be interested in posting the results of running this script for some amount of time? (I'm thinking minimum 3 days).
Notes on what kind of balancing is necessary will be helpful as well.
You want me to test for 3 days and share my settings and results? NO I will share this. 1. As is, the program will time out long before 3 days. The code that pulls the books will error out. I have run it on few hosted systems and they both timed out (one lasted a lot longer). 2. You will end up blacklisted at btc-e if you hit them too hard. Open a support ticket and they can whitelist your IP.
|
|
|
|
01BTC10 (OP)
VIP
Hero Member
Offline
Activity: 756
Merit: 503
|
|
September 17, 2013, 07:52:21 PM Last edit: September 17, 2013, 11:00:32 PM by 01BTC10 |
|
It's easy to fix so it will never time-out on an error but it might give unwanted results. Like I said in my second post you need to adjust the timing so BTC-E won't ban your IP. Mine got banned temporarily a couple time before I got the settings right. It will vary depending on your connection, it wasn't the same on my home connection vs a VPS. Officialy they say once every 10 minutes but if I remember right I was able to use 300ms on my VPS and 100ms on my home connection.
|
|
|
|
btc-mike
|
|
September 17, 2013, 10:05:19 PM |
|
Agreed - not too hard to fix.
After I was white-listed, I hit them harder with no issues. You just need to ask to be white-listed.
|
|
|
|
daybyter
Legendary
Offline
Activity: 965
Merit: 1000
|
|
September 18, 2013, 08:59:43 AM |
|
100ms? That is crazy ... I never used intervals < 15s in my bots.
It might work for you now, but if all those hundreds of bots switch to such a scheme, the website is blocked ...
|
|
|
|
01BTC10 (OP)
VIP
Hero Member
Offline
Activity: 756
Merit: 503
|
|
September 18, 2013, 10:48:17 AM |
|
100ms? That is crazy ... I never used intervals < 15s in my bots.
It might work for you now, but if all those hundreds of bots switch to such a scheme, the website is blocked ...
100ms on my home connection is over 300ms in reality.
|
|
|
|
tarui
|
|
September 19, 2013, 03:24:41 PM |
|
so how do I implement this/?
|
|
|
|
01BTC10 (OP)
VIP
Hero Member
Offline
Activity: 756
Merit: 503
|
|
September 19, 2013, 04:34:48 PM |
|
so how do I implement this/?
You need PHP and curl installed then put your BTC-E API key at the appropriate place in the code.
|
|
|
|
Financisto
|
|
November 20, 2013, 04:30:03 AM |
|
Greetings!
Nice script. Thanks for sharing it.
It's been a while since BTC-e, Vircurex and Cryptsy added some more altcoins.
BTW, is it possible to add automated (triangular and 2-currency) arbitrage for altcoins pairs (LTC/BTC; NMC/BTC; PPC/BTC; XPM/BTC etc.)?
Keep up the good work!
|
|
|
|
|