domenica 26 aprile 2020

APP IMMUNI - CONSIDERAZIONI PERSONALI

Dopo aver sentito l'analisi dell'avvocato Marisa Marraffino, esperta del Sole 24 Ore, l'app Immuni è peggio di quello che pensavo. L'avvocato, giustamente, illustra le leggi per la difesa di questi dati, ma il problema è la tecnologia e il sistema che sono fragili.
Bluetooth: questa tecnologia va ben oltre il metro o due, in spazi aperti si possono raggiungere i 20 metri senza problemi e quindi venir registrati sui dispositivi altrui anche senza essere nella "zona di contagio". Si può limitare l'onda del Bluetooth? Certo, in modo hardware. Dopo di che bisognerebbe andarsene a zonzo con il bluetooth sempre attivo e aperto alle connessioni: il bluetooth a livello di sicurezza è già pietoso, immaginate a lasciare un canale aperto.
Gli ID degli altri utenti sono salvati sul nostro cellulare... ok un ID non porta nome e cognome, ma sicuramente con se il macaddress del dispositivo. Il macaddress è un numero'identificativo hardware che ogni dispositivo costruito per le comunicazioni ha, in questo modo, nel caso di illeciti, si può risalire a chi l'ha fabbricato e da li a chi è stato venduto.
Ad un certo punto parla di 'Controllo umano', poichè l'algoritmo è molto complesso... il problema più grande della tecnologia al giorno d'oggi è seduto davanti al monitor del PC.
Poi parla di crittografia, server centrale e database, nel momento in cui iniziano ad esserci i primi presunti infetti, il server centrale raccoglie i dati e fa una crittografia, chiava privata e chiave pubblica di quell'ID sono conservati su database diversi ok, ma il server è sempre unico.
Non riporterà nome e cognome ok, ma il macaddress? Abbiamo già visto che da li si arriva a chi ha comprato cosa e quando.
Sempre nel centro dell'intervista parla di trattamento massivo dei dati: che la legge sia complicatissima su questa roba non c'è dubbio, ma una legge complessa non garantisce la sicurezza.
Altro termine interessante è PSEUDOANONIMIZZAZIONE, questo vuol dire che non è ANONIMIZZAZIONE dei dati.
Prima di tutto il pandemonio parlavano di installare trojan horse statali: siamo sicuri che non sia quello? 
Ponendo che l'APP venga fatta open source, e su questo ho dei dubbi, i sorgenti saranno effettivamente quelli reali? 
Non mi fido, non mi fido perchè tutti i politici si sono giocati la mia fiducia e credo anche quella di tantissimi altri italiani.

giovedì 23 aprile 2020

PYTHON - IA TRADING CONVERGENCE MACD

This AI is done to find convergences between MACD and prices. 
Work on Binance's SPOT databases. 
You can enter the data manually; decide to make the program work on a pre-set text file; can understand the trend automatically.

You can choose the analysis on three time frames: DAY, 4 hour and 30 minute. 
This program is open source and licensed under GNUGPL v.3. 
Together with the automatic PIVOT POINT program it can be a useful and daily support for your trading strategies.
If you want you can support my works by donating BTC, BAT or LINK or by going to this link.
Download divMacd

lunedì 20 aprile 2020

PYTHON - LE BASI DELLA PROGRAMMAZIONE

English translation after Italian. 

C'è chi cerca soluzioni di algoritmi e chi le basi per iniziare a programmare in python e il mio blog è ben lontano da fornire informazioni di questo tipo, dato il già esteso numero di siti e blog pieni delle basi, ma il pdf a questo link credo che sia un eccezzionale libro thinkpython_italian.pdf che bisogna avere.
Oltre che spiegare bene la sintassi, spiega anche la logica del programmatore, cosa da non sottovalutare: un programma, a differenza di tante altre cose, può funzionare anche se scritto male. 

Quando ho iniziato a studiare informatica alle superiori oltre cha valutare se il programma funzionava veniva fatto anche il calcolo computazionale di tale programma, poichè le risorse dei PC erano limitate; ai giorni nostri ci sono PC molto potenti e le grandi software house commerciali tendono a sfruttare questa potenza nello spreco, allenarsi a sfruttare la potenza del linguaggio per sfruttare al meglio, senza sprechi, la potenza del PC.
 Qualcuno potrebbe obiettare che a livello commerciale non conviene "perdere tempo" ad ottimizzare i programmi, e potrei anche dargli ragione, ma credo che per quello che si chiama "amor proprio" ottimizzare ogni programma è una grande soddisfazione.


There are those looking for algorithm solutions and those who have the basics to start programming in python and my blog is far from providing information of this type, given the already extensive number of sites and blogs full of bases, but the pdf to this link I think it is an exceptional thinkpython_italian.pdf book that you must have. 
In addition to explaining the syntax well, it also explains the programmer's logic, which should not be underestimated: a program, unlike many other things, can work even if written poorly. 
When I started studying computer science in high school, besides evaluating if the program worked, the computational calculation of this program was also done, as the PC resources were limited; nowadays there are very powerful PCs and the big commercial software houses tend to exploit this power in waste, train to exploit the power of language to make the best use, without waste, of the power of the PC. 
Some might argue that on a commercial level it is not convenient to "waste time" on optimizing programs, and I might even agree with it, but I believe that for what is called "self-love" optimizing each program is a great satisfaction.

domenica 19 aprile 2020

PYTHON - MACD ALGORITHM

MACD is a momentum indicator. This algorithm will search for the divergences between price and indicator independently. It will find the trend automatically and then look for convergence.
Here you can see the script that builds only the MACD.

The vectorMA function builds the two moving average lists that will be used to build the MACD.
def vettoreMA(dati,periodo):
    itad=[]
    vMediaINV=[]
    mediaFinale=[]
    i=len(dati)
    c=0
    prov=0
    conta=0
    while i >0 :
        itad.append(dati[c])
        c+=1
        i-=1
    long1=len(itad)//int(periodo)
    for i in range(len(itad)-int(periodo)):
        for c in range(periodo):
            prov=float(itad[i+c][4])+prov
        vMediaINV.append(prov/periodo)
        prov=0
    i=len(vMediaINV)
    c=0
    while i >0:
        mediaFinale.append(vMediaINV[c])
        c+=1
        i-=1
    return mediaFinale

def vettoreMACD(mediasmall,mediabig):
    macd=[]
    for i in range(len(mediabig)):
        macd.append(mediabig[i]-mediasmall[i])
    return macd

PYTHON IA BINANCE API PIVOT CALCULATOR V.2

In this new version there is the possibility to automatically calculate the Fibonacci levels between the levels where the price is located. 


If you like you can help me continue the research on my AI written in Python by donating crypto currencies or by donating here

You can download the software from this link: PivotCalculator. If you are interested in the sources contact me.

venerdì 17 aprile 2020

PYTHON BINANCE API TRADING IA - EXAMPLE

What is an AI BOT trading? It's a software that trades for you. We must build the logic of the trading system.

If you want to help me you can choose to send me crypto currencies to my addresses indicated on the right of the blog or make a donation on gofundme.
This is a very trivial example of AI for trading. It is based only on book order volumes and two moving averages over a 5 minute time frame. 
I am developing algorithms for the recognition of graphic patterns, the management of the MACD (an example of MACD is already present in this blog). 
The function of the Pivot Point is already automated: my Pivot Point algorithm decides which is the right candle from which to extrapolate all the resistances and supports as well as the p.p.(.exe program for Windows here).

from binance.client import Client
from binance.enums import *
import string
import time
import dateparser
import sys

def accesso():
    f=open('chiavi.dat','r') #text file : pubblicAPIkey-privateAPIkey
    rawkeys=f.read()
    f.close()
    k=rawkeys.split('-')
    cl=Client(api_key=k[0], api_secret=k[1])
    return cl

def ultimoPrezzo(cl,coppia):
    lP=0.0
    while True:
        try:
            vPrz=cl.get_all_tickers()
            break
        except:
            print("Ticker connection - error")
    for i in range(len(vPrz)):
        if vPrz[i]['symbol']==coppia.upper():
            lP=vPrz[i]['price']
    return lP

