Pracovní skupina poskytovaná tradery pro tradery. Naleznete v ní odpovědi na své technické otázky týkající se programů Amibroker, Python, InteractiveBrokers TWS a TradeStation Global.
Ale tímto způsobem byl právě například včera problém se zlatem - MGC. Interactive brokers ho listovala jako hlavní kontrakt, ale už se nedal obchodovat.
Zdravím,
já si stahuji FUT kontrakt přes reqContractDetails a poté seřadím kontrakty podle expirace a vyberu akutální. Kód jsem si upravil takto:
def qualify_cont_futures_contract(self,exchange,secType,symbol,currency):
"""Vrátí seznam dostupných futures kontraktů pro daný ticker, seřazených podle expirace."""
if secType != 'FUT':
raise ValueError(f"Neznámý typ kontraktu: {secType}")
contract = Future(symbol=symbol, exchange=exchange, currency=currency)
aktualni_kontrakt = self.ib.reqContractDetails(contract )
if not aktualni_kontrakt:
print(f"Nenalezeny žádné futures kontrakty pro {symbol} na {exchange}")
return None
# Seřazení kontraktů podle expirace
sorted_contracts = sorted(aktualni_kontrakt, key=lambda x: x.contract.lastTradeDateOrContractMonth)
multiplier = float(sorted_contracts[0].contract.multiplier) if sorted_contracts[0].contract.multiplier else None # 1.0
tick_size = float(sorted_contracts[0].minTick) if sorted_contracts[0].minTick else None # 0.01
tick_value = multiplier * tick_size
# print(f"multiplier: {multiplier} , tick_size: {tick_size}")
return sorted_contracts, tick_size, tick_value
Dobry den.To jsem udelal. Dole na potrfoliu je videt ze GEV mam nakoupeno 9, RPRX mam -94. Normalne jsem si stahnul Basket z dashboardu, otevrel v platforme a pak jednotlive dal Transfer. Nevim, co se stalo. Je mozne, ze kdyz je posilam jednotlive, ze by se zadaly jako jednotlive prikazy BUY a SELL a ne jako BUY a spojeny PT?
Budu to sledovat, jestli se mi to nahodou stane znovu. Diky.
Ales
Zdravím,
potreboval by som poradiť. Snažím sa naimportovať príslušné 5-minute futures data z tradingroomu do TS. Zip súbor som si stiahol a nasladne upravil data tak aby ich TS mohol načítať. Pre príklad dám @ES-5min-UTC. Csv súbor som upravil a nahral od začiatku až po koniec do TS cez 3rd party možnosť a takto mi to vyzeralo:
Potom som skúsil nahrať iba prvý mesiac, to už nahralo 5 minutové data tak že sa dali čítať ako normálne sviečky, ale ked som si ich porovnával s online dátami z TS boli z časti odlišné. Pátral som ďalej a zistil som že dáta do TS nahrávam vo formáte "Date","Time",Open,High,Low,"Close","Volume" tak ako ich petr zdielal. Keď som si skúšal exportovať a hneď importovať tradestation data boli vo formáte "Date","Time","Open","High","Low","Close","Up","Down" vtedy boli imporotvané data a online data z TS identické. Preto by som sa chcel opýtať že či ja nerobím niekde chybu s importom alebo jednoducho to tam musí ísť vo forme druhého formátu ? Robím to preto lebo by som si rád otestoval svoje portfolio v analyzátore do ktorého môžu ísť len backtesty z indexov(SPY, QQQ, IWM atď.) Nakoľko výsledky z futures a ich dvojičiek indexov veľmi nelíšia. 5 minútove data niektoých indexov su k dispozícii na stiahnutie v tradingroome, bolo by odomňa blbé sa to nesnažiť využiť. Fundovaný mam len futures účet v TS čiže data mam len na futures. Aby som platil maximalne 10 dollarov za inactivity.
Ďakujem prajem pekný večer.
Timi
Prikladám provizornú vzorku môjho súboru csv :
"Date","Time","Open","High","Low","Close","Up","Down"
01/03/2006,08:35,1648.75,1650.50,1648.50,1649.50,11385,10836
01/03/2006,08:40,1649.25,1649.75,1648.25,1649.00,8942,7874
01/03/2006,08:45,1649.00,1650.00,1649.00,1649.75,6267,3859
01/03/2006,08:50,1649.50,1649.75,1648.25,1648.50,5472,4712
01/03/2006,08:55,1648.75,1649.50,1647.25,1647.50,6434,10634
01/03/2006,09:00,1647.25,1649.00,1647.00,1648.75,7385,2973
01/03/2006,09:05,1648.50,1650.25,1647.25,1647.25,12417,13452
01/03/2006,09:10,1647.25,1647.75,1645.25,1645.50,9449,16342
01/03/2006,09:15,1645.50,1646.25,1644.50,1645.25,8163,10973
01/03/2006,09:20,1645.25,1646.00,1645.00,1645.75,4627,5939
01/03/2006,09:25,1645.75,1646.25,1644.00,1644.00,7345,10130
01/03/2006,09:30,1644.00,1644.50,1643.00,1643.75,10189,11070
01/03/2006,09:35,1643.75,1644.25,1642.75,1643.00,7523,7872
01/03/2006,09:40,1643.00,1643.00,1641.25,1641.75,10620,15410
01/03/2006,09:45,1641.75,1643.50,1641.75,1643.25,9782,5630
01/03/2006,09:50,1643.00,1643.75,1642.75,1643.75,4326,3452
01/03/2006,09:55,1643.50,1644.00,1643.50,1643.75,3116,2682
01/03/2006,10:00,1643.75,1644.50,1643.50,1644.00,3881,3226
01/03/2006,10:05,1644.25,1644.75,1643.75,1643.75,3846,4313
01/03/2006,10:10,1643.75,1644.50,1643.50,1644.25,2924,2919
01/03/2006,10:15,1644.25,1644.50,1643.25,1644.25,3646,3710
01/03/2006,10:20,1644.00,1646.00,1644.00,1645.00,7987,5734
01/03/2006,10:25,1645.00,1645.50,1644.50,1645.00,4876,3474
01/03/2006,10:30,1645.00,1645.50,1644.50,1645.00,4364,2686
01/03/2006,10:35,1645.25,1645.75,1645.00,1645.50,2810,1597
01/03/2006,10:40,1645.50,1646.75,1645.25,1646.00,8871,3777
01/03/2006,10:45,1646.00,1646.75,1645.75,1646.25,7542,2198
01/03/2006,10:50,1646.50,1646.50,1645.25,1645.75,3399,3350
01/03/2006,10:55,1645.75,1646.00,1645.00,1645.75,2171,2829
01/03/2006,11:00,1645.75,1647.25,1645.50,1647.25,7707,1927
01/03/2006,11:05,1647.25,1647.75,1646.25,1646.25,5148,5977
01/03/2006,11:10,1646.25,1648.25,1646.25,1647.75,9343,3128
01/03/2006,11:15,1648.00,1648.00,1647.00,1647.50,4439,3883
01/03/2006,11:20,1647.50,1648.00,1646.25,1646.50,1769,5502
01/03/2006,11:25,1646.25,1646.75,1646.00,1646.50,1871,1433
01/03/2006,11:30,1646.25,1646.75,1646.00,1646.25,1944,2033
Takt o máte v pořádku, ne? Jenom je vidět že příkazy nemáte odeslané - buď musíte kliknout ručně na všechna tlačítka Transmit u jednotlivých příkazů (modrá/červená tlačítka) nebo na Transmit tlačítko v poli Execute Basket (spodní třetina, šedé tlačítko).
u IB to funguje tak, že příkazy se nejprve přenesou do platformy a pak je ještě potřeba je odeslat (Transmit) na burzu.
@vita1 Díky za ukázku.
Předěláme tedy skript na práci s FUT (vynecháme CONTFUT).
Čeho bych se chtěl vyvarovat je přesně to, o čem píše @vita1. Tedy že některé aktuální kontraktní měsíce už budou před expirací a bylo by potřeba je vyplňovat ručně. Rád bych, aby logika výběru kontraktních měsíců probíhala kompletně automatizovaně.
Co mě napadá - do konfigurace trhů bychom přidali ke každému trhu dva nové parametry:
- minimální počet dnů do expirace. Na začátku skriptu by se načetli všechny expirační měsíce a vybral by se ten nejbližší podle expirace, ovšem s alespoň minimálním počtem zadaných dnů do expirace. Například u MGC to vypadá, že musí být alespoň 30 dnů - viz https://ndcdyn.interactivebrokers.com/en/trading/futures-close-out.php (z té by se daly informace parserovat, ale to mi přijde extrémně náchylné na chyby).
- ruční expirace. Standardně by pole bylo prázdné. Když se vyplní, tak by se obchodovala zadaná expirace. Bylo by to takové řešení pro situace, kdy by automat trval na zobchodování expirace, která se obchodovat nedá.
Napadá k tomu někoho něco dalšího?
Dobry den. Mam uplne to same. Pouzil jsem take Basket prikaz. Vyplneny byly GEV a RPRX. GEV mam nakoupeny s LMT prikazem na SELL, ale RPRX mam v SHORT prodany s LMT prikazem na BUY. Oba byly v BASKETu spolu. Nic jsem v BASKETU nemenil.
Pokud se vám vyplnil výstupní prodejní příkaz coby vstupní (a jste short), tak jste musel mít příkaz špatně zadaný. Takto to vypadá správně:
Jde o příkaz, který čeká v mém živém účtu.
Zobrazuji si i sloupec Key, kde je vidět číslo 497 a 497.1. To je interní číslování příkazů IB. Podstatné je, že hlavní příkaz je bez desetinné tečky a ty s desetinnou tečkou jsou podmíněné - do trhu se dostanou až v momentě, kdy je vyplněn hlavní příkaz. Proto přestože cena byla nad výstupním profit targetem nejsem short - příkaz čeká na to, až trh doklesá k nákupnímu limitu a teprve po je vyplnění by byl poslán do trhu sell příkaz.
Pokud příkaz zadáváte přes basket, tak by se toto mělo vyplnit automaticky.
Petr
Děkuji za vysvětlení.
Dnes jsem zadal Deepdip příkazem basket před otevřením trhu. Hodinu po otevření jsem si šel příkazy zkontrolovat. Všechno probíhá, jak jsem zadal, jen ticker RPRX mne překvapil. Pro RPRX se měla otevřít dlouhá pozice příkazem Buy na ceně 30.18 a obchod se měl ukončit příkazem Sell na ceně 32.11, což je vlastně PT. Místo toho trh otevřel pod 32, ale vystoupal nejprve k příkazu Sell na 32.11 a otevřel krátkou pozici. Jak se má teď dále postupovat? Díky, Roman
I já hlásím, že mi reqHistoricalData dnes začalo s CONTFUT zlobit. A to až tak, že jsem musel restartovat TWS, aby začalo znovu fungovat stahování jakýchkoliv dat.
Vyřešil jsem to tak, že si zavolám qualifyContracts hned na začátku skriptu, tím zjistím aktuální expirace, a s nimi už si vytvořím ib_insync.Future objekty (ty už jsou typu FUT). Pro ně teprve stahuji data. Malá komplikace je, že minimálně u MGC musím expiraci specifikovat ručně, protože pro aktuální front kontrakt už IB požaduje vyplnit physical delivery intent. Takže obchoduji až následující kontrakt.
Sdílím kód pro inspiraci, ale je z mého vlastního systému, ne ze sdíleného bracket helperu:
class MarketSpec(TypedDict):
symbol: str
exchange: str
tick_size: float
expiry: datetime.date | None
def create_future_contracts(ib: ib_insync.IB, markets: list[MarketSpec]) -> dict[str, ib_insync.Future]:
incomplete_contracts = []
for market in markets:
if market.get("expiry"): # Explicit expiration date is specified
incomplete_contracts.append(
ib_insync.Future(
symbol=market["symbol"],
exchange=market["exchange"],
lastTradeDateOrContractMonth=market["expiry"].strftime("%Y%m%d"),
)
)
else: # Default to the current front contract
incomplete_contracts.append(
ib_insync.Contract(secType="CONTFUT", exchange=market["exchange"], symbol=market["symbol"])
)
# This adds the expiration date and currency, among other fields
qualified_contracts = ib.qualifyContracts(*incomplete_contracts)
return {
c.symbol: ib_insync.Future(
symbol=c.symbol,
exchange=c.exchange,
currency=c.currency,
lastTradeDateOrContractMonth=c.lastTradeDateOrContractMonth,
)
for c in qualified_contracts
}
A použít se to dá např. takto. Reálně se ovšem ten list kontraktů načte z konfigurace:
contracts = create_future_contracts(ib, [
{"symbol": "MES", "exchange": "CME"},
{"symbol": "MGC", "exchange": "COMEX", "expiry": datetime.date(2025, 6, 26)},
])
Zdravím.
Při spuštění generator.py mi to vyhodí chybu viz níže. Zkusil jsem nainstalovat knihovnu functions.database, ale píše mi to, že taková knihovna neexistuje. Mám nainstalován python 3.12.9.
Jaromír
Traceback (most recent call last):
File "C:\AUTO_signaltrader\fills.py", line 24, in <module>
import functions.database as db
ModuleNotFoundError: No module named 'functions.database'
Zdravím,
hlásím stejnou chybu pro MBT.
Když zkouším zadat příkaz ručně, IB píše že nemám trading permissions.
Takže jsem požádal, vyplnit dotazník a čekám na schválení.
Michal
Zkoušel jsem zadat Buy příkaz MKT a pak výstup Sell taky MKT a prošlo to v pořádku. Všiml jsem si ale, že se mi tam zobrazuje hláška Cost Impact, což jsem ještě nikde nezaregistroval ... ale asi to s tím nesouvisí.
Server od roku 2003 vydává
Centrum finančního vzdělávání, s.r.o. info@financnik.cz
Upozornění: Všechny informace poskytované na Financnik.cz jsou určeny výhradně ke studijním účelům témat týkajících se obchodování na burze a neslouží v žádném případě coby konkrétní investiční či obchodní doporučení. Provozovatel serveru ani jednotliví autoři nejsou registrovanými brokery či investičním poradcem ani makléřem. Jsou-li na stránkách zmiňovány konkrétní finanční produkty, komodity, akcie, forex či opce, vždy a pouze za účelem studia obchodování na burze. Vydavatel serveru není zodpovědný za konkrétní rozhodnutí jednotlivých uživatelů. Burzovní obchodování a investování s finančními instrumenty (a komoditami obzvláště) je vysoce rizikové. Rozhodnutí obchodovat komodity a akcie je odpovědností každého jednotlivce a jedině on sám nese za svá rozhodnutí plnou odpovědnost. Nikdy se nepouštějte do obchodů, jejichž podstatě plně nerozumíte. Pamatujte, že burza má svá pravidla, kterým je třeba porozumět, než začnu riskovat své vlastní peníze!