Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1121

 

Bom dia a todos e grandes lucros!

Gerei um simples Expert Advisor com VQL5 Wizard, o código está abaixo. Ajude-me por favor a descobrir porque é que a função "Expiração de encomendas pendentes (em barras)" não funciona. Defini quaisquer valores de Sinal_Expiração de 1 a 1000, mas a ordem pendente ainda existe apenas dentro de uma barra. Também anexar definições de parâmetros.

Para testes, estou a utilizar uma conta demo no terminal Metatrader 5, construir 2136.

Atenciosamente, 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á para os criadores em vez de OrderCloseTime()?

A minha experiência na MQL5 é o quarto dia, mas já tive a minha dose!

Trazer de volta a função OrderCloseTime(), esta posição pode ser feita de alguma forma programática.... - ordem - depois troca - depois posição, ou é assim tão difícil calcular a posição 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);
}
//+------------------------------------------------------------------+
 

Boa tarde a todos!

Se não for muito incómodo, por favor corrija o código MQL4 para que funcione no 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 o comportamento não natural da plataforma.

1. ME5 não mantém as configurações de interface que estavam no lugar quando foi desligado. Em particular, o painel de ajustes desaparece. Pode ser restaurado, mas tem de ser feito de cada vez que é ligado.

2. Estou a fazer um indicador. A alteração das definições do indicador em MT5 conduz normalmente a uma falha: a forma das linhas muda significativamente, a cor não pode ser alterada, etc.
Além disso, se alterar as definições num indicador recentemente instalado, tudo funciona como planeado.

Questões:

1. É impressão minha ou é um problema geral?
2. Se é algo que me está a faltar ou a fazer mal, por favor aconselhem-me.

 
Comentários não relacionados com este tópico foram transferidos para "Perguntas dos principiantes do MQL4 MT4 MetaTrader 4".
 
Leo59:

Boa tarde a todos!

Se não for muito incómodo, por favor corrija o código MQL4 para que funcione no ML5

Em primeiro lugar, é preciso escrever correctamente o sistema funciona. A forma mais fácil de o fazer é em MetaEditor 5 menu File - Create - Expert Advisor (modelo). Compare o seu código e o meu:

//+------------------------------------------------------------------+
//|                                                            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()
  {
//---
   
  }
//+------------------------------------------------------------------+
Quando o tiver corrigido, continuaremos...
 
Pul-Adgi Mo-UlStan:

Funcionará para os criadores em vez de OrderCloseTime()?

A minha experiência na MQL5 é o quarto dia, mas já tive a minha dose!

Trazer de volta a função OrderCloseTime(), esta posição pode ser feita de alguma forma programática.... - ordem - depois troca - depois posição, ou é tão difícil calcular a posição por máquina?

O que é que quer obter exactamente? Precisa da hora da última transacção(tipo de "saída de mercado")? Ou quer saber a hora de fecho de uma posição na história do comércio?

 
User_mt5:

Observar o comportamento não natural da plataforma.

1. ME5 não mantém as configurações de interface que estavam no lugar quando foi desligado. Em particular, o painel de ajustes desaparece. Pode ser restaurado, mas tem de o fazer de cada vez que o liga.


Quem é ME? Quem é o Painel de Ajustes?

 
Vladimir Karputov:

Quem é ME? Quem é o painel de ajustes?

ME = MetaEditor.

O painel de ajustes, é a minha advertência. Refiro-me à barra de ferramentas com botões, incluindo o Compile.
(Eu disse "definições" por inércia - sou eu com o MT5 que também estou a lutar com o painel de definições de indicadores)

Build 2138 datado de 06.09.2019.
 
User_mt5:

ME = MetaEditor.

O painel de ajustes é a minha advertência. Refiro-me à barra de ferramentas, que tem botões, incluindo o Compile.
(Eu disse "definições" por inércia - sou eu com o MT5 que também incomoda com o painel de definições dos parâmetros indicadores)

Build 2138 datado de 06.09.2019.

Por favor especifique em que equipamento isto está a acontecer:

Fórum sobre comércio, sistemas automatizados de comércio e testes de estratégia comercial

Insectos, insectos, perguntas

Vladimir Karputov, 2019.07.31 12:12

Especificar tais dados:

copiar três linhas do separador "Log" (seleccionar três linhas -> clique com o botão direito do rato -> Copiar)


e cole-o na sua mensagem. Deveria obter algo assim:

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

Depois descreva passo a passo e com screenshots - o que se passa exactamente para si.
Razão: