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

 
Leser: 请告知在EA中如何以及在哪里指定属于2号窗口的MA。例如,我在MFI中添加了MA,我想在我的EA中注册这个MA。我不知道在哪里和如何做。
你想深入了解细节吗?你的专家顾问已经在使用MFI指标,你想让它使用第二个指标--MA指标?或者,你的专家顾问根本不使用任何指标,而你需要它使用MA指标?
 
Yedelkin:

1.我想说的是:使用别人的代码要非常小心。因为别人的代码也意味着别人的错误。

2.在这里(https://www.mql5.com/ru/forum/6343/page64#comment_357008),我建议你在使用变量之前尝试正确地将其归零。但你的代码还没有实现这个建议。此外,你的代码包含以下类型的结构。

你看,在这个结构中,请求和结果变量不是在使用之前而是在使用之后 被清零。此外,当这些局部变量被归零时,函数就会停止运行,也就是说,这种归零本身是没有意义的。换句话说,这样的结构是一个很好的例子,说明MqlTradeRequestMqlTradeResult 变量不应该 被归零。所以,如果你很渴望,请尝试正确地清除变量。如果出了问题,请详细描述什么是 "不工作"。

3.标准库有一个交易类"MQL5参考/ 标准库/ 交易类/ CTrade"。试着想一想如何在实践中应用它。在沉浸于语言的初始阶段,这门课可能已经很足够了。例如,这个类有以下方法:"MQL5参考/ 标准库/ 交易类/ 2CTrade/ PositionModify"。它的实施方式如下。

其中的'ClearStructures();'一行 使用 清除了m_request变量。

耶德尔金。

非常感谢 :)

我查了一下,发现我的错误。

我可以这样写。

//+------------------------------------------------------------------+
//| Clear structures request,result and check_result                 |
//+------------------------------------------------------------------+
void ClearStructures()
  {
   MqlTradeRequest request;
   MqlTradeResult result;
   MqlTradeCheckResult check_result;
   ZeroMemory(request);
   ZeroMemory(result);
   ZeroMemory(check_result);
  } 

但我喜欢你的建议。

   MqlTradeRequest request={0};
   MqlTradeResult result={0};
所有这些,结果都是一样的。

现在职位没有找到,我将为这个任务而劳累。

谢谢你。

 

耶德尔金。

我给你写信是因为你的回答很充分。

我有两台机器--MT4和MT5。

为什么在MT5上不工作,它们是一样的。

附加的文件:
MTB_1E.mq4  4 kb
MTB_E.mq5  9 kb
 
mario065: 为什么在MT4和MT5上不能工作,它们是一样的。

不幸的是,我根本就不了解MT4。我会看一下,如果我发现什么,我会告诉你。

补遗。一般来说,你会等待市场开盘,并报告到底什么应该成功,但没有成功。

 
Yedelkin:

不幸的是,我根本就不了解MT4。我会看一下,如果我发现什么,我会告诉你。

补遗。一般来说,你要等到开市后,描述本应成功但没有成功的事情。

所以我是为了自己,也是为了谁,如果有必要的话。

以下是评论。

如果对两个yazikas(MT4和MT5)的指示点bolshego零进行修改。

if(TradeTrailing>0)

if(MStop > 0)

如果这些点(Bid - pips)bolshe打开posishon。

if((NormalizeDouble(Bid, Digits)-TradeTrailing)>=OrderOpenPrice())

if(NormalizeDouble(Bid - MStop,4) >= Open)
如果止损=0或买入价-pipsi dal尾随>=从开放Posishon+点的定义。
if(OrderStopLoss()==0 || (NormalizeDouble(Bid, Digits)-TradeTrailing)>=(OrderStopLoss()+0.0005))

if(SL == 0 || NormalizeDouble(Bid - MStop,4) >= NormalizeDouble(SL + MStop,4))

修改。

ОrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid, Digits)-TradeTrailing,OrderTakeProfit(),0,Blue);

ModifyPosition(Symbol(),NormalizeDouble(Bid - MStop,4),TP);

就这样了。

我想为修改做一个单独的函数。

 
Yedelkin:
你能说得更具体些吗?你的专家顾问已经在使用MFI指标,你现在需要它使用第二个指标--MA指标?或者,你的专家顾问根本不使用任何指标,但你需要它使用MA指标?
我的专家顾问使用MFI,但我搞不清楚如何编写MA指标!主要条件是MA的位置。MA不在图表上(窗口1),而是在有MFI指标的窗口(窗口2)。
 
Leser: 我的专家顾问使用MFI,但我搞不清楚如何编写MA指标主要条件是MA的位置。MA不在图表上(窗口#1),而是在有MFI指标的窗口(窗口#2)。

如果专家顾问使用MFI,那么它的代码必须包含一个获取该指标手柄的行:"MQL5参考/ 技术指标/ iMFI"。因此,掌握移动平均线指标的方法在这里描述:"MQL5参考 指南/技术指标/ iMA"。

还可以尝试阅读"MQL5中的指标"一文。

 
mario065: 以下是评论:如果Bid-STOPS_LEVEL大于0,用于修改:如果该Bid-STOPS大于未平仓合约:如果止损=0或Bid-STOPS是尾随>=从未平仓合约+点数的定义:修改:这就是全部。我想做一个单独的函数来修改。

1.不幸的是,你没有说明什么是 "不起作用的"。你已经说明了程序的逻辑(它应该如何工作),但你没有说明逻辑在哪里被破坏,以及如何被破坏。如果没有对问题的详细描述,你只能对代码进行评论。

2.bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit)函数包含这样的行。

   if(!OrderSend(request,result) || result.deal==0)
     {
      Print("Modify error =", GetLastError());
      return(false);
     }

如果你看一下MqlTradeResult结构的描述,你可以看到,交易字段的描述如下

交易

交易 票据,如果一个交易已被执行。它在交易操作中被报告TRADE_ACTION_DEAL

由于你的ModifyPosition()函数执行的是一个完全不同的操作,result.deal的值应该永远是0。因此,运营商
if(!OrderSend(request,result) || result.deal==0)

将总是被触发,即使修改成功,同时也会打印一个错误信息。

2.看看前面第2点的线条。你在那里使用函数GetLastError(),目的是返回最后一个错误的代码。但是你在使用它之前根本没有清除包含错误代码的变量,所以即使修改成功,你也会打印出一个可能早在修改位置的请求被发送之前就已经发生的错误。它应该是这样的。

ResetLastError();   
if(!OrderSend(request,result))
   { 
    ... 
    Print("Modify error =", GetLastError());
    ...
   }

3.看看这些线条。

          if(SL == 0 || NormalizeDouble(Bid - MStop,4) >= SL) 
           {
            ModifyPosition(Symbol(),NormalizeDouble(Bid - MStop,4),TP);
           }

假设在下一个交易日,你的条件NormalizeDouble(Bid - MStop,4) == SL触发。假设SL==1.11110。但随后也修改了ModifyPosition(Symbol(),1.11110,TP)。也就是说,这种修改将指定以前设定的水平。

如果平等的NormalizeDouble(Bid - MStop,4) == SL将在下一个tick上再次发挥作用,会发生什么?)特别是如果我们考虑到(a)规范化是在四位数上进行的,而可能有五位数的报价,(b)交易请求在服务器上执行时可能会有一些延迟。

4.还有这样一个字符属性,即SYMBOL_TRADE_STOPS_LEVEL。但在你的代码中没有检查这个级别。也就是说,如果买入头寸的新止损点候选者被指定为SL_new,那么检查条件if(Bid-STOPS_LEVEL>SL_new)就会很有用。

 

事实上,可以试着在《参考手册》中寻找实数的比较。在我的记忆中,它强烈建议不要像这样比较两个实数:如果(double_1 == double_2)。

 

耶德尔金

非常感谢你,雷谢托夫还告诉我错误在哪里。

下面是这个函数本身。

//+------------------------------------------------------------------+
//| Modify position.                                                 |
//+------------------------------------------------------------------+
bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit){
//---- обявяване на структурата и резултата на търговското искане
   MqlTradeRequest request={0};
   MqlTradeResult result={0};
//---- структурна инициализация на  търговското искане MqlTradeRequest за модифициране на  позиция
   request.action       = TRADE_ACTION_SLTP;
   request.symbol       = symbol;
   request.sl           = StopLoss;
   request.tp           = Takeprofit;
   string word          = "";
   StringConcatenate(word,
                     "<<< ============ Modifyposition():   Модифицираме позицията  ",
                     symbol," ============ >>>");
   Print(word);
//---- модифицираме позицията и  проверяваме резултата от търговското искане
   if(!OrderSend(request,result))
     {
      Print("Modify error =", GetLastError());
      return(false);
     }
   return(true);
  }

下面是我应该如何完成函数本身。

  double buy_trail = 0;
  double sel_trail = 0;
  double SL,TP,Open;
  if(PositionSelect(Symbol())){
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
      {
      Open = PositionGetDouble(POSITION_PRICE_OPEN);
      SL   = PositionGetDouble(POSITION_SL);
      TP   = PositionGetDouble(POSITION_TP);
      Bid  = SymbolInfoDouble(Symbol(),SYMBOL_BID);
      buy_trail = NormalizeDouble(Bid - Open,Digits());
      if(buy_trail > MStop)
       {
        if(NormalizeDouble((Bid - MStop),Digits()) >= Open && Open > SL)
          {
           ModifyPosition(Symbol(),Open,TP);
          }
          if(NormalizeDouble((Bid - MStop),Digits()) > SL && Open <= SL)
           {
            ModifyPosition(Symbol(),NormalizeDouble((SL + 0.001),Digits()),TP);
           }
        }
      }
    if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
      {
      Open = PositionGetDouble(POSITION_PRICE_OPEN);
      SL   = PositionGetDouble(POSITION_SL);
      TP   = PositionGetDouble(POSITION_TP);
      Ask  = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
      sel_trail = NormalizeDouble(Open - Ask,Digits());
      if(sel_trail > MStop)
       { 
        if(NormalizeDouble((Ask + MStop),Digits()) <= Open && Open < SL)
          {
           ModifyPosition(Symbol(),Open,TP);
          }
          if(NormalizeDouble((Ask + MStop),Digits()) < SL && Open >= SL)
           {
            ModifyPosition(Symbol(),NormalizeDouble((SL - 0.001),Digits()),TP);
           }
        }
      }
     }

现在一切都在正常工作。

谢谢你。

原因: