Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 360

 

Buenas tardes.

Pueden por favor aconsejarme como escribir el código correctamente al operar con EA en MT4, soy muy nuevo en la programación.

Necesito seleccionar la última orden cerrada y comparar su beneficio. No tengo que hacer nada si su beneficio es superior a 0, si es inferior a 0, tengo que hacer algo.

double GetSizeLot(double lastlot=0) //Функция возвращает значение лотов 
  {
   double Lot2,MinLots,MaxLots;
   int j=OrdersHistoryTotal();
   
   MinLots=Lots;
   MaxLots=MaxLot;
   if(!DynamicLot)Lot2=Lots;
   if(lastlot<Lot2)lastlot=Lot2;
   
   if(OrderSelect(j,SELECT_BY_POS,MODE_HISTORY))
     {
     if(OrderProfit()<0) lastlot=lastlot*Martin;
     if(OrderProfit()>0) lastlot=Lot2;
     }
   Lot2=lastlot;
   if(Lot2 < MinLots) Lot2 = MinLots;
   if(Lot2 > MaxLots) Lot2 = MaxLots;
   return(NormalizeDouble(Lot2,2));
  }

Tengo mucho respeto, Alexander.

 
Menshikov:

Buenas tardes.

Pueden por favor aconsejarme como escribir el código correctamente al operar con EA en MT4, soy muy nuevo en la programación.

Tengo que seleccionar la última orden cerrada y comparar su beneficio. No tengo que hacer nada si su beneficio es superior a 0, si es inferior a 0, tengo que hacer algo.

Tengo mucho respeto, Alexander.

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

datetime time=0; double profit=0,lots=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      if(OrderSymbol()==_Symbol)
         if(OrderMagicNumber()==MagicNumber || MagicNumber==-1)
            if(OrderCloseTime()>time) // находим последний в истории ордер
              {
               time=OrderCloseTime(); // запомним время
               profit=OrderProfit();  // запомним профит
               his_lt=OrderLots();    // запомним лот
              }

if(profit<0) //если профит меньше нуля
   lots=his_lt*2; // Увеличим в два раза

//+------------------------------------------------------------------+
 
Vladimir Pastushak:
Muchas gracias.
 
Vladimir Pastushak:
Me pregunto para qué sirve la hora, por qué se recuerda la hora de cierre, si de todas formas se elige la última de la lista, y qué pasa con el ciclo. ¿Y por qué no considera el intercambio y la comisión? Aunque OrderProfit()>0, el beneficio real puede ser negativo. Si trabajas directamente con la lista de pedidos, no debes dejar trozos de código del bucle buscando el último por tiempo de cierre. Una cosa es la fiabilidad y la seguridad o la rapidez. Y tienes un batiburrillo.
 
Artyom Trishkin:
Me pregunto para qué sirve la hora, por qué se recuerda la hora de cierre, si de todas formas se elige la última de la lista, y qué pasa con el ciclo. ¿Y por qué no considera el intercambio y la comisión? Aunque OrderProfit()>0, el beneficio real puede ser negativo. Si trabajas directamente con la lista de pedidos, entonces no deberías dejar trozos de código del bucle buscando el último pedido que se ha cerrado. Una cosa es la fiabilidad y la seguridad o la rapidez. Lo que tienes es un batiburrillo.

Lo que está sugiriendo es que

   if(OrderSelect(OrdersHistoryTotal(),SELECT_BY_POS,MODE_HISTORY))

¿Lo haces tú?

La persona sólo pidió una orden de beneficio, ¿por qué imponer lo que no pidió? Pero estoy de acuerdo contigo ....

 

Por favor, indíqueme cómo cerrar una orden abierta en MQL4 en MT4 después de 20 barras, es decir, cuando se abre una orden y aparecen 20 nuevas barras, se cierra. (sólo 1 pedido está siempre abierto). Por alguna razón, este código no funciona en el probador de estrategias, y necesitamos que lo haga.


El código tiene el siguiente significado: comprobamos si tenemos alguna orden abierta, si no es así, abrimos una orden y registramos en la variable "z" el precio de apertura de la 1ª barra y luego con cada tick comprobamos el precio de apertura de la 20ª barra y cuando la 1ª barra llegue finalmente a la 20ª barra, su precio será el mismo que el registrado en la variable "z" y entonces se cerrará la orden. (por supuesto durante el proceso, los precios pueden coincidir, pero será muy raro, además, podemos escribir más parámetros de la 1ª barra en variables)


double z; //объявление переменной

           //ОТКРЫТИЕ ОРДЕРА
           if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер
              {
               OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, Bid+150*Point, Bid-10*Point);
                   z = Open[1]; // здесь переменной "z" присваивается цена открытия 1-го бара
              }
            else

           Print("ORDER NE USTANOVLEN!!!");




           //ЗАКРЫТИЕ ОРДЕРА

    if (z==Open[20])  //если цена записанная в переменную "z" равна цене 20-го бара, то закрывать ордер
        {
           

            //-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;

 while (OrdersTotal()>0)
 {
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {   if(OrderType()==OP_BUY)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
           OrderDelete(OrderTicket());
         
           if(result!=TRUE) { error=GetLastError();
              Print("LastError = ",error, " ",Symbol()); }
           else error=0; }
   else Print( "Error when order select ", GetLastError());

  }
//------------конец кода закрывающего ордер------------------
           
           
        }
      else
      Print("ORDER NE ZAKRYT!!!");
 
BEGEMOT32:

Por favor, indíqueme cómo cerrar una orden abierta en MQL4 en MT4 después de 20 barras, es decir, si se abre una orden y aparecen 20 barras nuevas, se cierra. (Sólo hay un pedido siempre abierto). Este código no funciona en el probador de estrategias por alguna razón.


El código tiene el siguiente significado: comprobamos si tenemos alguna orden abierta; si no es así, abrimos una orden y registramos en la variable "z" el precio de apertura de la 1ª barra y luego con cada tick comprobamos el precio de apertura de la 20ª barra y cuando la 1ª barra llegue finalmente a la 20ª barra, su precio será el mismo que el registrado en la variable "z" y entonces la orden se cerrará. (por supuesto, los precios pueden coincidir durante el proceso, pero será muy raro, además, podemos escribir más parámetros de la 1ª barra en variables)


Ya está, me he dado cuenta yo mismo, debería haber declarado la variable fuera de int start() - ahora funciona bien
 
BEGEMOT32:
Ya está, me he dado cuenta yo mismo, debería haber declarado una variable fuera de int start() - ahora funciona bien

He simplificado un poco su código, pero todavía hay errores en su código

//ОТКРЫТИЕ ОРДЕРА
if(OrdersTotal()==0) // если нет открытых ордеров то открывать ордер
   if(OrderSend(Symbol(),OP_SELL,0.1,Bid,3,Bid+150*Point,Bid-10*Point)<0)
      Print("ORDER NE USTANOVLEN!!!");

//-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;
   while(OrdersTotal()>0)
     {
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
        {
         if(iBarShift(OrderSymbol(),Period(),OrderOpenTime())==20)
           {
            if(OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
            if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
            if(OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
               OrderDelete(OrderTicket());
           }
         if(result!=TRUE)
           {
            error=GetLastError();
            Print("LastError = ",error," ",Symbol());
           }
         else error=0;
        }
      else Print("Error when order select ",GetLastError());

     }
 

Estoy escribiendo un EA multidivisa pero no puedo entender por qué devuelve diferentes precios al mismo tiempo si lo vinculo a diferentes divisas

En resumen, el código:

en Init

EventSetTimer(60);

en OnTimer()

MqlTick last_tick;
if(SymbolInfoTick("EURNZD",last_tick))
{
    Print("Last Ask: ", last_tick.ask);
}

Si pruebo mi EA en EURNZD, por ejemplo

2015.05.18 00:07:00 Lat Pregunta: 1.5370

Si utilizo cualquier otro par de divisas

2015.05.18 00:07:00 Lat Pregunta: 1.5323

Este valor es totalmente diferente, y en el segundo caso, según el gráfico, no podría haber tal valor durante al menos varias horas

En el Probador de Estrategias todos los ticks están en modo comercio, me da la sensación de que si no es el par principal, los valores en el Probador de Estrategias son aproximados

Me olvidé de añadir que esto es Meta Trade 5

He descubierto que la primera vez que lo hago, el precio está mal y la segunda vez que lo hago, el precio es normal

 
1.¿Puede averiguar en el historial cuántos ticks han subido y bajado de volumen?

2.Hace unos meses que borré autochartis, pero los mensajes de registro siguen apareciendo. El software sigue intentando abrir los archivos.

¿Cómo borrar completamente el autochartis?

2015.05.25 15:36:42.983 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Volatility.ex4' [2]
2015.05.25 15:36:42.983 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Key Levels.ex4' [2]
2015.05.25 15:36:42.982 Cannot open file 'C:\Users\asus\AppData\Roaming\MetaQuotes\Terminal\................................\MQL4\indicators\Autochartist Chart Patterns.ex4' [2]

Razón de la queja: