[ARCHIVO] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 3. - página 368

 

¡Buenas tardes!

Tengo una tarea, parece fácil a primera vista, pero no funciona. Hay un array en el que los valores están siempre en una fila (en algunos casos los valores pueden ir en orden ascendente, en otros casos - en orden descendente). Hay algo de nivel (rojo en la imagen). Tienes que encontrar los dos valores del array que más se acerquen al nivel de la línea roja. En la figura a) serán valores del array con índices 0 y 1. En la figura b) serán valores del array con índices 2 y 1. En las figuras c) y f) serán valores del array con índices 0 y 0. En las figuras d) y e) serán valores del array con índices 2 y 2.

Por favor, díganme cómo resolver este problema. Gracias de antemano.

 
Roman.:

Entonces no se moleste en absoluto - sólo mueva el código del indicador al Asesor Experto como es para cumplir con los criterios de negociación y eso es todo - luego en el tablero usando estas condiciones de negociación transferidas de este indicador usted abre posiciones a través del Asesor Experto y eso es todo...
Gracias, estoy trabajando en ello :)
 
skyjet:
Gracias, lo estoy solucionando :)

De nada... Todo el mundo ha pasado por ello. :-)
 
drknn:

Hoy es sábado, día libre. Usted inicia el EA, la inicialización ocurre, pero como es día libre y no hay tick, la función de inicio no se inicia (es decir, no se llama a Trade(). Para comprobar si funciona correctamente, es necesario pegar la llamada de esta función en el bloque de inicialización, o probarla en el probador.

Tras sustituir esta función en Init() y añadir el código de comprobación Print(DayOfWeek()) resultó que la hora se tomaba del servidor, y la hora del servidor era el viernes...

Sustituido

if(DayOfWeek()==0 || DayOfWeek()==6)

a

  if(TimeDayOfWeek(TimeLocal())==0 || TimeDayOfWeek(TimeLocal())==6)

y ha funcionado como estaba previsto.

Gracias.

 

¡Hola, camaradas!

Se enfrentó a un problema inesperado.

Anteayer el probador funcionaba como debía. Desde ayer por la tarde, cualquier versión de la estrategia en el probador abre una operación y después de un segundo, o unos minutos/horas de historia, el probador deja de funcionar. No hay errores, nada.

¿Alguien tiene algún problema? Por favor, asesórese

 

Hola.

Por favor, ayúdenme a encontrar el error.

A continuación se presenta la sección problemática en su totalidad, extraída de la EA.

extern int      MAGIC= 1; 

int start()
  {
//----
  int tt = 0;
  double SchBuyLots     = SchBuyLots_b(MAGIC);
  double SchSellLots    = SchSellLots_b(MAGIC);
  double SchBuyLots100  = SchBuyLots100_b();
  double SchSellLots100 = SchSellLots100_b();
  double SchBuyLimitLots    = SchBuyLimitLots_b(MAGIC);
  double SchSellLimitLots   = SchSellLimitLots_b(MAGIC);
  double SchBuyStopLots100  = SchBuyStopLots100_b();
  double SchSellStopLots100 = SchSellStopLots100_b();

  double dy=0;
  double dx=SchBuyLots+SchBuyLots100-SchSellLots-SchSellLots100;
  if (dx!=0) dy=MathAbs(dx);

  double zx=SchBuyLimitLots-SchSellLimitLots;

  if (dx>0 && dy+zx!=SchSellStopLots100)tt=1; else tt=2;
 
  Alert (dy+zx,"---",SchSellStopLots100,"---",tt);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
// ----------------- SchBuyLots() ---------------------------------------------
//  Функция возвращает суммарный лот Бай-ордеров для Магика
//----------------------------------------------------------------
double SchBuyLots_b(int MAGIC) {
  double SchBuyLots=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC){ 
      if(OrderType()==OP_BUY) {
        SchBuyLots=SchBuyLots+OrderLots();
       }
      }
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchBuyLots);
}
// ----------------------------------------------------------------------------

// ----------------- SchSellLots() ---------------------------------------------
//  Функция возвращает суммарный лот Сейл-ордеров для Магика
//-----------------------------------------------------------------
double SchSellLots_b(int MAGIC) {
  double SchSellLots=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC) {
      if(OrderType()==OP_SELL) {
        SchSellLots=SchSellLots+OrderLots();
       }  
      }  
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchSellLots);
}
// -------------------------------------------------------------------------------

// ----------------- SchBuyLots100() ---------------------------------------------
//  Функция возвращает суммарный лот Бай-ордеров для Магика 100
//--------------------------------------------------------------------------------
double SchBuyLots100_b() {
  double SchBuyLots100=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()==100) {
      if(OrderType()==OP_BUY) {
        SchBuyLots100=SchBuyLots100+OrderLots();
       }
      }
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchBuyLots100);
}
// --------------------------------------------------------------------------------

// ----------------- SchSellLots100() ---------------------------------------------
//  Функция возвращает суммарный лот Сейл-ордеров для Магика 100
//---------------------------------------------------------------------------------
double SchSellLots100_b() {
  double SchSellLots100=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()==100) {
      if(OrderType()==OP_SELL) {
        SchSellLots100=SchSellLots100+OrderLots();
       }  
      }  
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchSellLots100);
}
// ----------------------------------------------------------------------------
// ----------------- SchBuyLimitLots() ------------------------------------------
//  Функция возвращает суммарный лот BuyLimit-ордеров для Магика
//------------------------------------------------------------------------------
double SchBuyLimitLots_b(int MAGIC) {
  double SchBuyLimitLots=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC){ 
      if(OrderType()==OP_BUYLIMIT) {
        SchBuyLimitLots=SchBuyLimitLots+OrderLots();
       }
      }
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchBuyLimitLots);
}
// ----------------------------------------------------------------------------

// ----------------- SchSellLimitLots() ----------------------------------------
//  Функция возвращает суммарный лот SellLimit-ордеров для Магика
//-----------------------------------------------------------------------------
double SchSellLimitLots_b(int MAGIC) {
  double SchSellLimitLots=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC) {
      if(OrderType()==OP_SELLLIMIT) {
        SchSellLimitLots=SchSellLimitLots+OrderLots();
       }  
      }  
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchSellLimitLots);
}
// -------------------------------------------------------------------------------
// ----------------- SchBuyStopLots100() -----------------------------------------
//  Функция возвращает суммарный лот BuyStop-ордеров для Магика 100
//--------------------------------------------------------------------------------
double SchBuyStopLots100_b() {
  double SchBuyStopLots100=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()==100) {
      if(OrderType()==OP_BUYSTOP) {
        SchBuyStopLots100=SchBuyStopLots100+OrderLots();
       }
      }
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchBuyStopLots100);
}
// --------------------------------------------------------------------------------

// ----------------- SchSellStopLots100() -----------------------------------------
//  Функция возвращает суммарный лот SellStop-ордеров для Магика 100
//---------------------------------------------------------------------------------
double SchSellStopLots100_b() {
  double SchSellStopLots100=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()==100) {
      if(OrderType()==OP_SELLSTOP) {
        SchSellStopLots100=SchSellStopLots100+OrderLots();
       }  
      }  
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchSellStopLots100);
}
// --------------------------------------------------------------------------------

Por favor, preste atención a la línea (casi al principio):

 if (dx>0 && dy+zx!=SchSellStopLots100)tt=1; else tt=2;

Por alguna razón, cuando los valores dy+zx y SchSellStopLots100 son iguales por separado (lo he comprobado con allerts) en esta expresión dejan de ser iguales entre sí, y la variable tt toma el valor 1 en lugar del 2.

Te pido que me ayudes a encontrar el fallo.

Gracias de antemano.

 
Las condiciones comerciales del servidor han cambiado durante el fin de semana... Deberías probar en un terminal separado no conectado a un corredor/red, usando una utilidad especial para establecer el spread correcto. Mejor buscar artículos sobre pruebas de EAs y cómo hacerlo correctamente.
 
nemo811:

(comprobado con allerts)

Es mejor comprobar a través de ND o la diferencia de módulo menos de algún delta.
 
splxgf:
Mejor comprobar a través de ND o diferencias módulo menos de algún delta.

Por alguna razón, la suma de dy y zx da un número 0,3 (en mi prueba particular de la situación actual del mercado) cuando se compara con este número no lo iguala. Es decir, sumo dy+zx y obtengo 0,3. Comparo dy+zx con 0,3 - no son iguales.

Comparando dy y zx con los números que devuelven - los iguales funcionan como deberían.

Adivinanza.

Por favor, ayuda.

 
ramirez17:

¡Hola, camaradas!

Se enfrentó a un problema inesperado.

Anteayer el probador funcionaba como debía. Desde ayer por la tarde, cualquier versión de la estrategia en el probador abre una operación y después de un segundo, o unos minutos/horas de historia, el probador deja de funcionar. No hay errores, nada.

¿Alguien tiene algún problema? Por favor, asesórese

El probador tiene un cargador. Todo está escrito allí. Aquí no hay telépatas para leer los registros de su probador a distancia.