Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1144

 
Valeriy Yastremskiy:

Lo capisco, ma mql5 è difficile da capire purtroppo. Sono d'accordo con fxsaber, penso che sia più facile usare il 4 e per l'ottimizzazione e altre cose dovremmo usare il 5. In generale, vorrei sapere se c'è qualcuno che ha padroneggiato mql5 senza pratica OOP? Naturalmente, dopo il C++ 4 non è rilevante, anche se potrei sbagliarmi.

Le due lingue sono assolutamente identiche. Né più né meno. E l'OOP (da cui tutti sono stati intimiditi) è esattamente lo stesso in entrambi. Non lo sapevi? Hai letto storie dell'orrore su Internet e guardato blogger su YouTube che "seminano bene, saggio ed eterno"? Che parlano abilmente di sciocchezze, spaventando deliberatamente la gente da MQL5.

Mi affretto a deludere: entrambe le lingue sono esattamente le stesse. Sia nella facilità di comprensione, che nelle caratteristiche e nella presenza di OOP.
Ma MQL5 ha più possibilità.

 
Alexey Viktorov:

Vi ho mandato lo spagnolo - beh, spaventatelo. Fagli un indicatore - non ho tempo. È in inglese. Vi spiegherò se c'è qualcosa. Ma... lo scoprirai.

 
Alexey Viktorov:

Non ricordo la risposta di Artem e non ho intenzione di cercarla. Tutti i codici nei suoi articoli sono o multi-terminali o due versioni, per mql5 e mql4. Ho controllato queste versioni su mql4. Tutto funziona correttamente e rileva la chiusura per stop o take e non fa errori.

Sì, questi articoli sono difficili da capire, ma ne vale la pena se non siete più vecchi di me. E io, per essere un programmatore, sono oscenamente vecchio.

L'altra variante è più semplice, ma sarà molto più lenta. Scrivere il biglietto d'ordine in una matrice, e da questa matrice, selezionare l'ordine e controllare il tempo di chiusura dell'ordine. Se è superiore a zero, significa che l'ordine è chiuso. Se il commento di un ordine chiuso contiene le lettere "sl", significa che l'ordine è chiuso con uno stop. Se l'ordine viene chiuso, viene cancellato dall'array. Oppure, dopo che la matrice è stata completata, viene riempita con gli ordini aperti rimanenti. L'immaginazione vola in generale.

L'opzione che scegliete dipende da voi. E leggi alcuni dei miei post sul libro di testo di Kovalev. È il libro di testo che suggerisce di scrivere int start(), mentre nell'aggiornato mql4, void OnTick() dovrebbe essere scritto per Expert Advisors.

Per gli indicatori e gli script, fate riferimento alla documentazione. E a proposito, è molto più facile scrivere indicatori in mql4 aggiornato di quando Sergey ha scritto questo tutorial.

Grazie mille. Le tue informazioni sono state molto preziose per me. Soprattutto per quanto riguarda la funzione start().

 
Alexey Viktorov:

Non ricordo la risposta di Artem, e non la cercherò, posso indovinare cosa potrebbe aver risposto. ...

Ecco la mia risposta. Con una chiara indicazione di ciò che deve essere fatto:

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Tutte le domande dei neofiti su MQL4 e MQL5, aiuto e discussione su algoritmi e codici

Artyom Trishkin, 2020.04.28 08:22

Questa è una spiegazione semplice: è necessario monitorare il numero di ordini e posizioni, e confrontarli con lo stato precedente. Se abbiamo 12 posizioni nel tick precedente e 8 posizioni nel tick attuale, abbiamo un cambiamento di 4 posizioni. Di conseguenza, dovremmo prendere le ultime quattro posizioni (al momento della chiusura) per capire cosa è successo loro.

Ma, a giudicare dal codice allegato, in cui sono scritti i "miracoli", non c'è davvero bisogno di una spiegazione a parole. Ma è qui per aiutare, non per scrivere per/per.


 
ANDREY:

Grazie mille. Le vostre informazioni sono state molto preziose per me. Specialmente riguardo alla funzione start()

La cosa buona è creare nell'editor ciò di cui abbiamo bisogno, EA, script, indicatore e l'editor creerà un modello con i campi giusti.
 
Artyom Trishkin:

E cosa fa il tuo codice oltre al fatto che apre due posizioni di vendita, ognuna ad un tempo strettamente specificato, e stampa l'ora di apertura dell'ultima posizione quando è permesso? Tutto. Utilizzando variabili non inizializzate, che possono portare a "meraviglie" nel comportamento del codice, e molto, molto vecchio gestore start(), che è stato tirato da uno scaffale polveroso con anni di ragnatele, e nel mercato (un giorno si vuole vendere qualcosa) con gestori antichi non mancherà mai validatore - dirà che il tipo di programma sbagliato.

Grazie per il contributo. Sulla coppia GBP/USD ho trovato un modello nel comportamento dei prezzi durante i test. Questo modello con piccole correzioni, così come con piccoli drawdown, il grafico di equilibrio porta costantemente verso l'alto dal 2008 e fino al momento attuale. Come ho detto, le correzioni dei grafici di equilibrio e i drawdown non sono grandi, ma possono durare diversi mesi.
Ho iniziato a testare diverse varianti di questo modello e ho fatto ricorso all'ottimizzazione per questo scopo. Ma come si è scoperto, l'ottimizzazione con diversi parametri contemporaneamente richiede una quantità enorme di tempo. Nel mio caso ci è voluto circa un anno. Un algoritmo genetico non è adatto a me.
Poi sono arrivato all'idea che i test e l'ottimizzazione possono essere eseguiti più velocemente con l'aiuto di un codice correttamente formulato, la funzione Pront() e la tabella Excel.

Il codice qui sotto è solo un tentativo di scrivere un codice del genere. Migliorerò ulteriormente questo codice. Ma ho incontrato un problema che mi mancava la conoscenza per risolvere.
Per favore non giudicate me e il mio codice molto severamente.... Sono un principiante che ha appena iniziato a capire le basi del coding e poco più. Ma accetto le critiche con calma e non mi offendo..... soprattutto alle critiche costruttive.

Grazie per il vostro aiuto.

int s1,Mn,a,CH;
double Hay,Lou=Bid,Nm_PL[700]={0},PrS,DL=0.0030,X;
int start()
{
int ot = OrdersTotal();                                         
int Ht = OrdersHistoryTotal();
////******************************************************************
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))                                             
if (X!=OrderTicket( ))
{
Mn=OrderMagicNumber();CH=TimeHour(OrderOpenTime());PrS=OrderProfit( );Nm_PL[CH+Mn*24]=Nm_PL[CH+Mn*24]+PrS;
Print("----------------- ПРОФИТ-----------------------=",CH,"    Ном орд.(1-26)   ",Mn," ТП    ",PrS," ФИН.РЕЗУЛЬТ.   ",Nm_PL[CH+Mn*24]," НОМ. ИНДЕКСА   ",Mn*24);X=OrderTicket();
}
////******************************************************************
if (Bid < Lou)
{
Lou=Bid;
}
//=======================
if (Bid > Hay)
{
Hay=Bid;
}
////=======================
if (Bid - Lou > DL&& Lou!=0)
{
for(int c=0; c<=500;c+=20) 
{
a++;
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,Ask+0.0030+c*Point,Ask-0.0010-c*Point,"300",a );
}
Lou=Bid;
Hay=Bid;
a=0;
s1=0;
}
return(0);
}

Se due o più ordini sono chiusi da stop o take nello stesso tick, il programma stampa Print() solo dopo l'ultimo ordine chiuso in questo tick. Ho bisogno di Print() dopo la chiusura di ogni ordine. Non so come raggiungere questo obiettivo. Ma se vedo il codice necessario, lo capisco e lo ricordo immediatamente.

Ecco un esempio del mio problema.


Генетические алгоритмы - это просто!
Генетические алгоритмы - это просто!
  • www.mql5.com
Введение Генетический алгоритм (ГА) относится к эвристическим алгоритмам (ЭА), который даёт приемлемое решение задачи в большинстве практически значимых случаев, однако при этом правильность решения математически не доказана и применяют чаще всего для задач, аналитическое решение которых весьма затруднительно или вовсе невозможно. Классическим...
 
Valeriy Yastremskiy:
La cosa buona è creare nell'editor ciò di cui abbiamo bisogno, un EA, uno script, un indicatore e l'editor creerà un modello con i campi giusti.

Sì, ho notato questi campi corretti, cioè nuove funzioni invece di START. Ma non ho prestato molta attenzione a loro e ho usato START per i test come prima.
Non so dove posso leggere maggiori dettagli sugli ultimi aggiornamenti di MQL4. Il libro di Kovalev mi piace molto, perché tutte le informazioni sono logicamente strutturate e facilmente comprensibili. Ed è abbastanza dettagliata per capire tutti i dettagli necessari. Mi chiedo perché non abbia scritto lo stesso manuale per MQL5.

 
Artyom Trishkin:

Due lingue assolutamente identiche. Né più né meno. E l'OOP (da cui tutti sono stati intimiditi) è esattamente lo stesso in entrambi. Non lo sapevi? Hai letto storie dell'orrore su Internet e guardato blogger su YouTube che "seminano bene, saggio ed eterno"? Che abilmente parlano a vanvera, spaventando deliberatamente la gente da MQL5.

Mi affretto a deludere: entrambe le lingue sono esattamente le stesse. Sia nella facilità di comprensione, che nelle caratteristiche e nella presenza di OOP.
Ma MQL5 ha più possibilità.

Sì in generale sono d'accordo, e OOP in 4ka felice))) ma nell'accesso dei principianti nella mia esperienza libri di testo Kovalev, Zhdan su 4ka e incomprensibile Mishin su 5ka e OOP. Non so come capirlo. Non importa quante volte ripetete l'incapsulamento, la comprensione del poliformismo non arriverà. E non capite quali articoli leggere per primi. E dove cercare cosa. Ecco perché finora in codobase in ontik l'uscita dalla funzione start si trova )))))
 
ANDREY:

Sì, ho notato quei campi corretti, cioè nuove funzioni invece di START. Ma non ho prestato molta attenzione a loro, quindi ho usato START per i test come prima.
Non so dove posso leggere maggiori dettagli sugli ultimi aggiornamenti di MQL4. Il libro di Kovalev mi piace molto, perché tutte le informazioni sono logicamente strutturate e facilmente comprensibili. Ed è abbastanza dettagliata per capire tutti i dettagli necessari. Mi chiedo perché non abbia scritto lo stesso manuale per MQL5.

Come ha dettoAlexey Viktorov:Capire la semplice verità, mql5 differisce da mql4 solo in OrderSend() e alcune altre funzioni, che non ricordo. Un'altra differenza importante è la direzione dell'indicizzazionedei buffer degli indicatori. Tuttavia, può essere risolto molto rapidamente, ma è meglio abituarsi alle nuove caratteristiche. Ma ottenere i valori degli indicatori rimane lo stesso.
Gli articoli OOP per i principianti hanno aiutato. E l'aiuto dell'editore.
 
ANDREY:

Grazie per la vostra partecipazione.

...

Il codice qui sotto è solo un tentativo di scrivere un codice del genere. Migliorerò questo codice in futuro. Ma ho incontrato un problema che mi mancava la conoscenza per risolvere.
Per favore non giudicate me e il mio codice molto severamente.... Sono un principiante che ha appena iniziato a capire le basi del coding e poco più. Ma accetto le critiche con calma e non mi offendo..... soprattutto alle critiche costruttive.

Grazie per il vostro aiuto.

Se due o più ordini sono chiusi da stop o take nello stesso tick, il programma stampa Print() solo dopo che l'ultimo ordine è stato chiuso in questo tick. Ho bisogno di Print() dopo che ogni ordine è chiuso. Non so come raggiungere questo obiettivo. Ma se vedo il codice necessario, lo capisco e lo ricordo immediatamente.

Ecco un esempio del mio problema.


Ti ho già risposto:

La spiegazione in parole: è necessario monitorare il numero di ordini e posizioni e confrontarli con lo stato precedente. Se avevamo 12 posizioni nel tick precedente e 8 nel tick attuale, abbiamo un cambiamento di 4 posizioni. Di conseguenza, dovremmo prendere le ultime quattro posizioni (al momento della chiusura) per vedere cosa è successo a loro.

Si prende l'ultimo ordine della lista:

int Ht = OrdersHistoryTotal();
////******************************************************************
if (OrderSelect (Ht-1,SELECT_BY_POS, MODE_HISTORY))

E devi prima scoprire quanto è cambiato lo stato dell'elenco degli ordini. Prima ne avevi 12, ora ne hai 8 - questo è un cambiamento di 4 ordini. Di conseguenza, è necessario stampare tutti e quattro gli ordini. E si stampa sempre solo l'ultimo ordine della lista.

Come faccio a sapere quanto è cambiato? Abbiamo bisogno di scrivere il numero di ordini in una variabile, per esempio int last_total, quando eseguiamo l'EA. Poi, ad ogni tick, confronta OrdersTotal() con last_total. Se NON sono uguali, questo è un cambiamento. Scrivi la differenza tra OrdersTotal() e last_total in una variabile, per esempio, num_changes e salva il nuovo stato di OrdersTotal() in last_total.
Ci possono essere alcune sottigliezze qui, per esempio, quando viene attivato un ordine pendente. Ma per ora, dovresti fare quello che devi fare prima.
Conoscendo il numero di ordini pendenti, puoi cercarli nella cronologia. Tuttavia, puoi anche limitare il monitoraggio degli ordini nella lista storica - fai tutto quanto sopra per la lista degli ordini storici, e non per la lista degli ordini di mercato. La differenza tra ciò che era e ciò che è diventato - questa è la quantità di ordini che devi analizzare. Si analizza sempre solo l'ultimo ordine della lista.

Tuttavia, questo non può garantire che l'ultimo ordine nella lista della cronologia sia l'ultimo ordine chiuso. Anche questa è una sfumatura che deve essere considerata. Ma poi.

Motivazione: