Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- get '/' => sub {
- $log->info("looking for " . $basecurr . " / " . $altcurr . " OPPORTUNITIES, trade minimum: $trade_min, exchanges: @exs");
- # $log->info("trading: " . $basecurr . " / " . $altcurr . ", supported exchanges: @exs");
- $log->info("buy exchanges: @buy_exs, sell exchanges: @sell_exs");
- my $self = shift;
- $best{sell}{price} = -1;
- $best{buy}{price} = -1;
- $self->render_later;
- $show_opportunities = 0;
- my $delay_openorders = Mojo::IOLoop->delay(sub{
- my ($del, @args) = @_;
- my $delay = shift;
- # $log->info("\nargs: " . Dumper(@args) . "/args\n");
- foreach my $index (0..$#_) {
- my $host = $args[$index]->req->url->host;
- my @h = split('\.', $host);
- my $ex = $h[$#h-1];
- my $success = 0;
- my $error_msg;
- my $crit = '- CRITICAL';
- my @orders;
- my $orders_ref;
- my %orders;
- my @body = map { $_->res->body } $_[$index];
- my $body = decode_json(@body);
- # $log->info(Dumper($body));
- if ($ex eq "cryptsy") { $success = $body->{success}; $error_msg = $success?'':$body->{error} }
- if ($ex eq "kraken") { $success = ! defined($body->{error}[0])?1:0; $error_msg = $success?'':$body->{error} }
- if ($ex eq "hitbtc") { $success = ! defined($body->{code})?1:0; $error_msg = $success?'':$body->{error} }
- if ($ex eq "vircurex") { $success = ( (defined($body->{status})) && ($body->{status} == 0) )?1:0; }
- if ( $success ) {
- $crit = '';
- if ($ex eq "cryptsy") {
- # $orders_ref = defined($body->{return}[0])?$body->{return}:'-1';
- my $c = 0;
- for my $k (@{$body->{return}}) {
- # print Dumper($k);
- $orders{$c}{symbol} = $basecurr . $altcurr;
- $orders{$c}{price} = ${$k}{price};
- $orders{$c}{size} = ${$k}{quantity};
- $orders{$c}{side} = lc ${$k}{ordertype};
- $c++;
- }
- }
- if ($ex eq "kraken") {
- my $c = 0;
- # my @k = map { $_ } keys %{$body->{result}->{open}};
- my %open = %{$body->{result}->{open}};
- for my $k (keys %open) {
- # print Dumper($open{$k});
- $orders{$c}{symbol} = $open{$k}{descr}{pair};
- $orders{$c}{price} = $open{$k}{descr}{price};
- $orders{$c}{size} = $open{$k}{vol};
- $orders{$c}{side} = lc $open{$k}{descr}{type};
- $c++;
- }
- # %orders = defined($k[0])?%{$body->{result}->{open}}:('-1','1');
- }
- if ($ex eq "hitbtc") {
- # $orders_ref = defined($body->{orders}[0])?$body->{orders}:'-1';
- my $c = 0;
- for my $k (@{$body->{orders}}) {
- # print Dumper($k);
- $orders{$c}{symbol} = ${$k}{symbol};
- $orders{$c}{price} = ${$k}{orderPrice};
- $orders{$c}{size} = ${$k}{orderQuantity} * ${$exchanges}{$ex}{lotsize}{$basecurr . $altcurr};
- $orders{$c}{side} = lc ${$k}{side};
- $c++;
- }
- }
- if ($ex eq "vircurex") {
- my $no_orders = $body->{numberorders};
- for (my $no = 1; $no <= $no_orders; $no++) {
- my $orderno = 'order-' . $no;
- # print "orderno: $orderno\n";
- # print Dumper($body->{$orderno});
- $orders{$no}{symbol} = $body->{$orderno}->{currency1} . $body->{$orderno}->{currency2};
- # print "unitprice ";
- # print Dumper($body->{$orderno}->{unitprice});
- # print "\n/unitprice\n";
- $orders{$no}{price} = $body->{$orderno}->{unitprice};
- # print "/orderno: $orderno\n";
- $orders{$no}{size} = $body->{$orderno}->{quantity};
- $orders{$no}{side} = lc $body->{$orderno}->{ordertype};
- }
- }
- } else {
- $crit .= ", error: $error_msg";
- }
- %{$openorders{$ex}} = %orders; # map { $_ => $orders{$_} } keys %orders;
- $log->info("----------------------------------------- OPEN ORDERS - $ex $crit - -----------------------------------------");
- for my $k (keys %{$openorders{$ex}} ) {
- $log->info($openorders{$ex}{$k}{side} . "|" . $openorders{$ex}{$k}{size} . " " . $openorders{$ex}{$k}{symbol} . " for " . $openorders{$ex}{$k}{price});
- }
- }
- $openorders_read = 1;
- });
- my @openorders_exs = ( "cryptsy", "hitbtc", "vircurex") ;
- # my @openorders_exs = ( "vircurex" ) ;
- foreach my $ex (@openorders_exs) {
- my $request_data = $self->get_openorders($ex, $basecurr, $altcurr, $log);
- my $url = "$request_data->{url}";
- my $type = lc $request_data->{type};
- my $header = $request_data->{header};
- my $content = $request_data->{content};
- $log->debug("url, type, content: $url, $type, $content");
- $log->debug("header " . Dumper($header) . "/header");
- $self->ua->$type($url => $header => $content => $delay_openorders->begin);
- }
- my $delay_getbalances = Mojo::IOLoop->delay(sub{
- my ($del, @args) = @_;
- my $delay = shift;
- # $log->info("\nargs: " . Dumper(@args) . "/args\n");
- foreach my $index (0..$#_) {
- my $host = $args[$index]->req->url->host;
- my @h = split('\.', $host);
- my $ex = $h[$#h-1];
- my $success = 0;
- my $error_msg;
- my $crit = '- CRITICAL';
- my @orders;
- my $orders_ref;
- my %orders;
- my @body = map { $_->res->body } $_[$index];
- my $body = decode_json(@body);
- # $log->info(Dumper($body));
- if ($ex eq "cryptsy") { $success = $body->{success}; $error_msg = $success?'':$body->{error} }
- if ($ex eq "kraken") { $success = ! defined($body->{error}[0])?1:0; $error_msg = $success?'':$body->{error} }
- if ($ex eq "hitbtc") { $success = ! defined($body->{code})?1:0; $error_msg = $success?'':$body->{error} }
- if ($ex eq "vircurex") { $success = ( (defined($body->{status})) && ($body->{status} == 0) )?1:0; }
- if ( $success ) {
- $crit = '';
- if ($ex eq "cryptsy") {
- for my $cur (keys %{$body->{return}->{balances_available}}) {
- $balances{$ex}{$cur} = $body->{return}{balances_available}{$cur};
- }
- }
- # if ($ex eq "kraken") {
- # my $c = 0;
- # # my @k = map { $_ } keys %{$body->{result}->{open}};
- # my %open = %{$body->{result}->{open}};
- # for my $k (keys %open) {
- # # print Dumper($open{$k});
- # $orders{$c}{symbol} = $open{$k}{descr}{pair};
- # $orders{$c}{price} = $open{$k}{descr}{price};
- # $orders{$c}{size} = $open{$k}{vol};
- # $orders{$c}{side} = lc $open{$k}{descr}{type};
- # $c++;
- # }
- # # %orders = defined($k[0])?%{$body->{result}->{open}}:('-1','1');
- # }
- # if ($ex eq "hitbtc") {
- # # $orders_ref = defined($body->{orders}[0])?$body->{orders}:'-1';
- # my $c = 0;
- # for my $k (@{$body->{orders}}) {
- # # print Dumper($k);
- # $orders{$c}{symbol} = ${$k}{symbol};
- # $orders{$c}{price} = ${$k}{orderPrice};
- # $orders{$c}{size} = ${$k}{orderQuantity} * ${$exchanges}{$ex}{lotsize}{$basecurr . $altcurr};
- # $orders{$c}{side} = lc ${$k}{side};
- # $c++;
- # }
- # }
- if ($ex eq "vircurex") {
- for my $cur (keys %{$body->{balances}}) {
- $balances{$ex}{$cur} = $body->{balances}{$cur}{availablebalance};
- }
- }
- } else {
- $crit .= ", error: $error_msg";
- }
- $log->info("----------------------------------------- BALANCES - $ex $crit -----------------------------------------");
- my $logline;
- for my $cur (keys %{$balances{$ex}} ) {
- if ( ($cur eq "$basecurr") || ($cur eq "$altcurr") ) {
- $logline .= "$cur $balances{$ex}{$cur}|";
- }
- }
- $log->info($logline);
- # print "finishing get_balances\n";
- # $e = $e->emit('get_balances');
- $balances_read = 1;
- }
- });
- # $delay_getbalances->on(finish => sub {
- # });
- # my @getbalances_exs = @trade_exs;
- my @getbalances_exs = ( "cryptsy", "vircurex" ) ;
- foreach my $ex (@getbalances_exs) {
- my $request_data = $self->get_balances($ex, $log);
- my $url = "$request_data->{url}";
- my $type = lc $request_data->{type};
- my $header = $request_data->{header};
- my $content = $request_data->{content};
- $log->debug("url, type, content: $url, $type, $content");
- $log->debug("header " . Dumper($header) . "/header");
- $self->ua->$type($url => $header => $content => $delay_getbalances->begin);
- }
- my $delay_orderbooks = Mojo::IOLoop->delay(sub{
- my ($del, @args) = @_;
- my $delay = shift;
- foreach my $index (0..$#_) {
- @asks = ();
- @bids = ();
- my $host = $args[$index]->req->url->host;
- my @h = split('\.', $host);
- # $log->debug("$index: $host");
- my $remote_path = $args[$index]->req->url->path;
- my @map = map { $_->res->body } $_[$index];
- my $ex = $h[$#h-1];
- $log->debug("---------------------------- $ex -----------------------------");
- # $log->debug(Dumper($_[$index]));
- if ($map[0] ne "") {
- my $map_plain = decode_json(@map);
- if ($ex eq "hitbtc") { @asks = $map_plain->{asks}; @bids = $map_plain->{bids}; }
- if ($ex eq "btc-e") { @asks = $map_plain->{asks}; @bids = $map_plain->{bids}; }
- if ($ex eq "crypto-trade") { @asks = $map_plain->{asks}; @bids = $map_plain->{bids}; #print Dumper($map_plain);
- }
- if ($ex eq "bter") {
- @asks = $map_plain->{asks}; @bids = $map_plain->{bids};
- }
- if ($ex eq "kraken") {
- my $CURR;
- my $invert = ${$exchanges}{$ex}{inverted}{$basecurr . $altcurr};
- if ( defined($invert) ) {
- $CURR = $invert;
- @asks = $map_plain->{result}->{$CURR}->{bids};
- foreach my $i (keys $asks[0]) { $asks[0][$i][0] = sprintf("%0.8f", 1 / $asks[0][$i][0]); }
- @bids = $map_plain->{result}->{$CURR}->{asks};
- foreach my $i (keys $bids[0]) { $bids[0][$i][0] = sprintf("%0.8f", 1 / $bids[0][$i][0]); }
- } else {
- $CURR = "X" . $basecurr . "Z" . $altcurr;
- @asks = $map_plain->{result}->{$CURR}->{asks};
- @bids = $map_plain->{result}->{$CURR}->{bids};
- }
- }
- if ($ex eq "vircurex") { @asks = $map_plain->{"asks"}; @bids = $map_plain->{"bids"}; }
- if ($ex eq "cryptsy") {
- my @asks_ = $map_plain->{return}->{$basecurr}->{sellorders};
- my @bids_ = $map_plain->{return}->{$basecurr}->{buyorders};
- if (defined($asks_[0])) {
- foreach my $k (keys $asks_[0]) {
- $asks[0][$k][0] = $asks_[0][$k]{price};
- $asks[0][$k][1] = $asks_[0][$k]{quantity};
- }
- }
- if (defined($bids_[0]) ) {
- foreach my $k (keys $bids_[0]) {
- $bids[0][$k][0] = $bids_[0][$k]{price};
- $bids[0][$k][1] = $bids_[0][$k]{quantity};
- }
- }
- }
- if ( ! defined($bids[0][0][0]) ) { $bids[0][0][0] = 0; $bids[0][1][0] = 0; $bids[0][2][0] = 0; $bids[0][3][0] = 0; $bids[0][4][0] = 0; $bids[0][0][1] = 0; $bids[0][1][1] = 0; $bids[0][2][1] = 0; $bids[0][3][1] = 0; $bids[0][4][1] = 0; }
- if ( ! defined($asks[0][0][0]) ) { $asks[0][0][0] = 99999999; $asks[0][1][0] = 99999999; $asks[0][2][0] = 99999999; $asks[0][3][0] = 99999999; $asks[0][4][0] = 99999999; $asks[0][0][0]; $asks[0][0][1] = 99999999; $asks[0][1][1] = 99999999; $asks[0][2][1] = 99999999; $asks[0][3][1] = 99999999; $asks[0][4][1] = 99999999;}
- $orderbooks{$ex}{'bids'} = $bids[0];
- $orderbooks{$ex}{'asks'} = $asks[0];
- my $logline;
- $logline = "we BUY|";
- my $asks_no;
- if ( @{$asks[0]} > 2 ) { $asks_no = 2 } else { $asks_no = @{$asks[0]} - 1 }
- foreach my $index (0..$asks_no) {
- $logline .= "$asks[0][$index][0] ($asks[0][$index][1])|";
- }
- $log->debug($logline);
- $logline = "we SELL|";
- my $bids_no;
- if ( @{$bids[0]} > 2 ) { $bids_no = 2 } else { $bids_no = @{$bids[0]} - 1 }
- foreach my $index (0..$bids_no) {
- $logline .= "$bids[0][$index][0] ($bids[0][$index][1])|";
- }
- $log->debug($logline);
- }
- }
- check_bids_asks;
- $orderbooks_read = 1;
- });
- # $e->on(orderbooks_done => sub {
- # });
- my $delay_createorder = Mojo::IOLoop->delay(sub{
- my ($del, @args) = @_;
- my $delay = shift;
- # $log->info("\nargs: " . Dumper(@args) . "/args\n");
- print "\nIN CREATEORDER DELAY\n";
- foreach my $index (0..$#_) {
- my $host = $args[$index]->req->url->host;
- my @h = split('\.', $host);
- my $ex = $h[$#h-1];
- my $success = 0;
- my $error_msg;
- my $crit = '- CRITICAL';
- my @orders;
- my $orders_ref;
- calc_prices;
- display_trade_info;
- run_pretrade_checks;
- if ( ($pretrade_checks{size} eq "GO") && ($pretrade_checks{profit} eq "GO") ) {
- if ( ($pretrade_checks{buy_exchange} eq "GO") && ($pretrade_checks{sell_exchange} eq "GO") ) {
- my $result = $self->create_order($best{buy}{exchange}, "Buy", $trade{size}, $basecurr, $altcurr, $best{buy}{price}, $log);
- $log->debug(Dumper($result));
- if ( (defined($result->{code})) && ($result->{code} == 0) ) {
- $log->info("CREATE ORDER - SUCCESS (" . $result->{traded_size} . " traded)");
- $log->info("CREATE ORDER - trading contra...");
- my $result = $self->create_order($best{sell}{exchange}, "sell", $trade{size}, $basecurr, $altcurr, $best{sell}{price});
- $log->debug(Dumper($result));
- if ($result->{code} == 0) {
- $log->info("CREATE ORDER - SUCCESS (" . $result->{traded_size} . " traded)");
- } else {
- $log->info("CREATE ORDER - CRITICAL: " . $result->{text});
- }
- } else {
- $log->info("CREATE ORDER - CRITICAL: " . $result->{text});
- }
- }
- }
- }
- # $log->info("TESTING");
- # # my @test_ex = ( "cryptsy", "vircurex", "hitbtc", "kraken" );
- # my @test_ex = ( "kraken" );
- # for my $ex (@test_ex) {
- # my $result = $self->create_order($ex, "sell", "1", $basecurr, $altcurr, 0.025, $log);
- # # print Dumper($result);
- # # my $result = $self->create_order("cryptsy", "buy", "0.01", $basecurr, $altcurr, "0.2222");
- # if ( (defined($result->{code})) && ($result->{code} == 0) ) {
- # $log->info(" - SUCCESS (" . $result->{traded_size} . " traded");
- # # my $result = $self->create_order("cryptsy", "sell", "0.01", $basecurr, $altcurr, "0.0220");
- # # if ($result->{code} == 0) {
- # # print " - SUCCESS (" . $result->{traded_size} . " traded)\n";
- # # } else {
- # # print " - CRITICAL: " . $result->{text} . "\n";
- # # }
- # } else {
- # $log->info(" - CRITICAL: " . $result->{text});
- # }
- # # $self->get_openorders("hitbtc");
- # }
- # $log->info("/TESTING");
- });
- # print "\ndelay_getbalances: " . Dumper($delay_getbalances) . "/delay_getbalances\n";
- $delay_createorder->wait;
- # $delay_createorder->steps(sub { say 'BOOM!' }) if $balances_read == 1;
- foreach my $ex (@exs) {
- my $url;
- my $marketid;
- my ($basec, $altc);
- $basec = $basecurr;
- $altc = $altcurr;
- undef $inverted;
- $inverted = ${$exchanges}{$ex}{inverted}{$basec . $altc};
- if ( defined($inverted) ) {
- $basec = $altcurr;
- $altc = $basecurr;
- }
- my $method1 = ${$exchanges}{$ex}{orderbook}{method};
- $method1 =~ s/\{BASECURR\}/$basec/g;
- $method1 =~ s/\{ALTCURR\}/$altc/g;
- my $method2 = ${$exchanges}{$ex}{orderbook}{method2};
- $method2 =~ s/\{BASECURR\}/$basec/g;
- $method2 =~ s/\{ALTCURR\}/$altc/g;
- my $params = ${$exchanges}{$ex}{orderbook}{params};
- $params =~ s/\{BASECURR\}/$basec/g;
- $params =~ s/\{ALTCURR\}/$altc/g;
- if ( $ex eq "cryptsy" ) {
- $marketid = ${$exchanges}{$ex}{markets}{$basec . $altc};
- $method1 =~ s/\{MARKETID\}/$marketid/g;
- $method2 =~ s/\{MARKETID\}/$marketid/g;
- }
- # print "method1/method2: $method1 / $method2 \n";
- $url = ${$exchanges}{$ex}{http} . "://" . ${$exchanges}{$ex}{host} . "/" . ${$exchanges}{$ex}{uripath} . $method1 . $method2 . $params;
- if ( ( $ex eq "btc-e" ) || ( $ex eq "crypto-trade") || ( $ex eq "bter") ) {$url = lc $url}
- $log->debug("url: $url");
- $self->ua->get( $url => $delay_orderbooks->begin);
- }
- # $delay_createorder->wait unless $delay_getbalances->ioloop->is_running;
- # $delay_createorder->begin;
- #( ($openorders_done == 0) && ($balances_done == 0) );
- # sleep 5;
- # $delay->on(finish => sub {
- # foreach my $ex (@exs) {
- # find_best_buy_sell($ex);
- # }
- # });
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement