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

 
Por la tarde. Por favor, ayude a un comerciante principiante a encontrar un asesor adecuado para el comercio automatizado, que es capaz de abrir órdenes bloqueadas en los pares de divisas con la posibilidad de ajuste arbitrario de take profit. Gracias.
 
abcxyzabcxyz:
Por la tarde. Por favor, ayude a un comerciante principiante a encontrar un asesor adecuado para el comercio automatizado, que es capaz de abrir órdenes bloqueadas en los pares de divisas con la posibilidad de ajuste arbitrario de take profit. Gracias.
Si realmente necesitas un cierre, estás en el lugar adecuado. No hay bloqueo en MetaTrader 5 ya que MetaTrader 5 es una plataforma de red.
MQL4: форум по механическим торговым системам и тестированию стратегий
  • www.mql5.com
MQL4: форум по механическим торговым системам и тестированию стратегий
 
micle:
Alternativa: declarar en todos ellos el método Type, en el que se devuelve el identificador de tipo.

Je, si pudieras editar el código fuente... No hay que simplificar tanto las cosas. Y todavía - ¿hay un nombre de clase en mql5?

 
YAndrey:

Je, si pudieras editar el código fuente... No hay que simplificar tanto las cosas. Sin embargo, ¿hay alguna manera de que mql5 sepa el nombre de una clase?

Mira en la dirección de las plantillas. Este código devolverá el nombre de la clase o un tipo primitivo.

#include<Trade\Trade.mqh>
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
voidOnStart()
{
//---
El comercio de CTrade;
double d_value=M_PI;
int i_value=INT_MAX;
Print("d_value: type=",GetTypeName(d_value),", value=", d_value);
Print("i_value: type=",GetTypeName(i_value),", value=", i_value);
Print("comercio: tipo=",GetTypeName(comercio);
//---
}
//+------------------------------------------------------------------+
//| Devuelve el tipo en forma de cadena|
//+------------------------------------------------------------------+
template<typename T>
string GetTypeName(const T&t)
{
//--devuelve el tipo como una cadena
return(typename(T))
//---
}

 
C-4:

Mira hacia los patrones. Este código devolverá el nombre de una clase o tipo primitivo.

#include<Trade\Trade.mqh>
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
voidOnStart()
{
//---
El comercio de CTrade;
double d_value=M_PI;
int i_value=INT_MAX;
Print("d_value: type=",GetTypeName(d_value),", value=", d_value);
Print("i_value: type=",GetTypeName(i_value),", value=", i_value);
Print("comercio: tipo=",GetTypeName(comercio);
//---
}
//+------------------------------------------------------------------+
//| Devuelve el tipo en forma de cadena|
//+------------------------------------------------------------------+
template<typename T>
string GetTypeName(const T&t)
{
//--devuelve el tipo como una cadena
return(typename(T))
//---
}

¡Tengo algo! Pero no funciona con new - en el código hay un ejemplo de lo que necesito - ¿puede alguien sugerir cómo?

class a{
public:
virtual void Print(){Print("Print class a");}
};

class b:public a{
public:
virtual void Print(){Print("Print class b");}
};

class c:public a{
public:
virtual void Print(){Print("Print class c");}
void Print2(){Print("!Print2! class c");}
};


void add(a *&arr[], bool var)
{
   ArrayResize(arr, ArraySize(arr)+1);
   if (var)
      arr[ArraySize(arr)-1] = new b;
   else
      arr[ArraySize(arr)-1] = new c;
   
}

void OnStart()
  {
//--- 
   
   
   a *arr[];

   add(arr, true); // На самом деле здесь я НЕ знаю, какой класс добавит функция add
   add(arr, false); // Это потомок класса а или сам класс а, исходный код которого я править не могу.
   for (int i = 0; i < ArraySize(arr); i++)
   {
      // Вот тут то мне и надо узнать, что за класс там
      // шаблон вернет *а, как и объявлено. Но мне надо проверить - можно ли вызвать функцию, которая есть только в с
      if (i == 1) // Вот тут должна быть проверка на имя класса
      {
         c *tmp = arr[i];
         tmp.Print2();
      }
    }  
   
   
   
   
   
//--- 
  }
 
YAndrey:

¡Tengo algo! Pero no funciona con new - hay un ejemplo en el código de lo que necesito - ¿alguien puede sugerir alguna forma?

Se trata de un problema de método de plantilla. Lamentablemente, el método de la plantilla devuelve el nombre de la clase que hace referencia a la instancia. El tipo de la instancia en sí aún se desconoce.
 

¿Puede alguien explicarme por qué este código no funciona en el probador, mientras que en tiempo real funciona!!!? En concreto, me interesa saber por qué en el probador, después de HistorySelect(0, TimeCurrent()) el HistoryOrderGetInteger...

#include <Trade\Trade.mqh>

CTrade trade;

int OnInit()
{
   trade.LogLevel(LOG_LEVEL_NO);
   return INIT_SUCCEEDED;
}
void OnTick()
{
   if(!DetectNewBar())return;
   trade.Sell(0.1);
   HistorySelect(0, TimeCurrent());
   for(; dealsCount < HistoryDealsTotal(); dealsCount++)
   {
      ulong ticket = HistoryDealGetTicket(dealsCount);
      RecalcDeal(ticket);
   }
}

bool DetectNewBar(void)
{
   MqlRates bars[1];
   CopyRates(Symbol(), PERIOD_M1, 0, 1, bars);
   if(bars[0].time != timeLastBar)
   {
      timeLastBar = bars[0].time;
      //printf(expertName + " new bar detected: " + TimeToString(bars[0].time));
      return true;
   }
   return false;
}

void RecalcDeal(ulong ticketDeal)
{
   //History is selected in OnTick()!
   ulong ticketOrder = HistoryDealGetInteger(ticketDeal, DEAL_ORDER);
   //if(!HistoryOrderSelect(ticketOrder))
   //   printf("order not select.");
   ENUM_ORDER_TYPE type = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(ticketOrder, ORDER_TYPE);
   datetime time = HistoryOrderGetInteger(ticketOrder, ORDER_TIME_SETUP); 
   ulong time_msc = HistoryOrderGetInteger(ticketOrder, ORDER_TIME_SETUP_MSC); 
   printf("Order: " + (string)ticketOrder + " Type: " + EnumToString(type) + " Time: " + (string)time +
          " Time msc: " + (string)time_msc + " Total Orders: " + HistoryOrdersTotal());
}

int dealsCount;

datetime timeLastBar;

Captura de pantalla en el probador de estrategias:

Captura de pantalla en tiempo real en la demo:

p.d. Lo que es interesante, la primera orden en el probador se procesa correctamente, las otras no. Además, si comentamos HistroryOrderSelect(ticketOrder), obtenemos un mensaje en el Probador de Estrategias de que la orden no ha sido seleccionada y en el Probador de Estrategias, todo empieza a funcionar, excepto la primera orden.

 

Y tengo algún problema con HistorySelect(). Abro una posición con el script enviando una orden de mercado, y si se abre una operación, compruebo inmediatamente el número de operaciones en el historial desde el lanzamiento del script, y lo compruebo 10 veces con un intervalo de un segundo. Obviamente, debe haber un comercio. Aquí está el guión:

void OnStart()
{
        // время запуска скрипта
        datetime dtStartTime = TimeCurrent();
        
        // структуры запроса
        MqlTradeRequest oRequest = {0};
        MqlTradeResult oResult = {0};
        
        // формируем запрос
        oRequest.action = TRADE_ACTION_DEAL;
        oRequest.magic  = 15;
        oRequest.symbol = _Symbol;
        oRequest.volume = 0.1;
        oRequest.type   = ORDER_TYPE_BUY;
        oRequest.type_filling = ORDER_FILLING_FOK;
        oRequest.price  = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
        oRequest.deviation = 1000;
        
        // шлём ордер
        bool bResult = OrderSend(oRequest, oResult);
        
        // если позиция успешно открыта
        if(bResult == true && oResult.retcode == 10009) // если позиция открыта
        {
                for(int i = 0; i < 10; i++)
                {
                        // запрашиваем историю за время работы скрипта
                        HistorySelect(dtStartTime, TimeCurrent());
                
                        // количество сделок за время работы скрипта (должна быть одна)
                        Print("Шаг: ", i, " Совершено сделок: ", HistoryDealsTotal());
                        
                        Sleep(1000);
                }
        }
}

Y aquí está el resultado en Alfa-Forex:

Se realiza una operación, pero no aparece en el historial ni siquiera después de 10 segundos. ¿Qué es? ¿Un error de MT? ¿Fallo en el Alfa? ¿Algún tipo de chip que no conozco? Alpari tiene el mismo script funcionando normalmente, sólo ocasionalmente se detecta el cero en el primer paso (cero) (bueno, es comprensible - la historia aún no ha tenido tiempo de actualizarse), todos los demás pasos son uno. Pero después de diez segundos, ¿por qué no hay acuerdo en la historia?

 
Algo:

Y tengo algún problema con HistorySelect(). Abro una posición con el script enviando una orden de mercado, y si se ha abierto una operación, miro inmediatamente el número de operaciones en el historial desde que se lanzó el script, y lo compruebo 10 veces con un intervalo de un segundo. Obviamente, debe haber un comercio. Aquí está el guión:

Y aquí está el resultado del corredor Alfa:

Se realiza una operación, pero no aparece en el historial ni siquiera después de 10 segundos. ¿Qué es esto? ¿Un error de MT? ¿Fallo en el Alfa? ¿Algún tipo de chip que no conozco? El script de Alpari funciona normalmente, sólo ocasionalmente se detecta el cero en el primer paso (cero) (bueno, es comprensible - la historia aún no ha tenido tiempo de actualizarse), todos los demás pasos son uno. Pero, ¿por qué no hay acuerdo en la historia en diez segundos?

Lo que me molesta es la siguiente línea

datetime dtStartTime = TimeCurrent();

¿Estás seguro de que dtStartTime y TimeCurrent() no son el mismo número por el momento para? Tal vez el redondeo a un segundo pone la transacción completada fuera de dtStartTime.

 
C-4:

La línea

datetime dtStartTime = TimeCurrent();

¿Está seguro de que dtStartTime y TimeCurrent() no son el mismo número por el tiempo para? Quizás el redondeo a un segundo pone la transacción completada fuera de dtStartTime.

E incluso si es uno, ¿no debería MT emitir el historial de ese segundo? Es decir, ¿no se emite el historial dentro de los límites especificados, INCLUYENDO los propios límites?

Pero de todos modos, he intentado escribir tanto dtStartTime = TimeCurrent () - 1, como dtStartTime = TimeCurrent() - 10. No funciona.