Wednesday, March 6, 2019

codingdirectional: The final part of the Forex application project

Hello and welcome back, as I have mentioned earlier I would like to create a method which will convert USD/world currency pairs to world currency pair/world currency pair before closing up this Forex application project and in this chapter, we will look at the source code to do the above- mentioned topic.

Before we start I have found out two things that I have overlooked previously. 1) This Coinbase API is actually returning the USD/BTC and other USD/cryptocurrency pair as well besides the USD/world currency pair so we do not need to develop another application for the USD/cryptocurrency pair with the Coinbase API anymore. 2) The currency pair converter method which I have created for this chapter will only return the approximate exchange rate for x/y currency pair because it seems like if we know the USD/x currency value and we know the USD/y currency value then x/y value is not equal to USD/x divided by USD/y. Which simply means the currency exchange rate for two individual countries will not base on the currency exchange rate of the USD/that country currency but instead that two countries have made their own agreement on the currency exchange rate separately. I have not looked into the GOLD/world currency yet which maybe is the sole commodity which all the world currency exchange rate is based upon. Nevertheless, the program which based on the USD below will demonstrate to you all that if the exchange rate of the world currency is based on USD then we can easily do the math to find out what is the exchange rate of x currency/ y currency pair if we know what is the currency exchange rate of USD/that currency. Do leave your comment under this post to let me know if the formula which I am using is wrong.

from coinbase.wallet.client import Client
import json
from tkinter import *
import tkinter.ttk as tk

win = Tk() # Create tk instance
win.title("Real CryptoGeek") # Add a title
win.resizable(0, 0) # Disable resizing the GUI
win.configure(background='white') # change window background color

selectorFrame = Frame(win, background="white") # create top frame to hold search and switch combobox
selectorFrame.pack(anchor = "nw", pady = 2, padx=10)
currency_label = Label(selectorFrame, text = "Select currency pair / base currency :", background="white")
currency_label.pack(anchor="w") # the currency pair label

# Create a combo box for currency pair
select_currency = StringVar() # create a string variable
preferPaired = tk.Combobox(selectorFrame, textvariable=select_currency)
preferPaired.pack(side = LEFT, padx=3)

s = StringVar() # create string variable
# create currency frame and text widget to display the incoming forex data
currencyFrame = Frame(win)
currencyFrame.pack(side=TOP)
currency = Label(currencyFrame)
currency.pack()
text_widget = Text(currency, fg='white', background='black')
text_widget.pack()
s.set("Click the find button to find out the currency exchange rate")
text_widget.insert(END, s.get())

buttonFrame = Frame(win) # create a bottom frame to hold the find button
buttonFrame.pack(side = BOTTOM, fill=X, pady = 6)

def search_currency(): # search currency pair

    countVar = StringVar() # use to hold the character count
    text_widget.tag_remove("search", "1.0", "end") # cleared the hightlighted currency pair

    if(preferPaired.get() != ''):

        pos = text_widget.search(preferPaired.get(), "1.0", stopindex="end", count=countVar)
        text_widget.tag_configure("search", background="green")
        new_pos = float(pos) + float(0.7)
        text_widget.tag_add("search", pos, str(new_pos)) #highlight the background of the searched currency pair
        pos = float(pos) + 2.0
        text_widget.see(str(pos))

action_search = tk.Button(selectorFrame, text="Search", command=search_currency) # button used to search the currency pair within the text widget
action_search.pack(side=LEFT)

# Create base currency combo box
base_currency = StringVar() # create a string variable
based = tk.Combobox(selectorFrame, textvariable=base_currency)
based.pack(side = LEFT, padx=3)

exchange_name_dict = dict() # the dictionary for currency name
base_currency_dict = dict() # the dictionary for base currency

