Caratteristiche utili da KimIV - pagina 110

 
Grazie per il chiarimento, ora andrò avanti)))))
 

Funzione WritingLineInFile().

Ho riscritto questa funzione, ho aggiunto un parametro fs, che permette di scrivere la prima riga del file, che è diversa dalle altre righe, per esempio l'intestazione della tabella. La prima riga sarà scritta nel file solo se due condizioni sono soddisfatte simultaneamente: la lunghezza della riga è maggiore di zero e la dimensione del file è zero. E per mantenere la compatibilità con la versione precedente, il nuovo parametro è stato reso opzionale.

Parametri della funzione WritingLineInFile():

  • fn - nome del file
  • st - la stringa da scrivere nel file
  • fs - prima linea (intestazione della tabella)

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.04.2012                                                     |
//+----------------------------------------------------------------------------+
//|  Описание : Запись строки в файл                                           |
//|  Параметры:                                                                |
//|    fn - имя файла                                                          |
//|    st - строка                                                             |
//|    fs - первая строка (шапка таблицы)                                      |
//+----------------------------------------------------------------------------+
void WritingLineInFile(string fn, string st, string fs="") {
  int fh=FileOpen(fn, FILE_READ|FILE_WRITE, " ");

  if (fh>0) {
    if (FileSize(fh)==0 && StringLen(fs)>0) FileWrite(fh, fs);
    FileSeek (fh, 0, SEEK_END);
    FileWrite(fh, st);
    FileClose(fh);
  }
}

ZZY. In allegato c'è uno script per testare la funzione.

 
Buona sera, Igor! Si è fermato alla funzione
DateBeginQuarter

Prima di tutto sto cercando di capire le linee:

int ye=Year()-MathFloor(nq/4);
  nq=MathMod(nq, 4);

Per default nq = 0, quindi non è chiaro cosa otteniamo dall'espressione MathMod(nq/4), dato che il risultato sarà sempre 0. Anche la seconda riga non è chiara, dato che 0/4 non ha resto, si prega di chiarire.

 

Grazie, Natasha, per la tua domanda. Grazie a voi, ho ricontrollato la funzione e ho trovato l'errore. Nella linea

int ye=Year()-MathFloor(nq/4);

Ho bisogno di sostituire il segno meno con un segno più.

int ye=Year()+MathFloor(nq/4);

E ora veniamo alla sostanza della sua domanda. nq non è sempre uguale a zero. Ci può essere qualsiasi valore intero, compresi quelli negativi. Queste linee funzionano quando nq è un multiplo di 4, cioè quando dovete aggiungere o sottrarre 4 trimestri (anno).

 
KimIV:

Grazie, Natasha, per la tua domanda. Grazie a voi, ho ricontrollato la funzione e ho trovato l'errore. Nella linea

Ho bisogno di sostituire il segno meno con un segno più.

E ora veniamo alla sostanza della sua domanda. nq non è sempre uguale a zero. Ci può essere qualsiasi valore intero, compresi quelli negativi. Le linee che hai specificato funzionano nei casi in cui nq è un multiplo di 4, cioè quando devi aggiungere o sottrarre 4 trimestri (anno).

Grazie per la tua risposta, Igor.... mi ci è voluto più tempo del solito per affrontare la funzione, ma l'ho comunque capito))))))) nella stessa funzione, mi sembra che non ho bisogno di diminuire l'anno nell'espressione:

 if (mo<1) {
    mo+=12;
    ye--;

allora sarà corretto.

 
Lisi4ka330:

...nella stessa funzione, non credo sia necessario ridurre l'anno nell'espressione...

Giustifica, Natasha, perché no? Al contrario, mi sembra logico diminuire l'anno dopo aver chiuso il cerchio mensile nella direzione opposta. Nella tua espressione, rimpicciolire l'anno equivale a spostare la lancetta delle ore indietro di un'ora dopo che la lancetta dei minuti è stata avvolta indietro di un giro completo. Dacci la tua versione della funzione e ne discuteremo... Forse la tua versione avrà più successo della mia.
 

Funzione GetDrawdownOpenPosInPoint()

Bene, ho finito di testare a fondo questa funzione. Ho tenuto conto dello spread dove necessario, ho cercato di ottimizzarlo... La funzione restituisce il drawdown massimo delle posizioni attualmente aperte in pip. Tradizionalmente, potete passare dei parametri alla funzione e quindi filtrare le posizioni che vi servono per l'analisi:

  • sy - Nome dello strumento. Se questo parametro viene passato, la funzione controllerà solo le posizioni dello strumento specificato. NULL significa lo strumento corrente, e "" (di default) significa qualsiasi strumento.
  • 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). Il valore predefinito di -1 significa qualsiasi MagicNumber.
  • tf - Timeframe del grafico, su cui vengono mostrati i valori delle barre High e Low. Il valore predefinito è 0 - l'intervallo di tempo corrente.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.05.2012                                                     |
//|  Описание : Возвращает максимальную просадку в пунктах текущих открытых    |
//|             позиций.                                                       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    tf - таймфрейм                  ( 0   - текущий таймфрейм)              |
//+----------------------------------------------------------------------------+
int GetDrawdownOpenPosInPoint(string sy="", int op=-1, int mn=-1, int tf=0) {
  if (sy=="0") sy=Symbol();
  if (tf==0) tf=Period();

  datetime to=TimeOpenFirstPos(sy, op, mn); // Время открытия первой позиции
  datetime tb=GetTimeOpenBar(sy, tf, to);
  int      dd, md=0;                        // Просадка
  double   po, sp;                          // Пункт, спрэд
  int      i, k=OrdersTotal();              // Номера позиций
  int      nb;                              // Номер бара

  if (tb>0) {
    while (tb<TimeCurrent()) {
      dd=0;
      for (i=0; i<k; i++) {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
          if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
            if ((op<0 || OrderType()==op) && (OrderType()==OP_BUY || OrderType()==OP_SELL)) {
              if (tb>OrderOpenTime()) {
                nb=iBarShift(OrderSymbol(), tf, tb, True);
                if (nb>=0) {
                  po=MarketInfo(OrderSymbol(), MODE_POINT);
                  if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol()+". Точность расчётов не гарантируется!");
                  else {
                    if (OrderType()==OP_BUY) {
                      dd+=(OrderOpenPrice()-iLow(OrderSymbol(), tf, nb)+po)/po;
                    }
                    if (OrderType()==OP_SELL) {
                      sp=po*MarketInfo(OrderSymbol(), MODE_SPREAD);
                      dd+=(iHigh(OrderSymbol(), tf, nb)-OrderOpenPrice()+sp)/po;
                    }
                  }
                }
              }
            }
          }
        }
      }
      if (md<dd) md=dd;
      tb+=60*tf;
    }
  }
  return(md);
}

SZZ. In allegato c'è uno script per testare la funzione GetDrawdownOpenPosInPoint().

 
KimIV:
Giustifica, Natasha, perché no? Al contrario, mi sembra logico diminuire l'anno dopo aver chiuso il cerchio mensile nella direzione opposta. Nella tua espressione, rimpicciolire l'anno equivale a spostare la lancetta delle ore indietro di un'ora dopo che la lancetta dei minuti è stata avvolta indietro di un giro completo. Dacci la tua versione della funzione e ne discuteremo... Forse la tua versione avrà più successo della mia.

Ho ragionato così: diciamo che dobbiamo determinare l'inizio di Q7 nel passato e nel futuro, allora nq= -7 e nq=7 rispettivamente. Mathfloor restituirà -2 per il passato e +1 per il futuro (a giudicare dalla descrizione della funzione nella documentazione), quindi per la situazione nel passato sottrarremo un anno in più di quello che aggiungiamo nel futuro..... se continuiamo altri calcoli per il passato, dovremo ridurre ancora l'anno e finiremo al 2009.....

Purtroppo per mancanza di tempo (difficilmente ho il tempo di leggere la pagina del sito), non posso fornire il codice che penso sia corretto, ma penso che se necessario, non sarà difficile correggerlo.

 
Lisi4ka330:

Ho ragionato così: diciamo che dobbiamo determinare l'inizio di Q7 nel passato e nel futuro, allora nq= -7 e nq=7 rispettivamente. Mathfloor restituirà -2 per il passato e +1 per il futuro (a giudicare dalla descrizione della funzione nella documentazione), quindi per la situazione nel passato sottrarremo un anno in più di quello che aggiungiamo nel futuro..... se continuiamo altri calcoli per il passato, dovremo ridurre ancora l'anno e finiremo nel 2009...

Sono d'accordo con il tuo ragionamento, ma stai dimenticando i tipi di dati coinvolti nelle operazioni. MathFloor() può essere omesso del tutto. Vedi il risultato dello script nell'allegato.

File:
test.mq4  1 kb
 
Buon pomeriggio, Igor)))) Ad essere onesti, non ho capito bene la tua risposta, e anche lo script allegato non ha portato chiarezza, ma piuttosto il contrario... )))) ma penso che lo capirò col tempo)))) Potreste dirmi perché ci sono dei plus nella linea return(StrToTime(ye+"."+mo+".01").
Motivazione: