C#: SIMULAZIONE CURVA DEI PREZZI (RANDOM WALK)
using System;
using System.Drawing;
using System.Windows.Forms;
namespace WinFormsApp4
{
public partial class Form1 : Form
{
private Panel panelGrafico;
public Form1()
{
InitializeComponent();
InitializeGrafico();
}
private void InitializeGrafico()
{
panelGrafico = new Panel();
panelGrafico.Dock = DockStyle.Fill;
Controls.Add(panelGrafico);
}
private void button1_Click(object sender, EventArgs e)
{
// Impostazioni per la serie storica
int lunghezzaSerie = 50; // Lunghezza della serie storica
int valoreIniziale = 100; // Valore iniziale della random walk
// Generazione dei dati per la serie storica
Random random = new Random();
double[] dati = new double[lunghezzaSerie];
dati[0] = valoreIniziale; // Imposta il primo valore
for (int i = 1; i < lunghezzaSerie; i++)
{
// Incremento casuale per la random walk
int incremento = random.Next(-10, 11); // Incremento casuale compreso tra -10 e 10
// Calcola il nuovo valore basato sul valore precedente e sull'incremento
dati[i] = dati[i - 1] + incremento;
// Assicura che il valore sia compreso tra 0 e 200
dati[i] = Math.Max(0, Math.Min(200, dati[i]));
}
// Disegno del grafico
panelGrafico.Paint += (s, args) =>
{
// Calcolo delle dimensioni del grafico
int margineSinistro = 50;
int margineDestro = 50;
int margineSuperiore = 50;
int margineInferiore = 50;
int larghezzaGrafico = panelGrafico.Width - margineSinistro - margineDestro;
int altezzaGrafico = panelGrafico.Height - margineSuperiore - margineInferiore;
// Calcolo dello spazio tra ciascun punto lungo l'asse x
float spazioPunti = (float)larghezzaGrafico / (lunghezzaSerie - 1);
// Calcolo dello spazio tra i valori sull'asse y
float spazioValoriY = 5;
// Disegno dell'asse x
args.Graphics.DrawLine(Pens.Black, margineSinistro, panelGrafico.Height - margineInferiore, panelGrafico.Width - margineDestro, panelGrafico.Height - margineInferiore);
args.Graphics.DrawString("Mesi", DefaultFont, Brushes.Black, panelGrafico.Width - margineDestro - 30, panelGrafico.Height - margineInferiore + 10);
// Disegno dell'asse y e dei valori
for (int i = 0; i <= 200; i += 15)
{
float y = panelGrafico.Height - margineInferiore - (i - 0) * (altezzaGrafico / (float)(200 - 0));
args.Graphics.DrawLine(Pens.Black, margineSinistro, y, margineSinistro - 5, y);
args.Graphics.DrawString(i.ToString(), DefaultFont, Brushes.Black, margineSinistro - 40, y - 7);
}
// Disegno della serie storica
for (int i = 0; i < lunghezzaSerie - 1; i++)
{
float x1 = margineSinistro + i * spazioPunti;
float y1 = panelGrafico.Height - margineInferiore - (float)((dati[i] - 0) / (200 - 0) * altezzaGrafico);
float x2 = margineSinistro + (i + 1) * spazioPunti;
float y2 = panelGrafico.Height - margineInferiore - (float)((dati[i + 1] - 0) / (200 - 0) * altezzaGrafico);
args.Graphics.DrawLine(Pens.Fuchsia, x1, y1, x2, y2);
}
};
// Forza il ridisegno del pannello per visualizzare il grafico
panelGrafico.Invalidate();
}
}
}
Output: