[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 284

 
hoz:
No importa. Estoy devolviendo un valor absoluto, modulo a través de MathAbs...


Si se busca un punto de entradaMathAbs() introduce una mancha. ¡Para mí debería estar especificado de principio a fin, para que quede claro cuándo y con qué tolerancia!
 
borilunad:

Si se busca el punto de entradaMathAbs() hace que se emborrone.¡Para mídebería estar especificado de principio a fin, para que quede claro cuándo y con qué tolerancia!


Corregido... De todos modos, no se cumple ninguna de las condiciones.

//+-------------------------------------------------------------------------------------+
//| Получение значений МА на указанном баре                                             |
//+-------------------------------------------------------------------------------------+
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]);
         }
      }
   }
}

antes de quereturnSign[i] = true; y en consecuencia antes de que la funciónVrPr (que es la función que emite los datos que estoy controlando) no se utilice. Aunque, el cruce hacia abajo ya ha comenzado. Aquí hay una captura de pantalla, puedes ver que el arraycrossDir[] se llena a medida que cada máquina rápida cruza la lenta...

Observa que 2 ruedas han cruzado la más gruesa, y 2 elementos del array ya tienen asignado el valor 1. Eso significa que su valor esCROSS_DN

Lo que significa que la condición

 if (crossDir[i] == CROSS_DN)

y luego...

 
borilunad:

Si se busca un punto de entrada,MathAbs() introduce la confusión. Para mí, debería especificarse de principio a fin, para que quede claro cuándo y con qué tolerancia.

También con quién y por qué.
 
tara:

Quién más y por qué.

Excepto que visualmente es más fácil de percibir sin MathAbc() por la costumbre, pero... no hay ninguna diferencia. Pero nos desviamos del tema. ¿Hay alguna observación sobre mi código? Después de todo, la pregunta sigue abierta...
 
No tengo reservas sobre el código.
 
Entonces, ¿por qué no se cumple la condición? ¿Algún comentario sobre la lógica?
 

No.

 
Sí. Será mejor por la mañana, espero que algo se aclare mañana.
 

¡Buenas tardes a todos!

Estoy probando el USD/JPY en MT-4 de Alpari.

He descargado el historial de 1 minuto del USD/JPY

Nota: Después de cargar en el archivo de cotizaciones de la historia de minutos en doble clic en "1 minuto".

Por alguna razón, la lista de cotizaciones de un minuto no aparece en la ventana del archivo de cotizaciones de la base de datos.


1 hora TF.

Todas las garrapatas

Período 01.01.2000. - 01.01.2013.

Al final de la prueba, la pestaña REPORTS muestra una barra roja y dice que la calidad del modelado es del 25%.

He probado el mismo periodo con los mismos parámetros ......pero por separado para cada mes

y para cada mes muestra la barra verde y el 90% de la calidad de la simulación

A continuación, analicé el mismo periodo pero dividiéndolo en 2 partes iguales 2000-2006 y 2006-2013.

Para cada parte, la barra es verde y la calidad de la simulación es del 90%.


PREGUNTA

¿Qué debo hacer para que la calidad de las pruebas durante un período de 13 años en general también fue del 90%?

Gracias

 

Sí. Creo que he terminado. Aquí está el recolector de garrapatas reelaborado con su empaquetado en segundas velas.

Lo fue:

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);

Se convirtió:

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);//запоминаем позицию записи в файле
}

Comentarios sobre el código.

1. No se hizo el cambio de caso en la selección de velas virtuales para ahorrar tiempo de CPU, en su lugar se comentaron las secciones con la selección (ya que la selección se hace para necesidades específicas una vez antes de la compilación).

2. En el trabajo con la hora local (fuera de línea que es) no trajo a la mente. En el bucle"while(time==TimeLocal()){//hasta que haya pasado un segundo", sospecho que debe haberMarketInfo en FileWriteDouble (me suena a punta de idiota). Si me decís qué parecería más lógico ahí, os lo agradeceré.

3. Una construcción de autor

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

Lo he declarado al final de init().

4. Al principio de init() las matrices dinámicas

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

en lugar de las variables utilizadas.

5. Para la optimización, teóricamente puede utilizar las funciones de archivo WinAPI y escribir en el historial de una vez en el bloque 44 bytes (longitud de la estructura MarketInfo o lo que sea en .hst).

6. Se ha eliminado completamente el modelado de tiempo del autor para escribir en la celda Time[]. Por la misma razón, en el bucle head while no se comprueba TimeLocal(), sólo TimeCurrent().

7. ¿Qué más sugiere para optimizar el código?