Meno codice, più azione... scrivere un EA - pagina 5

 
Vladimir Simakov:

Cosa vuoi ottenere? Per essere onesto, non capisco. All'inizio ho pensato che fosse previsto un framework, ma no, nessuna classe wrapper per indicatori, ordini, algoritmi standard di decisione, niente. Anche se molto più leggibile è questo costrutto: fast.Get(2)>=slow.Get(1); (è solo un esempio), ma la dichiarazione:

CMA fast=nuovo CMA(NULL,0,12,...);

CMA slow=nuovo CMA(NULL,0,100,...);

Ora possiamo discuterne, mentre tu, IMHO, stai calpestando il punto.

per esempio, invece di fast.Get(2)>=slow.Get(1); è un codice abbastanza legale e funzionante:

table[FAST_MA][1] >=table[SLOW_MA][2]

funziona come un foglio di calcolo, con excel. È riassunto in una tabella, non per singole maniglie, perché i dati (formule) possono essere interdipendenti.

Si potrebbe fare (solo che non l'ho ancora fatto in una biblioteca specifica):

fast=table[FAST_MA]; slow=table[SLOW_MA];

e poi fast[2]>slow[1] è ancora più facile da leggere

e tutti i calcoli interni saranno eseguiti "su richiesta".

 
Maxim Kuznetsov:

anche per esempio, invece di fast.Get(2)>=slow.Get(1); codice abbastanza legale e funzionante:

table[FAST_MA][1] >=table[SLOW_MA][2]

funziona come con un foglio di calcolo, con Excel. È riassunto in una tabella, non per singole maniglie, perché i dati (formule) possono essere interdipendenti.

Si può fare (solo che non l'ho ancora fatto in una biblioteca specifica):

fast=table[FAST_MA]; slow=table[SLOW_MA];

e poi fast[2]>slow[1] si legge ancora più facilmente

e tutti i calcoli interni saranno fatti "su richiesta".

È una specie di stampella. Ai buffer di cancellazione, che il terminale creerà comunque, aggiungiamo anche array di doppi. Capisco che riserverete loro memoria fino alla profondità completa della storia (per M1 USHORT_MAX, se ricordo bene *8 byte) o pensate di usare regolarmente il costoso ArrayResize nel processo?
 
Vasiliy Sokolov:

Sono d'accordo, è molto difficile leggere il tuo codice, anche se conosci il linguaggio.

In effetti, questa regola funziona per qualsiasi codice di terzi. L'unica domanda è quale codice non è difficile ma più facile da leggere.

E qui è più facile leggere e modificare quasi sempre il codice MQL4. Gli sviluppatori hanno indovinato una volta.

 
fxsaber:

In effetti, questa regola funziona per qualsiasi codice di terzi. L'unica domanda è quale codice non è difficile ma più facile da leggere.

Ed è più facile leggere e modificare quasi sempre il codice MQL4. Gli sviluppatori hanno indovinato una volta.

Ma lasciate che vi faccia una domanda. Qual era l'ipotesi? Il C/C++ standard, tranne che per query specifiche relative al trading e ai grafici, può essere considerato come "windows.h" in C++.

Quindi, rispetto agli sviluppatori per non reinventare la ruota, anche se proibire i link è un minus inequivocabile, quando sono caduto in C/C++ dopo mql, non ho potuto gioire. Ecco perché, se succede un miracolo, forse dovreste considerare, come alternativa, come C# usafe, specialmente per persone come me, come se voleste colpire il muro, uccidetevi, vi abbiamo avvertito.

 
Vladimir Simakov:

Mi permetta di farle una domanda. Qual è l'ipotesi?

Kodobase è pieno di EAs MT5 che sono remake di EAs MT4. Confrontate il codice dell'originale e del remake.


Ovviamente, capire la logica dell'originale MT4 è molto più facile. Ma è ancora più facile quando c'è bisogno di correggere qualcosa in TS. Non per niente MQL4 è uno standard per la discussione degli algoritmi di trading sui forum di tutto il mondo. Nessun altro linguaggio, ma MQL4. E ha giocato un grande ruolo nella popolarità di MT4, non il contrario.


E se parliamo di conversioni MT5, sono storte - non sempre funzionano. Un semplice esempio. Si invia una richiesta di chiusura di una posizione ma si riceve un ordine di compravendita invece di chiuderla. Ci sono un sacco di trucchi che devono essere risolti per andare al conto reale. Con MT4 è semplice e affidabile.

Совершение сделок - Торговые операции - MetaTrader 5
Совершение сделок - Торговые операции - MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
fxsaber:

Il kodobase è pieno di EAs MT5 che sono remake di EAs MT4. Confrontate il codice dell'originale e del remake.


Ovviamente è molto più facile capire la logica dell'originale MT4. Ma è ancora più facile quando c'è bisogno di correggere qualcosa in TS. Non per niente MQL4 è uno standard per la discussione degli algoritmi di trading sui forum di tutto il mondo. Nessun altro linguaggio, ma MQL4. E ha giocato un grande ruolo nella popolarità di MT4, non il contrario.


E se parliamo di conversioni MT5, sono storte - non sempre funzionano. Un semplice esempio. Si invia una richiesta di chiusura di una posizione ma si riceve un ordine di compravendita invece di chiuderla. Ci sono un sacco di trucchi che devono essere affrontati per andare al conto reale. Con MT4 è semplice e affidabile.

Quindi è assurdo lavorare con ordini/posizioni per analogia. In mql4 ho una classe wrapper per questo, in mql5 ne ho due diverse, perché in mt4 è una sola entità, e in mt5 ce ne sono due diverse, ora il piano è di implementare una classe wrapper su di esse e dimenticare di lavorare con gli ordini, come ho fatto per mezzo anno su mql4.
 
E sì, mt5 è stato creato per lavorare sulla borsa, e c'è un principio diverso di lavorare con gli ordini/posizioni, quindi impara la matematica e non lamentarti, tutto funziona bene e senza intoppi lì, ma le meccaniche di trading della borsa e del forex devono imparare prima e tenere conto delle loro differenze. Tutto ciò che è necessario per fare questo, gli sviluppatori lo hanno dato e descritto nelle banchine, e poi sta a voi.
 
Vladimir Simakov:
Quindi è un'assurdità lavorare con gli ordini/posizioni per analogia. Ho una classe wrapper per questo in mql4 e due diverse in mql5 perché è un'entità in mt4 e due diverse in mt5. Ora ho intenzione di implementare una classe wrapper per loro e dimenticare di lavorare con gli ordini come ho fatto per mezzo anno in mql4.
Vladimir Simakov:
Sai, anche mt5 è stato creato per lavorare su exchange e lì hanno un altro principio di lavoro con ordini/posizioni, quindi impara la matematica e non lamentarti, tutto va bene e funziona bene lì, ma prima dobbiamo imparare le meccaniche di trading di exchange e forex e tenere conto delle loro differenze. Tutto ciò che è necessario per fare questo, gli sviluppatori lo hanno dato e descritto nelle banchine, e poi sta a voi.

Cercate di allargare i vostri orizzonti, perché quello che avete scritto è davvero lagnoso.

 
Vladimir Simakov:
Sembra essere una stampella. Oltre a pulire i buffer, che il terminale creerà comunque, aggiungiamo anche array doppi. Capisco che hai intenzione di riservare la memoria per loro fino alla profondità completa della storia (per M1 USHORT_MAX, se ricordo bene *8 byte) o hai intenzione di usare ArrayResize costoso regolarmente nel processo di funzionamento?

Io alloco la memoria per loro, ovviamente. Ad una profondità non superiore a quella necessaria per i calcoli e il debug. Nel frammento dato è 30, che è più che sufficiente. Se da qualche parte sarà necessario calcolare per esempio la deviazione standard di profondità 50, allora la cache dovrebbe essere aumentata. Ed è solo per velocizzare i calcoli.

 
fxsaber:

Cercate di allargare i vostri orizzonti, perché quello che avete scritto è davvero lagnoso.

Sto bene, ma questo è il modo in cui il collegamento tra posizione e ordine è implementato in mql5 (come parte dell'ultimo lavoro era, in linea di principio, in questa forma sarà già incluso nella libreria per i conti di copertura).

CHedge::CheckOrder(void){
   if (!CheckPointer(cOrder)) return;
   switch(cOrder.Control()){
      case ORDER_FULL:        cPosition=NewPosition(cOrder);
      case ORDER_REMOVE:
      case ORDER_ERROR:       delete cOrder;}}
Motivazione: