Showing posts with label Python programming. Show all posts
Showing posts with label Python programming. Show all posts

Sunday, 4 February 2018

Python Button Tkinter passing arguments

Python tkinter button widget passing arguments.  In these examples I will show you several ways you can pass values, variables, arguments to a function. You will also learn how to add a right mouse click as well as the left mouse click.  

Save Save
Here is the code to start the tutorial and follow along
from tkinter import *
from tkinter import ttk

class Application(Frame):
    
    """ A GUI application """

    def __init__(self, master):
        """ Initialize the Frame"""
        ttk.Frame.__init__(self, master)

        self.grid()
        self.create_widgets()

    def create_widgets(self):
        # create a normal button
        self.button1 = Button(root, font=('', 16, 'bold'), text='.22 Cents', command=self.do_something)
        self.button1.grid(row=0, column=0, pady=5, padx=5)

        # create a text box (Entry box) to hold the value of the click event
        self.tbValue = Entry(root, font=('', 16, 'bold'), textvariable=varEntryValue).grid(row=1, column=2, pady=5, padx=5)

        # create a text box (Entry box) to hold a average price
        self.tbSet = Entry(root, font=('', 16, 'bold'), textvariable=varAvgPrice).grid(row=1, column=1, pady=5, padx=5)
        
    # button 1 example
    def button1_Click(event, arg):
        average_Price = varAvgPrice.get() # gets a value from the first Entry box
        c = float(average_Price) + arg # adds the value from the ttk .22 button to the first entry box value
        c = round(c, 2) # round off c to 2 decimal places
        varEntryValue.set(c) # sets the value in the second Entry box

    def do_something(self):
        varEntryValue.set('Hello, Hola, Bonjour')    

root = Tk()

root.title("Button Examples in Python")
root.geometry("790x850")
root.attributes("-topmost", True)
varEntryValue = StringVar()
varAvgPrice = StringVar(root, value='105.00')

app = Application(root)

root.mainloop()



Get The Unique id conId Number from TWS

Learn how to get the unique id (conId) from Interactive brokers using a gui application. Every option has a different number since there are so many variations. The contract id (conid) is a number not a symbol, and this number you will need in order to trade options. For example the IBM 170 CALL option with an expiry on January 6, 2017 has a unique id number of  256910869. The number may be different on the next trading day.  I am not sure if they stay the same from now, until the next day until they expire. You can search for a contract id number here: https://pennies.interactivebrokers.com/cstools/contract_info/v3.9/index.php see the code here To access a September 2016 $40 Call option on Netflix : I believe there is a data fee for options. You need to pay for a data feed for the options in order to request data through the API
conID = 3 # Contract ID
symbol = "NFLX" # Netflix’s stock symbol
secType = "OPT" # Security type is an Option (OPT)
expiry = "20170120" # January 2017 Expiry format yyyymmdd
strike = 90 # $90.00 strike price
right = "CALL" # Call option
multiplier = "100" # multiplier 100 shares per contract for options
exchange = "SMART" # Use IB’s Smart Order router to get the prices
currency = "USD" # USD Currency

To access a June 2017 Crude Oil Futures contract set the properties:
conID = 2 # Contract Id
symbol = "CL" # Crude Oil underlying symbol (CL)
secType = "FUT" # Security type is an Future (FUT)
expiry = "20170120" # January 20, 2017 Expiry third Friday of month
exchange = "NYMEX" # Use IB’s Smart Order router to get the prices
To access a foreign exchange quote such as Euro/USD:
conID = 6 # Contract Id
symbol = "EUR" # Euro underlying (base currency) symbol (EUR/USD quote)
secType = "CASH" # Security type is Cash / FX
exchange = "IDEALPRO" # Use the IDEALPRO FX data source
currency = "USD" # Quoted currency is USD
 
Save Save

Saturday, 3 February 2018

Scrolling 2 text widgets together

I am using the pack() Geometry Manager to place all of the widgets. I opted for the pack() Manager because it is ideal for placing widgets side by side or drop down position. Fortunately, in a text editor, I have all the widgets Placed next to each other or in descending order. It is therefore advantageous to the pack() Manager. We can do the same with the grid() manager also.

Save Save

# Craig Hammond 2018

import tkinter as tk
from tkinter import *


from tkinter import ttk
import re

class SampleTextApp(Frame):
    def __init__(self, master, **kwargs):# this **kwargs is needed for the scroll bar
        ttk.Frame.__init__(self, master)
        self.file_name = None
        self.grid()
        self.create_widgets()

    def create_widgets(self):

        # font varialble to use with all widgets
        my_font = ('', 18)
        
        # add a text box for the line numbers
        self.line_number_text = Text(self, font=my_font, width=4, padx=3, takefocus=0, border=0, background='yellow', state='disabled', wrap='none')
        self.line_number_text.pack(side='left', fill='y')
        
        # add the main text box widget here
        self.main_text = Text(self, font=my_font, wrap='none')
        self.main_text.bind('<KeyPress>', self.on_text_changed)
        self.main_text.pack(expand='yes', fill='both')
        
        # add a scroll bar for the main text widget
        self.scroll_bar = Scrollbar(self.main_text)
        self.scroll_bar.pack(side='right', fill='y')

        # call the scroll bar functions
        self.scroll_bar['command'] = self.on_scrollbar
        self.line_number_text['yscrollcommand'] = self.on_textscroll
        self.main_text['yscrollcommand'] = self.on_textscroll
# this will update the line numbers any time you
        # press a key on the keyboard
        self.main_text.bind('<Any-KeyPress>', self.on_text_changed)
        self.main_text.focus_set()
   
    def on_scrollbar(self, *args):
        self.line_number_text.yview(*args)
        self.main_text.yview(*args)
        
    def on_textscroll(self, *args):
        # Moves scrollbar and scrolls text widgets when the mouse wheel
        # is moved on the text widget
        self.scroll_bar.set(*args)
        self.on_scrollbar('moveto', args[0])
        
    def on_text_changed(self, event=None):
        self.update_line_numbers()
    
    def get_line_numbers(self):
        output = ''
        row, col = self.main_text.index("end").split('.')
        for i in range(1, int(row)):
            output += str(i) + '\n'
        return output

    def update_line_numbers(self, event=None):
        line_numbers = self.get_line_numbers()
        # disables the text widget so the widget does not scroll
        self.main_text.config(state='disabled')
        self.line_number_text.config(state='normal') 
        self.line_number_text.delete('1.0', 'end')
        self.line_number_text.insert('1.0', line_numbers)
        self.line_number_text.config(state='disabled')
        # returns the text widget back to normal
        self.main_text.config(state='normal')

root = Tk()
PROGRAM_NAME = ' My Text Editor '
root.title(PROGRAM_NAME)
root.geometry("600x300")
app = SampleTextApp(root)
app.pack(fill='both', expand='yes')
app.mainloop()

Wednesday, 22 November 2017

Create an awesome mailing program in Python



# Craig Hammond 2017 YouTube channel bingazingas
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
# smtp.mail.yahoo.com
import time
from tkinter import *
from tkinter import ttk
import math

class Application(Frame):
    """ Gui Application """
    
    def __init__(self, master):
        """ initialize the Frame """
        ttk.Frame.__init__(self, master)

        self.grid()
        self.create_widgets()

    def create_widgets(self):

        myfont = ('', 14, 'bold')
        # row 0
        #create first button
        self.btnConnect = Button(self,  font=myfont, text = "Send Mail", bg='red', fg='white', command=self.send_mail).grid(row=0, column=0, sticky=W)
        
        # row 1
        # create label for To:
        self.label1 = Label(self, font=myfont, text='To: ').grid(row=1, column=0, pady=10, padx=10, sticky=E)

        # create combo box for the address
        self.cbToEmail = ttk.Combobox(self, font=myfont, width=40, textvariable=varTo)
        self.cbToEmail['values'] = ('info@evil_corp.com', 'admin@yahoos.com', 'bobhatesthat@yahoo.com', 'juggernaut@gmail.com')
        self.cbToEmail.grid(row=1, column=1, pady=10, padx=10)
        
        # row 2
        # create label from
        self.label2 = Label(self, font=myfont, text='From: ').grid(row=2, column=0, pady=10, padx=10, sticky=E)

        # create combo box for the address
        self.cbFromEmail = ttk.Combobox(self, font=myfont, width=40, textvariable=varFrom)
        self.cbFromEmail['values'] = ('info@yahhoo.com',
                                      'juggernaut@gmail.com',
                                      'evil_corp@yahoo.com')
        self.cbFromEmail.grid(row=2, column=1, pady=10, padx=10)
        
        # row 3
        # create label list of email addresses
        self.label3 = Label(self, font=myfont, text='Subject: ').grid(row=3, column=0, pady=10, padx=10, sticky=E)
        
        # create combo box for the address
        self.cbSubject = ttk.Combobox(self, font=myfont, width=40, textvariable=varSubject)
        self.cbSubject['values'] = ('check out my latest update from my website', 'Webist has been updated')
        self.cbSubject.grid(row=3, column=1, pady=10, padx=10)
        
        # row 4
        # create label list of email addresses
        self.label2 = Label(self, font=myfont, text='Address list name: ').grid(row=4, column=0, pady=10, padx=10, sticky=E)

        # create combo box for the address
        self.cbEmail_List = ttk.Combobox(self, font=myfont, width=40, textvariable=varEmail_List)
        self.cbEmail_List['values'] = ('adresses_email.txt',
                                       'Test_adresses_email.txt')
        self.cbEmail_List.grid(row=4, column=1, pady=10, padx=10)
        
        # row 5
        # create text box to hold the text for the letter
        self.text = Text(self, font=('', 12), width=90, height=25)
        self.text.grid(row=5, column = 0, columnspan=2, padx=5, pady=5, sticky='nsew')
        
        self.scrollb = Scrollbar(self, command=self.text.yview)
        self.scrollb.grid(row=5, rowspan=8, column=2, columnspan=2, pady=10, sticky='nse')
        self.text['yscrollcommand'] = self.scrollb.set

    def send_mail(self):
        
        from_address = varFrom.get() # get the address from the combobox who is sending the email example: 'sender_name@yahoo.com' 
        to_address = varTo.get() # get the address from the combobox for example: 'receiver_name@gmail.com'

        file_to_open = varEmail_List.get()# get address text file from combobox on form
        address_text = open(file_to_open,'r') # read the file
        my_addresses = address_text.readlines() # read each line in text file
        address_text.close() # close text file

        
        text_Letter = self.text.get('1.0', END) # select all text in the listbox 


        counter = 1 # create a varialbe to increase an integer
        # loop through all the addresses and print them
        for line in my_addresses:
            print (counter, line)
            counter +=1
   
        subject_text = varSubject.get() # gets the contents of the combo box for the subject line

        username = 'username@yahoo.com'  # use your email address as the username
        password = 'password' # password used to login to your email account
 
        b=1 # create a counter set it to start at 1
        
        # how many email addresses to process
        list_length = len(my_addresses)
        t = list_length 
        print ('How many in the list', list_length)
        
        msg = MIMEMultipart()
        msg['From'] = from_address
        msg['To'] = to_address
        msg['Subject'] = subject_text 
        msg.attach(MIMEText(text_Letter))
        server = smtplib.SMTP('smtp.mail.yahoo.com') # for gmail use: smtp.gmail.com
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(username, password)
        for atoaddress in my_addresses: # loop through each email address
            ti = t % 12 # divide number by 12 send 12 at a time
            if ti == 0: # if when you divide the number by 12 you get zero
                server.sendmail(from_address,atoaddress,msg.as_string())
                print (b, ' sent ', atoaddress) # print the address that you sent the mail to
                time.sleep(2)
                server.quit() # quit or close the server
                print ('it_quit')
                time.sleep(8) # sleeps for 8 seconds
                msg = MIMEMultipart() # re-connects and continues the main loop
                msg['From'] = from_address
                msg['To'] = to_address
                msg['Subject'] = subject_text
                msg.attach(MIMEText(text_Letter))
                server = smtplib.SMTP('smtp.mail.yahoo.com') # for gmail use: smtp.gmail.com
                server.ehlo()
                server.starttls()
                server.ehlo()
                server.login(username, password)
                b+=1
                t-=1
            else:
                server.sendmail(from_address,atoaddress,msg.as_string())
                print (b, ' sent ', atoaddress)
                b+=1
                t-=1
                time.sleep(6)
        server.quit()
        print ('Done')


root = Tk()
   
root.title("email program in Python please donate")
root.geometry("840x625")
"""root.bind("", keydown)
root.bind("", keyup)"""
root.attributes("-topmost", True)
varTo = StringVar(root, value='to_address@gmail.com')
varFrom = StringVar(root, value='from_address@yahoo.com')
varText_Letter = StringVar()
varSubject = StringVar(root, value='Latest update from my website')
varEmail_List = StringVar(root, value='adresses_email.txt')
app = Application(root)

root.mainloop()


Save Save Save

Saturday, 17 December 2016

IB TWS Trading Platform in Python 8 outsideRTH

IB TWS Trading Platform in Python 8 outsideRTH

In this tutorial you will add a check box to your gui form window that will allow you to trade after hours and pre-market.

Add this variable to hold the variable for the checkbox just above the create widgets function.

self.my_outsideRTH = False 
Add this to the end of the create_widgets(self): function
        # create a check button box for outside RTH
        self.chkOutsideRTH = Checkbutton(f1, font=('', 10),
                                         text='OutsideRTH', variable=varOutsideRTH)
        self.chkOutsideRTH.grid(row=9, column=6)
  Add highlighted text to the buy(self): function and the sell(self): function
  def buy(self):
        self.symbol = varSymbol.get()
        self.quantity = varQuantity.get()
        self.order_type = varOrderType.get()
        self.limit_price = varLimitPrice.get()
        self.my_outside = varOutsideRTH.get() # add here
        the_outsideRTH = 0
        if self.my_outside == True:
            the_outsideRTH = 1
        self.place_market_order(self.symbol, self.quantity, self.order_type,
                                True, self.limit_price, the_outsideRTH) # add here
    def sell(self):
        self.symbol = varSymbol.get()
        self.quantity = varQuantity.get()
        self.order_type = varOrderType.get()
        self.limit_price = varLimitPrice.get()
        self.my_outside = varOutsideRTH.get() # add here
        the_outsideRTH = 0
        if self.my_outside == True:
            the_outsideRTH = 1
        self.place_market_order(self.symbol, self.quantity, self.order_type,
                                False, self.limit_price, the_outsideRTH) # add here
Add the variable my_outsideRTH to the highlighted areas in the place_market_order() function as shown below.
    def place_market_order(self, symbol, quantity, order_type, is_buy, limit_price, my_outsideRTH): # add here
        print (symbol, quantity, order_type, is_buy, limit_price)
        contract = self.create_contract(symbol,
                                        'STK',
                                        'SMART',
                                        'NASDAQ',
                                        'USD')
 # tests if is buy or sell
        buysell = 'BUY' if is_buy else 'SELL'
        order = self.create_order(order_type, quantity, buysell, limit_price, my_outsideRTH)# add here
        self.tws_conn.placeOrder(self.order_id, contract, order)
        # increses the order id by one
        self.order_id += 1
Add the variable outsideRTH to the highlighted areas in the create_order() function as shown below.
    def create_order(self, order_type, quantity, action, limit_price, outside_Rth):    # add  outside_Rth 
        order = Order()
        order.m_orderType = order_type
        order.m_totalQuantity = quantity
        order.m_action = action
        order.m_lmtPrice = limit_price  
        order.m_outsideRth = outside_Rth                  # add order.m_outsideRth = outside_Rth 
        return order

Add this to the bottom where all the variables are for your window form widgets.
varOutsideRTH = StringVar(root, value=False) 


Pages: 1 2 3 4 5 6 7 8 9


Save

Saturday, 26 November 2016

Python Listbox delete text

In this video you will learn to delete a selected item in a listbox tkinter widget using Python3



# Craig Hammond 2016
from tkinter import 
from tkinter import ttk

class Application(Frame):
    
    def __init__(self, master):
        """ Initialize the Frame """
        ttk.Frame.__init__(self, master)
 
        self.grid()
        self.create_widgets()

    def create_widgets(self):
        # create the button widgets
        self.btnAddSymbol = ttk.Button(self, text = "Add Symbol", command=self.add_symbol).grid(row=0, column=0, sticky=W)    
        self.tbEntry = Entry(self, font=('', 12), textvariable=varEntry).grid(row=0, column=1, sticky=W)
        self.btnDeleteSymbol = ttk.Button(self, text = 'Remove Symbol', command=self.delete_symbol).grid(row=0, column=2, sticky=W)

        # create listbox widget
        self.listbox1 = Listbox(self, font=('', 12))
        #self.listbox1.bind('<ButtonRelease-1>', self.select_item) # Don't use  it won't work
        self.listbox1.bind('<<ListboxSelect>>', self.select_item)
        self.listbox1.insert(1, 'EVIL')
        self.listbox1.insert(2, 'SBUX')
        self.listbox1.insert(3, 'FB')
        self.listbox1.grid(row=1, column=0)
        
    def add_symbol(self):
        to_add = varEntry.get() # gets text from textbox or Entry box
        # change 'end' to 0 to add it to the beginning
        self.listbox1.insert('end', to_add) # adds text to listbox 
        
    def select_item(self, event):
        pass
        
    def delete_symbol(self):
        current_selection = self.listbox1.curselection() # gets the position of the selected item
        # print (current_selection)
        self.listbox1.delete(current_selection) # deletes the selected item

root = Tk()
varEntry = StringVar(root, value="SCTY")
app = Application(root)
root.mainloop()

Thursday, 24 November 2016

Python Listbox Add Text


from tkinter import *
from tkinter import ttk

class Application(Frame):
    
    def __init__(self, master):
        """ Initialize the Frame"""
        ttk.Frame.__init__(self, master)
 
        self.grid()      
        self.create_widgets()

    def create_widgets(self):
        # create the button widgets
        self.btnAddSymbol = ttk.Button(self, text = "Add Symbol", command=self.add_symbol).grid(row=0, column=0, sticky=W)    
        self.tbEntry = Entry(self, font=('', 12), textvariable=varEntry).grid(row=0, column=1, sticky=W)
        self.btnDeleteSymbol = ttk.Button(self, text = 'Remove Symbol', command=self.delete_symbol).grid(row=0, column=2, sticky=W)

        # create listbox widget
        self.listbox1 = Listbox(self, font=('', 12))
        #self.listbox1.bind('<ButtonRelease-1>', self.select_item) # Don't use <Button-1> it won't work
        self.listbox1.bind('<<ListboxSelect>>', self.select_item)
        self.listbox1.insert(1, 'EVIL')
        self.listbox1.insert(2, 'SBUX')
        self.listbox1.insert(3, 'FB')
        self.listbox1.grid(row=1, column=0)
        
    def add_symbol(self):
        to_add = varEntry.get() # gets text from textbox or Entry box
        # change 'end' to 0 to add it to the beginning of the list
        self.listbox1.insert('end', to_add) # adds text to listbox 
        
    def select_item(self, event):
        pass
        
    def delete_symbol(self):
        pass

root = Tk()
varEntry = StringVar(root, value="SCTY")
app = Application(root)
root.mainloop()

Sunday, 13 November 2016

Python Tree view search cell contents

Python treeview search for cell value and change cell contents
# Craig Hammond 2016
from tkinter import *
from tkinter import ttk

class Application(Frame):
    
    def __init__(self, master):
        """ Initialize the Frame"""
        ttk.Frame.__init__(self, master)
        self.grid()
        self.create_widgets()

    def create_widgets(self):
        self.btnConnect = ttk.Button(self, text = "Search Symbol", command=self.search_symbol).grid(row=0, column=0, sticky=W)
        self.btnDisconnect = ttk.Button(self, text = "Add data", command=self.add_data).grid(row=0, column=1, sticky=W)
        self.btnCancelMktData = ttk.Button(self, text = 'Remove All', command=self.remove_all).grid(row=0, column=2, sticky=W)
        self.button_edit = Button(self, font=('',12), text="select row", width=7, command=self.add_data)
        self.button_edit.grid(row=0, column=4)
        
        # create Treeview widget to hold values in a table
        self.tv = ttk.Treeview(root)    

        self.tv = ttk.Treeview(self,  height=8)
        self.tv['columns'] = ('id', 'symbol', 'price', 'trigger', 'shares', 'side', 'type', 'status', 'fill')
        self.tv.heading("#0", text='Time', anchor='w')
        self.tv.column("#0", stretch=NO, width=5, anchor="w")
        self.tv.heading('id', text='ID')
        self.tv.column('id', anchor='center', width=70)
        self.tv.heading('symbol', text='Symbol')
        self.tv.column('symbol', anchor='center', width=70)
        self.tv.heading('price', text='Price')
        self.tv.column('price', anchor='center', width=70)
        self.tv.heading('trigger', text='Trigger')
        self.tv.column('trigger', anchor='center', width=70)
        self.tv.heading('shares', text='Shares')
        self.tv.column('shares', anchor='center', width=130)
        self.tv.heading('side', text='Side')
        self.tv.column('side', anchor='center', width=70)
        self.tv.heading('type', text='Type')
        self.tv.column('type', anchor='center', width=70)
        self.tv.heading('status', text='Status')
        self.tv.column('status', anchor='center', width=100)
        self.tv.heading('fill', text='Fill')
        self.tv.column('fill', anchor='center', width=70)
        self.tv.bind('<ButtonRelease-1>', self.select_item) 
        self.tv.grid(row=1, column=0, columnspan=6, padx=5, pady=5)
        self.treeview = self.tv
##        self.ysb = ttk.Scrollbar(self, orient='vertical', command=self.tv.yview)
##        self.xsb = ttk.Scrollbar(self, orient='horizontal', command=self.tv.xview)
##        self.tv.configure(yscroll=self.ysb.set, xscroll=self.xsb.set)
##        self.ysb.grid(row=1, column=7, sticky='ns')
##        self.xsb.grid(row=2, column=0, sticky='ew')
        
        ttk.Style().configure("Treeview", font= ('', 11), background="black", 
        foreground="white", fieldbackground="yellow")

        self.tv.insert("","end",text = "Person",values = ("1254","MSFT","39.39", "", "0/200", "BUY", "LMT", "Filled", "39.39"), tags='hot')
        self.tv.insert("","end",text = "Animal",values = ("1255","MSFT","39.58", ".10", "0/200", "SELL", "TRAIL", "PreSubmitted", "0.00"), tags='cold')
        self.tv.insert("","end",text = "Name",values = ("1256","MSFT","39.58", "", "0/200", "SELL", "LMT", "Submitted", "0.00"), tags='pizza')
        self.tv.insert("","end",text = "Evil Corp",values = ("1258","NFLX","102.55", "", "0/300", "SELL", "LMT", "Submitted", "0.00"), tags='tacos')
        
    def select_item(self, a):   # added self and a
        pass

    def remove_all(self):
       pass
                
    def search_symbol(self):
        pass

    def add_data(self):
        x = self.tv.get_children() # variable to store the dictionary string
        if x != '()': # checks if there is something in the first row
            for item in x:
                values_Values = (self.tv.item(item)["values"]) # variable to hold the cell values
                tags_values = (self.tv.item(item)["tags"]) # variable to hold the tag values
                if values_Values[1] == "NFLX": # looks for value 1254
                    self.tv.item(item, values=(values_Values[0], # value from existing string
                                                            values_Values[1],
                                                            values_Values[2],
                                                            values_Values[3],
                                                            'Yippie Ki Evil Corp', # value to be changed 4th cell
                                                            values_Values[5],
                                                            values_Values[6],
                                                            values_Values[7],
                                                            values_Values[8]
                                                            ), tags=tags_values) # changes the tag value to bite
                    
                    
root = Tk()
app = Application(root)
root.mainloop()

Friday, 11 November 2016

Python Code Treeview Select Row

In this video you can observe how the operation of the click event works when you click on a row in the tree view widget
# Craig Hammond 2016
from tkinter import *
from tkinter import ttk

class Application(Frame):
    
    def __init__(self, master):
        """ Initialize the Frame"""
        ttk.Frame.__init__(self, master)
 
        self.grid()
        self.create_widgets()

    def create_widgets(self):
        self.btnConnect = ttk.Button(self, text = "Search Symbol", command=self.search_symbol).grid(row=0, column=0, sticky=W)
        self.btnDisconnect = ttk.Button(self, text = "Add data", command=self.add_data).grid(row=0, column=1, sticky=W)
        self.btnCancelMktData = ttk.Button(self, text = 'Remove All', command=self.remove_all).grid(row=0, column=2, sticky=W)
        self.button_edit = Button(self, font=('',12), text="select row", width=7, command=self.add_data)
        self.button_edit.grid(row=0, column=4)
        
        # create Treeview widget to hold values in a table
        self.tv = ttk.Treeview(root)    

        # create Treeview 
        self.tv = ttk.Treeview(self,  height=8)
        self.tv['columns'] = ('id', 'symbol', 'price', 'trigger', 'shares', 'side', 'type', 'status', 'fill')
        self.tv.heading("#0", text='Time', anchor='w')
        self.tv.column("#0", stretch=NO, width=5, anchor="w")
        self.tv.heading('id', text='ID')
        self.tv.column('id', anchor='center', width=70)
        self.tv.heading('symbol', text='Symbol')
        self.tv.column('symbol', anchor='center', width=70)
        self.tv.heading('price', text='Price')
        self.tv.column('price', anchor='center', width=70)
        self.tv.heading('trigger', text='Trigger')
        self.tv.column('trigger', anchor='center', width=70)
        self.tv.heading('shares', text='Shares')
        self.tv.column('shares', anchor='center', width=100)
        self.tv.heading('side', text='Side')
        self.tv.column('side', anchor='center', width=70)
        self.tv.heading('type', text='Type')
        self.tv.column('type', anchor='center', width=70)
        self.tv.heading('status', text='Status')
        self.tv.column('status', anchor='center', width=100)
        self.tv.heading('fill', text='Fill')
        self.tv.column('fill', anchor='center', width=70)
        self.tv.bind('<ButtonRelease-1>', self.select_item) 
        self.tv.grid(row=1, column=0, columnspan=6, padx=5, pady=5)
        self.treeview = self.tv
##        self.ysb = ttk.Scrollbar(self, orient='vertical', command=self.tv.yview)
##        self.xsb = ttk.Scrollbar(self, orient='horizontal', command=self.tv.xview)
##        self.tv.configure(yscroll=self.ysb.set, xscroll=self.xsb.set)
##        self.ysb.grid(row=1, column=7, sticky='ns')
##        self.xsb.grid(row=2, column=0, sticky='ew')
        
        ttk.Style().configure("Treeview", font= ('', 11), background="#383838", 
        foreground="white", fieldbackground="yellow")

        self.tv.insert("","end",text = "Person",values = ("1254","MSFT","39.39", "", "0/200", "BUY", "LMT", "Filled", "39.39"), tags='hot')
        self.tv.insert("","end",text = "Animal",values = ("1255","MSFT","39.58", ".10", "0/200", "SELL", "TRAIL", "PreSubmitted", "0.00"), tags='cold')
        self.tv.insert("","end",text = "Name",values = ("1256","MSFT","39.58", "", "0/200", "SELL", "LMT", "Submitted", "0.00"), tags='pizza')
        self.tv.insert("","end",text = "Evil Corp",values = ("1258","NFLX","102.55", "", "0/300", "SELL", "LMT", "Submitted", "0.00"), tags='tacos')
        
    def select_item(self, a):   # added self and a (event)
        test_str_library = self.tv.item(self.tv.selection())# gets all the values of the selected row
        print ('The test_str = ', type(test_str_library), test_str_library,  '\n')  # prints a dictionay of the selected row
        item = self.tv.selection()[0] # which row did you click on
        print ('item clicked ', item) # variable that represents the row you clicked on
        print (self.tv.item(item)['values'][0]) # prints the first value of the values (the id value)

    def remove_all(self):
       pass
                
    def search_symbol(self):
        pass

    def add_data(self):
        pass

root = Tk()       
app = Application(root)
root.mainloop()

Saturday, 29 October 2016

IB TWS Trading Platform in Python 7

IB TWS Trading Platform in Python 3 part 7 - profit and loss

In this tutorial lesson you will add labels and textboxes to hold the unrealized, realized, and total profit and loss add code to calculate the marked profit and loss for both a long position and a short position Add these variables to your project
        self.unrealized = 0 # used in monitor position
        self.realized = 0   # used in monitor position
        self.unrealized_pnl = 0
        self.realized_pnl = 0
        self.marked_pnl = 0
  Add this to the bottom of the create_widgets() function
        # create label for unrealized
        self.label_unrealized = Label(f1, font=('', 10), text='Unrealized').grid(row=10, column=2)

        # create label for realized
        self.label_realized = Label(f1, font=('', 10), text='Realized').grid(row=10, column=3)

        # create label for Marked
        self.label_Marked = Label(f1, font=('', 10), text='Marked').grid(row=10, column=4)

        # create entry box for unrealized
        self.tbUnrealized = Entry(f1, font=('', 10), width=12, textvariable=varUnrealized).grid(row=11, column=2)

        # create entry box for realized
        self.tbRealized = Entry(f1, font=('', 10), width=11, textvariable=varRealized).grid(row=11, column=3)

        # create entry box for Marked
        self.tbMarked = Entry(f1, font=('', 10), width=11, textvariable=varMarked).grid(row=11, column=4)

  add this code to the bottom of the cbSymbol_onEnter() function they set the text boxes for Position, average price, unrealized, realized, and marked to zero, also the 2 variables realized_pnl, and marked_pnl to zero
        varPosition.set('0')
        varAvgPrice.set('0.00')
        self.realized_pnl = 0
        self.marked_pnl = 0
        varUnrealized.set('0.00')
        varRealized.set('0.00')
        varMarked.set('0.00')
  Add this to the monitor_position() function
        myShares = abs(self.position) # changes negative number to a position number
        varRealized.set(self.realized_pnl)
        if self.position > 0:
            self.unrealized = '%.2f' %((self.last_prices - self.average_price) * myShares)
            varUnrealized.set(self.unrealized)
            self.marked_pnl = '%.2f' %(float(self.unrealized) + float(self.realized_pnl))
            varMarked.set(self.marked_pnl)
        elif self.position < 0:
            self.unrealized = '%.2f' %((self.average_price - self.last_prices) * myShares)
            varUnrealized.set(self.unrealized)
            self.marked_pnl = '%.2f' %(float(self.unrealized) + float(self.realized_pnl))
            varMarked.set(self.marked_pnl)
        else:
            self.marked_pnl = float(self.unrealized_pnl) + float(self.realized_pnl)
            self.marked_pnl = '%.2f' % self.marked_pnl
            self.realized_pnl = '%.2f' % float(self.realized_pnl)
            varUnrealized.set('0.00')             
            varMarked.set(self.marked_pnl)
            varRealized.set(self.realized_pnl)
  add these string variables to the botton with the other textvariables for the 3 Entry boxes (text boxes)
varUnrealized = StringVar()
varRealized = StringVar()
varMarked = StringVar()

Pages: 1 2 3 4 5 6 7 8 9


Save Save Save Save Save Save

Tuesday, 11 October 2016

Python Historical Data 3

In this tutorial you will understand more about what goes into the code to request historical data for certain trading instruments.  Check out the other properties for Options, Futures, and Forex at the end of the page. In the video example we will request data for stocks. This only works with Interactive Brokers Paste this call to a function at the end of the connect_to_tws  function (The highlighted text in yellow below)
# make sure this is included in the connect_to_tws function
self.register_callback_functions()
  Paste this code after the connect_to_tws function and make sure all your indents are correct
    def contract_creation(self):
        self.listbox1.delete(0,END) # clears contents of the listbox
        self.tws_conn.cancelHistoricalData(5) #cancels historical data
        mySymbol = varSymbol.get() # get the symbol from the combobox
        
        contract = self.create_contract(mySymbol,
                                   'STK',   # security STK = stock 
                                   'SMART', # exchange
                                   'NASDAQ',# primary exchange
                                   'USD')   # currency

        now = strftime('%Y%m%d %H:%M:%S', localtime(int(time())))
        duration = varDuration.get() # get the duration ie. 1 D, 1 M, 1 Y
        bar_size = varBarSize.get()  # get the bar size ie. 5 mins, 2 mins, 1 day
        
        self.tws_conn.reqHistoricalData(tickerId = 5,       # contract number can be any number
                                        contract=contract,  # contract detail from above
                                        endDateTime=now,    # end date and time
                                        durationStr=duration,    
                                        barSizeSetting=bar_size,
                                        whatToShow='TRADES', # what to show ie. MIDPOINT, BID, ASK,
                                        useRTH=1,          # Regular trading hours 1 = RTH, 0 = all data
                                        formatDate=1)   # 1 = 20161021  09:30:00 2 = Unix time (Epoch)
        
    def register_callback_functions(self):
        # Assign server messages handling function.
        self.tws_conn.registerAll(self.server_handler)

        # Assign error handling function.
        self.tws_conn.register(self.error_handler, 'Error')
        
    def error_handler(self, msg):
        if msg.typeName == 'error'and msg.id != -1:
            print ('Server Error:', msg)
            
    def server_handler(self, msg):    
        if msg.typeName == 'historicalData':
            hd_date = msg.date
            hd_open = msg.open
            hd_high = msg.high
            hd_low = msg.low
            hd_close = msg.close
            hd_volume = msg.volume
            
            str_date = str(hd_date)
            str_open = str(hd_open)
            str_high = str(hd_high)
            str_low = str(hd_low)
            str_close = str(hd_close)
            str_volume = str(hd_volume)
            # creates a string containing date, open, high, low, close, volume
            priceData2 = hd_date+","+str_open+","+str_high+","+str_low+","+str_close+","+str_volume
            
            if 'finished' in hd_date:
                pass
            else:
                str_data = hd_date, hd_open, hd_high, hd_low, hd_close, hd_volume
                print (str_data) # prints info to the Python shell
                self.listbox1.insert(END, priceData2) # adds info to the listbox
            
        elif msg.typeName == "error" and msg.id != -1:
            return
  
    def create_contract(self, symbol, sec_type, exch, prim_exch, curr):
        contract = Contract()
        contract.m_symbol = symbol
        contract.m_secType = sec_type
        contract.m_exchange = exch
        contract.m_primaryExch = prim_exch
        contract.m_currency = curr
        return contract        




Interactive Brokers API identifies a financial instrument using an object class named contract.

The properties for contract are as follows:

Property Description
conId Contract id for the financial instrument.
symbol Stock symbol or symbol for Options or Futures
secType Type of instrument: Stock=STK, Option=OPT, Future=FUT, etc.
expiry used with Options or Futures: The expiration date format YYYYMMDD
strike Options: The Options Strike Price
right Options: The Options “PUT” or “CALL”
multiplier Contract multiplier for Futures or Options "100"
exchange Destination of order or requested. “SMART” = IB smart order router
primaryExchange Primary listing exchange where the instrument trades. NYSE, NASDAQ, AMEX, BATS, ARCA, etc.
currency Currency of the exchange USD or GBP or CAD or EUR, etc.

http://interactivebrokers.github.io/tws-api/classIBApi_1_1Contract.html#gsc.tab=0 Examples, before a data request is made or before an order is submitted, an object of class contract will be created and its attributes will be populated with appropriate values used to identify the financial instrument. For example, to access market data for Netflix stock, set the properties:

conID = 5 # Contract identifier
symbol = "NFLX" # Netflix stock symbol
secType = "STK" # Security type is a stock (STK)
exchange = "SMART" # Use IB’s Smart Order router to get the prices
primary exchange = "NASDAQ" # Use NASDAQ
currency = "USD" # USD Currency

Historical data limitations Link


To access a September 2016 $40 Call option on Netflix : I believe there is a data fee for options. You need to pay for a data feed for the options in order to request data through the API

conID = 3 # Contract ID
symbol = "NFLX" # Netflix’s stock symbol
secType = "OPT" # Security type is an Option (OPT)
expiry = "20170120" # January 20, 2017 Expiry YYYYMMDD
strike = 90 # $90.00 strike price
right = "CALL" # Call option
multiplier = "100" # multiplier 100 shares per contract for options
exchange = "SMART" # Use IB’s Smart Order router to get the prices
currency = "USD" # USD Currency

To access a June 2017 Crude Oil Futures contract set the properties:

conID = 2 # Contract Id
symbol = "CL" # Crude Oil underlying symbol (CL)
secType = "FUT" # Security type is an Future (FUT)
expiry = "20170120" # January 20, 2017 Expiry third Friday of month
exchange = "NYMEX" # Use IB’s Smart Order router to get the prices

To access a foreign exchange quote such as Euro/USD:

conID = 6 # Contract Id
symbol = "EUR" # Euro underlying (base currency) symbol (EUR/USD quote)
secType = "CASH" # Security type is Cash / FX
exchange = "IDEALPRO" # Use the IDEALPRO FX data source
currency = "USD" # Quoted currency is USD



Pages: 1 2 3 4 5 6


Save Save Save Save Save Save Save Save Save Save Save Save Save Save Save

Sunday, 9 October 2016

IB TWS Historical Data in Python 2

 


from time import sleep, strftime, localtime, time
from ib.ext.Contract import Contract
from ib.ext.Order import Order
from ib.opt import Connection, message

from tkinter import *
from tkinter import ttk

class Application(Frame):
    """ a gui application"""

    def __init__(self, master):
        """ Initialize the Frame"""
        ttk.Frame.__init__(self, master)

        self.port=7496
        self.client_id = 97 # this number can be any number
        self.symbol_id, self.symbol = 5, 'MSFT'
        self.account_code = None
        self.strData = ""
        self.grid()
        self.create_widgets()

    def create_widgets(self):
        """ create the window layout. """
        now = strftime('%Y%m%d %H:%M:%S', localtime(int(time())))
        myfont=('Arial', 12)
        myFont = ('Lucida Grande',12)
        
        # create a connect to tws button
        self.btnConnect = ttk.Button(self, text = "Connect", command=self.connect_to_tws)
        self.btnConnect.grid(row=0, column=1, sticky=W)

        # create a button to request the data
        self.btnGetData = ttk.Button(self, text = "Get Data", command=self.contract_creation)
        self.btnGetData.grid(row=0, column=2, sticky=W)

        # create a label for Symbol
        self.label_symbol = Label(root, text='Symbol').grid(row=1, column=0)
        
        # create a combobox for security symbol
        self.cbSymbol = ttk.Combobox(root, font=myfont, textvariable=varSymbol).grid(row=2, column=0)
        
        # create label for the endDateTime
        self.label_datetime = Label(root, font=myfont, text='End Date').grid(row=3, column=0)

        # create label for the duration
        self.label_duration = Label(root, font=myfont, text='Duration').grid(row=3, column=1)

        # create label for the barSizeSetting
        self.label_bar_size = Label(root, font=myfont, text='Bar Size').grid(row=3, column=2)

        # create Entry box (textbox) for the endDateTime
        self.tbDateTime = Entry(root, font=myfont, textvariable=varDateTime).grid(row=4, column=0)
        
        # create Combo box (textbox) for the duration 
        self.cbDuration = ttk.Combobox(root, font=myfont, textvariable=varDuration)
        self.cbDuration['values'] = ('1 Y', '1 M', '6 M', '1 D', '2 D')
        self.cbDuration.grid(row=4, column=1, sticky=W)

        # create Combo box (textbox) for the barSizeSetting
        self.cbBarSize = ttk.Combobox(root, font=myfont, textvariable=varBarSize)
        self.cbBarSize['values'] = ('1 day', '1 min', '2 mins', '5 mins')
        self.cbBarSize.grid(row=4, column=2, sticky=W)
        
        varDateTime.set(now)

        # create a listbox for the data make it 2 lines or the
        # listbox1.insert will not work you get an error
        # damn that is frustrating
        self.listbox1 = Listbox(root, font= ('', 12), width=75, height=30)
        self.listbox1.grid(row=6, column=0, columnspan=5, padx=5, pady=5, sticky='w')
            
    def connect_to_tws(self):
        self.tws_conn = Connection.create(port=7496, clientId=5)
        self.tws_conn.connect()

    def contract_creation(self):
        pass

root = Tk()

root.title("Historical data from IB TWS in Python please donate")
root.geometry("600x670")
root.attributes("-topmost", True)

varDateTime = StringVar()
varDuration = StringVar(root, value='1 D')
varBarSize = StringVar(root, value='5 mins')
varSymbol = StringVar(root, value='MSFT')

app = Application(root)

root.mainloop()



Pages: 1 2 3 4 5 6


Save