Visualizzazione post con etichetta programmazione. Mostra tutti i post
Visualizzazione post con etichetta programmazione. Mostra tutti i post

giovedì 8 aprile 2021

PYTHON - Light database from json file

 A very light textual database, very simple and basic. 

Download the two files maker.py and lightdb.py in the same directory. Run lightdb.py to build the database on a json file. Then there is the possibility to add data directly from lightdb or you can build a .py file that will serve to manage the database. There is also the possibility to transform the json file into an excel file.

 You can download  the file from repo on github: lightdb

domenica 21 marzo 2021

PYTHON and CURSES - Stupid text editor

I needed a light and simple text editor.
Sometimes I need to write micro programs in python or batch, with this little script I solved my problem.
How to use:
py ste.py "filename I want to save"
import sys,os
import curses
#ste : simple(or stupid) text editor

def editor(stdscr):
k = 0
h = 0
cursor_x = 0
cursor_y = 0
stdscr.clear()
stdscr.refresh()
curses.start_color()
curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE)
curses.init_pair(2, curses.COLOR_GREEN, curses.COLOR_BLACK)
while (True):
height, width = stdscr.getmaxyx()
if k == curses.KEY_DOWN:
cursor_y += 1
elif k == curses.KEY_UP:
cursor_y -= 1
elif k == curses.KEY_RIGHT:
cursor_x += 1
elif k == curses.KEY_LEFT:
cursor_x -= 1
elif k == 10: #ENTER
cursor_x=1
cursor_y+=1
h=cursor_y
elif k == 9: #tab
cursor_x = cursor_x +3
elif k == 265: #F1
break
elif k == 266: #
stringa=''
outstr=''
f=open(sys.argv[1],"wb+")
for i in range(h+1):
outstr=stdscr.instr(i, 1) #Read the screen
f.write(outstr)
acapo='\n'
f.write(acapo.encode())
f.close()
else:
stdscr.attron(curses.color_pair(2))
curses.echo()
cursor_x = cursor_x+1
cursor_x = max(0, cursor_x)
cursor_x = min(width-1, cursor_x)
cursor_y = max(0, cursor_y)
cursor_y = min(height-1, cursor_y)
statusbarstr = "Press 'F1' to exit | 'F2' to save | https://danieleporcaripython.blogspot.com"
stdscr.attron(curses.color_pair(1))
stdscr.addstr(height-1, 0, statusbarstr)
stdscr.addstr(height-1, len(statusbarstr), " " * (width - len(statusbarstr) - 1))
stdscr.attroff(curses.color_pair(1))
stdscr.move(cursor_y, cursor_x)
stdscr.refresh()
stdscr.attron(curses.color_pair(2))
k = stdscr.getch()

def main():
curses.wrapper(editor)

if __name__ == "__main__":
main()

mercoledì 8 aprile 2020

PYTHON SOCKET SEMPLICE SERVER E CLIENT

I due script scaricabili in pacchetto zip ECHO CLIENT E SERVER

Un semplice server e client programmati con python.
Si lancia il server, poi si lancia il client.
Una introduzione alla gestione dei socket con python, molto simile ovviamente alla programmazione in C. Funziona su windows, per macchine Unix like o Mac non è stato testato.

lunedì 6 aprile 2020

PYTHON - PROCEDURA RICORSIVA CON ESEMPIO DELLA POTENZA MATEMATICA

La ricorsione è una procedura che chiama se stessa. Molte formule matematiche utilizzano la ricorsività e anche alcuni algoritmi, tra i quali cito il famoso Quick Sort.

import sys

def potenza(b,e):
    if e==0:
        return 1
    else:
        return b * potenza(b, e-1)

print(potenza(int(sys.argv[1]),int(sys.argv[2])))

Sette righe e la potenza è calcolata. Ciao

domenica 5 aprile 2020

PYTHON - EMAIL SENDER CON FOGLIO CSV

Inviare email leggendo da un file oggetto, email e contenuto.

import smtplib
from email.mime.text import MIMEText
import emailAccount
'''
Esempio di file emailAccount.py da salvare nella stessa directory di questo
script
popserver = 'poptuoserver'
popport = 995
server = 'smtptuoserver'
porta=465
username='mio@username'
password='lapassword'
mitt='mio@indirizzoemail'
'''
import time
import sys

def leggiFoglioCSV(nomeF):
    f=open(nomeF,"r")
    m=[]
    for linea in f.readlines():
        col=linea.split(",")
        col = [item for item in col if item not in ['\n']]
        m.append(col)
    f.close()
    return m

def sendEmail2(oggetto,dest,contenuto):
    #              server SMTP del tuo gestore #porta del server
    email=smtplib.SMTP_SSL(emailAccount.server,emailAccount.porta)
    email.ehlo()
    #           il tuo account        #la tua password
    email.login(emailAccount.username,emailAccount.password)
    email.ehlo()
    print("Invio")
    msg=MIMEText(contenuto,'html','utf-8')
    msg['Subject']=oggetto
    msg['From']=emailAccount.mitt
    msg['To']=dest
    email.sendmail(emailAccount.mitt,dest,msg.as_string())
    email.quit

def spedisciEmail(nomeLista):
    lista=leggiFoglioCSV(nomeLista)
    for i in range(len(lista)):
        try:
            sendEmail2(lista[i][0],lista[i][1],lista[i][2])
            print("Email a: ",lista[i][1]," inviata")
        except smtplib.SMTPRecipientsRefused:
            print("Email a: ",lista[i][1]," non inviata. Indirizzo sbagliato")
'''
Il foglio CSV deve essere composto da tre colonne
oggetto,email destinatario,contenuto dell'email
Puoi fare anche un semplice file di testo scritto con blocco note.
Esempio
oggetto,email@email.email,contenuto del messaggio
oggetto2,email2@email.email, contenuto del messaggio
'''
spedisciEmail(sys.argv[1])

Semplice e funzionale come sempre. Come si usa: python script.py nomedelfile.csv
Se ti piace il blog dona, in alto a destra i miei indirizzi criptovalute.

MATRICI - COSTRUIRE MATRICI VUOTE

TRIS qui puoi scaricare gli script completi


Qui la funzione per costruire una matrice vuota, senza usare numpy, ma utilizzando due cicli while annidati e .append che abbiamo già visto per costruire vettori vuoti.
def nMatr(x,y):
    matrice=[]
    i=0
    c=0
    while i < y:
      a=[]
      while c < x:
        a.append(c)
        c+=1
      matrice.append(a)
      i+=1
      c=0
    return matrice

Basta passare alla funzione il numero di righe e colonne per avere la matrice pronta.
Per usarla:
matrice=nMatr(r,c)

sabato 4 aprile 2020

PYTHON MODULI PERSONALIZZATI

Tramite import possiamo importare le nostre funzioni da altri file. I file per import sono altri programmi python che contengono variabili, funzioni, valori statici. Salviamo nel file modulo.py il prossimo listato:

def calc(arg1,operatore,arg2):

    if operatore=="+":

        risultato=arg1+arg2

    elif operatore=="-":

        risultato=arg1-arg2

    elif operatore=="*":

        risultato=arg1*arg2

    elif operatore=="/":

        risultato=arg1/arg2

    return risultato

Per usare la funzione calc ora dovremo richiamarla nel programma principale:

import sys
import modulo

risultato=modulo.calc(int(sys.argv[1]),sys.argv[2],int(sys.argv[3]))
print("= ",risultato)
richiamiamo la funzione calc in questo modo: modulo.calc(...)



PYTHON - API BINANCE: BUY/SELL AUTOMATICO

Potete scaricare il pacchetto zippato dei sorgenti da qui
Per utilizzarlo bisogna avere PYTHON installato insieme alle API BINANCE
Se vuoi sapere come installare python e API Binance lascia un commento.

Cosa fa questo script?
Al momento l'exchange Binance, sulla parte SPOT, non permette di settare dei take profit automatici, quindi questo script, sulle tue indicazioni di prezzo e quantità, piazza l'ordine e una volta eseguito piazza il contr'ordine di pari quantità.

Esempio:
voglio comprare sulla coppia BTC/USDT una quantità di BTC pari a 0.01 al volore
di 6000 USDT e rivendere la stessa quantità a 6100 USDT

> Coppia: btcusdt
> Ordine[BUY] or [SELL]: buy
> Prezzo di ingresso: 6000
> Prezzo di uscita: 6100
> Quantità: 0.01

fatto questo lo script piazza l'ordine, una volta che l'ordine è FILLED,
piazza l'ordine inverso, nel nostro caso un sell limit, e manda una email.
Perchè tutto funzioni correttamente il programma deve rimanere connesso al
server Binance.

Ricorda, se ti piace DONA e condividi il mio blog




venerdì 3 aprile 2020

LE FUNZIONI

Parola per definire la funzione: def
ritorno dei valori tramite return
una funzione può ritornare anche più valori o nemmeno uno

import sys



#definizione di una funzione

def calc(arg1,operatore,arg2):

    if operatore=="+":

        risultato=arg1+arg2

    elif operatore=="-":

        risultato=arg1-arg2

    elif operatore=="*":

        risultato=arg1*arg2

    elif operatore=="/":

        risultato=arg1/arg2

    return risultato



#programma principale

risultato=calc(int(sys.argv[1]),sys.argv[2],int(sys.argv[3]))

print("= ",risultato)



INPUT DA RIGA DI COMANDO

PASSARE ARGOMENTI DA RIGA DI COMANDO

#importazione di un modulo esterno
import sys
#input da linea di comando
print ("Nome dello script: ", sys.argv[0])
print ("Numero degli argomenti: ", len(sys.argv))
print ("Argomenti: " , str(sys.argv))
for i in range(len(sys.argv)):
    print(sys.argv[i])

Qui abbiamo anche importato il modulo sys tramite la parola import

giovedì 2 aprile 2020

IF ELIF ELSE - SCELTE MULTIPLE

Scelte multiple in python con IF ELIF ELSE

''' selezioni multiple IF ELIF ELSE '''

while True:

    scelta=input("Immetti la tua scelta 1 2 3 e ")

    if (scelta=='1'):

        print("Hai digitato 1")

    elif (scelta=='2'):

        print("Hai digitato 2")

    elif (scelta=='3'):

        print("Hai digitato 3")

    elif (scelta=='e'):

        print("Ciao")

        break

    else:

        print("Non hai digitato nessuna scelta permessa")


mercoledì 1 aprile 2020

PYTHON - MASSIMI MASSIMI e MINIMI MINIMI - PROGRAMMAZIONE TRADING

Avevo bisogno di scoprire i MASSIMI di una serie di dati disordinati e tutti i MINIMI della stessa serie. Nel trading l'individuazione dei massimi e dei minimi è di fondamentale importanza. 

'''
RICERCA DEI MASSIMI IN UN VETTORE DISORDINATO
RICERCA DEI MINIMI IN UN VETTORE DISORDINATO
di PORCARI DANIELE
'''
import sys

def trovaMassimi(v):
    m=[]
    max=0
    for i in range(len(v)):
        try:
            if v[i]>max and v[i]>v[i+1]:
                m.append(v[i])
                max=v[i+1]
        except:
            if v[i]>max:
                m.append(v[i])
    return m

def trovaMinimi(v,min):
    m=[]
    for i in range(len(v)):
        try:
            if v[i]<min and v[i]<v[i+1]:
                m.append(v[i])
                min=v[i+1]
        except:
            if v[i]<min:
                m.append(v[i])
    return m