def verificaTF(cl,tf):
    ok=False
    while True:
        try:
            t = cl.get_server_time()
            break
        except:
            print("Server Time Error")
    ms=str(t['serverTime'])
    data=dateparser.parse(ms)
    data=str(data)
    oD=data.split(" ")
    orario=oD[1].split(":")
    if tf=='4H':
        i=0
        d=4
    elif tf=='30M':
        i=1
        d=30
    elif tf=='15M':
        i=1
        d=15
    elif tf=='5M':
        i=1
        d=5
    resto=float(orario[i])%d
    if resto==0 and (int(orario[2])==0):
        ok=True
        time.sleep(10)
    return ok,oD[1]

def book(cl,cp):
    bidsPrice=[]
    asksPrice=[]
    while True:
        try:
            libro = cl.get_order_book(symbol=cp.upper())
            break
        except:
            print("book connection - error")
    for i in range(len(libro)):
        sumBidsVol=float(libro['bids'][i][1])
        sumAsksVol=float(libro['asks'][i][1])
    for i in range(30):
        bidsPrice.append(float(libro['bids'][i][0]))
        asksPrice.append(float(libro['asks'][i][0]))
    return bidsPrice, asksPrice,sumBidsVol,sumAsksVol

def MA(dati,periodo):
    prezzi=[]
    for i in range(len(dati)):
        prezzi.append(float(dati[i]))
    ris=0
    for i in range(periodo):
        ris=ris+prezzi[i]
    ris=ris/periodo
    return ris

def recuperoPrezzi(cl,coppia):
    vPrezzi=[]
    while True:
        try:
            vTot=cl.get_klines(symbol=coppia.upper(), interval=Client.KLINE_INTERVAL_5MINUTE)
            break
        except:
            print("kLines errore")
    for i in range(len(vTot)):
        vPrezzi.append(vTot[i][4])
    return vPrezzi

def main(coppia,diff):
    cl=accesso()
    vP=recuperoPrezzi(cl,coppia)
    buy=False
    sell=False
    inOp=False
    while True:
        stampa,ora=verificaTF(cl,'5M')#5M 15M 30M 4H
        prezzo = ultimoPrezzo(cl,coppia)
        if stampa:
            print("Prezzo ",prezzo," - ",ora)
            ma3=MA(vP,3)
            ma14=MA(vP,14)
            print("MA3 ",ma3,"\nMA14 ",ma14)
            vP.append(prezzo)
            bidsP,asksP,sumBV,sumAV=book(cl,coppia)#asset name
            f=open("dati.dat","a")
            stringa=str(prezzo)+","+str(ma3)+","+str(ma14)+","+str(ora)+"\n"
            f.write(stringa)
            f.close()
            if ((float(sumBV)-float(sumAV)) > 0) and (ma3>ma14) and not(inOp):
                print("BUY ",prezzo," ",ora)
                prezzoB=prezzo
                buy=True
                inOp=True
                sell=False
            elif ((float(sumBV)-float(sumAV)) < 0) and (ma3<ma14) and not(inOp):
                prezzoS=prezzo
                print("SELL ",prezzo," ",ora)
                buy=False
                inOp=True
                sell=True
        if buy:
            prezzo=ultimoPrezzo(cl,coppia)
            if float(prezzo)>(float(prezzoB)+float(diff)) :
                print("Preso Buy ",prezzoB," ",prezzo," ",ora)
                f=open("operazioni.dat","a")
                stringa="Prezzo Buy "+str(prezzoB)+" uscita: "+str(float(prezzoB)+float(diff))+"\n"
                f.write(stringa)
                f.close()
                buy=False
                inOp=False
        if sell:
            prezzo=ultimoPrezzo(cl,coppia)
            if float(prezzo)<(float(prezzoS)-float(diff)):
                print("Preso sell ",prezzoS," ",prezzo," ",ora)
                f=open("operazioni.dat","a")
                stringa="Prezzo Sell "+str(prezzoS)+" uscita: "+str(float(prezzoS)-float(diff))+"\n"
                f.write(stringa)
                f.close()
                sell=False
                inOp=False
#name asset takeprofit
main(sys.argv[1],sys.argv[2])

Sorry, alittle mistake in def MA: replace this with the one in the main listing.
def MA(dati,periodo):
    ris=0
    i=len(dati)-1
    for c in range(periodo):
        prezzo=(float(dati[i]))
        ris=ris+prezzo
        i-=1
    ris=ris/periodo
    return ris

PYTHON - BINANCE API - PRINT THE LATEST PRICE AT EACH TIME FRAME

This Python script print the last price for each time frame. 
TIME FRAME: 4H 30M 15M 5M
COUPLE: all those on spot Binance

from binance.client import Client
from twisted.internet import reactor
from binance.enums import *
import string
import time
import dateparser
import sys

def accesso():
    f=open('chiavi.dat','r') #text file : pubblicAPIkey-privateAPIkey
    rawkeys=f.read()
    f.close()
    k=rawkeys.split('-')
    cl=Client(api_key=k[0], api_secret=k[1])
    return cl

def ultimoPrezzo(cl,coppia):
    lP=0.0
    vPrz=cl.get_all_tickers()
    for i in range(len(vPrz)):
        if vPrz[i]['symbol']==coppia.upper():
            lP=vPrz[i]['price']
    return lP

def verificaTF(cl,tf):
    ok=False
    t = cl.get_server_time()
    ms=str(t['serverTime'])
    data=dateparser.parse(ms)
    data=str(data)
    oD=data.split(" ")
    orario=oD[1].split(":")
    if tf=='4H':
        i=0
        d=4
    elif tf=='30M':
        i=1
        d=30
    elif tf=='15M':
        i=1
        d=15
    elif tf=='5M':
        i=1
        d=5
    resto=float(orario[i])%d
    if resto==0 and (int(orario[2])==0):
        ok=True
        time.sleep(10)
    return ok,oD[1]

client=accesso()
while True:
    stampa,ora=verificaTF(client,sys.argv[2])#5M 15M 30M 4H
    if stampa:
        prezzo = ultimoPrezzo(client,sys.argv[1])#asset name
        print(prezzo," ",ora)

You must make a text file containing: public key API binance (dash) -private key API binance. You don't have to type send at the end of the line. You have to save it as: chiavi.dat .
This program is part of the next AI Signal Bot that I am programming.

martedì 14 aprile 2020

PYTHON - TELEGRAM IA TRADING SIGNAL INDICATOR CRYPTOCOINS -

The first BOT written in Python for Telegram is ready. Currently it communicates the trend of the couple, the pivot point with graph, and the maximum lows (in the test phase). 
 If you want to be inserted in the Telegram channel you can write me an email. 
If you want to help me you can support me with gofundme, or by sending me BTC, BAT or LINK to the addresses on the side. 
Send me an email for more information. 
I hope soon to be able to leave the BOT active 24 hours a day 7 days a week. The next features will be: entry and exit prices for scalping, recognition of graphic patterns such as cup and head and shoulders, recognition of differences. 
Here is the list of the main program of the bot with the Telegram API.
import time
import telepot
from pprint import pprint
import trFunz
import utils
import os
import sys
import keys

