Bitcoin Forum
November 02, 2024, 10:32:31 AM *
News: Latest Bitcoin Core release: 28.0 [Torrent]
 
   Home   Help Search Login Register More  
Pages: [1] 2 3 »  All
  Print  
Author Topic: [PHP| BTC-E arbitrage bot  (Read 22069 times)
01BTC10 (OP)
VIP
Hero Member
*
Offline Offline

Activity: 756
Merit: 503



View Profile
June 17, 2013, 06:36:01 AM
 #1

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.

Code:
<?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($chCURLOPT_RETURNTRANSFERtrue);
curl_setopt($chCURLOPT_USERAGENT'Mozilla/4.0 (compatible; BTC-E PHP client; '.php_uname('s').'; PHP/'.phpversion().')');
}
curl_setopt($chCURLOPT_URL'https://btc-e.com/tapi/');
curl_setopt($chCURLOPT_POSTFIELDS$post_data);
curl_setopt($chCURLOPT_HTTPHEADER$headers);
curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE);

// run the query
$res curl_exec($ch);
if ($res === false)
exit('Trade API error: Connection error: ' curl_error($ch));

$dec json_decode($restrue);
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_ltc6), 'rate' => round(best_ask($ltc_btc_orders) * $price_margin3)),
array('pair' => 'ltc_usd''type' => 'sell''amount' => round($c1_ltc6), 'rate' => round(best_bid($ltc_usd_orders) / $price_margin3)),
array('pair' => 'btc_usd''type' => 'buy''amount' => round($c1_btc6), 'rate' => round(best_ask($btc_usd_orders) * $price_margin3))
);
}

// 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($amt6), 'rate' => round(best_bid($btc_usd_orders) / $price_margin3)),
array('pair' => 'ltc_usd''type' => 'buy''amount' => round($c2_ltc6), 'rate' => round(best_ask($ltc_usd_orders) * $price_margin3)),
array('pair' => 'ltc_btc''type' => 'sell''amount' => round($c2_ltc6), 'rate' => round(best_bid($ltc_btc_orders) / $price_margin3))
);
}
}

// Execute the trades if we found one
if ($best_case 0)
{
echo date("H:i:s") . ($best_case == " LTC -> USD" " USD -> LTC") . ", Amount " $best_amount .
", Expected Profit " number_format($best_profit4) .
" (" number_format(($best_profit 100) / $best_amount2) . " %)\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: MadAlpha

If you enjoy this post you can send me a donation.

BTC: 1DB5BC85mqwdQbJaed47tWFpmn96i1YyWn
LTC: LahP2YUhSiJQaupn2AYB2iUgRSFg3n57uZ
keatonatron
Sr. Member
****
Offline Offline

Activity: 308
Merit: 250


Jack of oh so many trades.


View Profile
June 17, 2013, 06:46:31 AM
 #2

Thanks for sharing!

1KEATSvAhbB7yj2baLB5xkyJSnkfqPGAqk
01BTC10 (OP)
VIP
Hero Member
*
Offline Offline

Activity: 756
Merit: 503



View Profile
June 17, 2013, 06:52:13 AM
 #3

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
Full Member
***
Offline Offline

Activity: 294
Merit: 100



View Profile
June 18, 2013, 03:09:22 AM
 #4

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 Offline

Activity: 756
Merit: 503



View Profile
June 18, 2013, 03:13:05 AM
 #5

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
Sr. Member
****
Offline Offline

Activity: 259
Merit: 250


View Profile
June 21, 2013, 06:16:22 AM
 #6

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
Hero Member
*****
Offline Offline

Activity: 938
Merit: 1001



View Profile
September 04, 2013, 07:33:21 PM
 #7

Anyone play with this?

I am running on my shared hosting with about 0.1BTC. It seems to make a little bit.
imrer
Full Member
***
Offline Offline

Activity: 154
Merit: 100


View Profile
September 04, 2013, 11:44:20 PM
 #8

Thanks for sharing this bot.  Wink

Start your own casino site: » CoinDice | CoinWheel «
btc-mike
Hero Member
*****
Offline Offline

Activity: 938
Merit: 1001



View Profile
September 13, 2013, 05:11:58 PM
 #9

I have made another bot that checks multiple paths (based on this ->https://bitcointalk.org/index.php?topic=196313.0) but I still use this one. This one found a profitable trade path yesterday.
smitelrh
Jr. Member
*
Offline Offline

Activity: 59
Merit: 10


View Profile
September 14, 2013, 01:19:43 PM
 #10

Thanks for share Cheesy
mangox
Sr. Member
****
Offline Offline

Activity: 364
Merit: 250



View Profile
September 17, 2013, 02:49:03 PM
 #11

Thanks for sharing Smiley
Jumpy
Full Member
***
Offline Offline

Activity: 182
Merit: 100



View Profile
September 17, 2013, 03:59:53 PM
 #12

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
Hero Member
*****
Offline Offline

Activity: 938
Merit: 1001



View Profile
September 17, 2013, 07:48:52 PM
 #13

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 Offline

Activity: 756
Merit: 503



View Profile
September 17, 2013, 07:52:21 PM
Last edit: September 17, 2013, 11:00:32 PM by 01BTC10
 #14

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
Hero Member
*****
Offline Offline

Activity: 938
Merit: 1001



View Profile
September 17, 2013, 10:05:19 PM
 #15

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 Offline

Activity: 965
Merit: 1000


View Profile
September 18, 2013, 08:59:43 AM
 #16

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 Offline

Activity: 756
Merit: 503



View Profile
September 18, 2013, 10:48:17 AM
 #17

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
Sr. Member
****
Offline Offline

Activity: 294
Merit: 250


View Profile
September 19, 2013, 03:24:41 PM
 #18

so how do I implement this/?
01BTC10 (OP)
VIP
Hero Member
*
Offline Offline

Activity: 756
Merit: 503



View Profile
September 19, 2013, 04:34:48 PM
 #19

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
Hero Member
*****
Offline Offline

Activity: 640
Merit: 771

BTC⇆⚡⇄BTC


View Profile WWW
November 20, 2013, 04:30:03 AM
 #20

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!

LIST • ESCROW providers • Ranking & ScoresLIST • FOSS BrainwalletsBTC ⇆⚡⇄ BTCBTC aka BTC: 16MBvhaJoRBxW3Vk6apnvz3UYT9HAgraVS ⚡ PGP: 2680207AA9A1B69FE7A033D80DE0F221074384C4 ⚡ If you think freedom matters, please support the development of these privacy projects→DONATE some sats: TailsQubes OSWhonixVeraCryptPicocryptKryptorSimpleX Chat
Pages: [1] 2 3 »  All
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.19 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!