Caratteristiche utili da KimIV - pagina 114

 

Buon pomeriggio.

Sono ancora nuovo nella programmazione, se qualcuno ha qualche consiglio.

Domanda. Abbiamo uno o più ordini aperti e sappiamo che chiuderanno con un profitto di 20 dollari.

Abbiamo bisogno di sapere a quale prezzo gli ordini chiuderanno con un profitto di 20 dollari.

Calcoliamo il volume totale dei lotti aperti, e poi!

Per favore, consigliatemi come fare.

Forse c'è una funzione pronta?

Grazie in anticipo.

 
KimIV:

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 volete un'implementazione specifica di una di queste opzioni, scrivete qui le vostre richieste. Soddisferò tutte le richieste nell'ambito di ciò che ho elencato sopra.

ZZY-ZY. In allegato c'è un modello per sperimentare la funzione DistMarketAndPos().


CiaoKimIV, la funzione è molto buona, funziona, la capovolgo e funziona anche, ma non riesco a collegare le due metà.

     int start()

{

      if (DistMarketAndPos()>150)

{                                     

      OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,Ask+150*Point);

   }     

      return(0);

   }

int DistMarketAndPos(string sy="", int op=OP_BUY, 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, "")<0) p=0.00001; 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);

}  


 

Per favore, giralo per me, tutti dicono che non è giusto ma funziona.
 
Nuovi arrivati, fate le vostre domande nel thread dedicato.
 

Nuova versione della funzione Message().


La funzione Message() ha subito due cambiamenti dalla pubblicazione qui. La prima modifica ha aggiunto la possibilità di disabilitare l'output nel log di Expert tramite Print() e la possibilità di emettere solo il primo messaggio in una serie di messaggi simili. Il secondo cambiamento ha aggiunto direzioni di output, cioè oltre alle funzioni esistenti Comment() e Print() sono state usate Alert(), SendMail() e SendNotification(). È quest'ultimo cambiamento che sto pubblicando.

La funzione Message() è progettata per emettere il messaggio di testo in diverse direzioni. Può essere usato sia per scopi di debug che in applicazioni pronte per spiegare la situazione attuale del trading, per registrare il funzionamento del programma, per informare tempestivamente un trader su importanti cambiamenti, ecc. La funzione accetta tre parametri, gli ultimi due dei quali sono opzionali:
  • ms - Stringa, messaggio di testo da emettere, trasmesso.
  • nv - Una stringa di bandiere che specificano la direzione dell'uscita del messaggio. Cinque bandiere sono cinque luoghi significativi. Ogni faccia di bandiera con zero accende e uno spegne una particolare direzione di uscita. Da sinistra a destra in ordine sono Alert, Comment, Print, SendMail e SendNotification. Il valore predefinito è "01100", cioè Commento e Stampa sono abilitati, gli altri sono disabilitati.
  • am - Logico, True - emette tutti i messaggi, False - da una serie di messaggi identici emette solo il primo. Il valore predefinito è False.

Riguardo alle direzioni di uscita Alert e Print (spazi 1 e 3) va notato che sono in grado di emettere il messaggio riga per riga. In altre parole, se c'è un'interruzione di riga nel testo del messaggio - carattere di controllo "\n" allora ogni riga sarà stampata indipendentemente. Prova lo script di prova nell'allegato, penso che ti piacerà :-)

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.03.2013                                                     |
//|  Описание : Вывод текстового сообщения.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ms - текст сообщения                                                    |
//|    nv - флаги направлений вывода сообщения:   (0-выкл, 1-вкл)              |
//|           Alert, Comment, Print, SendMail, SendNotification                |
//|    am - флаг всех повторяющихся сообщений                                  |
//+----------------------------------------------------------------------------+
void Message(string ms, string nv="01100", bool am=False) {
  static string prevMessage="";
  string as[];
  int    i, k;

  if (StrToInteger(StringSubstr(nv, 1, 1))==1) Comment(ms);
  if ((StringLen(ms)>0) && (am || prevMessage!=ms)) {
    if (StrToInteger(StringSubstr(nv, 0, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Alert(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 2, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Print(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 3, 1))==1) SendMail(WindowExpertName(), ms);
    if (StrToInteger(StringSubstr(nv, 4, 1))==1) SendNotification(ms);
    prevMessage=ms;
  }
}

SZY. In allegato c'è uno script per testare la funzione Message().

File:
 
KimIV:

Nuova versione della funzione Message().


La funzione Message() ha subito due cambiamenti dalla pubblicazione qui. La prima modifica ha aggiunto la possibilità di disabilitare l'output nel log di Expert tramite Print() e la possibilità di emettere solo il primo messaggio in una serie di messaggi simili. Il secondo cambiamento ha aggiunto direzioni di output, cioè oltre alle funzioni esistenti Comment() e Print() sono state usate Alert(), SendMail() e SendNotification(). È quest'ultimo cambiamento che sto pubblicando.

La funzione Message() è progettata per emettere il messaggio di testo in diverse direzioni. Può essere usato sia per scopi di debug che in applicazioni pronte per spiegare la situazione attuale del trading, per registrare il funzionamento del programma, per informare tempestivamente un trader su importanti cambiamenti, ecc. La funzione accetta tre parametri, gli ultimi due dei quali sono opzionali:
  • ms - Stringa, messaggio di testo da emettere, trasmesso.
  • nv - Una stringa di bandiere che specificano la direzione dell'uscita del messaggio. Cinque bandiere sono cinque luoghi significativi. Ogni faccia di bandiera con zero accende e uno spegne una particolare direzione di uscita. Da sinistra a destra in ordine sono Alert, Comment, Print, SendMail e SendNotification. Il valore predefinito è "01100", cioè Commento e Stampa sono abilitati, gli altri sono disabilitati.
  • am - Logico, True - emette tutti i messaggi, False - da una serie di messaggi identici emette solo il primo. Il valore predefinito è False.

Riguardo alle direzioni di uscita Alert e Print (spazi 1 e 3) va notato che sono in grado di emettere il messaggio riga per riga. In altre parole, se c'è un'interruzione di riga nel testo del messaggio - carattere di controllo "\n" allora ogni riga sarà stampata indipendentemente. Prova lo script di prova nell'allegato, penso che ti piacerà :-)


SZY. In allegato c'è uno script per testare la funzione Message().

Avete aggiunto un controllo stopplay alla vostra funzione OpenPosition?
 
sv.:
Avete aggiunto un controllo per il livellamento dello stop alla vostra funzione OpenPosition?


No... a che tipo di controllo si riferisce? Bene, diciamo che lo stop and take ha fallito il controllo, cosa fare? Ci sono opzioni:

  1. Non aprire,
  2. Regolare lo stop e il takeaway.

 
KimIV:


no... a che tipo di controllo si riferisce? Bene, diciamo che lo stop and take non ha superato il controllo, cosa fate? Ci sono delle opzioni:

  1. Non aprire,
  2. Regolare lo stop e prendere.

Si potrebbe introdurre un interruttore personalizzato tra i punti 1 e 2. Seguendo lo schema:
 int           modeSetOrders = 1;      // Способ установки ордеров:
                                       //  0 - по заданной цене
                                       //  1 - скорректировать цены
                                       //  2 - вход по текущим ценам
 

Nuova versione della funzioneOpenPosition() nello script di test.

Cosa c'è di nuovo?

1. Quando l'errore 130 Invalid Stops e il valore della variabile NumberOfTry>1 è impostato, la funzione cercherà di regolare i livelli di prezzo StopLoss e TakeProfit ai valori di MODE_STOPLEVEL+MODE_SPREAD relativi a Bid per OP_SELL e Ask per OP_BUY.

Nota:

La variabile globaleNumberOfTry deveessere maggiore di 1 per innescare la correzione dei livelli di prezzo. Questo è dovuto alfatto che il primo tentativo di aprire una posizione rivela l'errore 130 e corregge i livelli di prezzo, mentre il secondo e i successivi tentativi di aprire una posizione con livelli corretti.

File:
 
KimIV, è bello vederti di nuovo qui con nuove caratteristiche.
 

Buon pomeriggio.

È possibile integrare la libreria di funzioni utili di KimIV con alcune funzioni semplici come :

1.prezzo aperto, selezionato da alcuni criteri di posizione (simbolo, tipo, dimensione del lotto, numero magico). Questo prezzo può essere memorizzato in variabili globali e utilizzato come un certo livello di prezzo, dal quale l'algoritmo dell'Expert Advisor può essere costruito.

Restituisce un biglietto selezionato secondo alcuni criteri di una posizione o di un ordine (simbolo, tipo, dimensione del lotto, numero magico). Il biglietto è un identificatore importante, può essere usato ovunque e anche come bandiera di esistenza.

Più funzioni semplici ci sono, più facile sarà trovare quelle migliori per voi, senza la paura di fare un errore quando si modificano quelle esistenti.

Grazie per le vostre funzioni.