Caratteristiche utili da KimIV - pagina 15

 
KimIV:
B_Dima:
Se il valore CCI è superiore a 100, allora aprite una posizione di acquisto fino a quando il valore è inferiore a -100, e quando è inferiore a -100, allora aprite una posizione di vendita fino a quando è superiore a 100.

Per te, Dima, posso suggerire questa funzione:

int CCI_period=14;
int Applied_Price=PRICE_CLOSE;

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.24.2008                                                     |
//|  Описание : Возвращает торговый сигнал:                                    |
//|              1 - покупай                                                   |
//|              0 - сиди, кури бамбук                                         |
//|             -1 - продавай                                                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    nb - номер бара                 (    0       - текущий номер бара)      |
//+----------------------------------------------------------------------------+
int GetTradeSignal(string sy="", int tf=0, int nb=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  double cci0=iCCI(sy, tf, CCI_period, Applied_Price, nb);
  double cci1=iCCI(sy, tf, CCI_period, Applied_Price, nb+1);
  int bs=0;

  if (cci1<=+100 && cci0>+100) bs=+1;
  if (cci1>=-100 && cci0<-100) bs=-1;

  return(bs);
}

Questa funzione restituisce 1 quando si compra e -1 quando si vende. Le condizioni di acquisto/vendita sono quelle che vuoi tu. Tutto quello che dovete fare ora è fare quanto segue su ogni spunta:

1. Ottieni il valore di GetTradeSignal().

2. Se il valore ricevuto ==0, allora non fare nulla.

Se il valore ricevuto >0, allora chiudi tutte le vendite e compra.

4. Se il valore calcolato è <0, allora chiudi tutti i trade e vendi.

:)))) naturalmente grazie per l'aiuto, ma il mio errore, non ho spiegato abbastanza accuratamente, l'indicatore CCI con un intervallo di 50 mostra la direzione e il cambiamento di tendenza e l'apertura avviene quando il prezzo tocca la EMA 8 e utilizza anche stop-loss e take-profit e altri indicatori per determinare la correzione. L'immagine è che quando il CCI sfonda +100 si apre una posizione di acquisto al tocco dell'EMA e non importa dove il CCI è (+10 o -20), la cosa principale è che quando attraversa -100 si apre una posizione di vendita. Nell'intervallo di tempo tra l'attraversamento di 100 candele e l'apertura di 10 o più posizioni, il CCI>=+100 e il CCI<=-100 possono attraversare 100 candele. Spero che sia chiaro. Se hai qualche consiglio, sarò felice di aiutarti.

 
B_Dima писал (а):
Errore mio, non l'ho spiegato abbastanza accuratamente,

Bene... Il tuo errore è tuo da correggere :-)

Ti ho dato la giusta direzione. Porterà all'obiettivo. Quindi vai avanti...

 
KimIV:

Esempi di come usare la funzione ModifyOrder().

Ho deciso di fare i primi esempi che mi sono stati chiesti molte volte. Questa è l'apertura di posizioni in termini di esecuzione degli ordini di mercato Market Watch. È quando non possiamo dare simultaneamente un ordine per aprire una posizione al prezzo di mercato e allegare un ordine pendente ad esso. Un'apertura di questo tipo a Market Watch deve essere eseguita in due fasi: prima si apre una posizione e poi si allega un ordine pendente ad essa, cioè si impostano i livelli di prezzo StopLoss e TakeProfit.

1. Comprare 0,1 lotti del simbolo corrente e impostare uno stop di 30 punti

int ti=OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Ask-30*Point, -1, clModifyBuy);

2. Vendi 0,15 lotti dello strumento corrente e imposta SL=45, TP=99

int ti=OpenPosition(NULL, OP_SELL, 0.15);
if (OrderSelect(ti, SELECT_BY_TICKET))
  ModifyOrder(-1, Bid+45*Point, Bid-99*Point, clModifySell);
Una sceneggiatura di lavoro con esempi è inclusa nel trailer.


Igor, per favore controlla di nuovo - lo script non funziona:

1) Nelle normali società di intermediazione non c'è limite al numero di ordini aperti (si apre all'infinito)

2) Nelle società di intermediazione dove gli ordini sono aperti a mercato - (Errore131). Potete testarlo, per esempio con NorthFinance.

 

Così tante funzioni utili disposte... Forse c'è il desiderio di scrivere un modello per scrivere un EA di trading che possa aprire e chiudere ordini pendenti, posizioni, impostare take e stoploss, modificare ordini e posizioni, a seconda delle condizioni definite dall'utente... Un tale modello ti permetterà di scrivere rapidamente un EA in cui solo il blocco di condizioni è cambiato (naturalmente, questa parte sarà inserita dall'utente a seconda della strategia)...


Se ci sono funzioni utili di Kim, cioè un certo standard di versatilità nell'uso, allora perché non stendere il codice di un template per un EA di trading di Kim...

 
Set777 писал (а):
Igor, per favore controlla di nuovo - lo script non funziona:
1) Nelle normali società di intermediazione non c'è limite al numero di ordini aperti (si apre all'infinito)
2) Nelle società di intermediazione dove gli ordini sono aperti dal mercato - (Error131). Potete testarlo, per esempio NorthFinance.

1. Non c'è nessun controllo sul numero di posizioni aperte nello script. Quante volte si esegue lo script, il numero di posizioni che aprirà.

Errore 131 - Volume errato, dimensione del lotto. Probabilmente è 0,15. Sostituiscilo con 0,2

 
kharko писал (а):
Così tante utili funzioni disposte...

Neanche un quinto di quello che ho in mente ancora... Annoierò tutti qui fino all'autunno. Quindi abbiate pazienza...

kharko ha scritto (a):
Forse c'è il desiderio di scrivere qualche modello per scrivere un consulente di trading, che può aprire e chiudere ordini pendenti, posizioni, impostare take e stoploss, modificare ordini e posizioni, a seconda delle condizioni definite dall'utente...
Template... Template... Buona idea! Grazie! Ma prima le funzioni...
 

Funzione DistMarketAndPos().

Ci siamo! Ecco che arrivano altre funzioni interessanti! Per esempio, restituisce la distanza in pip tra il mercato e la posizione più vicina. La selezione più accurata delle posizioni da controllare è impostata da parametri esterni:

  • sy - Nome dello strumento. Se questo parametro è impostato, la funzione controllerà solo le posizioni dello strumento specificato. Il "" o NULL indica lo strumento corrente.
  • op - operazione commerciale, tipo di posizione. Valori validi: OP_BUY, OP_SELL o -1. Il valore predefinito -1 significa qualsiasi posizione.
  • mn - Identificatore di posizione (MagicNumber). Valore predefinito -1 - qualsiasi MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает расстояние в пунктах между рынком и ближайшей       |
//|             позицей                                                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    op - торговая операция          (    -1      - любая позиция)           |
//|    mn - MagicNumber                (    -1      - любой магик)             |
//+----------------------------------------------------------------------------+
int DistMarketAndPos(string sy="", int op=-1, int mn=-1) {
  double d, p;
  int i, k=OrdersTotal(), r=1000000;

  if (sy=="" || sy=="0") sy=Symbol();
  p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
          if (OrderType()==OP_SELL) {
            d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
        }
      }
    }
  }
  return(r);
}
 

Esempi di utilizzo di DistMarketAndPos().

Perché si dovrebbe avere bisogno di una funzione che determini quanto è lontano il mercato dalla posizione più vicina? Vedo almeno quattro opzioni di base:

  1. Comprato o venduto. Il mercato si è mosso nella nostra direzione. E non appena passa una certa distanza, le posizioni esistenti hanno guadagnato un po' di profitto, facciamo immediatamente un deposito - entriamo di nuovo nella stessa direzione.
  2. Compriamo o vendiamo. Il mercato è andato nella nostra direzione. Una volta che ha percorso una certa distanza, e le posizioni esistenti hanno guadagnato un certo profitto, ci rendiamo subito conto che è finita! L'inversione è vicina! È il momento di girare. Chiudiamo le nostre posizioni attuali e apriamo nella direzione opposta.
  3. Compriamo o vendiamo. Il mercato ci si è rivoltato contro. Ma per qualche ragione, siamo sicuri di avere ragione e, a una certa distanza dal punto di entrata più vicino, cioè a un certo livello di perdita, facciamo la media e apriamo nella stessa direzione.
  4. Compriamo o vendiamo. Il mercato ci è andato contro. E ci siamo resi conto che siamo entrati nel mercato in modo sbagliato. Quindi, ci fissiamo su un certo livello di perdita e apriamo nell'altra direzione.

Se voglio piazzare un ordine con il giusto ordine, deve essere fatto nel quadro delle condizioni di mercato. Soddisferò tutte le richieste nell'ambito di ciò che ho elencato sopra.

ZZY-ZY. In allegato uno script "modello" per sperimentare la funzione DistMarketAndPos().

 
Caro KimIV Nella funzione idPriceLevel() che fa parte del tuo Expert Advisor e-TFL_v2 c'è un errore: nell'ultima condizione gdUpPrice==0 è ripetuta due volte. Probabilmente, nel secondo caso volevi scrivere gdDnPrice==0. Per qualche ragione, questo EA funziona nello Strategy Tester in modalità visiva, ma il conto demo non apre posizioni, anche se i commenti informano sui livelli di acquisto e vendita. Forse puoi dirmi cosa c'è che non va.
 
khorosh:
c'è un errore nella funzione bool idPriceLevel() inclusa in e-TFL_v2 Expert Advisor: gdUpPrice==0 è ripetuto due volte nell'ultima condizione, probabilmente volevi scrivere gdDnPrice==0 nel secondo caso.

Grazie! Ho caricato la versione corretta di e-TFL_v2 sul sito web.


khorosh:
Per qualche motivo questo EA funziona nel mio Strategy Tester in modalità visiva ma non apre posizioni su un conto demo, anche se riporta i livelli di acquisto e vendita nei commenti. Forse potete dirmi qual è il problema.

Non lo so... Ho appena finito di testare questo Expert Advisor su una demo di NorthFinance. Ieri mi ha chiamato il mio amico di Mosca. Si è lamentato dello stesso Expert Advisor. Dice che apre le posizioni in base alla linea e poi sempre di più fino a quando si ferma e apre molte posizioni. Pertanto, c'erano due obiettivi per i test:

1. Per quanto riguarda la sua domanda. Controllo della funzionalità generale.

2. Sulla domanda del mio amico. Ho aperto solo una posizione da una linea.

Per verificarlo, ho messo e-TFL_v2 Expert Advisor su timeframe a 5 minuti EURUSD, GBPUSD, USDCHF e USDJPY. Usando le linee di tendenza ho disegnato dei canali sulle ultime 20-30 barre. Di conseguenza, l'Expert Advisor ha funzionato come dovrebbe. L'EUR è stato comprato dalla linea inferiore, mentre lo JPY è stato venduto da quella superiore. Anche per la libbra e il chyf tutto era corretto. Quindi dovreste controllare da soli. L'Expert Advisor funziona.