v=[10,2,5,3,3,1,2,1,4,6,2,3,2,7,13]
if len(sys.argv)>0:
    min=float(sys.argv[1])
else:
    min=20
m=trovaMassimi(v)
print (m)
m=trovaMinimi(v,min)
print (m)
L'output sono due liste: una contenente tutti i MASSIMI, l'altra tutti i MINIMI. Un MASSIMO è un dato contenuto tra almeno due dati più bassi. Un MINIMO è un dato contenuto tra almeno due dati più alti. Se vi piace il blog e le soluzioni le donazioni in BTC,USDT o LINK sono le benvenute.

CICLI FOR - WHILE - CONDIZIONE IF

FOR WHILE e IF
Per andare avanti con le basi di Python

array=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

print("Lunghezza :"+str(len(array)))

#ciclo for : finchè i è dentro alla lunghezza di array

#i si autoincrementa

for i in range(len(array)):

    print(array[i]," - ", i)

#a sinistra i valori dell'array

#a destra i valori di i

#SI CONTA DA 0 IN POI !!!

i=0

while i<len(array): #ATTENZIONE < non <=

    print(array[i]," - ", i)

    i=i+1

#se vuoi uscire dal ciclo quando hai trovato

#la condizione che ti soddisfa

condizione=5

i=0

while True:

    if (array[i]==condizione):

        print("Trovato ",condizione)

        break #termina il ciclo

    i+=1 #abbreviazione di i=i+1

''' c'è il rischio di mandare in crash

il programma se lacondizione non è presente

allora mettiamo una sicurezza : gestione errore

'''

i=0

condizione=20 #non è nella nostra lista

while True:

    try:

        if (array[i]==condizione):

            print("Trovato ",condizione)

            break #termina il ciclo

        i+=1

    except:

        print("Il numero ",condizione," non è presente")

        break

martedì 31 marzo 2020

PYTHON LE BASI

''' CON # commento UNA SOLA RIGA CON LE TRE VIRGOLETTE
APRO I COMMENTI E LI CHIUDO SU MULTI LINEA
'''

a=5 #integer
b='6' #stringa
c=a+int(b) #trasformo la stringa b in numero integer
#posso stampare a video così
print (str(a)+" + "+ b +" = "+str(c))
#oppure così
print(a," + " + b + " = ",c)
#se faccio questo assegnamento
d=a," + " + b + " = ",c
print (d)
#ottengo una lista
print (d[0])
print (d[1]) #guarda bene questo
print (d[2])
#ma se faccio questo assegnamento
d=str(a)+" + "+ b +" = "+str(c)
print (d)
#ottengo una stringa
str(variabile) trasforma da numero a stringa int(variabile) trasforma la stringa in valore integer float(variabile) trasforma la stringa in valore con virgola mobile

PYTHON - TRASFORMAZIONE MILLI SECONDI IN DATA

PYTHON e BINANCE API
Binance rilascia le date in millisecondi, per renderle capibili basta importare dateparser.
File di esempio

from binance.client import Client
from binance.enums import *
import sys
import keys #un file contenente le chiavi Binance Pkeys la pubblica / Skeys la privata
import dateparser #per il parsing della data
'''
Trasformazione dei milli secondi in data e ora umanamente
capibili
'''
client=Client(api_key=keys.Pkeys, api_secret=keys.Skeys)
v=client.get_klines(symbol=sys.argv[1], interval=client.KLINE_INTERVAL_1DAY)
for i in range(len(v)):
    data=dateparser.parse(str(v[i][0]))#passaggio del valore in millisecondi
    data=str(data)#trasformo il tutto in stringa
    oD=data.split(" ")#splitto la stringa con lo spazio
    #oD è una lista composta da oD[0] e oD[1]
    print(oD[0],v[i][1],v[i][4])

L'esempio qui sopra riportato funziona solo se avete le chiavi per le API Binance.

lunedì 30 marzo 2020

PYTHON - DIZIONARIO - LISTA - VETTORE

Il dizionario raccoglie valori diversi, non ordinati, e tipi diversi. Al suo interno possono esserci liste. Adoro il dizionario e le sue potenzialità.
dizionario = {"chiave": "valore", "età": 24, 3.14: "pi_greco", "numeri": [1, 2, 3]}

print(dizionario['chiave'])

print(dizionario[3.14])

print(dizionario['numeri'][0])
print(dizionario['numeri'][1])
print(dizionario['numeri'][2])
Mi sembra chiaro no?

domenica 29 marzo 2020

PYHTON - ALGORITMO RICERCA PATTERN DI PREZZO

Elaborare algoritmi che valutano numeri è semplice.
Valutazione sui prezzi, sui tempi ciclici.
Valutare la formazione di figure quali tazze, testa e spalle e triangoli è un po' più complesso.
Un abbozzo di una prima soluzione:

'''ricerca del pattern tazza
programmazione per trading
soluzione algoritmica
di Porcari Daniele '''

vettorePrezziMedi=[45,42,41,24,22,25,18,15,21,22,38,44]
 
#divido il vettore in due con //
primaP=len(vettorePrezziMedi)//2
secP=len(vettorePrezziMedi)-primaP
#la prima parte deve essere discendente
#la seconda parte ascendente
max=vettorePrezziMedi[0]
discesa=False
print(max)
i=1
print(vettorePrezziMedi[i])
while i < primaP:
    if vettorePrezziMedi[i]<max:
        print(vettorePrezziMedi[i])
        discesa=True
    else:
        discesa=False
        break
    i+=1
if discesa:
    print("Discesa")
max=vettorePrezziMedi[len(vettorePrezziMedi)-1]
print(max)
salita=False
i=primaP
print(i)
print(vettorePrezziMedi[i])
while i < secP+primaP-1:
    if vettorePrezziMedi[i]<max:
        print(vettorePrezziMedi[i])
        salita=True
    else:
        salita=False
        break
    i+=1
if salita:
    print("salita")
if discesa==True and salita==True:
    print("Possibile tazza")
else:
    print("Tazza non trovata")

import matplotlib.pyplot as plt
x=[]
for i in range(len(vettorePrezziMedi)):
    x.append(i)
plt.plot(x, vettorePrezziMedi, marker = "o", color = 'red')
plt.show()


PYTHON?

Usare Python perchè si può fare qualsiasi cosa, grazie ai suoi moduli e alla sua portabilità.
Software open source adatto a qualsiasi tipo di sviluppo.

PYTHON - DECIDERE I DECIMALI IN MODO DINAMICO

Abbiamo visto come decidere i decimali dopo la virgola tramite l'uso :
"{0:.2f}".format(variabile)
in una stringa.
A volte però può essere comodo avere una decisione dinamica dei decimali.
Ecco la soluzione:

import sys
import modulo

modulo.controllo(sys.argv)
risultato=modulo.calc(float(sys.argv[1]),sys.argv[2],float(sys.argv[3]))
#definiamo la precisione dei decimali dopo la virgola in modo dinamico
#costruzione delle stringa
dec="{0:."+str(sys.argv[4])+"f}"
#somma della stringa alla stringa in print e il .format(risultato)
print("= "+dec.format(risultato))
Puoi scaricare il listato e il modulo modulo.py da questo LINK.

FLOAT - DECIMALI IN ORDINE E NON A GREGGE IN PYTHON

Il numero reale FLOAT in output è molto libero, ma se vogliamo avere un output pulito ?
Ecco risolto:

''' Decimali limitati dopo la virgola nei numeri float '''
a=23.4
b=17.3
c=a/b
print ("Risultato:",c)
#2 cifre dopo la virgola
print ("Risultato: {0:.2f}".format(float(c)))
#5 cifre dopo la virgola
print ("Risultato: {0:.5f}".format(float(c)))