初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1121

 

大家好,利润丰厚!

我用VQL5向导生成了一个简单的专家顾问,代码如下。请帮助我找出 "挂单过期(以条为单位)"功能不工作的原因。我设置了从1到1000的任何Signal_Expiration值,但挂单仍然只存在于一个条形内。我还附上了参数设置。

为了测试,我在Metatrader 5终端中使用模拟账户,构建2136。

真诚的,弗拉基米尔。

//+------------------------------------------------------------------+
//|                                                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();
  }
//+------------------------------------------------------------------+
 

它能代替OrderCloseTime()吗?

我在MQL5的经历是第四天,但我已经吃饱了!我在MQL5的经历是第四天。

带回OrderCloseTime()函数,这个位置可以通过某种程序完成....。- 订单--然后是交易--然后是头寸,还是说用机器计算头寸这么难?

//+------------------------------------------------------------------+
//| 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);
}
//+------------------------------------------------------------------+
 

大家下午好!

如果不是太麻烦的话,请纠正MQL4的代码,使其在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 );
   }
 

观察不自然的平台行为。

1.ME5不保留关闭时的界面设置。特别是,设置面板消失了。可以恢复,但必须在每次开机时进行。

2.我正在做一个指标。在MT5中改变指标设置通常会导致失败:线条的形状明显改变,颜色无法改变,等等。
此外,如果你在一个新安装的指标中改变设置,一切都按计划进行。

问题。

1.这只是我的问题,还是一个普遍问题?
2.如果是我遗漏了什么或做错了什么,请告知。

 
与本主题无关的评论已被移至 "MQL4 MT4 MetaTrader 4初学者的问题"。
 
Leo59:

大家下午好!

如果不是太麻烦的话,请纠正MQL4的代码,使其在ML5中工作。

首先,你需要正确编写系统功能。最简单的方法是在MetaEditor 5菜单中的文件-创建-专家顾问(模板)。比较你和我的代码。

//+------------------------------------------------------------------+
//|                                                            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()
  {
//---
   
  }
//+------------------------------------------------------------------+
当你纠正了它,我们将继续......
 
Pul-Adgi Mo-UlStan:

它能代替OrderCloseTime()对开发者起作用吗?

我在MQL5的经历是第四天,但我已经吃饱了!我在MQL5的经历是第四天。

带回OrderCloseTime()函数,这个位置可以通过某种程序完成....。- 订单--然后是交易--然后是头寸,还是说用机器计算头寸如此困难?

你到底想得到什么?你是否需要最后一笔交易的时间(交易类型为"市场退出")?或者你想知道交易历史中某个头寸的平仓时间?

 
User_mt5:

观察平台的非自然行为。

1.ME5不保留关闭时的界面设置。特别是,设置面板消失了。它可以被恢复,但必须在每次开机时进行。


我是谁?谁是设置小组?

 
Vladimir Karputov:

我是谁?谁是设置小组?

ME = MetaEditor.

设置面板,是我的告诫。我指的是带有按钮的工具条,包括编译。
(我说 "设置 "是出于惯性--是我用MT5也在纠结于指标设置面板)

2019年9月6日的Build 2138。
 
User_mt5:

ME = MetaEditor.

设置面板是我的告诫。我指的是工具条,它有一些按钮,包括编译。
(我说 "设置 "是出于惯性思维--是我用MT5也在纠结于指标参数的设置面板)

2019年9月6日的Build 2138。

请说明这种情况发生在哪个设备上。

关于交易、自动交易系统和交易策略测试的论坛

虫子,虫子,问题

Vladimir Karputov, 2019.07.31 12:12

指定此类数据。

从 "日志 "标签中复制三行(选择三行 -> 鼠标右键 -> 复制)。


并将其粘贴到你的信息中。你应该得到这样的东西。

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

然后一步一步地描述,并附上截图--你到底发生了什么。