Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1516

 
MakarFX

Gracias por la respuesta, muleta y no es una mala solución, pero en cuanto a mi idea funciona un poco incorrecto, porque el saldo es flotante, probablemente no lo hace al instante y en algunos casos mis órdenes empezaron a cerrar con menos por alguna razón. Sin embargo, el crecimiento fue el que debía ser, pero la reducción con esas minusvalías también aumentó. Me di por vencido en todo y decidí establecer manualmente los límites de retroceso, por lo que tendría que ajustarlos diariamente.

 
Порт-моне тв:

Gracias por la respuesta, muleta y no es una mala solución, pero en cuanto a mi idea funciona un poco incorrecto, porque el saldo es flotante, probablemente no lo hace al instante y en algunos casos mis órdenes empezaron a cerrar con menos por alguna razón. Sin embargo, el crecimiento fue el que debía ser, pero la reducción con esas minusvalías también aumentó. He decidido renunciar y establecer manualmente los límites de negociación y tener que ajustarlos diariamente.

La función funciona correctamente.

Pruébalo así

//+--------------------------------------------------------------------------------------------------------------------+

sb1 = StartBalance();
................

//+--------------------------------------------------------------------------------------------------------------------+
//|  Баланс на начало периода                                                                                          |
//+--------------------------------------------------------------------------------------------------------------------+
double StartBalance()
  { double b = 0;
   if(AccountBalance()>0) {b = AccountBalance()-DayProfit();}
   return(b);
  }
//+--------------------------------------------------------------------------------------------------------------------+
//|  Суммарный профит на начало периода                                                                                |
//+--------------------------------------------------------------------------------------------------------------------+
double DayProfit()
  { double p = 0; datetime st=iTime(_Symbol,PERIOD_D1,0);
   for(int pos=OrdersHistoryTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_HISTORY)==true)
        {
         if(OrderSymbol() == _Symbol)
           { 
            if(OrderCloseTime()>=st){p+=OrderProfit()+OrderSwap()+OrderCommission();}
           }
        }
     }
   return(p);
  }
//+--------------------------------------------------------------------------------------------------------------------+

y añadir la actualización del saldo a la función de cierre de la orden

   if(OrderClose(бла бла бла))
     {
      StartBalance(); Print("Order Close");
     }
 
Maxim Kuznetsov:

captar el cambio del día y calcular el valor del saldo en ese momento.

No en vano han dicho que "hay que conseguir el indicador adecuado", no cabe en un par de líneas de código. Es un algoritmo de gran capacidad.

atrapar el cambio de día es fácil, "el número del día conocido no es igual al número del día anterior", pero es más complicado


Alg. "calcular el saldo en el momento D" (excluyendo las retiradas/reposiciones y algún fallo sobre los swaps y las comisiones)

Saldo:=saldo de la cuenta corriente. Esto es AccountBalance().

Para todas las órdenes de mercado cerradas en el historial:

si la hora de cierre cae entre D y la actual, Balance -= OrderProfit()+OrderSwap()+OrderCommision();

al finalizar la enumeración, el Balance es el valor requerido...

PERO, la comisión se cobra (es decir, afecta a la línea de balance) en la apertura, y la tenemos en cuenta en el cierre y los swaps se toman en el cambio de día, y de nuevo los tendremos en cuenta sólo en el cierre

y en caso de gran profundidad D, existe la posibilidad de que no se reciban todas las órdenes requeridas en un exceso

 
Порт-моне тв:

Gracias por la respuesta, muleta y no es una mala solución, pero en cuanto a mi idea funciona un poco incorrecto, porque el saldo es flotante, probablemente no lo hace al instante y en algunos casos mis órdenes comenzaron a cerrar con menos por alguna razón. Sin embargo, el crecimiento fue el que debía ser, pero la reducción con esas minusvalías también aumentó. Me di por vencido y decidí establecer manualmente los límites de negociación, que tendría que ajustar diariamente.

Ya me he perdido en vuestras sugerencias y consejos, así que quizá mi consejo no venga a cuento, pero lo siento...

Entiendo que lo que necesito al principio del día es fijar el balance y para el día contar las ganancias/pérdidas de acuerdo con lo que necesito para tomar una decisión sobre si continuar el comercio ...

Así que aquí está la decisión

datetime dayTime;
double dayBalance;
// Дальше в функции OnTick()
if(dayTime != iTime(_Symbol, PERIOD_D1, 0);
 {
  dayBalance = AccountInfoDouble(ACCOUNT_BALANCE));
  dayTime = iTime(_Symbol, PERIOD_D1, 0);
 }
// Дальше текущий баланс можно сравнивать с балансом на начало дня…
// В начале следующего дня в переменной dayBalance будет другое значение баланса…

Si el Asesor Experto se va a reiniciar durante el día, debe considerar el cálculo de las ganancias/pérdidas de las órdenes de hoy teniendo en cuenta los swaps y las comisiones y calcular el balance para el comienzo del día en OnInit().

Creo en las habilidades de Makar, puede mostrar todo esto ya en el código...

 

Hola. ¿Puede decirme cómo determinar el número de barra actual desde el principio del día?

¿Cómo puedo determinar el número de la barra actual desde el principio del día?

Gracias.

 
prom18:

Hola. ¿Puede decirme cómo determinar el número de barra actual desde el principio del día?

¿Cómo puedo determinar el número de la barra actual desde el principio del día?

Gracias.

      double BarNumber=NormalizeDouble((TimeCurrent()-iTime(_Symbol,PERIOD_D1,0))/60/Period()+0.5,0);

esta es la barra actual, si la última barra se cerró, entonces -0.5

 
MakarFX:

es la barra actual, si la última barra se cerró, entonces -0.5

Gracias. Lo intentaré.

 
MakarFX:

esta es la barra actual, si es la última cerrada, -0.5

en minutos y exóticos no funcionará.

número de barras != número de_cuentas

las barras se saltan a la vez, en 15 minutos puede haber barras de 12 minutos

mejor usar iBarShift()

 
Maxim Kuznetsov:

es mejor utilizar la función incorporada iBarShift()

No sé cómo...

 
MakarFX:

No sé cómo...

Función

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  if (tf<=0) tf=Period();
  if (dt<=0) dt=TimeCurrent();
  if (tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay(dt);                       // текущий день месяца
  int nb=iBarShift(sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime(sy, tf, nb))==cd) {
    nb++;
    bd++;
  }

  return(bd);
}
Razón de la queja: