Discussione sull’articolo "Scrivere un Expert Advisor Utilizzando l'Approccio di Programmazione Orientato agli Oggetti MQL5"
In generale, non è male, ma è un po' zoppo nel seguire lo slogan OOP usato nel nome. Ad esempio, perché stoploss, take e price sono posti al di fuori della classe? STP e TKP dovrebbero essere membri, abbiamo bisogno del metodo setSLTP; latest_price e levels dovrebbero essere considerati all'interno di openBuy/openSell. Le stesse classi sono scritte in modo molto irrazionale: è auspicabile lasciare un solo if con chiamata MarginOK, e al suo interno aggiungere la prima riga del controllo if(Chk_Margin == 0) return(true);
E un'altra piccola cosa. Perché Chk_Margin è dichiarato come int-, anche se è usato solo come bool? Sarebbe meglio descriverlo con un tipo minimo sufficiente, altrimenti ci si chiede, leggendo il codice sorgente, cosa succederà se Chk_Margin == 2, 3, ecc.
Con la coppia specificata nel periodo specificato e con i parametri di input predefiniti, non è possibile ottenere un grafico di equilibrio così bello. L'autore aveva altre quotazioni? Può allegare i parametri di input con i quali è stato ottenuto tale grafico?
Quanto dovrebbero essere diverse le quotazioni tra te e l'autore perché i risultati siano molto diversi))))))) Ho ottenuto quasi lo stesso risultato, e il risultato finale è persino leggermente migliore:
il design è sconcertante
if(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4) { return(true); } else { return(false); }
il design è sconcertante
Cos'è che non ti piace così tanto? Naturalmente non l'ho visto nel contesto del codice.....
non è così che si scrive di solito in questi casi?
return(Buy_Condition_1 && Buy_Condition_2 && Buy_Condition_3 && Buy_Condition_4);
Non è così che si scrive di solito in questi casi?
Non capisco la seguente parte del codice:
// Copia il prezzo di chiusura della barra precedente (barra 1) nella variabile Expert Advisor corrispondente Cexpert.setCloseprice(mrate[1].close); // prezzo di chiusura della barra 1 //--- Controllare se c'è una posizione di acquisto if (Cexpert.checkBuy()==true) { if (Buy_opened) { Alert("Abbiamo già una posizione da acquistare!!!".); return; // Non aggiungere alla posizione lunga } double aprice = NormalizeDouble(latest_price.ask,_Digits); double stl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); double tkp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); int mdev = 100; // effettuare l'ordine Cexpert.openBuy(ORDER_TYPE_BUY,Lot,aprice,stl,tkp,mdev); }Se stiamo per aprire una posizione di acquisto, dovremmo concentrarci sul prezzo latest_price.ask, ma quando impostiamo uno Stop Loss e un Take Profit per tale posizione - sul prezzo latest_price.bid. È corretto? Perché nel testo del codice lo Stop Loss e il Take Profit vengono impostati sulla base del prezzo ask? Si tratta di un errore di stampa o di una peculiarità di una particolare strategia (il codice ha una struttura simile per l'apertura di una posizione Sell)?
Non capisco la seguente parte del codice:
Se stiamo per aprire una posizione di acquisto, dovremmo concentrarci sul prezzo latest_price.ask, ma quando impostiamo uno Stop Loss e un Take Profit per tale posizione - sul prezzo latest_price.bid. È corretto? Perché nel testo del codice lo Stop Loss e il Take Profit vengono impostati sulla base del prezzo ask? Si tratta di un errore di stampa o di una peculiarità di una particolare strategia (il codice ha una costruzione simile per l'apertura di una posizione Sell)?Ecco la logica (probabilmente, la uso anch'io di solito):
1. Il prezzo di apertura di Buy è considerato Ask (ed è corretto);
Supponiamo di aprire a 1,27 su EURUSD.
2. Quando apriamo una posizione otteniamo la differenza pari allo spread, per il Buy è Ask-Bid (perdita potenziale se chiudiamo al prezzo attuale);
Supponiamo che lo spread sia pari a 5 pip. Quindi il Bid all'apertura sarà a 1,2695 (giusto?).
3. I long vengono chiusi al prezzo di Bid (e questo è abbastanza logico).
Quindi quando il Bid sale a 1,27 otteniamo un BU sulla posizione (giusto?).
4. Ma dobbiamo anche ottenere un profitto (100 pip nella quotazione standard).
In altre parole, il TP deve essere superiore all'Open di 100 pip. Nel nostro caso è 1,28 (giusto?).
Allo stesso tempo il TP verrà attivato se il Bid (non l'Ask) raggiunge questo 1,28....
5. Anche lo SL deve essere impostato (diciamo che è di 50 pips). Quindi nel nostro esempio sarà situato a 1,2650 (50 pips sotto l'apertura).
In quali condizioni funziona lo SL?
Logicamente, dovrebbe funzionare quando il prezzo passa questi 50 pips contro di noi (cioè l'Ask nelle monete di chiusura dello SL dovrebbe logicamente essere proprio a 1,2650).
Dove dovrebbe trovarsi il Bid in questo caso? E in questo momento si troverà a 1,2645 (perché Spred dalla condizione abbiamo 5 pips).
Ricordando che i long sono fissi.
6. Ora diamo un'occhiata a ciò che sta effettivamente accadendo (prendiamo come esempio l'apertura del mercato di un long in MQL4).
//Взято из справки по OrderSend ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,Bid-25*Point,Ask+25*Point);
Cosa vediamo qui
Il prezzo di apertura è considerato come Ask, lo SL è considerato come Bid e il TP è considerato come Ask.
Nel nostro caso otterremo questo schema.
OrderSend(Symbol(),OP_BUY,1,Open = Ask,3,SL = Bid-50*Point,TP Ask+100*Point);
Sostituiamo qui i nostri dati:
OrderSend(Symbol(),OP_BUY,1,1.2700,3,1.2695-50*Point,TP 1.2700+100*Point);
Cosa otteniamo alla fine - Apertura = 1,2700 SL= 1,2645 TP 1,28
PS
Confrontiamo con i dati originali:
Ordine - Apertura = 1.2700 SL= 1.2645 TP 1.28
Modello - Apertura = 1.2700 SL= 1.2645 TP 1.28
C'è questa logica (molto probabilmente, anch'io tendo a usarla):
1. Il prezzo di apertura di Buy è considerato Ask (ed è corretto);
Supponiamo di aprire a 1,27 su EURUSD
2. Quando apriamo una posizione otteniamo la differenza pari allo spread, per l'acquisto è Ask-Bid (perdita potenziale se chiudiamo al prezzo attuale);
Supponiamo che lo spread sia pari a 5 pip. Quindi il Bid all'apertura sarà a 1,2695 (giusto?).
5. Anche lo SL deve essere impostato (diciamo che è di 50 pips). Quindi nel nostro esempio sarà situato a 1,2650 (50 pips sotto l'apertura).
In quali condizioni si attiverà lo SL?
Logicamente, dovrebbe funzionare quando il prezzo passa proprio questi 50 pips contro di noi (cioè l'Ask in chiusura delle monete sullo SL dovrebbe logicamente essere proprio a 1,2650).
Dove dovrebbe trovarsi il Bid in questo caso? E in questo momento si troverà a 1,2645 (perché in base alla condizione Spred abbiamo 5 pips).
Ricordando che i Longs sono fissi.

- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Il nuovo articolo Scrivere un Expert Advisor Utilizzando l'Approccio di Programmazione Orientato agli Oggetti MQL5 è stato pubblicato:
Questo articolo si concentra sull'approccio orientato agli oggetti per fare ciò che abbiamo fatto nell'articolo "Guida Passo per Passo per Scrivere un Expert Advisor in MQL5 per Principianti" - creazione di un semplice Expert Advisor. La maggior parte delle persone pensa che sia difficile, ma voglio assicurarti che quando avrai finito di leggere questo articolo, sarai in grado di scrivere il tuo Expert Advisor che è basato sugli oggetti.
Allora, cosa viene dopo?
Ti ho sentito dire, debug? Forse hai ragione. È sempre bene testare e vedere se il tuo codice contiene errori altrimenti rimarrai deluso quando lo rilasci al pubblico. Il problema qui è che questo è solo un file di inclusione, non è un codice o uno script di consulente esperto o un codice indicatore che può essere allegato al grafico. A questo punto hai due opzioni (dalla mia esperienza),
Autore: Samuel Olowoyo