Caratteristiche utili da KimIV

 

In questo thread posterò i codici delle mie funzioni in MQL4, darò esempi del loro uso, e risponderò alle domande relative al loro uso. Ogni funzione sarà pubblicata in due post. Il primo post conterrà il codice della funzione, il secondo - esempi di utilizzo e brevi spiegazioni. A volte allegherò il codice di uno script al secondo post per testare effettivamente la funzione e visualizzare i risultati.

Inizierò con le funzioni per gestire gli ordini come richiesto da Lukyanov nel topic "Come eseguire due EAs allo stesso tempo" alla fine.

La prima è la funzione di impostazione degli ordini (versione tester MT4):

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Установка ордера. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    pp - цена                                                               |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - Magic Number                                                       |
//|    ex - Срок истечения                                                     |
//+----------------------------------------------------------------------------+
void SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, datetime ex=0) {
  color clOpen;
  int   err, ticket;
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;
  ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, "", mn, ex, clOpen);
  if (ticket<0) {
    err=GetLastError();
    Print("Error(",err,") set ",GetNameOP(op),": ",ErrorDescription(err));
    Print("Ask=",Ask," Bid=",Bid," sy=",sy," ll=",ll,
          " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
  }
}
//+----------------------------------------------------------------------------+
 
Ci saranno delle caratteristiche pubblicate per il trading reale? P.S.: Grazie per l'argomento. Penso che sarà molto popolare e richiesto.
 
Ciao, Igor!
Appoggio l'idea. Decisione giusta........!!!
Il tuo codice è enorme, le domande sorgono spesso, e non è bene rivolgersi a te nei post di altre persone e in altri argomenti.
 

Fantastico.

Suggerimento agli sviluppatori: iniziate a formare una libreria di funzioni. A mio parere, sarebbe auspicabile presentare alla comunità dei requisiti di progettazione per questo (ad esempio, descrizione obbligatoria delle variabili, restrizioni d'uso, numero di caratteri per riga, ecc.) Un articolo di MQ sull'argomento sarebbe una buona idea.

Con il tempo, non solo funzioni semplici ma anche complesse appariranno nella libreria.

 
Lukyanov:
Ci saranno caratteristiche pubblicate per il trading reale?

Sì, lo faranno... La prossima sarà la funzione SetOrder() per il trading online...


Esempi di come usare la funzione SetOrder():

1. Impostazione di un ordine BuyLimit con 0,1 lotto, 50 pip sotto il prezzo corrente:

SetOrder(NULL, OP_BUYLIMIT, 0.1, Ask-50*Point);

2. Impostazione di un ordine BuyStop con lotto 0.3 36 pip sopra il prezzo corrente con uno stop di 32 pip:

SetOrder(NULL, OP_BUYSTOP, 0.3, Ask+36*Point, Ask+(36-32)*Point);

3. Piazzando un ordine SellLimit del lotto 0.2 a 42 pip sopra il prezzo corrente con un takeaway di 50 pip:

SetOrder(NULL, OP_SELLLIMIT, 0.2, Bid+42*Point, 0, Bid+(42-50)*Point);

4. Piazzando un ordine SellStop per lotto 0,5 di 100 pip sotto il prezzo corrente con uno stop di 30 pip e un takeaway di 70 pip:

SetOrder(NULL, OP_SELLSTOP, 0.5, Bid-100*Point, Bid-(100-30)*Point, Bid-(100+70)*Point);

5. Un ordine BuyLimit con lotto 0.1 piazzato 50 pips sotto il prezzo corrente con numero magico 123456 e scadenza tra due ore:

SetOrder(NULL, OP_BUYLIMIT, 0.1, Ask-50*Point, 0, 0, 123456, TimeCurrent()+2*60*60);
Il trailer è una sceneggiatura reale con gli esempi di cui sopra. I primi quattro esempi sono commentati.
File:
 
VBAG:
Ciao, Igor!
Appoggio l'idea. Decisione giusta........!!!
Il tuo codice è enorme, le domande sorgono spesso, e non è bene rivolgersi a te nei post di altre persone e in altri argomenti.
Bene, qui possiamo parlare. Formulate le vostre domande, sarò felice di rispondere :-)
 
Mostra la tua versione dei ritardi tra le transazioni commerciali
Grazie.
 
Grazie per l'utile argomento, anche se sono su torte bruciate, ma comunque forse qualcuno ha affrontato il problema di accumulare e campionare da grandi set di dati in µl. µl e banche dati? Qualcuno ha pensato in questa direzione?
 
zhuki писал (а):
Mostra la tua versione dei ritardi tra gli scambi

Non faccio nessun ritardo tra un'operazione e l'altra. Cioè, se ho bisogno di piazzare due o più ordini, eseguo queste operazioni di trading senza una pausa tra loro. Ma tra i tentativi di trading, che devono essere ripetuti se c'è un errore quando si contatta il server, faccio una pausa secondo le raccomandazioni degli sviluppatori di MT4. Come esempio potete vedere come tali pause sono implementate nella mia funzione SetOrder() per il trading online. Pause diverse sono fatte per diversi errori restituiti dal server di trading.

Questa funzione SetOrder() è usata per impostare gli ordini in sospeso. È raccomandato per l'uso nel trading online su conti demo e live.

File:
 
Molto originale, ma spiega perché i ritardi di 7,7, 17, 11 secondi. Inoltre, cosa succede se c'è più di un Expert Advisor, allora l'analisi è necessaria.
 
zhuki:
...spiegare perché c'è un ritardo di 7,7,17,11 secondi. È uno scherzo o è giustificato.

Che tipo di scherzi ci possono essere con i soldi veri?

Gli errori 129 (prezzo di domanda o offerta errato), 130 (stop errato), 134 (non abbastanza soldi), 136 (nessun prezzo) metteranno in pausa per 7,7 secondi. Gli sviluppatori di MT4 raccomandano pause di più di 5 secondi in questi casi. L'ho impostato a 7,7 secondi. Tanto valeva mettere 6,1 secondi. Non mi piacciono i valori rotondi a causa della loro attrattiva, quindi ho impostato quelli non circolari.

La pausa di 17 secondi doveva essere per l'errore 145 (Modifica vietata). Ma poiché la funzione SetOrder non gestisce la modifica, ho rimosso la gestione di questo errore. Grazie per aver portato alla mia attenzione questo aspetto della mia funzione!

La pausa di 11 secondi si trova all'interno del ciclo che controlla lo stato del sottosistema commerciale. Si può impostare su 15 o 30 secondi. Non importa cosa vi piace.

zhuki:
Mi chiedo anche cosa fare se c'è più di un Expert Advisor, e non si può fare a meno dell'analisi.

Per diversi Expert Advisors in un conto di trading, l'errore 146 (il sottosistema di trading è occupato) è gestito. La funzione SetOrder aspetta che il sottosistema di trading sia libero.


Attenzione! Ho modificato il post precedente. Apportate modifiche alla funzione SetOrder.