Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/perl -w
- # Autor: Dawid Mocek <dawid.mocek@gmail.com>
- # Day-trader.pl Simple IRC Bot
- # Version 2012-10
- use warnings;
- use strict;
- #use Data::Dumper;
- use POE qw(Component::Schedule Component::IRC Component::IRC::Plugin::BotCommand Component::IRC::Plugin::Connector);
- #use LWP::Simple;
- #use XML::Simple;
- use DBI;
- use DateTime;
- use DateTime::Set;
- use IRC::Utils qw(PINK NORMAL RED BROWN ORANGE TEAL YELLOW BLUE LIGHT_CYAN LIGHT_GREEN PURPLE LIGHT_BLUE);
- #my $pid = $$;
- #open my $fd, '>', "/home/dawid/irbcot/traderbot.pid" or die $!;
- #print $fd $pid;
- #close $pid or die $!;
- my $sqlu = "";
- my $sqlpass = "";
- my $sqldb = "";
- my $sqlquotetable = "market_data";
- my $debuglogfile = "TraderBot.debug.txt";
- my $nickpass = "";
- my $dbh = DBI->connect('DBI:mysql:' . $sqldb, $sqlu, $sqlpass);
- $dbh->{mysql_auto_reconnect} = 1;
- my $stmttop10vol = $dbh->prepare("SELECT ticker, volume FROM " . $sqlquotetable ." order by volume desc limit 10");
- my $stmttickerinfo = $dbh->prepare("SELECT * FROM " . $sqlquotetable ." WHERE ticker = ?");
- my $stmtearnings = $dbh->prepare("SELECT GROUP_CONCAT(earnings_whispers.ticker SEPARATOR ', ') as tickers FROM earnings_whispers LEFT JOIN market_data ON market_data.ticker = earnings_whispers.ticker WHERE DATE(earnings_whispers.earn_time) = CURDATE() AND stage = ? ORDER BY market_data.avgdailyvolume DESC");
- my $stmttop10gainers = $dbh->prepare("SELECT ticker,perchange FROM ". $sqlquotetable. " WHERE volume >= ? ORDER BY perchange DESC LIMIT 10");
- my $stmttop10losers = $dbh->prepare("SELECT ticker,perchange FROM ". $sqlquotetable. " WHERE volume >= ? ORDER BY perchange ASC LIMIT 10");
- my $stmtbyspreadasc = $dbh->prepare("SELECT ticker FROM ".$sqlquotetable." WHERE volume >= ? ORDER BY spread ASC LIMIT 25");
- my $stmtbyspreaddesc = $dbh->prepare("SELECT ticker FROM ".$sqlquotetable." WHERE volume >= ? ORDER BY spread DESC LIMIT 25");
- my $stmtevents = $dbh->prepare("SELECT wiadomosc FROM irc_events WHERE czas = ?");
- my $stmttradehalts = $dbh->prepare("SELECT issue_symbol, halt_datetime, reason_code, pause_price, res_date, res_trade_time FROM trade_halts limit 25");
- my $stmtlatestipo = $dbh->prepare("SELECT data, ticker, exchange, companyname FROM symbols_update WHERE action='added' ORDER BY id DESC LIMIT 10");
- my $stmtdivs = $dbh->prepare("SELECT GROUP_CONCAT(ticker SEPARATOR ', ') FROM thestreetdivs WHERE exdate = CURDATE()");
- my ($irc) = POE::Component::IRC->spawn();
- my $poe_session = POE::Session->create(
- inline_states => {
- _start => \&bot_start,
- irc_001 => \&irc_001,
- irc_255 => \&irc_255,
- irc_notice => \&irc_notice,
- irc_msg => \&on_msg,
- irc_public => \&irc_public,
- # _default => \&handle_default,
- irc_botcmd_tickerinfo => \&irc_botcmd_tickerinfo,
- irc_botcmd_earnings => \&irc_botcmd_earnings,
- irc_botcmd_top10 => \&irc_botcmd_top10,
- irc_botcmd_slap => \&irc_botcmd_slap,
- irc_botcmd_top10vol => \&irc_botcmd_top10vol,
- irc_botcmd_tradehalts => \&irc_botcmd_tradehalts,
- irc_botcmd_latestipo => \&irc_botcmd_latestipo,
- irc_botcmd_divs => \&irc_botcmd_divs,
- tick => \&tick,
- },
- );
- sub bot_start {
- my($kernel, $heap) = @_[KERNEL, HEAP];
- $heap->{sched} = POE::Component::Schedule->add(
- $_[SESSION],
- tick => DateTime::Set->from_recurrence(
- after => DateTime->now,
- #before => DateTime->now->add(seconds => 60),
- recurrence => sub {
- return $_[0]->truncate(to => 'second')->add( seconds => 1 )
- },
- ),
- );
- $kernel->delay('tick', 10);
- $heap->{connector} = POE::Component::IRC::Plugin::Connector->new();
- $irc->plugin_add('Connector' => $heap->{connector});
- $irc->plugin_add('BotCommand', POE::Component::IRC::Plugin::BotCommand->new(
- Commands => {
- slap => 'Takes one argument: a nickname to slap.',
- tickerinfo => 'Takes one argument: symbol.',
- earnings => 'Takes one argument: bmo or amc. bmo = before market open, amc = after market close.',
- top10 => 'Takes two arguments: first, minimum current volume; second gainers or losers.',
- top10vol => 'Top ten volume',
- tradehalts => 'Trade halts.',
- latestipo => '10 latest IPO.',
- divs => 'List of dividends for today.',
- },
- In_channnels => 0,
- In_private => 1,
- Ignore_unknow => 1,
- Method => 'privmsg',
- ));
- $irc->yield(register => "all");
- $irc->yield(
- connect => {
- Nick => "nina",
- Username => "ninabot",
- Ircname => "Nina the Trader Bot",
- Server => "irc.pirc.pl",
- # Server => "212.106.159.129",
- Port => 6667,
- Flood => 0,
- # Bitmode => 2,
- NoDNS => 1,
- # Raw => 0,
- }
- );
- $kernel->delay('lag_o_meter' => 60);
- return;
- }
- sub irc_001 {
- my($kernel, $sender) = @_[KERNEL, SENDER];
- }
- sub irc_255 {
- $_[KERNEL]->post($irc => join => "#day-trader.pl");
- $_[KERNEL]->post($irc => 'mode' => "nina" => "+B+i");
- # $_[KERNEL]->post($irc => join => "#exchange");
- }
- sub irc_notice {
- my $msg = $_[ARG2];
- if($msg =~ m!/msg.*(NickServ).*(IDENTIFY)!i) {
- $_[KERNEL]->post($irc => privmsg => $1, "$2 $nickpass");
- }
- }
- sub irc_public {
- my $kernel = $_[KERNEL];
- my $nick = (split /!/, $_[ARG0])[0];
- my $channel = $_[ARG1]->[0];
- my $msg = $_[ARG2];
- if($msg =~ /^!killnina/i) {
- exit 0;
- }
- if($msg =~ /where\s+long|where\s+short/i) {
- $kernel->post($irc => privmsg => $channel, "$nick, honey its time to use your brain.... or F13 button ;-)");
- }
- if($msg =~ /szmata|szmato|dziwko|dziwka|piczka/i) {
- $kernel->post($irc => privmsg => $channel, "$nick: foch.");
- }
- if($msg =~ /ladnie\s+wyglada|ladny\s+long|ladny\s+short|\s+nice long/i) {
- $kernel->post($irc => privmsg => $channel, "$nick: my tits re still better :-)");
- }
- if($msg =~ /payout\s+([0-9]{2})%/i) {
- my $payout = $1;
- if(sprintf("%i", $payout) <= 95) {
- $kernel->post($irc => privmsg => $channel, "$nick, payout $payout% ? what a loser!");
- }
- else {
- $kernel->post($irc => privmsg => $channel, "$nick, u ve $payout% payout? Will u mary me ?");
- }
- }
- }
- sub on_msg {
- my($kernel, $who, $where, $msg) = @_[KERNEL, ARG0, ARG1, ARG2];
- my $nick = ( split /!/, $who )[0];
- }
- sub irc_botcmd_slap {
- my $nick = (split /!/, $_[ARG0])[0];
- my ($where, $arg) = @_[ARG1, ARG2];
- $irc->yield(ctcp => $where, "ACTION slaps $arg");
- return;
- }
- sub irc_botcmd_tickerinfo {
- my $nick = (split /!/, $_[ARG0])[0];
- my ($where, $arg) = @_[ARG1, ARG2];
- if($arg =~ /^([a-z]{1,6})$/i) {
- $stmttickerinfo->execute($1);
- my $res = $stmttickerinfo->fetchrow_hashref;
- delete($res->{id});
- foreach my $f ( keys(%$res) ) {
- $irc->yield(privmsg => $nick, uc($f) .": ". $res->{$f} );
- }
- }
- }
- sub irc_botcmd_earnings {
- my $nick = (split /!/, $_[ARG0])[0];
- my ($where, $arg) = @_[ARG1, ARG2];
- if($arg =~ /^(bmo|amc)$/i) {
- $stmtearnings->execute(uc($1));
- my $res = $stmtearnings->fetchrow_hashref;
- $irc->yield(privmsg => $nick, $res->{tickers} );
- }
- }
- sub irc_botcmd_top10 {
- my $nick = (split /!/, $_[ARG0])[0];
- my ($where, $arg) = @_[ARG1, ARG2];
- if($arg =~ /^([^0][0-9]{2,12})\s+(gainers|losers)$/i) {
- my $volume = $1;
- my $userside = $2;
- if($userside =~ /^gainers$/) {
- $stmttop10gainers->execute($volume);
- while( my @row = $stmttop10gainers->fetchrow_array) {
- $irc->yield(privmsg => $nick, $row[0] . " " .$row[1] . "%");
- }
- }
- if($userside =~ /^losers$/) {
- $stmttop10losers->execute($volume);
- while( my @row = $stmttop10losers->fetchrow_array) {
- $irc->yield(privmsg => $nick, $row[0] . " " .$row[1] . "%");
- }
- }
- }
- }
- sub irc_botcmd_top10vol {
- my $nick = (split /!/, $_[ARG0])[0];
- my ($where, $arg) = @_[ARG1, ARG2];
- $stmttop10vol->execute;
- while( my @row = $stmttop10vol->fetchrow_array) {
- $irc->yield(privmsg => $nick, $row[0] . " " .$row[1]);
- }
- }
- sub irc_botcmd_byspread {
- my $nick = (split /!/, $_[ARG0])[0];
- my ($where, $arg) = @_[ARG1, ARG2];
- if($arg =~ /^([^0][0-9]{2,12})\s+(asc|desc)$/i) {
- my $side = $2;
- if($side =~ /^asc$/) {}
- if($side =~ /^desc$/) {}
- }
- }
- sub irc_botcmd_tradehalts {
- my $nick = (split /!/, $_[ARG0])[0];
- my ($where, $arg) = @_[ARG1, ARG2];
- $stmttradehalts->execute();
- $irc->yield(privmsg => $nick, PINK."Symbol".ORANGE." Halt date ". BROWN ." Reason". TEAL." Pause price" . ORANGE ." Resume date");
- while( my @row = $stmttradehalts->fetchrow_array) {
- $irc->yield(privmsg => $nick, PINK . addspaces($row[0],6) ." ".ORANGE. $row[1] ." ".BROWN . addspaces($row[2],6) . " ".TEAL . addspaces($row[3],10)." ". ORANGE ." ".$row[4] . " ". $row[5]);
- }
- }
- sub irc_botcmd_latestipo {
- my $nick = (split /!/, $_[ARG0])[0];
- my ($where, $arg) = @_[ARG1, ARG2];
- $stmtlatestipo->execute();
- $irc->yield(privmsg => $nick, ORANGE."Added date ".PINK."Symbol ".LIGHT_CYAN."Market ".LIGHT_GREEN."Name");
- while( my @row = $stmtlatestipo->fetchrow_array) {
- $irc->yield(privmsg => $nick, ORANGE.$row[0]." ".PINK.$row[1] ." ".LIGHT_CYAN.$row[2]." ".LIGHT_GREEN.$row[3]);
- }
- }
- sub irc_botcmd_divs {
- my $nick = (split /!/, $_[ARG0])[0];
- my ($where, $arg) = @_[ARG1, ARG2];
- $stmtdivs->execute();
- my $row = $stmtdivs->fetchrow_array;
- if(defined($row)) {
- $irc->yield(privmsg => $where, $row);
- }
- }
- sub tick {
- my($kernel, $heap) = @_[KERNEL, HEAP];
- my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime(time);
- my $date = sprintf("%4d-%02d-%02d %02d:%02d:%02d", $year+1900, $mon+1, $mday, $hour, $min, $sec);
- $stmtevents->execute($date);
- # if($stmtevents->{NUM_OF_FIELDS} > 0) {
- while(my @row = $stmtevents->fetchrow_array()) {
- $kernel->post($irc => notice => "#day-trader.pl", $row[0]);
- # }
- }
- }
- sub lag_o_meter {
- my($kernel, $heap) = @_[KERNEL, HEAP];
- $kernel->delay(lag_o_meter => 60);
- return;
- }
- sub handle_default {
- my($event, $args) = @_[ARG0 .. $#_];
- print "Unhandled $event\n";
- my $arg_number = 0;
- foreach(@$args) {
- print " ARG$arg_number = ";
- if(ref($_) eq 'ARRAY') {
- print "$_ = [", join(", ", @$_), "]\n";
- }
- else {
- print "'$_'\n";
- }
- $arg_number++;
- }
- return 0;
- }
- sub addspaces {
- my $text = $_[0];
- #if($text =~ /^0000-00-00$/){ $text = ""; }
- #if($text =~ /^00:00:00$/){ $text = ""; }
- # if($text =~ /^0\.0000$/){ $text = ""; }
- my $max_len = $_[1];
- my $cnt = $max_len - length $text;
- return sprintf("%s%".$cnt."s", $text, " ");
- }
- $poe_kernel->run();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement