Caratteristiche utili da KimIV - pagina 4

 

Altri esempi di come usare la funzione SetOrder().

Per chiarezza, dovremmo selezionare un simbolo con un grande livello minimo consentito di stop loss/stake profit in pip. Ho scelto AUDCAD, a cui questo livello nella mia società di intermediazione selezionata per il test è di 10 punti.

1. Impostazione di un ordine BuyLimit con lotto 0,1, 5 pip sotto il prezzo corrente. Ho scelto di proposito il livello di impostazione dell'ordine più basso del livello minimo consentito per ottenere l'errore 130 (Stop non corretto) e mostrare come la funzione SetOrder lo risolve.

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

Contenuto del protocollo (leggere dal basso verso l'alto):
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: rimosso
2008.03.17 09:06:24 stdlib AUDCAD,M5: rimosso
2008.03.17 09:06:24 stdlib AUDCAD,M5: uninit reason 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 09:06:24 test_SetOrder AUDCAD,M5: aperto #21616412 comprare limite 0,10 AUDCAD a 0,9180 ok
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: SetOrder(): livelli di prezzo corretti
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.1 op=Buy Limit pp=0.9185 sl=0 tp=0 mn=0
2008.03.17 09:06:15 test_SetOrder AUDCAD,M5: Error(130) set order: invalid stops, try 1
2008.03.17 09:06:15 stdlib AUDCAD,M5: caricato con successo
2008.03.17 09:06:14 test_SetOrder AUDCAD,M5: caricato con successo

Il protocollo mostra che questa funzione ha cercato di piazzare un ordine 0,9185 (pp=0,9185) ma il server di trading non ha accettato tale ordine e ha restituito l'errore 130. Poi la funzione corregge il livello di impostazione dell'ordine secondo il livello minimo consentito ed esegue il prossimo tentativo di trading che termina con successo. L'ordine è fissato a 0,9180.

2. Impostare un ordine BuyStop con lotto 0.3 a 6 pip sopra il prezzo corrente con uno stop di 9 pip

SetOrder(NULL, OP_BUYSTOP, 0.3, Ask+6*Point, Ask+(6-9)*Point);

Contenuto del protocollo (letto dal basso verso l'alto):
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: rimosso
2008.03.17 09:27:36 stdlib AUDCAD,M5: rimosso
2008.03.17 09:27:36 stdlib AUDCAD,M5: uninit reason 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 09:27:36 test_SetOrder AUDCAD,M5: open #21617419 buy stop 0.30 AUDCAD a 0.9209 sl: 0.9195 ok
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: SetOrder(): livelli di prezzo corretti
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Ask=0.9198 Bid=0.9188 sy=AUDCAD ll=0.3 op=Buy Stop pp=0.9204 sl=0.9195 tp=0 mn=0
2008.03.17 09:27:26 test_SetOrder AUDCAD,M5: Error(130) set order: invalid stops, try 1
2008.03.17 09:27:26 stdlib AUDCAD,M5: caricato con successo
2008.03.17 09:27:25 test_SetOrder AUDCAD,M5: caricato con successo

Questo esempio mostra come il livello di impostazione dell'ordine sia cambiato da 0,9204 a 0,9209. Allo stesso tempo, il livello di stop è rimasto invariato a sl=0.9195. Cioè, lo stop in pip è aumentato da 9 a 14.

 

3. Impostare un ordine SellLimit con 0,5 lotti a 8 punti sopra il prezzo corrente con uno stop di 9 punti e un ordine di acquisto di 7 punti

SetOrder(NULL, OP_SELLLIMIT, 0.5, Bid+8*Point, Bid+(8-9)*Point, Bid-(8+7)*Point);

Contenuto del protocollo:
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: rimosso
2008.03.17 10:38:50 stdlib AUDCAD,M5: rimosso
2008.03.17 10:38:50 stdlib AUDCAD,M5: uninit reason 0
2008.03.17 10:38:50 test_SetOrder AUDCAD,M5: uninit reason 0
2008.03.17 10:38:49 test_SetOrder AUDCAD,M5: aperto #21620553 vendere limite 0,50 AUDCAD a 0,9190 sl: 0,9201 tp: 0,9179 ok
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: SetOrder(): livelli di prezzo corretti
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Ask=0.919 Bid=0.918 sy=AUDCAD ll=0.5 op=Sell Limit pp=0.9188 sl=0.9197 tp=0.9179 mn=0
2008.03.17 10:38:40 test_SetOrder AUDCAD,M5: Error(130) set order: invalid stops, try 1
2008.03.17 10:38:40 stdlib AUDCAD,M5: caricato con successo
2008.03.17 10:38:39 test_SetOrder AUDCAD,M5: caricato con successo

Questo esempio tenta di nuovo di impostare un ordine limite troppo vicino al mercato. Il livello di impostazione degli ordini è stato regolato al rialzo di 2 pip da 0,9188 a 0,9190. Anche il livello di stop è stato modificato, ma di 4 punti da 0,9197 a 0,9201. Solo il livello Take è rimasto invariato, che è aumentato da 9 a 11 pip.

Penso che ci siano abbastanza esempi. Sono già abbastanza difficili da capire. Quali conclusioni si possono trarre?
1. La funzione farà del suo meglio per completare il suo compito, cioè cercherà di stabilire un ordine. Adatterà i livelli al mercato che cambia e cercherà di fare il suo lavoro ancora e ancora.
2. La regolazione del livello di impostazione dell'ordine di stop porta ad un aumento del livello di stop in punti rispetto al prezzo di impostazione. Questo è dovuto al fatto che il livello dell'ordine di stop rimane al suo posto e il livello di impostazione dell'ordine viene spostato lontano dal livello di stop. Il livello dell'ordine BuyStop è spostato verso l'alto e l'ordine SellStop verso il basso. Queste manipolazioni con il livello di impostazione dell'ordine aumentano la dimensione dello stop in punti del valore della regolazione del livello di impostazione dell'ordine.
3. La regolazione del livello di impostazione dell'ordine limite si traduce nell'aumento del livello di take line in punti relativamente al prezzo di impostazione. Questo è implementato nel modo seguente. I tee rimangono al loro posto mentre gli stop e i livelli di impostazione vengono spostati verso l'alto per il BuyLimit e verso il basso per il SellLimit. La dimensione dei punti di presa aumenta del valore della correzione del livello di impostazione dell'ordine.

Attenzione! Ho cambiato il codice della funzione SetOrder scambiando alcune righe. Il vecchio post non può essere modificato, quindi sto incollando qui la funzione corretta. Inoltre è allegato uno script per testare online la funzione SetOrder.


File:
 

Per accelerare la pubblicazione della funzione ModifyOrder, ho deciso di passare alle funzioni di posizione per un po' e poi tornare alle funzioni di ordine e finire con esse.

Nota!
Definisco leposizioni come operazioni di trading OP_BUY e OP_SELL. Le posizioni vengono aperte e chiuse.
Chiamo le operazioni di trading OP_BUYLIMIT, OP_BUYSTOP, OP_SELLLIMIT e OP_SELLSTOPcome ordini. Gli ordini vengono piazzati e cancellati. Se un ordine viene attivato, diventa una posizione.

La funzione ExistPositions().

Questa funzione è destinata a controllare se ci sono posizioni aperte di acquisto o vendita. Simile alla funzione ExistOrders. Per impostazione predefinita, controlla tutte le posizioni: corrente e altre. È possibile raffinare la selezione con una combinazione di filtri - parametri di funzione:

  • sy - Impone una restrizione sul nome dello strumento. Il parametro predefinito è "" - nessuna restrizione, cioè qualsiasi strumento. Se si passa NULL, la selezione della posizione sarà limitata allo strumento corrente.
  • op - pone una restrizione sul tipo di posizione (Acquisto/Vendita). Per impostazione predefinita, non c'è alcun vincolo, cioè, qualsiasi tipo di posizione è controllato. I valori validi per questo parametro sono -1, OP_BUY e OP_SELL.
  • mn - Applica la restrizione sul numero di identificazione ("magico") della posizione. Per default non c'è alcun vincolo, cioè viene controllata la posizione con qualsiasi numero magico.
  • ot - Applica una restrizione sul tempo di apertura della posizione. Controlla se la posizione sarà aperta dopo il valore di questo parametro. Nessun vincolo di default, cioè qualsiasi posizione con qualsiasi orario di apertura viene controllata.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 06.03.2008                                                     |
//|  Описание : Возвращает флаг существования позиций                          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    ot - время открытия             ( 0   - любое время открытия)           |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1, datetime ot=0) {
  int i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (ot<=OrderOpenTime()) return(True);
            }
          }
        }
      }
    }
  }
  return(False);
}
 

Esempi di come usare la funzione ExistPositions().

1. Controllare l'esistenza di qualsiasi posizione

ExistPositions();

2. Controlla l'esistenza di qualsiasi posizione sul simbolo del grafico corrente

ExistPositions(NULL);

3. Controllare l'esistenza dell'acquisto su qualsiasi strumento

ExistPositions("", OP_BUY);

4. Controlla se c'è una vendita con il numero magico 123456 su EURUSD

ExistPositions("EURUSD", OP_SELL, 123456);

5. Controllare l'esistenza di qualsiasi posizione con orario di apertura non anteriore a 15 minuti fa

ExistPositions("", -1, -1, TimeCurrent()-15*60);

Il trailer contiene uno script per testare la funzione ExistPositions. I primi quattro esempi sono commentati.

 
Mi dispiace, ma né OrderSet_1 né OrderSet_2 funzionano! Genera errori - non compila! Cosa devo fare?
 
SoloEgoist:
Mi dispiace, ma né OrderSet_1 né OrderSet_2 funzionano! Genera errori - non compila! Cosa devo fare?
I file OrderSet_1 o OrderSet_2 sono codici sorgente per la funzione OrderSet in diverse versioni. Solo il codice sorgente, tutto qui. Non compileranno o eseguiranno correttamente (senza errori). Per ottenere almeno qualche risultato, dovete anche creare un ambiente di lavoro che usi la funzione OrderSet. Ho creato un esempio di un tale ambiente di lavoro in test_SetOrder.
 
Grazie. Capisco - ci proverò, ma non conosco molto la lingua.
 

Funzioni e modi di lavorare con la data e l'ora sarebbero utili...

Per esempio:
- sottrarre 2 ore dall'ora corrente
- X giorni alla scadenza...

Inoltre... non so se questo è rilevante... :(

Funzioni per la statistica. Per esempio:
- quante candele orarie alle 21:00 ogni lunedì
- di cui: 215 rialzista, 245 ribassista
- di candele rialziste: min. 12 pips max 54 pips
- ecc...

o
- il minimo di ogni prima candela 15H del giorno è superiore/inferiore al secondo X numero di volte

Non sono importanti le funzioni in sé, ma come vengono create, ed è più facile implementare le proprie funzioni,
mentre imparava a programmare...
Mi sto lamentando ancora una volta :))) A volte molte cose non sono molto chiare, e i libri su C possono aiutare.
Naturalmente potete leggerli, ma avete davvero bisogno di riempirvi la testa di informazioni inutili, concentrandovi solo su µl4?
Che tipo di oscurità? per esempio questa: ||

 
kombat:

Funzioni e modi di trattare la data e l'ora sarebbero utili...

Per esempio:
- sottrarre 2 ore dall'ora corrente
- Mancano X giorni alla scadenza...

...


non hai bisogno di scrivere una tale funzione - c'è una soluzione molto semplice!


int gHour = 2;
datetime gTwoHour ;


gTwoHourTime = TimeCorrent() - ((86400)/24) * gHour ); // 2 ore
gTwoHourTime = TimeCorrent() - 7200; // lo stesso ma senza calcoli di carico

cioè abbiamo 86400 tick in un giorno

quindi 2 ore = 7200 tick, cioè 86400/24 * 2 = 7200
1 ora = 3600; ecc.
 
kombat:

Sarebbero utili funzioni e modi di lavorare con la data e l'ora.

Funzioni per la statistica. Per esempio:
- quanti candelieri delle 21:00 ogni lunedì
- di cui: 215 rialzista, 245 ribassista
- di candele rialziste: min. 12 pips max 54 pips
- ecc...

o
- il minimo di ogni prima candela 15H del giorno è superiore/inferiore al secondo X numero di volte

Non sono importanti le funzioni in sé, ma come vengono create, ed è più facile implementare le proprie funzioni,
mentre imparava a programmare...

Debitamente annotato... :-)

kombat ha scritto (a):
Mi lamenterò di nuovo :))) a volte molte cose non sono molto chiare, e dicono che i libri C aiutano.
Fanno notare che molti libri di C possono essere d'aiuto. Certo, puoi leggerli, ma hai davvero bisogno di riempirti la testa con informazioni inutili, concentrandoti solo su µl4?
Che tipo di oscurità? per esempio questa: ||

È un OR logico. Lasciate che ve lo spieghi con un esempio. L'espressione "Se x>2 o x<-3, allora x=5" in MQL4 avrà la seguente forma

if (х>2 || х<-3) х=5;