def handle(msg):
    content_type, chat_type, chat_id = telepot.glance(msg)
    if content_type == 'text':
        txt=msg['text']
        if txt.startswith('/help'):
            bot.sendMessage(chat_id,'Bot analizzatore di trading su crypto valute presenti sull\'exchange Binance')
            help=utils.archivioR("txt/help.bot")
            bot.sendMessage(chat_id,help)
        if txt.startswith('/email'):
            params=txt.split()
            if len(params) == 1:
                bot.sendMessage(chat_id,'Ti saranno inviate email con segnali di trading sulla coppia voluta\n/email  ')
            else:
                try:
                    dati=params[1]+","+params[2]+"\n"
                    utils.archivio('txt/email.bot','a',dati)
                    bot.sendMessage(chat_id,'Eseguito')
                except:
                    bot.sendMessage(chat_id,'Errore nel passaggio dei parametri')
        if txt.startswith('/pivot'):
            params = txt.split()
            if len(params) == 1:
                bot.sendMessage(chat_id, 'Uso: /pivot    Calcola il Pivot Point in automatico  DAY/4H')
            else:
                try:
                    client=utils.accesso()
                    print (params[1])
                    print (params[2])
                    coppia=params[1].upper()
                    periodo=int(params[2])
                    tf=params[3].upper()
                    print(tf)
                    bot.sendMessage(chat_id,(trFunz.calcPP(client,coppia,periodo,tf)))
                    bot.sendPhoto(chat_id, photo=open('img/pp.png', 'rb'))
                except:
                    bot.sendMessage(chat_id, 'Errore nei parametri')
        if txt.startswith('/trend'):
            params = txt.split()
            if len(params) == 1:
                bot.sendMessage(chat_id,'Uso: /trend   rileva il trend con le medie mobili')
            else:
                try:
                    client=utils.accesso()
                    coppia=params[1].upper()
                    term=params[2].upper()
                    trend=trFunz.scopriTrend(client,coppia,term,200)
                    trend=coppia+" "+trend
                    bot.sendMessage(chat_id,trend)
                except:
                    bot.sendMessage(chat_id,'Errore nei parametri')
        if txt.startswith('/ph'):
            bot.sendPhoto(chat_id, photo=open('img/test.png', 'rb'))
        if txt.startswith('/mm'):
            params = txt.split()
            if len(params) == 1:
                bot.sendMessage(chat_id,'Uso: /mm      Trova i massimi ed i minimi nel periodo n.giorni indicato. MAXVAL: il valore di soglia sotto il quale si vogliono trovare i minimi oppure per scelta automatica digitare \'a\'. N.DEC numero di decimali desiderati dopo la virgola.\nACorHL: 0 per lavorare su prezzi apertura/chiusura, 1 per lavorare su prezzi high/low')
            else:
                try:
                    client=utils.accesso()
                    giorni=int(params[1])
                    print(giorni)
                    coppia=params[2].upper()
                    print(coppia)
                    maxval=params[3]
                    print(maxval)
                    ndec=params[4]
                    print(ndec)
                    ACHL=int(params[5])
                    vMax,vmin=trFunz.minemax(client,giorni,coppia,maxval,ndec,ACHL)
                    bot.sendMessage(chat_id,'Massimi:'+str(vMax))
                    bot.sendMessage(chat_id,'Minimi:'+str(vmin))
                except:
                    bot.sendMessage(chat_id,'Errore nei parametri')

TOKEN = keys.Token
bot = telepot.Bot(TOKEN)
response = bot.getUpdates()
pprint(response)
bot.message_loop(handle)
print ('Listening ...')
while 1:
    time.sleep(20)

sabato 11 aprile 2020

PYTHON BINANCE API - HOW TO MAKE: A LIST OF SMA and MACD

This little python script uses the Binance API.
The customer position is opened to access the data.
Data on the chosen pair are retrieved in the chosen time frame.
The moving average vector is constructed.
The macd vector is constructed.
The macd vector is drawn.
As always if you like the blog you can help me by going on by donating BTC, Link, BAT or by donating through gofundme.
from binance.client import Client
from twisted.internet import reactor
from binance.enums import *
import matplotlib.pyplot as plt
import dateparser

def recuperoDati(coppia,tf):
    f=open('chiavi.dat')
    #esempio di chiavi.dat file: chiavepubblicabinance-chiaveprivatabinance
    #tra le due chiavi deve esserci '-' senza spazi, alla fine della riga non
    #deve essere battuto invio
    rawkeys=f.read()
    f.close()
    k=rawkeys.split('-')
    client=Client(api_key=k[0], api_secret=k[1])
    if tf=='DAY':
        rawData=client.get_klines(symbol=coppia, interval=client.KLINE_INTERVAL_1DAY)
    elif tf=='4H':
        rawData=client.get_klines(symbol=coppia, interval=client.KLINE_INTERVAL_4HOUR)
    elif tf=='30M':
        rawData=client.get_klines(symbol=coppia, interval=client.KLINE_INTERVAL_30MINUTE)
    elif tf=='15M':
        rawData=client.get_klines(symbol=coppia, interval=client.KLINE_INTERVAL_15MINUTE)
    elif tf=='5M':
        rawData=client.get_klines(symbol=coppia, interval=client.KLINE_INTERVAL_5MINUTE)
    return rawData

