Trading & Automated Trading

S prvními Bitccoiny jsem založil účet na Mt.Gox (aktuálně nejlikvidnější tržiště BTC) a vrhnul se na BTC trading… Současná volatilita může být příležitost k zúročení :). Nicméně manuální zadávání příkazů není pro mne, takže si hraju s intraday automatic trading a po prvních testech s analýzou mtgox ledger (váhy na straně poptávky a nabídky) poměrně bezúspěšně (dobré tak ke zvýšení obratu na mtgox účtu :slight_smile: a získání lepších poplatků /začínáte na 0.6%/ :japanese_ogre: ). Momentálně se snažím odladit php/mysql bota na Heiken Ashi average bars…

Problém je, že programovat backtesty v php/mysql je zbytečná práce, když na to již existují software…

Zkoušel jsem http://btc-trader.org/ ale nedaří se mi do něj dostat data z Mt.Gox (tickery BRITCOINGBP, BTCEXEUR fungují normálně). Datafeed je z Bitcoinwatch.com.

Co používáte za trading sw?

Pro doplnění užitečné grafy, které používám:
http://bitcoinity.org/markets?currency=USD&exchange=mtgox (asi nejlepší realtime ticker)
http://bitcoincharts.com/charts/mtgoxUSD
http://www.mtgoxlive.com (je schopný zahltit firefoxe)

S analyzou hloubky trhu na MtGox opatrne, az moc casto se stava, ze se zde objevuji velke falesne bid a asky, ktere pak zmizi.

Na obchodovani mam napsany vlastni soft, zacal sem ho psat kvuli tomu, ze Mtgox neumi prakticky nic: neumi STOP order, nespocitavam predpokladanou slippage, nutny rozdil kurzu pro ziskovost long/short pozice atd. V tuto chvili cely system prepisuju z puvodni php/postgres do node.js, takze vyvoj dalsich vlastnosti stoji, ale mam v planu napriklad i to automaticke intraday. Predpokladam, ze backtesty budu delat sam.

Dalsi webové služby:

http://bitstock.info/
http://bitcoin.clarkmoody.com/time-sales/
http://bitcoin.clarkmoody.com/order-book/

Toho jsem si vedom… omezuju rozpeti bid a asku, ktere beru v uvahu jako realizovatelne (zadavatel jimi riskuje ze se provedou, takze by to teoreticky nemelo zahrnovat extremne “nahozene” ceny) na +/- 0.3 btc a vahu davam nejvyssi na blizke bidy/asky a postupne ji snizuji u asku/bidu vzdalenejsich aktualnimu prumeru.

Nicmene jak jsem psal, ta logika za tim prilis nefungovala, takze momentalne radeji se zamerim Heikin Ashi a price trendy :slight_smile:

Na samotnou trading execution je jasné, že je třeba něco custom… Ale na backtesty bych preferoval již hotový tool, kam se nalejou datafeedy z bitcoinwatch.com… Nebo si již eviduješ vlastní historii trhu? Jaké proměnné sleduješ?
Já aktuálně po cca 5-ti sekundách best bid, best ask, váhu bidů, váhu asků, průměrnou cenu, aktuální spread. Je to ale děsnejch dat… :frowning: a pro využitelnost je třeba je dál agregovat, takže dál z toho počítám min/max/open/close a to samé pro heiken ashi…

Mam komplet history vsech transakci a aktualni depth, nepocital sem s tim, ze bych potreboval znat depth v minulosti, ale zacnu si asik ukladat kazdou zmenu depthu, mista je spousty a vzdycke se da neco po agregaci vymazat. Aktualne ma db 120 MB.

Předpokládám, že bude jednodušši si napsat backtesting než se snažit napojovat mýho bota do nějakýho jinýho softu.

V jaké podobě ukládáš aktuální hloubku trhu? Jako volume zpracovaných transakcí v intervalu?

Ty SW by nemusely být propojené… jde jen o nakonfigurování několika trading pravidel (pár vzorců)… a to můžu provést v každém zvlášť…

Aktualní hloubku mám práve zatím aktuální, tj. v tomto okamžimu.

To si nemyslím, že by stačilo na všechny případy a typy robotů.

A na hloubce provádíš nějaké korekce (z výše uvedeného důvodu)?
Zobchodovaný volume musím začít měřit…

Asi máš pravdu… pokud se nějaký app nenajde, holt se to nakóduje ;)…

Ne, nenapadá mě totiž jak poznat falešný bid :slight_smile:

Máš nějaké odkazy na popisy algoritmů? Nebo odkud hledáš inspiraci, co zkusit?

Inspiraci jsem prehlcen. Tech veci, co bych chtel zkusit je spousta a na nove narazim kazdou chvili. Vezmi si jen, kolik je diskusnich for, ktera se zabyvaji strategiemi na trading Forexu.

Zajimam se o akcie, ale spis z fundamentalniho hlediska… Technicka analyza je pro me zatim velka neznama a jsem v daytradingu uplny novacek a pouzivam hlavne selsky rozum + to co mi dalo mikro a makro ;)…

Momentalne nejvetsi trabl je, ze z Mtgox dostavam jina data nez jsou na bitcoinity.org… Navic jsem si vsiml, ze ma mtgox problem se zpracovanim prikazu (nektere mi proste expirovaly ve fronte i kdyz by se mely provest - kurz byl OK). Tahle zprava asi souvisi.

Diskuse o Mt.gox aktualne zde: https://bitcointalk.org/index.php?topic=43470.0

Jake mas zkusenosti se ziskavanim realtime kurzu a poslednich obchodu?

Oficialni (http json) ticker Mt.Gox je nejak pomalejsi (10-15 sekund prodleva proti treba bitcoinity.org), vypada to ze cesta bude websocket mtgox api …

https://en.bitcoin.it/wiki/MtGox/API#0.2Fdata.2FgetTrades.php

Na backtesty jsem nasel asi nejlepsi aplikaci Matlab. Ted jeste se s ni naucit ;)…

pouzivam websocket
5a774d684b5d5

Skoda ze na serverech mi obvykle javascript nebezi :wink:

ja to solim normalne z php pres fsockopen (spousty bordelu staci odmazat):

	public function runWs() {
		$messageHub = MessageHub::getHub();
		$host = 'websocket.mtgox.com';
		$port = 80;
		$local = "http://localhost/";
		$head = "GET /mtgox HTTP/1.1"."\r\n".
			"Upgrade: WebSocket"."\r\n".
			"Connection: Upgrade"."\r\n".
			"Origin: $local"."\r\n".
			"Host: $host"."\r\n".
			"\r\n";
		$sock = fsockopen($host, $port, $errno, $errstr, 2);
		fwrite($sock, $head ) or die('error:'.$errno.':'.$errstr);
		fwrite($sock, chr(0).'{"op": "mtgox.subscribe", "channel": "'.$this->key.'"}'.chr(255));
		stream_set_blocking($sock, 0);
		$rest = '';
		$loop = 0;
		while (!feof($sock)) {
			$in = fread($sock, 1500);
			if ($in === FALSE) {
				die('error:' . $errno.':'.$errstr);
			}
			if ($loop++ % 20 == 0) {
				$messageHub->sendMessage('daemon.mtgoxWs', array(
						'loop' => $loop,
						'in' => $in,
						'feof' => feof($sock),
					));
			}
			if ($in == '') {
				usleep(50000);
			}

			$wsdata = $rest . $in;  //receives the data included in the websocket package "\x00DATA\xff"
			$d = explode("\xff", $wsdata);
			$rest = array_pop($d);
			foreach ($d as $m) {
				$m = explode("\x00", $m);
				$m = $m[1];
				if (!$message = json_decode($m)) {
					print "ERROR decoding: ";
					var_dump($m);
					continue;
				}
				switch($message->op .'#' . @$message->channel) {
					case 'private#dbf1dee9-4f2e-4a08-8cb7-748919a71b21': { // trades
						$trade = $message->trade;
						unset($trade->type);
						unset($trade->primary);
						$mt = new MtgoxTrades($trade);
						$m = new MtgoxTradesManager();
						$m->createTrade($mt);
						//print "TRADE: " . ($trade->amount_int / 100000000) . ' for ' . ($trade->price_int / 100000) . ' ' . $trade->price_currency . ' ' . $trade->trade_type . PHP_EOL;
						$messageHub->sendMessage('trade', $trade);
					} break;
					case 'private#d5f06780-30a8-4a48-a2f8-7ed181b4a13f': { // ticker
						$ticker = $message->ticker;
						//print "TICKER: " . $ticker->buy . " " . $ticker->sell . " " . $ticker->last . PHP_EOL;
						$m = new Ticker();
						$m->state = 'OK';
						$m->ts = time();
						$m->avg = $ticker->avg;
						$m->buy = $ticker->buy;
						$m->high = $ticker->high;
						$m->last = $ticker->last;
						$m->low = $ticker->low;
						$m->sell = $ticker->sell;
						$m->vol = $ticker->vol;
						$m->vwap = $ticker->vwap;
						if ($ticker->vol == 0) {
							print "Invalid ticker: ";
							var_dump($ticker);
						} else {
							$m->save();
						}
					} break;
					case 'private#24e67e0d-1cad-4cc0-9e7a-f8523ef460fe': { // depth
						$depth = $message->depth;
						$d = new MtgoxDepth($depth);
						$dm = new MtgoxDepthManager();
						$dm->changeDepth($d);
						//print "DEPTH: " . $depth->type_str . ' ' . ($depth->volume_int / 100000000) . ' for ' . ($depth->price_int / 100000). ' ' . $depth->currency . PHP_EOL;
						$messageHub->sendMessage('depth', $depth);
					} break;
					default: {
						var_dump($message);
					} break;
				}
			}
		}
        fclose($sock);
	}

Paradni! Klobouk dolu… nenapadlo mne otocit push na pull ;)… diky moc… Mmch zjistil jsem, ze ticker nedava posledni trade (osobne moc nechapu jaky cislo vlastne obcas ukazuje) a nejspolehlivejsi (z hlediska presnosti nikoliv stability spojeni) se mi jevi:

function getmtgoxtick() {
	exec("wget http://mtgoxlive.com:3457/".rand(24,1000000)."\?_=100000000000000000 -qO-",&$mtglive);
	//print_r($mtglive);
	
	if (preg_match("/last price: ([0-9\.]{1,10})\"\]/i",$mtglive[0],$match)) {
		//print_r($match);
		$livetick = $match[1];
	}
	
	if ($livetick > 0) {
		return $livetick;
	} else {
		return false;
	}
}

API zatim jedu zakladni… ale o websocketu popremyslim :cowboy_hat_face:

function mtgox_query($path, array $req = array()) {
	// API settings
  global $mtg_key, $mtg_secret;
  
	// generate a nonce as microtime, with as-string handling to avoid problems with 32bits systems
	$mt = explode(' ', microtime());
	$req['nonce'] = $mt[1].substr($mt[0], 2, 6);
 
	// generate the POST data string
	$post_data = http_build_query($req, '', '&');
 
	// generate the extra headers
	$headers = array(
		'Rest-Key: '.$mtg_key,
		'Rest-Sign: '.base64_encode(hash_hmac('sha512', $post_data, base64_decode($mtg_secret), true)),
	);
 
	// 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; MtGox PHP client; '.php_uname('s').'; PHP/'.phpversion().')');
	}
	curl_setopt($ch, CURLOPT_URL, 'https://mtgox.com/api/'.$path);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
 
	// run the query
	$res = curl_exec($ch);
	if ($res === false) throw new Exception('Could not get reply: '.curl_error($ch));
	$dec = json_decode($res, true);
	if (!$dec) throw new Exception('Invalid data received, please make sure connection is working and requested API exists');
	return $dec;
}

Scratching the surface…

Max Dama
http://www.maxdama.com/

http://dl.dropbox.com/u/39904/maxdama.pdf

Drobná zjištění: Matlab je na backtesty, statistiku apod. naprosto geniální. Dokonce jej lze použít pro automatické obchodování (umí spolupracovat a volat externí programy / URL).

Dokonce už mám i strategii s úspěšností cca 70%, problém je již zmíněná problematická implementace stoplossu. Protože i s touto úspěšností je ztráta natolik velká, že ji zisky nepokryjí. Např. mám stoploss na 65 pips, ale v reálu se “aktivuje” klidně až na 185 - 250 pips :(.

Tip pro tradery co drží bitcoiny kvůli spekulativním nákupům: proti dlouhodobému poklesu je možné se zajistit skrze krátkou pozici s pákou 1:5 na stejnou částku jako držíte v BTC na www.bitcoinica.com. Účet je možné nabít skrze redeemable Mtgox kód v USD.