Características úteis da KimIV - página 110

 
Obrigado pelo esclarecimento, agora vou passar para )))))
 

Função WritingLineInFile().

Eu reescrevi esta função, adicionei um parâmetro fs, que permite escrever a primeira linha do arquivo, que é diferente de outras linhas, por exemplo, cabeçalho de tabela. A primeira linha será escrita no arquivo somente se duas condições forem cumpridas simultaneamente: o comprimento da linha é maior que zero e o tamanho do arquivo é zero. E a fim de manter a compatibilidade com a versão anterior, o novo parâmetro foi tornado opcional.

Parâmetros da função WritingLineInFile():

  • fn - nome do arquivo
  • st - o fio a ser escrito no arquivo
  • fs - primeira linha (cabeçalho da tabela)

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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. Em anexo está um roteiro para testar a função.

Arquivos anexados:
 
Boa noite, Igor! Parou na função
DateBeginQuarter

antes de mais nada, estou tentando entender as linhas:

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

Por padrão nq = 0, portanto não está claro o que obtemos da expressão MathMod(nq/4), pois o resultado será sempre 0. Também a segunda linha não está clara, pois 0/4 não tem resto, favor esclarecer.

 

Obrigada, Natasha, por sua pergunta. Graças a você, eu verifiquei novamente a função e encontrei o erro. Na linha

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

Preciso substituir o sinal de menos por um sinal de mais.

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

E agora a substância de sua pergunta. nq nem sempre é igual a zero. Pode haver quaisquer valores inteiros, incluindo os negativos. Estas linhas funcionam quando nq é um múltiplo de 4, ou seja, quando você precisa adicionar ou subtrair 4 trimestres (ano).

 
KimIV:

Obrigada, Natasha, por sua pergunta. Graças a você, eu verifiquei novamente a função e encontrei o erro. Na linha

Preciso substituir o sinal de menos por um sinal de mais.

E agora a substância de sua pergunta. nq nem sempre é igual a zero. Pode haver quaisquer valores inteiros, incluindo os negativos. As linhas que você especificou trabalham nos casos em que nq é um múltiplo de 4, ou seja, quando você precisa adicionar ou subtrair 4 trimestres (ano).

Obrigado por sua resposta, Igor.... demorei mais do que o normal para lidar com a função, mas ainda assim descobri))))))) na mesma função, me parece que não preciso diminuir o ano na expressão:

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

então será correto.

 
Lisi4ka330:

na mesma função, acho que não é preciso reduzir o ano na expressão.

Justifique, Natasha, por que não? Pelo contrário, parece-me lógico diminuir o ano após fechar o círculo mensal na direção oposta. Em sua expressão, tornar o ano menor é o mesmo que mover o ponteiro das horas de volta uma hora após o ponteiro dos minutos ter sido enrolado em um círculo completo. Dê-nos sua versão da função e nós a discutiremos... Talvez sua versão tenha mais sucesso do que a minha.
 

Função GetDrawdownOpenPosInPoint()

Bem, eu terminei os testes completos desta função. Levei em conta a dispersão quando necessário, tentei otimizá-la. A função retorna o máximo de drawdown das posições atualmente abertas em pips. Tradicionalmente, você pode passar parâmetros para a função e assim filtrar as posições que você precisa para análise:

  • sy - Nome do instrumento. Se este parâmetro for passado, a função verificará apenas as posições do instrumento especificado. NULL significa o instrumento atual, e "" (por padrão) significa qualquer instrumento.
  • op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
  • mn - Identificador de posição (MagicNumber). O valor padrão de -1 significa qualquer MagicNumber.
  • tf - Quadro de tempo, no qual são mostrados os valores das barras Alta e Baixa. O valor padrão é 0 - o período de tempo atual.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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. Em anexo está um roteiro para testar a função GetDrawdownOpenPosInPoint().

Arquivos anexados:
 
KimIV:
Justifique, Natasha, por que não? Pelo contrário, parece-me lógico diminuir o ano após fechar o círculo mensal na direção oposta. Reduzir o ano na expressão que você acabou de mencionar é o mesmo que mover o ponteiro das horas para trás uma hora após o ponteiro dos minutos ter sido enrolado um círculo completo. Dê-nos sua versão da função e nós a discutiremos... Talvez sua versão tenha mais sucesso do que a minha.

Eu raciocinei assim: digamos que precisamos determinar o início do Q7 no passado e no futuro, depois nq= -7 e nq=7 respectivamente. Mathfloor retornará -2 para o passado e +1 para o futuro (a julgar pela descrição da função na documentação), portanto para a situação no passado subtrairemos mais um ano do que adicionamos no futuro..... se continuarmos os cálculos para o passado, teremos que reduzir o ano novamente e terminaremos em 2009.....

Infelizmente devido à falta de tempo (quase não tenho tempo para ler a página do site), não posso fornecer o código que acho correto, mas acho que, se necessário, não será difícil corrigi-lo.

 
Lisi4ka330:

Eu raciocinei assim: digamos que precisamos determinar o início do Q7 no passado e no futuro, depois nq= -7 e nq=7 respectivamente. Mathfloor retornará -2 para o passado e +1 para o futuro (a julgar pela descrição da função na documentação), portanto para a situação no passado subtrairemos mais um ano do que adicionamos no futuro..... se continuarmos os cálculos para o passado teremos que reduzir o ano novamente e terminaremos em 2009...

Eu concordo com seu raciocínio, mas você está esquecendo os tipos de dados envolvidos nas operações. O MathFloor() pode ser omitido completamente. Veja o resultado do roteiro no anexo.

Arquivos anexados:
test.mq4  1 kb
 
Boa tarde, Igor)))) Para ser honesto, eu não entendi bem sua resposta, e até o roteiro anexo não trouxe clareza, mas sim o oposto... )))) mas acho que vou descobrir a tempo)))) Poderia me dizer por que há vantagens na linha de retorno(StrToTime(ye+"."+mo+".01").