Это клон MD ПРОДАВЦА в Perl / Tk.
У меня нет какой-либо торговой функциональности, реализуемой как еще, потому что у меня не хватает биткойны на депозит для MtGox.
Так что если вы хотите, чтобы я продолжать развиваться вышлите мне Bitcoins, пока не достигнет 1 BTC по адресу, указанному ниже. Или вы могли бы просто реализовать его самостоятельно, что должно быть легко, если вы знаете, Perl.
Если у вас есть окна, которые нужны ActivePerl первого, и, возможно, установить некоторые пакеты с помощью менеджера пакетов, но я не уверен, что на самом деле, я разработал и проверил его на окнах только, но я не знаю, какие пакеты не является ваниль ActivePerl.
Пожалуйста, оставьте комментарий.
Ох, и он использует поток bitcoincharts телнет для времени + продаж вместо WebSockets, потому что порт 80 заблокирован моим провайдером
Код:
использовать Tk;
использовать JSON;
использовать LWP :: Simple;
использовать Net :: Telnet;
использовать строгий;
#use предупреждения;
#делать
#бегущая строка
#multiple рынки
Объем #min приращения фильтра /
#scrolling по лестнице
#опции
#actual торговли лол
мой $ PID = вилка ();
если ($ ИДП) {
мой ($ спросить, $ предложение, $ цена,% bidx,% askx, $ lastprice);
мой $ fixprice = 0;
## ТК Shiznet
мой ($ изменение, $ Объем, $ ordersize, $ defaultordersize, $ togglecenter);
мой $ Mw = MainWindow->новый;
$ mw->optionAdd ( '* шрифт', 'Helvetica 10');
$ mw->заглавие("BT Trader");
$ mw->Настройка (-menu => мой $ MenuBar = $ mw->Меню);
#строка меню
мой $ filemb = $ menubar->каскад (-label =>'Файл');
мой $ viewmb = $ menubar->каскад (-label =>'Посмотреть');
$ filemb->команда (
-метка => 'Config',
-команда => \&настроить,
);
$ filemb->команда (
-метка => 'Выход',
-команда => к югу {$ mw->уничтожить ();},
);
$ viewmb->команда (
-метка => 'Время&Продажи',
-команда => \×ales,
);
$ viewmb->команда (
-метка => 'Бегущая строка',
-команда => \&бегущая строка,
);
мой $ левостороннее = $ mw->Рамка;
$ leftside->Checkbutton (-text => "Исправлена", -переменный =>\ $ Togglecenter, -font => [ 'Helvetica', '8', 'жирный шрифт']) ->упаковка (-side =>'Вверх');
$ leftside->упаковка (-side => 'Влево', -anchor => 'П');
#md лестница
мой $ трап = $ mw->Рама (-borderwidth =>2, -relief => 'Канавки');
для (мой $ я = 28; $ я>0; $ Я -) {
мой ($ Ь, $ р, $ а);
$ ladder->Кнопка (-width => 2) ->сетка (
$ Ь = $ ladder->Кнопка (-textvariable => \ $ Bid->[$ Я], -background => 'DodgerBlue4', -foreground => 'Белый'),
$ Р = $ ladder->Кнопка (-textvariable => \ $ Цена->[$ Я], -background => 'Snow4', -foreground => 'Белый'),
$ А = $ ladder->Кнопка (-textvariable => \ $ АСК>[$ Я], -background => 'Red4', -foreground => 'Белый'),
$ ladder->Кнопка (-textvariable => \ $ Lastprice->[$ Я], -width => 4),
-липкие => "с.ш. ю.ш. в.д. з.д.", -pady => 0
);
$ b->Настройка (-command => [\&button_test, $ Ь, $ р]);
$ p->Настройка (-command => [\&button_test, $ р, $ р]);
$ a->Настройка (-command => [\&button_test, $ а, $ р]);
# $ Ladder->Холст (-background =>красный, высота =>1) ->сетка ("-","-","-","-", -pady => 0);
}
$ ladder->упаковка (-side =>'оставил');
$ ladder->повторить (500 \&обновить);
к югу button_test {
мой ($ Var, $ var2) = @_;
$ Var = $ варьировали>cget (-textvariable);
$ Var2 = $ var2->cget (-textvariable);
Распечатать("$$ вар $$ var2 \ п");
}
окно #config
мой $ CFG;
юг настроить {
если (! Exists ($ CFG)) {
$ CFG = $ mw->Верхний уровень();
$ CFG->заглавие("конфиг");
}
еще {
$ CFG->деминимизируете ();
$ CFG->поднять ();
}
}
#time + продаж
мой ($ ТНС, $ tnsLB);
суб timesales {
если (! Exists ($ ТНС)) {
$ ТНС = $ mw->Верхний уровень();
$ tns->заглавие("Время&Продажи");
$ TnsLB = $ tns->Listbox (-height => 30, -background => 'Gray95', -relief => 'квартира')->упаковка (-expand => 'У', -side => 'Влево', -anchor => 'П');
}
еще {
$ tns->деминимизируете ();
$ tns->поднять ();
}
}
#бегущая строка
мой ($ ТКР,);
мои @exchanges = ("MT GOx");
мой (% Тхи,% TLO,% TLA,% tby,% TSL,% tvol);
суб тикер {
если (! Exists ($ ТКР)) {
$ ТКР = $ mw->Верхний уровень();
$ tkr->заглавие("Бегущая строка");
$ tkr->Кнопка (-text => "обмен") ->сетка (
$ tkr->Кнопка (-text => "Высокая"),
$ tkr->Кнопка (-text => "Низкий"),
$ tkr->Кнопка (-text => "Последний"),
$ tkr->Кнопка (-text => "предложение"),
$ tkr->Кнопка (-text => "Просить"),
$ tkr->Кнопка (-text => "объем"),
-липкие => "с.ш. ю.ш. в.д. з.д.");
Foreach мой $ Ex (@exchanges) {
$ tkr->Кнопка (-text => "$ ех") ->сетка (
$ tkr->Кнопка (-textvariable => \ $ Тхи {$} ех),
$ tkr->Кнопка (-textvariable => \ $ TLO {$} ех),
$ tkr->Кнопка (-textvariable => \ $ TLA {$} ех),
$ tkr->Кнопка (-textvariable => \ $ Tby {$} ех),
$ tkr->Кнопка (-textvariable => \ $ TSL {$} ех),
$ tkr->Кнопка (-textvariable => \ $ Tvol {$} ех),
-липкие => "с.ш. ю.ш. в.д. з.д.");
}
}
еще {
$ tns->деминимизируете ();
$ tns->поднять ();
}
}
мой $ в прошлом;
юг обновление {
мой ($ JSON, $ json_txt, $ json_ticker, $ json_tl, $ lastt);
данные #market
открыть файл, "Мэриленд";
$ = JSON- JSON>новый->utf8;
$ Json_txt = $ json->декодирования ( <ФАЙЛ> );
закрыть файл;
#бегущая строка
открыть файл, "бегущая строка";
$ Json_ticker = $ json->декодирования ( <ФАЙЛ> );
закрыть файл;
$ Тхи {"MT GOx"} = $ Json_ticker->{бегущая строка}->{высокая};
$ TLO {"MT GOx"} = $ Json_ticker->{бегущая строка}->{низкий};
$ TLA {"MT GOx"} = $ Json_ticker->{бегущая строка}->{последний};
$ Tby {"MT GOx"} = $ Json_ticker->{бегущая строка}->{купить};
$ TSL {"MT GOx"} = $ Json_ticker->{бегущая строка}->{Продать};
$ Tvol {"MT GOx"} = $ Json_ticker->{бегущая строка}->{Т};
#telnet корма
открыть файл, "telnet_mtg";
мой ($ LastTime, $ lastvol, @ LST);
#add время & продажи
в то время как(<ФАЙЛ> ) {
$ Json_tl = $ json->декодирования ($ _);
если ($ LastTime! = $ json_tl->{} Временная метка && Exists ($ ТНС)) {
Распечатать("$ Последние $ json_tl->{Цена} \ п");
$ LastTime = $ json_tl->{} Объем."@". $ Json_tl->{цена};
$ tnsLB->вставить (0, $ LastTime);
если ($ последнего > $ json_tl->{цена}){
$ tnsLB->itemconfigure (0, -foreground => "красный");
}
если ($ последнего < $ json_tl->{цена}){
$ tnsLB->itemconfigure (0, -foreground => "Green4");
}
$ Последнему = $ json_tl->{цена};
}
$ LastTime = $ json_tl->{} Метка времени;
$ Последнему = $ json_tl->{цена};
$ Lastvol = $ json_tl->{} Объем;
}
закрыть файл;
если (Exists ($ ТНС)) {
разъединить ("telnet_mtg");
}
Распаковать новые данные
мой @newprice;
мой% LP;
#cleanup
(для ключей% askx) {
удалить $ askx {$ _};
}
(для ключей% bidx) {
удалить $ bidx {$ _};
}
(для ключей% LP) {
удалить $ LP {$ _};
}
Распаковать данные йот JSon свалка
Foreach моего $ пункта (@ {$ json_txt->{}} торги) {
$ Bidx {@ {$ пункт} ->[0]} = @ {$ пункт} ->[1];
толчок (@newprice, @ {$ пункт} ->[0]);
}
Foreach моего $ пункта (@ {$ json_txt->{Спрашивает}}) {
$ Askx {@ {$ пункт} ->[0]} = @ {$ пункт} ->[1];
толчок (@newprice, @ {$ пункт} ->[0]);
}
@newprice = сортировать {$ а <знак равно> $ Ь} @newprice;
#последний
$ LP {$} последняя = $ lastvol;
#fill массивы
мой (@ Аська, @ бид, @ МП);
мой $ х = 0;
Foreach моего $ пункта (@newprice) {
толчок (@ бид, $ bidx {$ пункт} ||"");
толчок (@ Аська, $ askx {$ пункт} ||"");
толчок (@ МПУ, $ LP {$ пункт} ||"");
}
#count смещение + Shift массивов
мой $ я = 0;
если ($ togglecenter || $ fixprice == 0) {
в то время как ($ askx {$ NewPrice [$ я]} эк "") {
$ Я ++;
}
$ Fixprice = $ NewPrice [$ я];
}
еще {
в то время как ($ NewPrice [$ я]<$ Fixprice) {
$ Я ++;
}
}
мой $ toshift = $ я-15;
для ($ I = 0; $ я<$ Toshift; $ я ++) {
сдвиг (@newprice);
сдвиг (@aska);
сдвиг (@bida);
сдвиг (@lpa);
}
deep_copy (\ @ NewPrice, $ цена);
deep_copy (\ @ Аська, $ спросить);
deep_copy (\ @ бид, $ ставка);
deep_copy (\ @ МПУ $ lastprice);
}
к югу deep_copy {
мой ($ ЦСИ, $ TGT) = @ _;
если (ссылка $ _ [0] = 'HASH' экв) {copy_href (@_)}
ELSIF (ссылка $ _ [0] экв 'МАССИВ') {copy_aref (@_)}
}
к югу copy_href {
$ _ [1] || = {};
для моего $ ключ (ключи% {$ _ [0]}) {
если (исх $ _ [0] ->{$ Ключ}) {
deep_copy ($ _ [0] ->{$ Ключ}, $ _ [1] ->{$ Ключ})
}
еще {
$ _ [1] ->{$ Ключ} = $ _ [0] ->{$ Ключ}
}
}
}
к югу copy_aref {
$ _ [1] || = [];
для моего $ я (0 .. $ # {$ _ [0]}) {
если (исх $ _ [0] ->[$ Я]) {
deep_copy ($ _ [0] ->[$ Я], $ _ [1] ->[$ Я])
}
еще {
$ _ [1] ->[$ Я] = $ _ [0] ->[$ Я]
}
}
}
MainLoop;
убить 1, $ PID;
}
еще {
$ PID = вилка;
если ($ ИДП) {
в то время как (1) {
getstore ("https://mtgox.com/code/data/getDepth.php","Мэриленд");
getstore ("https://mtgox.com/code/data/ticker.php","бегущая строка");
сон 1;
}
}
еще {
мой $ т = новый Net :: Telnet (Host =>"bitcoincharts.com"Порт =>27007, Тайм-аут =>999);
мой $ линии;
в то время как (1) {
$ Строка = $ t->GetLine ();
если ($ строка = ~ / mtgoxUSD /) {
открыть выход, ">>telnet_mtg";
распечатать "$ линия";
закрыть;
}
сон 1;
}
}
}
использовать JSON;
использовать LWP :: Simple;
использовать Net :: Telnet;
использовать строгий;
#use предупреждения;
#делать
#бегущая строка
#multiple рынки
Объем #min приращения фильтра /
#scrolling по лестнице
#опции
#actual торговли лол
мой $ PID = вилка ();
если ($ ИДП) {
мой ($ спросить, $ предложение, $ цена,% bidx,% askx, $ lastprice);
мой $ fixprice = 0;
## ТК Shiznet
мой ($ изменение, $ Объем, $ ordersize, $ defaultordersize, $ togglecenter);
мой $ Mw = MainWindow->новый;
$ mw->optionAdd ( '* шрифт', 'Helvetica 10');
$ mw->заглавие("BT Trader");
$ mw->Настройка (-menu => мой $ MenuBar = $ mw->Меню);
#строка меню
мой $ filemb = $ menubar->каскад (-label =>'Файл');
мой $ viewmb = $ menubar->каскад (-label =>'Посмотреть');
$ filemb->команда (
-метка => 'Config',
-команда => \&настроить,
);
$ filemb->команда (
-метка => 'Выход',
-команда => к югу {$ mw->уничтожить ();},
);
$ viewmb->команда (
-метка => 'Время&Продажи',
-команда => \×ales,
);
$ viewmb->команда (
-метка => 'Бегущая строка',
-команда => \&бегущая строка,
);
мой $ левостороннее = $ mw->Рамка;
$ leftside->Checkbutton (-text => "Исправлена", -переменный =>\ $ Togglecenter, -font => [ 'Helvetica', '8', 'жирный шрифт']) ->упаковка (-side =>'Вверх');
$ leftside->упаковка (-side => 'Влево', -anchor => 'П');
#md лестница
мой $ трап = $ mw->Рама (-borderwidth =>2, -relief => 'Канавки');
для (мой $ я = 28; $ я>0; $ Я -) {
мой ($ Ь, $ р, $ а);
$ ladder->Кнопка (-width => 2) ->сетка (
$ Ь = $ ladder->Кнопка (-textvariable => \ $ Bid->[$ Я], -background => 'DodgerBlue4', -foreground => 'Белый'),
$ Р = $ ladder->Кнопка (-textvariable => \ $ Цена->[$ Я], -background => 'Snow4', -foreground => 'Белый'),
$ А = $ ladder->Кнопка (-textvariable => \ $ АСК>[$ Я], -background => 'Red4', -foreground => 'Белый'),
$ ladder->Кнопка (-textvariable => \ $ Lastprice->[$ Я], -width => 4),
-липкие => "с.ш. ю.ш. в.д. з.д.", -pady => 0
);
$ b->Настройка (-command => [\&button_test, $ Ь, $ р]);
$ p->Настройка (-command => [\&button_test, $ р, $ р]);
$ a->Настройка (-command => [\&button_test, $ а, $ р]);
# $ Ladder->Холст (-background =>красный, высота =>1) ->сетка ("-","-","-","-", -pady => 0);
}
$ ladder->упаковка (-side =>'оставил');
$ ladder->повторить (500 \&обновить);
к югу button_test {
мой ($ Var, $ var2) = @_;
$ Var = $ варьировали>cget (-textvariable);
$ Var2 = $ var2->cget (-textvariable);
Распечатать("$$ вар $$ var2 \ п");
}
окно #config
мой $ CFG;
юг настроить {
если (! Exists ($ CFG)) {
$ CFG = $ mw->Верхний уровень();
$ CFG->заглавие("конфиг");
}
еще {
$ CFG->деминимизируете ();
$ CFG->поднять ();
}
}
#time + продаж
мой ($ ТНС, $ tnsLB);
суб timesales {
если (! Exists ($ ТНС)) {
$ ТНС = $ mw->Верхний уровень();
$ tns->заглавие("Время&Продажи");
$ TnsLB = $ tns->Listbox (-height => 30, -background => 'Gray95', -relief => 'квартира')->упаковка (-expand => 'У', -side => 'Влево', -anchor => 'П');
}
еще {
$ tns->деминимизируете ();
$ tns->поднять ();
}
}
#бегущая строка
мой ($ ТКР,);
мои @exchanges = ("MT GOx");
мой (% Тхи,% TLO,% TLA,% tby,% TSL,% tvol);
суб тикер {
если (! Exists ($ ТКР)) {
$ ТКР = $ mw->Верхний уровень();
$ tkr->заглавие("Бегущая строка");
$ tkr->Кнопка (-text => "обмен") ->сетка (
$ tkr->Кнопка (-text => "Высокая"),
$ tkr->Кнопка (-text => "Низкий"),
$ tkr->Кнопка (-text => "Последний"),
$ tkr->Кнопка (-text => "предложение"),
$ tkr->Кнопка (-text => "Просить"),
$ tkr->Кнопка (-text => "объем"),
-липкие => "с.ш. ю.ш. в.д. з.д.");
Foreach мой $ Ex (@exchanges) {
$ tkr->Кнопка (-text => "$ ех") ->сетка (
$ tkr->Кнопка (-textvariable => \ $ Тхи {$} ех),
$ tkr->Кнопка (-textvariable => \ $ TLO {$} ех),
$ tkr->Кнопка (-textvariable => \ $ TLA {$} ех),
$ tkr->Кнопка (-textvariable => \ $ Tby {$} ех),
$ tkr->Кнопка (-textvariable => \ $ TSL {$} ех),
$ tkr->Кнопка (-textvariable => \ $ Tvol {$} ех),
-липкие => "с.ш. ю.ш. в.д. з.д.");
}
}
еще {
$ tns->деминимизируете ();
$ tns->поднять ();
}
}
мой $ в прошлом;
юг обновление {
мой ($ JSON, $ json_txt, $ json_ticker, $ json_tl, $ lastt);
данные #market
открыть файл, "Мэриленд";
$ = JSON- JSON>новый->utf8;
$ Json_txt = $ json->декодирования ( <ФАЙЛ> );
закрыть файл;
#бегущая строка
открыть файл, "бегущая строка";
$ Json_ticker = $ json->декодирования ( <ФАЙЛ> );
закрыть файл;
$ Тхи {"MT GOx"} = $ Json_ticker->{бегущая строка}->{высокая};
$ TLO {"MT GOx"} = $ Json_ticker->{бегущая строка}->{низкий};
$ TLA {"MT GOx"} = $ Json_ticker->{бегущая строка}->{последний};
$ Tby {"MT GOx"} = $ Json_ticker->{бегущая строка}->{купить};
$ TSL {"MT GOx"} = $ Json_ticker->{бегущая строка}->{Продать};
$ Tvol {"MT GOx"} = $ Json_ticker->{бегущая строка}->{Т};
#telnet корма
открыть файл, "telnet_mtg";
мой ($ LastTime, $ lastvol, @ LST);
#add время & продажи
в то время как(<ФАЙЛ> ) {
$ Json_tl = $ json->декодирования ($ _);
если ($ LastTime! = $ json_tl->{} Временная метка && Exists ($ ТНС)) {
Распечатать("$ Последние $ json_tl->{Цена} \ п");
$ LastTime = $ json_tl->{} Объем."@". $ Json_tl->{цена};
$ tnsLB->вставить (0, $ LastTime);
если ($ последнего > $ json_tl->{цена}){
$ tnsLB->itemconfigure (0, -foreground => "красный");
}
если ($ последнего < $ json_tl->{цена}){
$ tnsLB->itemconfigure (0, -foreground => "Green4");
}
$ Последнему = $ json_tl->{цена};
}
$ LastTime = $ json_tl->{} Метка времени;
$ Последнему = $ json_tl->{цена};
$ Lastvol = $ json_tl->{} Объем;
}
закрыть файл;
если (Exists ($ ТНС)) {
разъединить ("telnet_mtg");
}
Распаковать новые данные
мой @newprice;
мой% LP;
#cleanup
(для ключей% askx) {
удалить $ askx {$ _};
}
(для ключей% bidx) {
удалить $ bidx {$ _};
}
(для ключей% LP) {
удалить $ LP {$ _};
}
Распаковать данные йот JSon свалка
Foreach моего $ пункта (@ {$ json_txt->{}} торги) {
$ Bidx {@ {$ пункт} ->[0]} = @ {$ пункт} ->[1];
толчок (@newprice, @ {$ пункт} ->[0]);
}
Foreach моего $ пункта (@ {$ json_txt->{Спрашивает}}) {
$ Askx {@ {$ пункт} ->[0]} = @ {$ пункт} ->[1];
толчок (@newprice, @ {$ пункт} ->[0]);
}
@newprice = сортировать {$ а <знак равно> $ Ь} @newprice;
#последний
$ LP {$} последняя = $ lastvol;
#fill массивы
мой (@ Аська, @ бид, @ МП);
мой $ х = 0;
Foreach моего $ пункта (@newprice) {
толчок (@ бид, $ bidx {$ пункт} ||"");
толчок (@ Аська, $ askx {$ пункт} ||"");
толчок (@ МПУ, $ LP {$ пункт} ||"");
}
#count смещение + Shift массивов
мой $ я = 0;
если ($ togglecenter || $ fixprice == 0) {
в то время как ($ askx {$ NewPrice [$ я]} эк "") {
$ Я ++;
}
$ Fixprice = $ NewPrice [$ я];
}
еще {
в то время как ($ NewPrice [$ я]<$ Fixprice) {
$ Я ++;
}
}
мой $ toshift = $ я-15;
для ($ I = 0; $ я<$ Toshift; $ я ++) {
сдвиг (@newprice);
сдвиг (@aska);
сдвиг (@bida);
сдвиг (@lpa);
}
deep_copy (\ @ NewPrice, $ цена);
deep_copy (\ @ Аська, $ спросить);
deep_copy (\ @ бид, $ ставка);
deep_copy (\ @ МПУ $ lastprice);
}
к югу deep_copy {
мой ($ ЦСИ, $ TGT) = @ _;
если (ссылка $ _ [0] = 'HASH' экв) {copy_href (@_)}
ELSIF (ссылка $ _ [0] экв 'МАССИВ') {copy_aref (@_)}
}
к югу copy_href {
$ _ [1] || = {};
для моего $ ключ (ключи% {$ _ [0]}) {
если (исх $ _ [0] ->{$ Ключ}) {
deep_copy ($ _ [0] ->{$ Ключ}, $ _ [1] ->{$ Ключ})
}
еще {
$ _ [1] ->{$ Ключ} = $ _ [0] ->{$ Ключ}
}
}
}
к югу copy_aref {
$ _ [1] || = [];
для моего $ я (0 .. $ # {$ _ [0]}) {
если (исх $ _ [0] ->[$ Я]) {
deep_copy ($ _ [0] ->[$ Я], $ _ [1] ->[$ Я])
}
еще {
$ _ [1] ->[$ Я] = $ _ [0] ->[$ Я]
}
}
}
MainLoop;
убить 1, $ PID;
}
еще {
$ PID = вилка;
если ($ ИДП) {
в то время как (1) {
getstore ("https://mtgox.com/code/data/getDepth.php","Мэриленд");
getstore ("https://mtgox.com/code/data/ticker.php","бегущая строка");
сон 1;
}
}
еще {
мой $ т = новый Net :: Telnet (Host =>"bitcoincharts.com"Порт =>27007, Тайм-аут =>999);
мой $ линии;
в то время как (1) {
$ Строка = $ t->GetLine ();
если ($ строка = ~ / mtgoxUSD /) {
открыть выход, ">>telnet_mtg";
распечатать "$ линия";
закрыть;
}
сон 1;
}
}
}