[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 284

 
hoz:
Isso não importa. Estou devolvendo um valor absoluto, modulo através do MathAbs


Se você estiver procurando um ponto de entradaMathAbs() introduz uma mancha. Para mim, isso deve ser especificado do começo ao fim, para que fique claro quando e com que tolerância!
 
borilunad:

Se você estiver procurando o ponto de entradaMathAbs() o torna manchado. Para mim, isso deve ser especificado do começo ao fim, para que fique claro quando e com que tolerância!


Corrigido... De qualquer forma, nenhuma das condições está preenchida.

//+-------------------------------------------------------------------------------------+
//| Получение значений МА на указанном баре                                             |
//+-------------------------------------------------------------------------------------+
double GetMA(int index, int maPeriod)
{
   return (iMA(NULL, i_TF, maPeriod, 0, MODE_EMA, MODE_CLOSE, index));
}
//+-------------------------------------------------------------------------------------+
//| Имеет ли место отскок?                                                              |
//+-------------------------------------------------------------------------------------+
void IsRebound(int crossDir[], bool& returnSign[])
{
   for (int i = 0; i < 4; i++)
   {
      if (crossDir[i] == CROSS_NO)
         continue;

      returnSign[i] = false;
      double ema = GetMA(1, g_maPeriod[i]);

 //     VrPr (ND(MathAbs(ema - Ask)));
   //   VrPr (i_thresholdFromMa * pt);
      if (crossDir[i] == CROSS_UP)
      {
         if (ND(Ask - ema) <= i_thresholdFromMa * pt) // ..зазор между ценой покупки и машки, <= i_thresholdFromMa..
         {
         //   VrPr (ND(MathAbs(ema - Ask)) <= i_thresholdFromMa * pt);
            returnSign[i] = true;
            VrPr (" returnSign["+0+"]"+" = "+ returnSign[0]);
            VrPr (" returnSign["+1+"]"+" = "+ returnSign[1]);
            VrPr (" returnSign["+2+"]"+" = "+ returnSign[2]);
            VrPr (" returnSign["+3+"]"+" = "+ returnSign[3]);
         }
      }
      if (crossDir[i] == CROSS_DN)
      {
         if (ND(ema - Bid) <= i_thresholdFromMa * pt) // ..зазор между ценой продажи и машки, <= i_thresholdFromMa..
         {
            returnSign[i] = true;
            VrPr (" returnSign["+0+"]"+" = "+ returnSign[0]);
            VrPr (" returnSign["+1+"]"+" = "+ returnSign[1]);
            VrPr (" returnSign["+2+"]"+" = "+ returnSign[2]);
            VrPr (" returnSign["+3+"]"+" = "+ returnSign[3]);
         }
      }
   }
}

pararetornarSign[i] = true; e consequentemente para a funçãoVrPr (que é a função que emite os dados que eu monitoreio) não é utilizada. Embora a travessia para baixo já tenha começado. Aqui está uma captura de tela, você pode ver que a matrizcrossDir[] é preenchida à medida que cada máquina rápida cruza a lenta.

Observe que 2 rodas cruzaram a mais grossa, e 2 elementos da matriz já atribuíram valor 1. Isso significa que seu valor éCROSS_DN

O que significa que a condição

 if (crossDir[i] == CROSS_DN)

e depois...

 
borilunad:

Se você estiver procurando um ponto de entrada,MathAbs() introduz a confusão. Para mim, isso deve ser especificado do começo ao fim, para que fique claro quando e com que tolerância!

Também com quem e por quê.
 
tara:

Quem mais e por quê.

Exceto visualmente, é mais fácil de perceber sem MathAbc() de hábito, mas... não há diferença. Mas nós nos desviamos do tema. Há alguma observação sobre meu código? Afinal, a questão ainda está em aberto...
 
Eu não tenho reservas sobre o código.
 
Então por que a condição não está preenchida? Algum comentário sobre a lógica?
 

Não.

 
Sim. Será melhor pela manhã, espero que algo se esclareça amanhã.
 

Boa tarde a todos!

Estou testando USD/JPY em MT-4 da Alpari.

Fiz o download do histórico de 1 minuto do USD/JPY

Nota: Após carregar no arquivo de cotações do histórico de minutos, clique duas vezes em "1 minuto".

A lista de citações de um minuto não aparece na janela do Arquivo de Citações do Banco de Dados por algum motivo.


1 hora TF.

Todos os carrapatos

Período 01.01.2000. - 01.01.2013.

No final dos testes, a guia REPORTS mostra uma barra vermelha e diz que a qualidade da simulação é de 25%.

Eu testei o mesmo período com os mesmos parâmetros ......mas separadamente para cada mês

e para cada mês mostra barra verde e qualidade de simulação de 90%.

Depois testei o mesmo período, mas o dividi em 2 partes iguais 2000-2006 e 2006-2013.

Para cada parte, a barra é verde e a qualidade da simulação é de 90%.


PERGUNTA

O que eu deveria fazer para que a qualidade dos testes por um período de 13 anos em geral também fosse de 90%?

Obrigado

 

Certo. Acho que já terminei. Aqui está o coletor de carrapatos retrabalhados com sua embalagem em segundas velas.

Foi:

int start()
  {  
//----
if(flag == true)
  {
  if(tick.time.local == true)
    {
    time = TimeLocal();
    }
    else{
    time = TimeCurrent();
    }
  if(t < time)
    { 
         t = time; 
    }
    else{ 
         t ++;
    }   

  if(FileSeek(hand1e, fpos, SEEK_SET) == false)
           { 
           error = GetLastError();
           Print("out: error(",error,"): ",ErrorDescription(error));
           flag = false;
           return;
           }
           else{
           bid = MarketInfo(symbol, MODE_BID);
           ask = MarketInfo(symbol, MODE_ASK);
           
                FileWriteInteger(hand1e,    t,   LONG_VALUE);            
                FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);          
                FileWriteDouble (hand1e,  bid, DOUBLE_VALUE);            
                FileWriteDouble (hand1e,  ask, DOUBLE_VALUE);    
                FileWriteDouble (hand1e,  ask, DOUBLE_VALUE);                            
                FileWriteDouble (hand1e, time, DOUBLE_VALUE);                   
      FileFlush       (hand1e);  

      fpos = FileTell (hand1e);

Tornou-se:

int i;//аналогично i=0
        while((TimeCurrent()-time)>1){//то заносим старые значения столько раз, сколько было пропущено секунд минус один
                if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                                error = GetLastError();//если ошибка
                                Print("out: error(",error,"): ",ErrorDescription(error));//записываем её в лог
                                flag = false;
                                return;//и выходим
                        }else{//выдумываем несуществующую свечу (т.к. тика в эту секунду не было)
                                time++;
                                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
//выбор выдуманной свечи (секунда, при которой тика не было):
//прочерк на Close[]
/*
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Open[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//High[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Low[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Close[]
                                FileWriteDouble (hand1e,  0, DOUBLE_VALUE);//Volume[]
*/
//свеча без теней
/*
                                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//Open[]
                                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//High[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Low[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Close[]
                                FileWriteDouble (hand1e,  last.index+1, DOUBLE_VALUE);//Volume[]
*/
//такая же свеча, как и была (не прочерк и не без теней)
                                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//Open[]
                                FileWriteDouble (hand1e,  bid[ArrayMaximum(bid)], DOUBLE_VALUE);//High[]
                                FileWriteDouble (hand1e,  ask[ArrayMinimum(ask)], DOUBLE_VALUE);//Low[]
                                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Close[]
                                FileWriteDouble (hand1e,  last.index+1, DOUBLE_VALUE);//Volume[]
//конец выбора
                                FileFlush       (hand1e);
                                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
                }
        }
ArrayResize(bid, 1);//урезаем и обнуляем использованные нмассивы
ArrayResize(ask, 1);
if(flag==true){
        if(tick.time.local==true){//если флаг работы с историей поднят
                        time = TimeLocal();//работаем с локальным временем
                        while(time==TimeLocal()){//пока секунда не прошла
                                bid[i]=MarketInfo(symbol, MODE_BID);//заносим в индикаторный массив данные тиков
                                ask[i]=MarketInfo(symbol, MODE_ASK);
                                i++;
                        }
                }else{//иначе
                        time = TimeCurrent();//работаем с временем сервера
                        while(time==TimeCurrent()){//пока секунда не прошла
                                bid[i]=MarketInfo(symbol, MODE_BID);//заносим в индикаторный массив данные тиков
                                ask[i]=MarketInfo(symbol, MODE_ASK);
                                i++;
                        }                       
        }
}
//Вышли из цикла, т.к. время изменилось. Заносим в файл:
if(FileSeek(hand1e, fpos, SEEK_SET) == false){//перемещаем указатель на новую позицию, которую мы запомнили в FileTell
                error = GetLastError();//если ошибка
                Print("out: error(",error,"): ",ErrorDescription(error));//записываем её в лог
                flag = false;
                return;//и выходим
        }else{
                int last.index=ArraySize(ask)-1;
                FileWriteInteger(hand1e,  time,   LONG_VALUE);//TimeCurrent()
                FileWriteDouble (hand1e,  bid[0], DOUBLE_VALUE);//Open[]
                FileWriteDouble (hand1e,  bid[ArrayMaximum(bid)], DOUBLE_VALUE);//High[]
                FileWriteDouble (hand1e,  ask[ArrayMinimum(ask)], DOUBLE_VALUE);//Low[]
                FileWriteDouble (hand1e,  ask[last.index], DOUBLE_VALUE);//Close[]
                FileWriteDouble (hand1e,  last.index+1, DOUBLE_VALUE);//Volume[]
                FileFlush       (hand1e);
                fpos = FileTell (hand1e);//запоминаем позицию записи в файле
}

Comentários sobre o código.

1. Não fez a seleção da caixa de troca em velas virtuais para economizar tempo da CPU, em vez disso comentou seções com seleção (já que a seleção é feita para necessidades específicas uma vez antes da compilação).

2. No trabalho com hora local (off-line que é) não me lembro. No loop"while(time===TimeLocal()){/ até que um segundo tenha passado", suspeito que deve haverMarketInfo no FileWriteDouble (parece-me o topo de um idiota). Se você me disser o que pareceria mais lógico lá, eu ficarei grato.

3. A construção de um autor

if(flag == true)
  {
  if(tick.time.local == true)
    {
    time = TimeLocal();
    }
    else{
    time = TimeCurrent();
    }

Eu o declarei logo no final do init().

4. No início do init() arrays dinâmicos

   IndicatorBuffers(2);
   SetIndexBuffer(0, bid);
   SetIndexBuffer(1, ask);

em vez de variáveis usadas.

5. Para otimização, você pode teoricamente usar as funções de arquivo WinAPI e escrever imediatamente no histórico em um bloco de 44 bytes (comprimento da estrutura MarketInfo ou o que quer que esteja em .hst).

6. Remoção completa do modelo de tempo de escrita do autor para a célula Time[]. Pela mesma razão, na cabeça enquanto loop não há verificação para TimeLocal(), apenas para TimeCurrent().

7. O que mais você sugere para otimizar o código?