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

 

¡Buenos días a todos y grandes beneficios!

He generado un simple Asesor Experto con el Asistente VQL5, el código está abajo. Por favor, ayúdenme a averiguar por qué la función "Vencimiento de órdenes pendientes (en barras)" no funciona. He establecido cualquier valor de Signal_Expiration de 1 a 1000, pero la orden pendiente sigue existiendo sólo en una barra. También adjunto la configuración de los parámetros.

Para las pruebas, estoy utilizando una cuenta demo en el terminal Metatrader 5, build 2136.

Sinceramente, Vladimir.

//+------------------------------------------------------------------+
//|                                                EA_MasterMQL5.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Include                                                          |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- available signals
#include <Expert\Signal\SignalITF.mqh>
//--- available trailing
#include <Expert\Trailing\TrailingNone.mqh>
//--- available money management
#include <Expert\Money\MoneyFixedRisk.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
//--- inputs for expert
input string Expert_Title            ="EA_MB_MasterMQL5"; // Document name
ulong        Expert_MagicNumber      =1473;               //
bool         Expert_EveryTick        =false;              //
//--- inputs for main signal
input int    Signal_ThresholdOpen    =0;                 // Signal threshold value to open [0...100]
input int    Signal_ThresholdClose   =0;                 // Signal threshold value to close [0...100]
input double Signal_PriceLevel       =0.0;                // Price level to execute a deal
input double Signal_StopLevel        =50.0;               // Stop Loss level (in points)
input double Signal_TakeLevel        =50.0;               // Take Profit level (in points)
input int    Signal_Expiration       =4;                  // Expiration of pending orders (in bars)
input int    Signal_ITF_GoodHourOfDay=-1;                 // IntradayTimeFilter(-1,...) Good hour
input int    Signal_ITF_BadHoursOfDay=8389119;            // IntradayTimeFilter(-1,...) Bad hours (bit-map)
input int    Signal_ITF_GoodDayOfWeek=-1;                 // IntradayTimeFilter(-1,...) Good day of week
input int    Signal_ITF_BadDaysOfWeek=0;                  // IntradayTimeFilter(-1,...) Bad days of week (bit-map)
input double Signal_ITF_Weight       =1.0;                // IntradayTimeFilter(-1,...) Weight [0...1.0]
//--- inputs for money
input double Money_FixRisk_Percent   =10.0;               // Risk percentage
//+------------------------------------------------------------------+
//| Global expert object                                             |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Initialization function of the expert                            |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Initializing expert
   if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing expert");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Creating signal
   CExpertSignal *signal=new CExpertSignal;
   if(signal==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating signal");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//---
   ExtExpert.InitSignal(signal);
   signal.ThresholdOpen(Signal_ThresholdOpen);
   signal.ThresholdClose(Signal_ThresholdClose);
   signal.PriceLevel(Signal_PriceLevel);
   signal.StopLevel(Signal_StopLevel);
   signal.TakeLevel(Signal_TakeLevel);
   signal.Expiration(Signal_Expiration);
//--- Creating filter CSignalITF
   CSignalITF *filter0=new CSignalITF;
   if(filter0==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating filter0");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
   signal.AddFilter(filter0);
//--- Set filter parameters
   filter0.GoodHourOfDay(Signal_ITF_GoodHourOfDay);
   filter0.BadHoursOfDay(Signal_ITF_BadHoursOfDay);
   filter0.GoodDayOfWeek(Signal_ITF_GoodDayOfWeek);
   filter0.BadDaysOfWeek(Signal_ITF_BadDaysOfWeek);
   filter0.Weight(Signal_ITF_Weight);
//--- Creation of trailing object
   CTrailingNone *trailing=new CTrailingNone;
   if(trailing==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating trailing");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Add trailing to expert (will be deleted automatically))
   if(!ExtExpert.InitTrailing(trailing))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing trailing");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Set trailing parameters
//--- Creation of money object
   CMoneyFixedRisk *money=new CMoneyFixedRisk;
   if(money==NULL)
     {
      //--- failed
      printf(__FUNCTION__+": error creating money");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Add money to expert (will be deleted automatically))
   if(!ExtExpert.InitMoney(money))
     {
      //--- failed
      printf(__FUNCTION__+": error initializing money");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Set money parameters
   money.Percent(Money_FixRisk_Percent);
//--- Check all trading objects parameters
   if(!ExtExpert.ValidationSettings())
     {
      //--- failed
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- Tuning of all necessary indicators
   if(!ExtExpert.InitIndicators())
     {
      //--- failed
      printf(__FUNCTION__+": error initializing indicators");
      ExtExpert.Deinit();
      return(INIT_FAILED);
     }
//--- ok
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Deinitialization function of the expert                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ExtExpert.Deinit();
  }
//+------------------------------------------------------------------+
//| "Tick" event handler function                                    |
//+------------------------------------------------------------------+
void OnTick()
  {
   ExtExpert.OnTick();
  }
//+------------------------------------------------------------------+
//| "Trade" event handler function                                   |
//+------------------------------------------------------------------+
void OnTrade()
  {
   ExtExpert.OnTrade();
  }
//+------------------------------------------------------------------+
//| "Timer" event handler function                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   ExtExpert.OnTimer();
  }
//+------------------------------------------------------------------+
 

¿Funcionará en lugar de OrderCloseTime()?

Mi experiencia en MQL5 es el cuarto día, ¡pero ya me he hartado!

Traer de vuelta la función OrderCloseTime(), esta posición se puede hacer de alguna manera programática.... - orden - luego operación - luego posición, ¿o es tan difícil calcular la posición por máquina?

//+------------------------------------------------------------------+
//| Check for close position conditions                              |
//+------------------------------------------------------------------+
//fxsaber

datetime TimCloseHisPos(){

datetime timCloseHisPos = 0;

if (!ticket1)
ticket1 = TradeClose.PositionOpen(_Symbol, ORDER_TYPE_BUY, 0.1, Ask_, Ask_ - 100 * Point_, Ask_ + 100 * Point_) ? TradeClose.ResultOrder() : 0;
else if (!PositionSelectByTicket(ticket1) && HistorySelectByPosition(ticket1) && HistoryDealGetString(ticket1,DEAL_SYMBOL)==_Symbol)
{
ENUM_ORDER_TYPE cmd = (ENUM_ORDER_TYPE)HistoryOrderGetInteger(HistoryOrderGetTicket(HistoryOrdersTotal() - 1), ORDER_TYPE);
double open = cmd ? Bid_ : Ask_;
double tp = open - (cmd ? 1 : -1) * 100 * Point_;
double sl = open + (cmd ? 1 : -1) * 100 * Point_;
ticket1 = TradeClose.PositionOpen(_Symbol, cmd, 0.1, open, sl, tp) ? TradeClose.ResultOrder() : 0;
}
//Pul-Adgi Mo-UlStan
if(HistoryDealSelect(ticket1))
{
//--- время совершения сделки в миллисекундах от 01.01.1970
timCloseHisPos=(datetime)HistoryDealGetInteger(ticket1,DEAL_TIME_MSC);
}
return(timCloseHisPos);
}
//+------------------------------------------------------------------+
 

¡Buenas tardes a todos!

Si no es mucha molestia, por favor corrige el código MQL4 para que funcione en ML5

int init()
   {

         info_init();                                                 // Вызов функции менеджера инициализации вывода информации на экран
         Fun_Label();                                                 // Вызов функции вывода информации на экран (чтобы сразу видно было)
    return(0);                                                        // Выход из init()
   }


int deinit()
   {
         info_deinit();                                               // Удаляем вывод информации на экран из блоков 1 - 8 
    return(0);                                                        // Выход из deinit()
   }


int start()
   {
         Fun_Label();                                                 // Ввод параметров для вывод информации на экран
    return(0);                                                        // Выход из start()
   }




void info_init()
   {
    info_init_1();  info(  0,".",Tan,8); // info( 10,".",Tan,8); info( 20,".",Tan,8); info( 30,".",Tan,8); // Tan - самое короткое название цвета
   }


void info_init_1()
   {
    for(int row = 0; row <= 9; row ++)                                           // row - номер текстовой метки (строки сообщения)
        {             
         info_LabelCreate( StringConcatenate( "InfoLabel_0", row ), 1000, 15 + 15*row ); // Вызов функции _LabelCreate
        }           // Передаются      string _Name, int _XDistance, int _YDistance
    }


void info_LabelCreate(string _Name, int _XDist, int _YDist, int _Corner = 0)       // Координаты: х = _XDist, у = _YDist, угол = _Corner.
   {
    int _GetLastError;

    if (!ObjectCreate(_Name, OBJ_LABEL, 0, 0, 0))          // Объекты с типом OBJ_LABEL игнорируют координаты, поэтому используем функцию ObjectSet()...
        {                                                  // ...  для установки свойств OBJPROP_XDISTANCE, OBJPROP_YDISTANCE и OBJPROP_CORNER
         _GetLastError = GetLastError();
         if (_GetLastError != 4200)                        // 4200 - Объект уже существует
             {
              Print("ObjectCreate(\"", _Name, "\", OBJ_LABEL,0,0,0) - Error #", _GetLastError);
             }
        }

    if (!ObjectSet(_Name, OBJPROP_XDISTANCE, _XDist))      // OBJPROP_XDISTANCE - Дистанция в пикселях по оси X от угла привязки
        {
         _GetLastError = GetLastError();
         Print("ObjectSet( \"", _Name, "\", OBJPROP_XDISTANCE, ", _XDist, ") - Error #", _GetLastError);
        }
    if (!ObjectSet(_Name, OBJPROP_YDISTANCE, _YDist))      // OBJPROP_YDISTANCE - Дистанция в пикселях по оси Y от угла привязки
        {
         _GetLastError = GetLastError();
         Print("ObjectSet( \"", _Name, "\", OBJPROP_YDISTANCE, ", _YDist, ") - Error #", _GetLastError);
        }
    if (!ObjectSet(_Name, OBJPROP_CORNER, _Corner))        // OBJPROP_CORNER - Угол графика для привязки графического объекта
        {
         _GetLastError = GetLastError();
         Print("ObjectSet( \"", _Name, "\", OBJPROP_CORNER, ", _Corner, ") - Error #", _GetLastError);
        }

    if (!ObjectSetText(_Name, "", 10))                     // Задаём размер шрифта (font_size)
        {
         _GetLastError = GetLastError();
         Print("ObjectSetText( \"", _Name, "\", \"\", 10 ) - Error #", _GetLastError);
        }
   }


void info_deinit() // Удаление объектов, созданных функцией info_init() для блоков 1-8 
   {
    int _GetLastError;
    for ( int row = 0; row <= 9; row ++ )
        {

         if ( !ObjectDelete( StringConcatenate( "InfoLabel_0", row ) ) )
             {_GetLastError = GetLastError(); Print( "ObjectDelete( \"", StringConcatenate( "InfoLabel_0", row ), "\" ) - Error #", _GetLastError ); }
        }
   }


void info(int LabelNumber, string Text, color Color = 17000000, double FontSize = -1.0, string Font = "-1")
   {
    //---- определяем имя объекта
    string LabelName;

    if ( LabelNumber <  10 )
         LabelName = StringConcatenate( "InfoLabel_0", LabelNumber );  // Обязательно "0" впереди перед ОДИНОЧНЫМИ цифрами

    color  lastusedColor    = Black;
    double lastusedFontSize = 9.0;
    string lastusedFont     = "Arial";

    //---- если значения дополнительных параметров не задавались, устанавливаем последние используемые значения
    if(Color == 17000000) Color    = lastusedColor;           // 0-чёрный, 16 777 215-белый, 17000000-цвета нет
    if(FontSize < 0)      FontSize = lastusedFontSize;
    if(Font == "-1")      Font     = lastusedFont;

    //---- запоминаем последние используемые значения
    lastusedColor    = Color;
    lastusedFontSize = FontSize;
    lastusedFont     = Font;

    //---- отображаем новый текст
    if(!ObjectSetText(LabelName, Text, FontSize, Font, Color))
        {
         int _GetLastError = GetLastError();
         Print("ObjectSetText( \"", LabelName,"\", \"", Text, "\", ", FontSize, ", ", Font, ", ", Color, " ) - Error #", _GetLastError);
        }
    //---- перерисовываем объекты
    ObjectsRedraw();
   }


void Fun_Label()                                                      // Ввод параметров для вывод информации на экран
   {
    info(  0, "x", Magenta, 8 );
    info(  1, "x", Magenta, 8 );
    info(  2, "x", Magenta, 8 );
    info(  3, "x", Magenta, 8 );
    info(  4, "x", Magenta, 8 );
    info(  5, "x", Magenta, 8 );
    info(  6, "x", Magenta, 8 );
    info(  7, "x", Magenta, 8 );
    info(  8, "x", Magenta, 8 );
    info(  9, "x", Magenta, 8 );
   }
 

Observar el comportamiento no natural de la plataforma.

1. ME5 no conserva los ajustes de la interfaz que estaban en el momento de la desconexión. En particular, el panel de ajustes desaparece. Se puede restaurar, pero hay que hacerlo cada vez que se enciende.

2. Estoy haciendo un indicador. La modificación de los ajustes de los indicadores en MT5 suele provocar un fallo: la forma de las líneas cambia significativamente, el color no se puede cambiar, etc.
Además, si se cambian los ajustes en un indicador recién instalado, todo funciona según lo previsto.

Problemas:

1. ¿Soy yo o es un problema general?
2. Si es algo que se me escapa o que hago mal, por favor, aconséjame.

 
Los comentarios no relacionados con este tema han sido trasladados a "Preguntas de los principiantes de MQL4 MT4 MetaTrader 4".
 
Leo59:

¡Buenas tardes a todos!

Si no es mucha molestia, por favor corrige el código MQL4 para que funcione en ML5

En primer lugar, hay que escribir correctamente las funciones del sistema. La forma más fácil de hacerlo es en el menú del MetaEditor 5 Archivo - Crear - Asesor Experto (plantilla). Compara tu código y el mío:

//+------------------------------------------------------------------+
//|                                                            1.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//--- input parameters
input int      Input1=9;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
Cuando lo hayas corregido, seguiremos...
 
Pul-Adgi Mo-UlStan:

¿Funcionará para los desarrolladores en lugar de OrderCloseTime()?

Mi experiencia en MQL5 es el cuarto día, ¡pero ya me he hartado!

Traer de vuelta la función OrderCloseTime(), esta posición se puede hacer de alguna manera programática.... - orden - luego operación - luego posición, ¿o es tan difícil calcular la posición por máquina?

¿Qué quiere conseguir exactamente? ¿Necesita la hora de la última operación(tipo de operación "salida del mercado")? ¿O quiere saber la hora de cierre de una posición en el historial de operaciones?

 
User_mt5:

Observar el comportamiento no natural de la plataforma.

1. ME5 no conserva los ajustes de la interfaz que estaban en el momento de la desconexión. En particular, el panel de ajustes desaparece. Se puede restaurar, pero hay que hacerlo cada vez que se enciende.


¿Quién soy yo? ¿Quién es el Panel de Configuración?

 
Vladimir Karputov:

¿Quién soy yo? ¿Quién es el panel de configuración?

ME = MetaEditor.

El panel de ajustes, es mi advertencia. Me refiero a la barra de herramientas con botones, incluyendo Compile.
(He dicho "ajustes" por inercia, soy yo con MT5 quien también está luchando con el panel de ajustes de los indicadores)

Build 2138 de fecha 06.09.2019.
 
User_mt5:

ME = MetaEditor.

El panel de ajustes es mi advertencia. Me refiero a la barra de herramientas, que tiene botones, incluido el de compilar.
(He dicho "ajustes" por inercia - soy yo con MT5 quien también se molesta con el panel de ajustes de los parámetros del indicador)

Build 2138 de fecha 06.09.2019.

Por favor, especifique en qué equipo ocurre esto:

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

Vladimir Karputov, 2019.07.31 12:12

Especifique estos datos:

copie tres líneas de la pestaña "Log" (seleccione tres líneas -> haga clic con el botón derecho del ratón -> Copiar)


y pégalo en tu mensaje. Deberías conseguir algo como esto:

2019.07.31 11:53:10.681 MetaTrader 5 x64 build 2093 started (MetaQuotes Software Corp.)
2019.07.31 11:53:10.685 Windows 10 (build 18362) x64, IE 11, UAC, Intel Core i3-3120 M  @ 2.50 GHz, Memory: 3188 / 8077 Mb, Disk: 99 / 415 Gb, GMT+2
2019.07.31 11:53:10.685 C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

A continuación, describa paso a paso y con capturas de pantalla lo que le ocurre exactamente.