def get_exchange_rate(): # this method will display the incoming forex data after the api called
    # first get the api key and secret from the text file
    f = open("coin.txt", "r")
    api_key = f.readline()
    api_secret = f.readline()
    f.close()

    api_key = api_key.replace('\n', '')
    api_secret = api_secret.replace('\n', '')

    global exchange_rate

    try:
        client = Client(api_key, api_secret)
        market_currencies_o = client.get_exchange_rates()
        market_currencies_s = json.dumps(market_currencies_o)
        exchange_rate = json.loads(market_currencies_s)
        supported_currency = client.get_currencies() # get all the available currencies from coinbase
        exchange_rate_s = json.loads(json.dumps(supported_currency))

    except:
        print("An exception occurred")

    count = 0
    found = False

    curr = tuple() # the tuple which will be populated by currency pairs
    curr1 = tuple() # the tuple which will be populated by base currency
    usd = "USD" # populate the first base currency
    curr1+= (usd,)
    sell_buy = ''

    for key in exchange_rate_s['data']: # populate the exchange_name_dict
        id = key['id']
        name = key['name']
        obj_currency = {id:name}
        exchange_name_dict .update(obj_currency)

    for key in exchange_rate['rates']: # create a dictionary for id and rate

        id = key
        rate = exchange_rate['rates'][key]
        obj_currency = {id: rate}
        base_currency_dict.update(obj_currency)
        curr1 += (id,)

    curr, sell_buy = fill_display_exchange(count, curr, exchange_rate, found, sell_buy)

    # fill up the data for the search currency pair combo box
    preferPaired['values'] = curr
    preferPaired.current(0)  # select item one

    # fill up data for the base currency pair
    based['values'] = curr1
    based.current(0)

    text_widget.delete('1.0', END) # clear all those previous text first
    s.set(sell_buy)
    text_widget.insert(INSERT, s.get()) # display forex rate in text widget

def fill_display_exchange(count, curr, exchange_rate, found, sell_buy): # method used to get the search combo box value and display forex rate

    for key in exchange_rate['rates']:
        count += 1
        c_st = exchange_rate['currency'] + "/" + key
        curr = curr + (c_st,)  # add the search currency pairs
        for e_key in exchange_name_dict:
            if (e_key == key):
                sell_buy += str(count) + ".) Pair : " + exchange_rate['currency'] + "/" + key + " (" + \
                            exchange_name_dict[e_key] + ") : " + \
                            exchange_rate['rates'][key] + '\n'
                found = True
                break
        if (found == False):
            sell_buy += str(count) + ".) Pair : " + exchange_rate['currency'] + "/" + key + " : " + \
                        exchange_rate['rates'][key] + '\n'
        else:
            found = False
    return curr, sell_buy

def switch_currency(): # switch base currency

    sell_buy = ''
    count = 0
    found = False
    the_base_currency = based.get()
    curr = tuple()
    if(the_base_currency != '' and the_base_currency != "USD"):

        for key in exchange_rate['rates']:
            if (the_base_currency != key):
                count += 1
                c_st = the_base_currency + "/" + key
                curr = curr + (c_st,)  # add the currency pairs
                for e_key in exchange_name_dict:
                    if (e_key == key):
                        sell_buy += str(count) + ".) Pair : " + the_base_currency + "/" + key + " (" + \
                            exchange_name_dict[e_key] + ") : " + \
                            str((float(exchange_rate['rates'][key])/float(base_currency_dict[the_base_currency]))) + '\n'
                        found = True
                        break
                if (found == False):
                    sell_buy += str(count) + ".) Pair : " + the_base_currency + "/" + key + " : " + \
                        str((float(exchange_rate['rates'][key]) / float(base_currency_dict[the_base_currency]))) + '\n'
                else:
                    found = False

    elif(the_base_currency != '' and the_base_currency == "USD"):

        curr, sell_buy = fill_display_exchange(count, curr, exchange_rate, found, sell_buy)

    if(the_base_currency != ''):
        # fill up the data for the search currency pair combo box
        preferPaired['values'] = curr
        preferPaired.current(0)  # select item one

        text_widget.delete('1.0', END)  # clear all those previous text first
        s.set(sell_buy)
        text_widget.insert(INSERT, s.get()) # populate the text widget with new forex data

# create the base currency switch button and the find button
action_switch = tk.Button(selectorFrame, text="Switch", command=switch_currency) # button used to switch the base currency
action_switch.pack(side=LEFT)

action_vid = tk.Button(buttonFrame, text="Find", command=get_exchange_rate) # button used to find out the exchange rate of currency pair
action_vid.pack()

win.iconbitmap(r'ico.ico')
win.mainloop()

If you run the above python program this is what you will expect.

I have finished the basic of the Forex application which has these features: 1) Get the USD/word currency price 2) Switch the base currency 3) Search for any particular currency pair! pic.twitter.com/8XkOHs9w8P— TechLikin (@ChooWhei) March 5, 2019

Like, share or follow me on twitter. I have created another website just for the stock market, Forex and cryptocurrency software written in python today, if you like to develop an application to monitor the financial market then do join me through this link!



from Planet Python
via read more

No comments:

Post a Comment

TestDriven.io: Working with Static and Media Files in Django

This article looks at how to work with static and media files in a Django project, locally and in production. from Planet Python via read...