def vettoreMA(dati,periodo):
    itad=[]
    vMediaINV=[]
    mediaFinale=[]
    i=len(dati)
    c=0
    prov=0
    conta=0
    while i >0 :
        itad.append(dati[c])
        c+=1
        i-=1
    long1=len(itad)//int(periodo)
    for i in range(len(itad)-int(periodo)):
        for c in range(periodo):
            prov=float(itad[i+c][4])+prov
        vMediaINV.append(prov/periodo)
        prov=0
    i=len(vMediaINV)
    c=0
    while i >0:
        mediaFinale.append(vMediaINV[c])
        c+=1
        i-=1
    return mediaFinale

def vettoreMACD(mediasmall,mediabig):
    macd=[]
    for i in range(len(mediabig)):
        macd.append(mediabig[i]-mediasmall[i])
    return macd

def asseX(l,dati):
    x=[]
    for i in range(l):
        data=dateparser.parse(str(dati[i][0]))
        data=str(data)
        oD=data.split(" ")
        x.append(oD[0])
    return x

rawData=recuperoDati('BATUSDT','DAY')
ms=vettoreMA(rawData,12)
mb=vettoreMA(rawData,26)
macd=vettoreMACD(ms,mb)
x=asseX(len(macd),rawData)
fig=plt.figure(figsize=(20,17))
plt.plot(x, macd, color = 'black')
plt.show()

giovedì 9 aprile 2020

PYTHON API BINANCE - IA - PIVOT POINT AUTOMATIC -

BOT trading for crypto currencies based on Binance API. The pivot point is automatically calculated on the last important candle of the selected time frame, over the chosen days. The candle is selected based on its amplitude and volume. The results are printed on the monitor and on a graph.


BOT di trading per crypto valute basato su Binance API. Il pivot point viene calcolato in automatico sull'ultima candela importante del time frame selezionato, nell'arco dei giorni scelti. La candela viene selezionata in base all'ampiezza e il volume. I risultati sono stampati a monitor e su grafico.


You can download the zip of the executable file on windows from this link
Puoi scaricare lo zip del file eseguibile su windows da questo link:  Pivot Calc






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)

Incapacità delle istituzioni di comunicare con i cittadini

Stiamo nel piccolo: comune di Parma (e stendiamo un velo pietoso sull'interfaccia INPS che è come sparare sulla croce rossa)
Ho fatto un piacere: compilazione modulo richiesta buoni spesa.
Qui il link dove scaricare acrobat reader: https://get.adobe.com/it/reader/ e seguire le istruzioni leggendo attentamente, è semplice, basta fare le cose con calma (sempre se il vostro PC è aggiornato altrimenti non funziona, è qui l'inghippo)
Per poter accedere ai buoni spesa si arriva ad un punto in cui bisogna scaricare un modulo in pdf precompilato dall'utente tramite la pagina web, poi bisogna aprire il modulo pdf ed inserire: n. di persone del nucleo famigliare, e flaggare 5 caselle... 
Allora per poter fare ciò bisogna scaricare l'ultimo Adobe Reader aggiornato ed installarlo.
Dopo di che, si compila il modulo e poi lo si ricarica sul sito e si procede.
La mia domanda è: se ho compilato campi "complessi" come codice fiscale, nome e cognome, via ecc ecc sul web, perchè per mettere un numero (n. di persone nel nucleo famigliare) e la possibilità di flaggare, cioè cliccare con il mouse per mettere una spunta, cinque voci, mi devi far scaricare il modulo e tutto ciò che ne deriva?
La mia risposta è questa: menefreghismo. 
Fondamentalmente le società che lavorano per le infrastrutture tecnologiche del bel paese Italia, se ne fregano di dare comodità all'utente finale e questo succede perchè le istituzioni stesse se ne fregano dei cittadini.
Non trovo nemmeno etico obbligare le persone a scaricare programmi proprietari, anche se gratuiti, sui propri personal computer.
Con questo virus stiamo scoprendo che il marcio ed il menefreghismo è ben presente anche nelle infrastrutture tecnologiche, e non pensate che sia roba da poco nel 2020.

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 - FOGLI CSV E MATRICI

Fogli CSV - programmi come Excel e Calc di Open Office, possono salvare i loro dati in fogli tipo CSV e caricare dati da fogli CSV, che non sono altro che file di testo.
Qui di seguito la costruzione di un CSV da una matrice e poi la trasformazione da CSV a matrice.

 '''
Da matrice a foglio.csv
'''
m=[['abc','def','ghi'],['abc','  ','ghi'],['  ','def','  ']]
f=open("foglio.csv","w")
for i in range(len(m)):
        for c in range(len(m[i])):
            f.write((m[i][c]+","))
        f.write("\n")
f.close()
f=open("foglio.csv","r")
fg=f.read()
f.close()
print("Il file CSV appena fatto: ")
print(fg)
nr=1
'''
Da foglio csv a matrice
'''
f=open("foglio.csv","r")
m=[]
for linea in f.readlines():
    col=linea.split(",")
    #eliminazione \n
    col = [item for item in col if item not in ['\n']]
    m.append(col)
f.close()
print("La matrice ottenuta dal foglio CSV\n")
print(m) 

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

PYTHON - DA MATPLOTLIB A FILE IMMAGINE

Matplotlib è il modulo python che ci permette di ottenere dei grafici dopo le elaborazioni di Python.
Tramite un semplice comando si può ottenere il file immagine salvato su hdd.

import matplotlib.pyplot as plt

plt.plot(range(10))
plt.savefig('testplot.png')
plt.show()
Questo script salva il grafico e poi lo mostra. ATTENZIONE, se volete salvare l'immagine dovete sempre farlo prima del plt.show() altrimenti otterete solo il riquadro bianco

Prossimamente arriverà anche qualche hack per matplotlib.

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")


FLICKR E IL NON DOWNLOAD IMBROGLIONE!

Flickr non è più gratuito come una volta, e capisco che lo spazio su server sia caro, quindi Flickr è diventato a pagamento.
Finchè era gratuito tutto va bene...
Ma ora no.
C'è la possibilità di bloccare il download delle foto da Flickr, presumo che alcuni utenti si sentano tranquilli davanti a questo blocco... peccato che è fittizio.
Aprite il vostro browser Firefox, andate su Flickr, trovate una foto che vi piace.
Andate a cliccare sul download, si aprirà una pagina con tutta la selezione delle foto.
Se il download è bloccato ci sarà questa scritta:

Download The owner has disabled downloading of their photos

Bene, scegliete la dimensione della foto che volete.
Click destro con il mouse, scegliere dal menu a tendina: Salva pagina con nome
Dategli un nome. Selezionate salva come pagina web completa.

Andate dove avete scaricato il file, ci sarà presente anche un cartella che inizia con lo stesso nome del file: all'interno della cartella c'è il file.jpg (la fotografia) che l'utente non voleva far scaricare, che flickr gli ha detto "No, impedisco lo scarico" e che ehm si può scaricare.

Per correttezza invito tutti a non scaricare le immagini di altri senza il loro consenso.
Per correttezza mi sembra giusto far notare a tutti questo "lieve" difetto.

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

PYTHON - DOWNLOAD FILE DAL WEB - URLIB.REQUEST

Si può utilizzare wget, ma si tratta sempre di usare applicazioni fatte da altri.
Si potrebbe importare wget l'API per python, ma magari non ce n'è bisogno di tutte le sue funzionalità.
Poche righe di codice:

import urllib.request

url=sys.argv[1] #indirizzo web
nomedelfile=sys.argv[2] #nome del file

print('Download del file...')
urllib.request.urlretrieve(url, nomedelfile)

DDNS e INPS

Oggi partiva il giorno delle richieste all'inps per i 600 euro promessi alle p.iva italiane.
Ovviamente il sito è collassato e, hanno dato la colpa agli hacker per questo collasso...
IMO
Con la situazione attuale, in cui siamo in merda, la semplice richiesta di utenti normali al sito dell'INPS ha generato un DDNS.
 L'unico problema vero in tutta questa storia sono stati i metodi di (dis)informazione utilizzati per comunicare con la popolazione.