Caratteristiche del linguaggio mql4, sottigliezze e tecniche

 
In questo argomento si parlerà di modi non documentati di lavorare con il linguaggio mql4, esempi di risoluzione di certi problemi. Sarebbe auspicabile che questo ramo fosse più vicino come contenuto alle FAQ, che alla discussione. Suggerisco a tutti i programmatori esperti di condividere le loro soluzioni e tecniche di programmazione, specialmente la copertura di funzioni non descritte nell'aiuto.
 
Beh, lasciatemi iniziare per primo.

Per chiudere un ordine, non devi affatto definire il tipo di ordine e il prezzo corrispondente a quel tipo. È sufficiente scrivere OrderClosePrice()

/********************Script program start function********************/
void OnStart()
{
   int i, total = OrdersTotal()-1;
    for(i = total; i >= 0; i--)
     {
      if(OrderType() < OP_SELLSTOP)
       {
        if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100))
        printf("***********");
       }
     }
}/********************************************************************/
 

Ci sono molte altre imprecisioni nella guida. PrendeteSetIndexBuffer(), per esempio.Cosa c'è di sbagliato nell'aiuto?

"Parametri

indice

[in] Numero del buffer dell'indicatore. La numerazione inizia con 0. Il numero deve essere inferiore al valore dichiarato nella #proprietà indicator_buffers". (questa affermazione non è vera)

La #proprietà indicator_buffers specifica il numero di buffer da visualizzare. Forse ciò che l'aiuto intende, anche se non l'ho verificato, è che i buffer usati per il calcolo non hanno bisogno di ricevere un numero da SetIndexBuffer(). Ma quello che ho verificato è che se al buffer usato per il calcolo viene dato un numero con SetIndexBuffer(), il suo valore può essere recuperato tramite iCustom().

 
Non capisco.
 

Dal momento che gli sviluppatori stanno visitando il thread - c'è una domanda su "sottigliezze e trucchi":

Esempio di una stampa formattata: PrintFormat("Bid=%.5f", Bid)

Domanda: c'è un modo, invece di una precisione fissa (qui5), di specificare una condizione nella descrizione del formato in modo che la precisione dipenda da _Digits? Per fare a meno del 'preprocessing' come PrintFormat("Bid=%s", DoubleToString(Bid, _Digits))

 

In MQL4 lo stesso codice può dare risultati diversi a seconda dello stato della #proprietà strict. Ed è qui che la compilazione ha successo in entrambi i casi. Quindi, se l'esecuzione è "sconclusionata", si può cercare la causa nel posto sbagliato (severo) per molto tempo.

 
Alexander Puzanov:

Domanda: invece di una precisione fissa (qui5), è possibile specificare una condizione nella descrizione del formato in modo che la precisione dipenda da _Digits?

No, gli esempi sono disponibili su https://www.mql5.com/ru/docs/common/printformat
Документация по MQL5: Общие функции / PrintFormat
Документация по MQL5: Общие функции / PrintFormat
  • www.mql5.com
Общие функции / PrintFormat - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Описание проблемы

Sto scrivendo un indicatore in MQL4. Ho affrontato una caratteristica non documentata dello stile DRAW_HISTOGRAM.

Per visualizzare i valori sul grafico, ho bisogno di due buffer: per il valore superiore dell'istogramma e per quello inferiore. Quando si mappano i buffer dell'array di indicatori, se i buffer per lo stile avranno i valori 0 e 1, 2 e 3, 4 e 5, ecc. tutto viene visualizzato normalmente. Tuttavia, se ai buffer di stile sono assegnati valori che iniziano con OTHER, cioè 1 e 2, 3 e 4, 5 e 6, le linee dell'istogramma non saranno visualizzate correttamente nel grafico, anche se i valori nella finestra dei dati saranno corretti.

Si prega di aggiungere una menzione di questa peculiarità alla documentazione, o di correggerla, perché non è sempre il caso che la descrizione dello stile DRAW_HISTOGRAM inizi con un buffer pari!

Dalla SD.
 

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

Bug, bug, domande

-Aleks-, 2017.02.07 18:21

Potete consigliarmi, per favore, se in un Expert Advisor MT4, se un indicatore personalizzato con più di un buffer grafico è costantemente chiamato, allora il ricalcolo avviene ad ogni chiamata o tutti i buffer sono calcolati in una volta sola e si può fare riferimento all'indicatore nel codice molte volte e non aspettarsi che ci sia uno spreco di risorse. Sono anche interessato a sapere cosa succede se il codice non viene completato (gira più di un tick), ma il valore dell'indicatore cambia.


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

Bug, bug, domande

Slawa, 2017.02.08 08:20

Tutti i buffer sono calcolati in una volta sola. Interrogare tranquillamente i valori dell'indicatore - non ci sarà nessun ricalcolo

In MT4 l'indicatore chiamato dall'Expert Advisor lavora nel flusso di questo EA e su una copia dei suoi dati storici. Puoi mettere in loop l'Expert Advisor, ma allo stesso tempo riceverai i dati dell'indicatore calcolati al momento della chiamata OnTick. Finché non si chiama RefreshRates. RefreshRates aggiorna i dati storici dell'Expert Advisor, dopo di che tutti i suoi dati saranno ricalcolati alla prima chiamata dell'indicatore

 
Alexey Viktorov:
Per chiudere un ordine, non è necessario specificare il tipo di ordine e il prezzo corrispondente a questo tipo. È sufficiente scrivere chiudere al prezzo OrderClosePrice()

Quindi, potete usare OrderClosePrice solo DOPO il corrispondente OrderSelect. Perché OrderSelect copia i dati per le funzioni Order(const)- una volta, e lo stesso RefreshRates non è in grado di aggiornarli.

Cioè se, per esempio, OrderClosePrice non riesce a chiudere, allora bisogna rifare OrderSelect prima del prossimo tentativo (RefreshRates non è necessario).

ZS Questo thread è del 2005! Ecco gli argomenti dettagliati degli sviluppatori.

 
Rashid Umarov:
No, ci sono esempi su https://www.mql5.com/ru/docs/common/printformat

È un peccato...

---

In modo che il post non sia inutile:

invece di StringGetCharacter("a", 0) si può scrivere solo 'a'- spesso necessario quando si analizzano le stringhe in parti con StringSplit