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

 
Alexey Viktorov:

我不能在任何方面给你建议。我不使用优化。我认为这是庸医。

我不同意。在我看来,优化是为给定的交易和策略选择最合适的参数。

P.S. 现在价差似乎正常了。

 
Youri Lazurenko:

我不同意。

我不是在激怒你。只是发表一下我的个人意见))。

 
Alexey Viktorov:

我不是在激怒你。我只是给出了我的个人意见))。

也许我的观点是错误的。我也不是在煽动。

 

你好。需要一些帮助。我需要限制挂单的 寿命,最好是在条数上。我已经在mql4中使用了这个函数。

datetime DateExp()                                 
{
   datetime expDate = 0;
   
   if(Period() == PERIOD_M1)
      expDate = TimeCurrent() + ExpDate*60;
      
   if(Period() == PERIOD_M5)
      expDate = TimeCurrent() + ExpDate*5*60;
    
   if(Period() == PERIOD_M15)
      expDate = TimeCurrent() + ExpDate*15*60;
    
   if(Period() == PERIOD_M30)
      expDate = TimeCurrent() + ExpDate*30*60;
    
   if(Period() == PERIOD_H1)
      expDate = TimeCurrent() + ExpDate*60*60;
    
   if(Period() == PERIOD_H4)
      expDate = TimeCurrent() + ExpDate*4*60*60;
   
   if(Period() == PERIOD_D1)
      expDate = TimeCurrent() + ExpDate*24*60*60;      
    
   if(Period() == PERIOD_W1) 
      expDate = TimeCurrent() + ExpDate*7*24*60*60; 
   
   if(Period() == PERIOD_MN1)
      expDate = TimeCurrent() + ExpDate*30*24*60*60;
          
   return(expDate);  
}

其中

外部intDate = 6; //订单有效期内的条数。

一切正常。

我在mql5中尝试过类似的东西。

datetime DateExp()                                 
{
   datetime expDate = 0;
   
   if(Period() == PERIOD_M1)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M1)*ExpDate;
      
   if(Period() == PERIOD_M2)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M2)*ExpDate;
   
   if(Period() == PERIOD_M3)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M3)*ExpDate;
   
   if(Period() == PERIOD_M4)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M4)*ExpDate;
      
   if(Period() == PERIOD_M5)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M5)*ExpDate;
   
   if(Period() == PERIOD_M6)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M6)*ExpDate;
   
   if(Period() == PERIOD_M10)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M10)*ExpDate;
   
   if(Period() == PERIOD_M12)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M12)*ExpDate;
    
   if(Period() == PERIOD_M15)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M15)*ExpDate;
   
   if(Period() == PERIOD_M20)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M20)*ExpDate;
    
   if(Period() == PERIOD_M30)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_M30)*ExpDate;
    
   if(Period() == PERIOD_H1)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H1)*ExpDate;
   
   if(Period() == PERIOD_H2)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H2)*ExpDate;
   
   if(Period() == PERIOD_H3)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H3)*ExpDate;
    
   if(Period() == PERIOD_H4)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H4)*ExpDate;
   
   if(Period() == PERIOD_H6)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H6)*ExpDate;
   
   if(Period() == PERIOD_H8)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H8)*ExpDate;
   
   if(Period() == PERIOD_H12)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_H12)*ExpDate;
   
   if(Period() == PERIOD_D1)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_D1)*ExpDate;      
    
   if(Period() == PERIOD_W1) 
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_W1)*ExpDate; 
   
   if(Period() == PERIOD_MN1)
      expDate = TimeCurrent() + PeriodSeconds(PERIOD_MN1)*ExpDate;
          
   return(expDate);  
}

其中

输入 int ExpDate = 6; //订单有效期的条数

然后我试着在下挂单时使用它(上面显示的功能),例如,买入

               request.action       = TRADE_ACTION_PENDING;                                         
               request.magic        = Magic;                                                       
               request.symbol       = _Symbol;                                                      
               request.volume       = GetLots();                                                    
               request.price        = openBuy;                                                      
               request.sl           = slBuy;                                                        
               request.tp           = tpBuy;                                                        
               request.type         = ORDER_TYPE_BUY_STOP;                                          
               request.type_filling = ORDER_FILLING_FOK;                                           
               request.expiration   = DateExp();                                                    
               request.deviation    = SG; 

挂单被放置,但在被激活之前不会生效(在测试器中)。我曾尝试在request.expiration中设置一个简单的数字,但没有任何效果。我在谷歌上没有找到任何信息。我有什么问题吗?为什么在一段时间后,订单没有被删除?

P.S. 当在Comment中显示时,DateExp()函数显示日期、时间。

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 
Youri Lazurenko:


你忘了说明

struct MqlTradeRequest
  {
   ENUM_TRADE_REQUEST_ACTIONS    action;           // Тип выполняемого действия
   ulong                         magic;            // Штамп эксперта (идентификатор magic number)
   ulong                         order;            // Тикет ордера
   string                        symbol;           // Имя торгового инструмента
   double                        volume;           // Запрашиваемый объем сделки в лотах
   double                        price;            // Цена 
   double                        stoplimit;        // Уровень StopLimit ордера
   double                        sl;               // Уровень Stop Loss ордера
   double                        tp;               // Уровень Take Profit ордера
   ulong                         deviation;        // Максимально приемлемое отклонение от запрашиваемой цены
   ENUM_ORDER_TYPE               type;             // Тип ордера
   ENUM_ORDER_TYPE_FILLING       type_filling;     // Тип ордера по исполнению
   ENUM_ORDER_TYPE_TIME          type_time;        // Тип ордера по времени действия
   datetime                      expiration;       // Срок истечения ордера (для ордеров типа ORDER_TIME_SPECIFIED)
   string                        comment;          // Комментарий к ордеру
   ulong                         position;         // Тикет позиции
   ulong                         position_by;      // Тикет встречной позиции
  };
 
Vladimir Karputov:

你忘了说明

谢谢,自己已经找到了,想写一下,问题已经删除。在这些之前,但我把,事实证明,错误的参数request.type_time = ORDER_TIME_GTC; 更正为request.type_time =ORDER_TIME_SPECIFIED; 然后一切都正常。但非常感谢你的反馈和提示。

 
Artyom Trishkin:

阿列克谢告诉你,你应该首先使你的指标至少只是画出蜡烛。因为他们是。至少在目前的酒吧。如果你设法做到这一点,就认为理解的第一步已经过去。但最好不要通过尝试不同的参数来找到它,而是用你自己的头脑。

这与先验论有什么关系?你真的需要它,因为你无法画出一个只有四个值的蜡烛。

在这里我写了一个非常简单的测试指标,它应该从美元指数H8图表中画出5根蜡烛(真实的蜡烛)。

//+------------------------------------------------------------------+
//|                                                        cTest.mq5 |
//|                                     Copyright 2020, Tabolin S.N. |
//|                           https://www.mql5.com/ru/users/vip.avos |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Tabolin S.N."
#property link      "https://www.mql5.com/ru/users/vip.avos"
#property version   "1.00"
//#property indicator_separate_window
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_plots   1
//--- plot bars
#property indicator_label1  "bars"
#property indicator_type1   DRAW_CANDLES
#property indicator_color1  clrGold
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double   barsBuffer1[];
double   barsBuffer2[];
double   barsBuffer3[];
double   barsBuffer4[];
//+------------------------------------------------------------------+
double   newCandles_Open[5]   = {106.785, 106.724, 106.760, 106.767, 106.769};
double   newCandles_High[5]   = {106.792, 106.765, 106.780, 106.781, 106.769};
double   newCandles_Low[5]    = {106.716, 106.719, 106.746, 106.758, 106.715};
double   newCandles_Close[5]  = {106.724, 106.760, 106.766, 106.769, 106.725};

int      tick_count           = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   SetIndexBuffer(0, barsBuffer1, INDICATOR_DATA);
   SetIndexBuffer(1, barsBuffer2, INDICATOR_DATA);
   SetIndexBuffer(2, barsBuffer3, INDICATOR_DATA);
   SetIndexBuffer(3, barsBuffer4, INDICATOR_DATA);
   
   ArraySetAsSeries(barsBuffer1  ,true);
   ArraySetAsSeries(barsBuffer2  ,true);
   ArraySetAsSeries(barsBuffer3  ,true);
   ArraySetAsSeries(barsBuffer4  ,true);
   
   ArrayInitialize(barsBuffer1   ,0.0);
   ArrayInitialize(barsBuffer2   ,0.0);
   ArrayInitialize(barsBuffer3   ,0.0);
   ArrayInitialize(barsBuffer4   ,0.0);
