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

 
Sergey Likho:

¿Pueden decirme cómo calcular la garantía de una transacción?


He intentado dos enfoques

(0.1 * Ask*MarketInfo(Symbol(),MODE_LOTSIZE))/AccountInfoInteger(ACCOUNT_LEVERAGE)


Y este

FreeMarginCheck=AccountFreeMarginCheck(Symbol(),OP_BUY,0.1);

 double val=AccountFreeMargin()-FreeMarginCheck;



El primero da resultados extraños en EURJPY si mi moneda de depósito es USD. ¿Tengo que añadir algo a la fórmula?

El segundo también funciona sólo una vez, a veces da el valor correcto, a veces da alguna tontería (depende del depósito)

La segunda variante es la forma correcta de calcular el depósito. Para ser más exactos, la variable val muestra el valor de los fondos libres después de que se haya realizado el pedido y la variableFreeMarginCheck muestra el valor del propio depósito

 
Igor Makanu:

La segunda opción es la forma correcta de calcular el margen, es decir, se obtiene el valor de los fondos libres en la variable val después de colocar una orden, y la variableFreeMarginCheck es el valor del margen mismo

¿Está seguro?

AccountFreeMarginCheck

Devuelve la cantidad de fondos libres que quedarán después de que se abra la orden especificada al precio actual en la cuenta corriente.


También hay una sutileza:

Si las contraoperaciones están abiertas, es decir, si hay un bloqueo total o incompleto en la cuenta, la función puede dar valores incorrectos.


 
Sergey Likho:

¿Está seguro?

Sí, tienes razón, es exactamente así:

Devuelve la cantidad de fondos libresque quedan después de abrir la orden especificada al precio actual en la cuenta corriente.

sobre las operaciones abiertas, hay que comprobar, no lo recuerdo, pero lo más probable es que lo que escribe el terminal, debe coincidir con los datos calculados: el número total de lotes en cada dirección de las operaciones (BAY/SELL) para todos los símbolos y luego llamar a cada símbolo

AccountFreeMarginCheck() pasando lotes en cada dirección y sumando estos resultados

El mercado funciona hoy, es fácil comprobarlo, así

#property strict
//+------------------------------------------------------------------+
void OnStart()
  {
   int i,ot,k=OrdersTotal();
   double lot_buy=0.0,lot_sell=0.0;
   string sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         ot=OrderType();
         if(OrderSymbol()==sy)
           {
            if(ot==OP_BUY)  lot_buy+=OrderLots();
            if(ot==OP_SELL) lot_sell+=OrderLots();
           }
        }
     }
   double MarginBUY  = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_BUY,lot_buy);
   double MarginSELL = AccountFreeMargin()-AccountFreeMarginCheck(sy,OP_SELL,lot_sell);
   double MarginALL = MarginBUY+MarginSELL;
   Print("Залог BUY = ",MarginBUY);
   Print("Залог SELL = ",MarginSELL);
   Print("Залог ALL = ",MarginALL);
  }
 

Saludos, ¿podríais decirme qué pasa con la función? La función realiza una pausa comercial por tiempo, los parámetros incluyen el inicio de la pausa y el final de la misma.
La función lee la hora no del servidor del corredor sino del ordenador, a pesar de que TimeCurrent está prescrito. En general, las operaciones se cierran durante la pausa, es decir, la función no funciona.

input  bool        p                 = true;    // Trading pause on/off
input  string      TimeStart         = "23:59"; // Start pause
input  string      TimeEnd           = "06:15"; // End of pause


int start() {

   //+----------------------------------------------------------------------------+
   datetime StartPause,EndPause;
   // ---
   StartPause = StrToTime(TimeStart);
   EndPause   = StrToTime(TimeEnd);
   // ---
   if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))
   {
     Print(" Pause the EA ");
     return(0);
   }
   //+----------------------------------------------------------------------------+
 
Anatolij Anufriev:

Saludos, ¿podríais decirme qué pasa con la función? La función realiza una pausa comercial por tiempo, los parámetros son inicio de pausa y fin de pausa.
La función lee la hora no del servidor del corredor, sino del ordenador, a pesar de que TimeCurrent está prescrito. En general, las operaciones se cierran durante una pausa, significa que la función no funciona.

DesimprimirTimeStart yStrToTime(TimeStart);

entonces unprintTimeCurrent()

¿suTimeStart no está en formato de fecha completa, es decir, la hora siempre será el día, mes y año actuales cuando ejecute el EA, y luego cambiará?

Y globalmente... para determinar las horas y minutos de negociación se debe comparar con la hora y minutos del servidor, sólo se compara el hecho de que la hora del servidor sea mayor que la especificada

SZZ: para evitar confusiones, puedespensar en datetime como un int, que es y al comparar 2datetime, estás comparando 2 int

PSPS:

if((p && StartPause > EndPause && (TimeCurrent() > StartPause || TimeCurrent() < EndPause)))

tu código probablemente funcionará, deberías probarlo así:

if((p && StartPause > EndPause && (TimeCurrent() > StartPause && TimeCurrent() < EndPause)))


Suelo contar el tiempo de esta manera:

int h = HoraHora(HoraActual());

int m = TimeMinute(TimeCurrent());

y luego compararlo con la configuración del EA

 
Igor Makanu:

Gracias, trataré de averiguarlo, soy un principiante), con la opción && en lugar de || aún no he probado online, por cierto en tester este código funciona, lee el tiempo desde el terminal, no se cierran las órdenes durante la pausa, pero online es diferente.

 

Hola. El terminal no se inicia en el probador de estrategias. Pongo la fecha, por ejemplo (2017,04,01 a 2018,05,29), pulso start, inmediatamente da un stop. En el registro dice lo siguiente,

TestGenerator: no hay datos del historial 'EURUSD30' desde 2017.04.01 hasta 2018.05.29. Y así en cualquier segmento. Mi ordenador funciona, pensé que no tenía suficiente RAM. Lo mismo en el ordenador de casa, reiniciar no sirve de nada, pero funciona un rato. He descargado el Asesor Experto del Mercado, de prueba. Si alguien sabe la razón, por favor, aconséjelo.


 
danil77783:

Hola. El terminal no se inicia en el probador de estrategias. Pongo la fecha, por ejemplo (2017,04,01 a 2018,05,29), pulso start, inmediatamente da un stop. En el registro dice lo siguiente,

TestGenerator: no hay datos del historial 'EURUSD30' desde 2017.04.01 hasta 2018.05.29. Y así en cualquier segmento. Mi ordenador funciona, pensé que no tenía suficiente RAM. Lo mismo en el ordenador de casa, reiniciar no sirve de nada, pero funciona un rato. He descargado el Asesor Experto del Mercado, de prueba. Si tengo alguna idea de la razón, ¿puede darme una pista?


Creo que el probador dice que no hay datos de la historia, pulse F2 y descargar la historia, a continuación, reiniciar el terminal

 
danil77783:

Hola. El terminal no se inicia en el probador de estrategias. Pongo la fecha, por ejemplo (2017,04,01 a 2018,05,29), pulso start, inmediatamente da un stop. En el registro dice lo siguiente,

TestGenerator: no hay datos del historial 'EURUSD30' desde 2017.04.01 hasta 2018.05.29. Y así en cualquier segmento. Mi ordenador funciona, pensé que no tenía suficiente RAM. Lo mismo en el ordenador de casa, reiniciar no sirve de nada, pero funciona un rato. He descargado el Asesor Experto del Mercado, de prueba. Si conozco la razón, por favor, aconséjeme.


¿Significa algo laausencia de datos históricos?

 
Igor Makanu:

Creo que el probador te está diciendo que no hay datos del historial, pulsa F2 y descarga el historial, luego vuelve a cargar el terminal

Gracias. Lo intentaré. ¿Afecta la actualización del terminal de alguna manera? Si se actualiza o no, aunque te lo dirá ella misma......