GRUPPI DI CODICI ELEMENTARI

Sezione dedicata a metatrader (ed altre piattaforme) ed al suo linguaggio di programmazione per il trading automatico
IntoTheWild1990
Messaggi: 116
Iscritto il: 12/10/2016, 17:44

GRUPPI DI CODICI ELEMENTARI

Messaggio da IntoTheWild1990 » 18/12/2017, 0:18

Salve a tutti, voglio parlare di codici mql4.

Iniziamo dalle variabili.

1.0 int
2.0 double

int indica una variabile intera, ad esempio 1, 2, 3, ..., n con n numero naturale
double indica una variable reale, ad esempio 1,223..., r ecc.. con r numero reale.

quindi se voglio che il mio codice mi stampi un numero devo scrivere:

void OnStart () {

int n=0;

n=20;

for (i=0;i<n; i++){
Print(i);
}
return;
}


cosa abbiamo scritto?
Si tratta di una funzione semplice che effettua una dichiarazione di variabile, un'assegnazione e a un certo punto si vede questo pezzo di codice:

Codice: Seleziona tutto

for (i=0;i<n; i++){
Print(i);
}
sostanzialmente stiamo accedendo al processore, nel senso che iniziamo a utilizzare una parte importante del nostro pc, cioè stiamo creando un ciclo.
Il ciclo in questione all'interno dell'algoritmica in mql4 permette di eseguire una importante parte dei calcoli necessari per il funzionamento del nostro bot.

ad esempio il suddetto ciclo può servire per ricercare una determinata operazione all'interno del nostro storico. A questo punto sorge spontaneo chiedersi:

In che modo il nostro pc riesce a leggere lo storico delle operazioni?

funzioni:
3.0 HistoryOrdersTotal();
4.0 OrderSelect();

La prima funzione riesce ad indicìviduare il numero totale di operazioni nel nostro storico.
La seconda seleziona il nostro ordine e ci da libero accesso a quelle che sono le proprietà dell'ordine, questa funzione si compone di una serie di variabili di comando che permettono di accedere alla funzione stessa e sono:

4.1 indice
4.2 selezione
4.3 archivio da cui estrarre le informazioni.

L'indice si riferisce o al ticket dell'ordine, il quale però viene sostituito proprio dalla variabile i del nostro ciclo
La selezione è una funzione della scelta, di certo all'interno di un ciclo non ha senso utilizzare SELECT_BY_TYCKET, bensì si utilizza il tipo di selezione SELECT_BY_POS
Per quanto riguarda gli archivi ve ne sono due:
MODE_TRADE che seleziona gli ordini all'interno dell'archivio degli ordini correnti
MODE_HISTORY che seleziona gli orndini all'interno dell'archivio degli ordini chiusi.

bene riscriviamo il nostro algoritmo con le nuove competenze assorbite:

void OnStart(){

int n=0;
n=HistoryOrdersTotal();

for(int i=0; i<n; i++){

OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
Print(OrderProfit());

}
return;
}

per completezza, OrderProfit() individua il profitto dell'ordine corrente.

Si invitano gli interessati a questo scambio a compilare un algoritmo che permette di analizzare il profitto degli ordini aperti.

Saluti
IntoTheWild1990
Una fenice risorge dalla cenere torna al fuoco per quanto tu la possa uccidere.

Fenice Ea +7% da gennaio, leva operativa 1:10.
DD 0.7%

Aggiungimi su WhatsApp per avere una copia funzionante Dell ea.
3348166396

MrMoret27
Messaggi: 19
Iscritto il: 28/01/2018, 18:05

Re: GRUPPI DI CODICI ELEMENTARI

Messaggio da MrMoret27 » 28/03/2018, 16:34

Post interessantissimo, non l'avevo visto!

Ecco il mio codice, da me funziona, è giusto?

Codice: Seleziona tutto

void OnStart()
{
//---
   int      nOrd        =  OrdersHistoryTotal();
   double   profitOrd   =  0;
   
   for (int i = 0; i < nOrd; i++)
   {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      profitOrd += OrderProfit();
   }
   Print(DoubleToStr(profitOrd, 2));

//---   
}
EDIT: la MetaEditor mi dà solo questo warning: "return value of 'OrderSelect' should be checked"
Come mai?

Avatar utente
carlo10
Messaggi: 2114
Iscritto il: 08/05/2014, 21:17

Re: GRUPPI DI CODICI ELEMENTARI

Messaggio da carlo10 » 30/03/2018, 23:24

Mi complimento con IntoTheWild1990 per l'ottima iniziativa. Spero che le la scarsa partecipazione non abbia frenato la cosa.

Per rispondere a MrMoret27 la cosa più utile è andare a vedere sul sito di mql4 la dichiarazione della OrderSelect. Cosa restituisce la funzione? Il warning ti avvisa che sta restituendo qualcosa ma tu te ne stai disinteressando.

Come modificheresti il tuo codice alla luce di questa informazione?

MrMoret27
Messaggi: 19
Iscritto il: 28/01/2018, 18:05

Re: GRUPPI DI CODICI ELEMENTARI

Messaggio da MrMoret27 » 31/03/2018, 19:05

Hai ragione, modificherei così (l'ho riscritto anche un pelo meglio, penso):

Codice: Seleziona tutto

void OnStart()
{
	double profitOpenOrder = 0.0;
	
	for (int i = 0; i < OrdersTotal(); i++)
	{
		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) profitOpenOrder += OrderProfit();
	}
	
	MessageBox("Il P/L degli ordini aperti è: " + DoubleToStr(profitOpenOrder, 2), "Somma Profitti", MB_OK);
}
EDIT: Volendo si potrebbe aggiungere una riga di codice (appena sotto all' IF) per vedere l'errore nel caso succeda qualcosa con OrderSelect():

Codice: Seleziona tutto

else Alert("Errore OrderSelect: " + string(GetLastError()));

Avatar utente
carlo10
Messaggi: 2114
Iscritto il: 08/05/2014, 21:17

Re: GRUPPI DI CODICI ELEMENTARI

Messaggio da carlo10 » 31/03/2018, 20:23

Così mi sembra perfetto!

Avatar utente
carlo10
Messaggi: 2114
Iscritto il: 08/05/2014, 21:17

Re: GRUPPI DI CODICI ELEMENTARI

Messaggio da carlo10 » 02/04/2018, 8:43

Esercizio 2:

Nel secondo esercizio che vi propongo dovrete:

1. aprire un ordine Buy tramite la funzione OrderSend con stop loss 100 pips, target 100 pips
2. scrivere su un file csv tramite la funzione FileWrite le stesse informazioni visibili in questa immagine:
ordine.JPG

P.S. chi si unisce dopo può comunque partire dal primo esercizio senza guardare le soluzioni degli altri.
Non hai i permessi necessari per visualizzare i file allegati in questo messaggio.

MrMoret27
Messaggi: 19
Iscritto il: 28/01/2018, 18:05

Re: GRUPPI DI CODICI ELEMENTARI

Messaggio da MrMoret27 » 03/04/2018, 15:26

Mi sono perso un po' con il discorso FileWrite ma sembra ci sia saltato fuori:

Codice: Seleziona tutto

void OnStart()
{
//---
   
   //--Apro/Creo il file
   int fileHandle = FileOpen("orderCSV.csv", FILE_CSV|FILE_READ|FILE_WRITE, ";");
   if (fileHandle < 0)
   {
      Print("Errore apertura file: " + string(GetLastError()));
      return;
   }
   //--Invio l'ordine BUY con SL 100pips e TP 100pips
   int ticket = OrderSend(_Symbol, OP_BUY, 0.10, Ask, 0, Ask-1000*_Point, Ask+1000*_Point);
   if (ticket < 0)
   {
      Alert("ERRORE ORDER SEND: " + string(GetLastError()));
      return;
   }
   
   //--Scrittura File
   if(OrderSelect(ticket, SELECT_BY_TICKET))
   {
      FileSeek(fileHandle, 0, SEEK_END); //Mi posiziono alla fine del file così da inserire più ordini
      FileWrite(fileHandle, OrderTicket(), TimeToStr(OrderOpenTime()), "buy", OrderLots(), OrderSymbol(), OrderOpenPrice(), OrderStopLoss(), OrderTakeProfit(), Bid, OrderCommission(), OrderSwap(), OrderProfit());
      
   }
   
   //--Chiusura File
   FileClose(fileHandle);
}

Avatar utente
carlo10
Messaggi: 2114
Iscritto il: 08/05/2014, 21:17

Re: GRUPPI DI CODICI ELEMENTARI

Messaggio da carlo10 » 08/04/2018, 10:02

Mi sembra ok, bene!

Chi c’è in linea

Visitano il forum: AhrefsBot [Bot], CC [Bot], Google [Bot] e 0 ospiti