//---
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int  OnCalculate(
   const int        rates_total,       // размер входных таймсерий
   const int        prev_calculated,   // количество обработанных баров на предыдущем вызове
   const datetime&  time[],            // массив Time
   const double&    open[],            // массив Open
   const double&    high[],            // массив High
   const double&    low[],             // массив Low
   const double&    close[],           // массив Close
   const long&      tick_volume[],     // массив Tick Volume
   const long&      volume[],          // массив Real Volume
   const int&       spread[]           // массив Spread
   )
{
   if(rates_total - prev_calculated > 1)
   {
      if(prev_calculated == 0)
      {
         Print("~~~~ Предварительный расчёт индикатора.");
         for(int i = 0; i < 5; i++)
         {
            barsBuffer1[0] = newCandles_Open[i];
            barsBuffer2[0] = newCandles_High[i];
            barsBuffer3[0] = newCandles_Low[i];
            barsBuffer4[0] = newCandles_Close[i];
         }
         Print("~~~~ Предварительный расчёт индикатора закончен.");
      }
      else return(0);
   }
   else Print("tick_count = ",++tick_count);
//--- return value of prev_calculated for next call
   return(rates_total);
}
//+------------------------------------------------------------------+

它只画出那些烛台,没有别的。

但当我运行它时,它只是在画那该死的东西......。

那么告诉我,我做错了什么?


顺便说一下,文档中有 一个错字:

const datetime&  time{},            // массив Time
Документация по MQL5: Обработка событий / OnCalculate
Документация по MQL5: Обработка событий / OnCalculate
  • www.mql5.com
события Calculate для обработки изменений ценовых данных. Существуют два варианта функции, в пределах одного индикатора нельзя использовать оба варианта. [in]  Размер массива price[] или входных таймсерий, доступных индикатору для расчета. Во втором варианте функции значение параметра соответствует количеству баров на графике, на котором он...
附加的文件:
cTest.mq5  8 kb
 
Сергей Таболин:

我写了一个非常简单的测试指标,它应该从USDJPY,H8图表中画出5个蜡烛图(真实的)。

它只画出这些烛台,没有别的。

但当我运行它时,它只是在画那该死的东西......。

我怎样才能解释我做错了什么?


顺便说一下,文档中有 一个错字:

在调试器中,检查time[0]并回答问题:"为什么你试图从图表的左前方画蜡烛图?


我告诉过你 - 使用DRAW_CANDLES 的帮助。复制DRAW_CANDLES 帮助中的例子。弄清楚。对你来说,现在接触蜱虫还为时过早。

Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_CANDLES
Документация по MQL5: Пользовательские индикаторы / Стили индикаторов в примерах / DRAW_CANDLES
  • www.mql5.com
//|                                                 DRAW_CANDLES.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | "Рисует в отдельном окне разным цветом свечи по случайно выбранному из MarketWatch символу...
 
Vladimir Karputov:

在调试器中检查time[0],并回答问题:"为什么你试图从图表的LEFT LEFT边缘绘制蜡烛?


我告诉过你 - 使用DRAW_CANDLES 的帮助。复制DRAW_CANDLES 帮助中的例子。弄清楚。对你来说,现在接触蜱虫还为时过早。

弗拉基米尔,我已经明白我想从最左边的边缘画出什么。测试的那个有正确的边缘。

   ArraySetAsSeries(barsBuffer1  ,true);
   ArraySetAsSeries(barsBuffer2  ,true);
   ArraySetAsSeries(barsBuffer3  ,true);
   ArraySetAsSeries(barsBuffer4  ,true);

而烛台的价格是真实的...也没有虱子...

 
Сергей Таболин:

弗拉基米尔,我已经明白,我是想从最左边的边缘画起。现在,测试的那个人正在从右边的边缘画出来

而且烛台价格是真实的...也没有虱子...

以《帮助》中的例子为例!有多少次?如果你不理解其含义,就不必使用你自己的虚构的结构。使用标准结构--弄清楚它们是如何工作的。之后,把你自己的构造扔进垃圾桶。


并使用 "MQL向导 "生成一个模板。

编码

//+------------------------------------------------------------------+
//|                                                 Draw Candles.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 4
#property indicator_plots   1
//--- plot USDJPY
#property indicator_label1  "USDJPY"
#property indicator_type1   DRAW_CANDLES
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double   Buffer1[];
double   Buffer2[];
double   Buffer3[];
double   Buffer4[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,Buffer3,INDICATOR_DATA);
   SetIndexBuffer(3,Buffer4,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;
   for(int i=limit; i<rates_total; i++)
     {
      Buffer1[i]=open[i];
      Buffer2[i]=high[i];
      Buffer3[i]=low[i];
      Buffer4[i]=close[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

和结果


附加的文件: