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

 

同事们好。

问: 在mql4中,为了计算位置的数量,你可以这样写函数

//+------------------------------------------------------------------+
// Счетчик ордеров
//+------------------------------------------------------------------+
int OrderCount(int type)
{
  int count = 0;
  for (int trade = OrdersTotal() -1; trade >=0; trade--)
  {
    if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
    {
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == type)
      count++;
    }
  }
  return(count);
}

它在mql5中是如何实现的?如何按魔力或类型来计算职位的数量?

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

同事们好。

问: 在mql4中,为了计算位置的数量,你可以这样写函数

它在mql5中是如何实现的?我们如何通过一个神奇的数字或一个类型来计算位置的数量?

Ehlers_CG EA 代码中的例子,函数CalculateAllPositions。

 
Vladimir Karputov:

Ehlers_CG EA 代码中的例子,函数CalculateAllPositions。

非常感谢你。试图把它改成一个更容易理解的形式。但它返回的是0,并打开了无尽的订单,请告知,我在哪里搞砸了?我不想关注我的交易理念,我只想大致了解它。


#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
#include <Trade\AccountInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Expert\Money\MoneyFixedMargin.mqh>

CPositionInfo  m_position;                   // trade position object
CTrade         trade;                      // trading object
CSymbolInfo    symbol_info;                     // symbol info object
CAccountInfo   m_account;                    // account info wrapper
CDealInfo      m_deal;                       // deals object
COrderInfo     m_order;                      // pending orders object
CMoneyFixedMargin *m_money;


input double lot = 0.01;
input int    TakeP = 300;
input int    StopL = 300;
input int    Magic = 123;
input int    Slip  = 50;

input int    MA    = 50;

double ma[];
int    handle;
int    digits;
double point;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   handle = iMA(NULL,0,MA,0,MODE_SMA,PRICE_CLOSE);
   
   trade.SetExpertMagicNumber(Magic);
   trade.SetDeviationInPoints(Slip);
   trade.SetTypeFilling(ORDER_FILLING_FOK);
   trade.SetAsyncMode(false);
   
   digits=(int)SymbolInfoInteger(NULL,SYMBOL_DIGITS);
   point=SymbolInfoDouble(NULL,SYMBOL_POINT);
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   CopyBuffer(handle,0,0,50,ma);
   ArraySetAsSeries(ma,true); 
   
   double Ask=SymbolInfoDouble(NULL,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(NULL,SYMBOL_BID);
   
   if(Ask > ma[1] && CalculateAllPositions(POSITION_TYPE_BUY) == 0)
     {
       double tp = NormalizeDouble(Ask+TakeP*point,digits);
       double sl = NormalizeDouble(Ask-StopL*point,digits);
       
       if(!trade.Buy(lot,NULL,Ask,sl,tp))
          {
      //--- сообщим о неудаче
      Print("Метод Buy() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
          } else
               {
                 Print("Метод Buy() выполнен успешно. Код возврата=",trade.ResultRetcode(),
                 " (",trade.ResultRetcodeDescription(),")");
               }
     }
     
   if(Bid < ma[1] && CalculateAllPositions(POSITION_TYPE_SELL) == 0)
     {
       double tp = NormalizeDouble(Bid-TakeP*point,digits);
       double sl = NormalizeDouble(Bid+StopL*point,digits);
       
       if(!trade.Sell(lot,NULL,Bid,sl,tp))
          {
      //--- сообщим о неудаче
      Print("Метод Sell() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
            ". Описание кода: ",trade.ResultRetcodeDescription());
          } else
               {
                 Print("Метод Sell() выполнен успешно. Код возврата=",trade.ResultRetcode(),
                 " (",trade.ResultRetcodeDescription(),")");
               }
     }     
   Comment(CalculateAllPositions(POSITION_TYPE_BUY));
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Счетчик ордеров                                                  |
//+------------------------------------------------------------------+
int CalculateAllPositions(const ENUM_POSITION_TYPE type)
  {
   int count=0;   
  
   for(int i=PositionsTotal()-1;i>=0;i--)
      {
      if(m_position.SelectByIndex(i)) 
        {
         if(m_position.Symbol()==NULL && m_position.Magic()==Magic && m_position.PositionType()==type)
         count++;
       }
         
     }
    return(count);
  }
 
Nikita Chernyshov:

非常感谢你。试图把它改成 一个对我来说更有意义的形式。但它返回的是0,并打开了无尽的订单,请告知,我在哪里搞砸了?请不要关注我的交易理念,我只是想熟悉它。


你的错误的关键词是,我在我的EA中没有白写这么多验证代码。你几乎遗漏了所有的内部结构,特别是OnTradeTransaction

 

我面临一个问题,基于指标的EA在真实账户上工作正常,但它在测试器中是躺着的,在按OHLC和按所有ticks的tick生成模式 下,结果是一样的。错误的结果是指标在零点的缓冲区是空的(只有当上层TF有一个新的柱子,用于计算指标的时候)。但是,我已经设法通过在我的专家顾问中添加睡眠来使指标得到计算。 但是我发现,根据生成ticks的模式,这个睡眠应该是不同的--对于从所有ticks产生的睡眠(15000)就足够了,而对于OHLC需要睡眠(30000)。

因此,问题出现了--睡眠的情况是否正常,因为从逻辑上讲,不同的延迟时间是根据嘀嗒声产生的模式在那里建模的!"。

亲爱的开发者,我请你解释一下指标的情况,因为我自己也不明白是什么原因--是代码中的错误还是测试人员的问题!?

我准备在PM中提供指标和专家顾问,但请告诉我给谁。

 
Aleksey Vyazmikin:

我面临一个问题,基于指标的EA在真实账户上工作正常,但它在测试器中是躺着的,在按OHLC和按所有ticks的tick生成模式 下,结果是一样的。错误的结果是指标在零点的缓冲区是空的(只有当上层TF有一个新的柱子,用于计算指标的时候)。但是,我已经设法使指标通过添加睡眠来计算,并且发现,根据刻度生成的模式,这个睡眠应该是不同的 - 对于从所有刻度生成的睡眠(15000)是足够的,但对于OHLC睡眠(30000)是需要的。

因此,问题出现了--睡眠的情况是否正常,因为从逻辑上讲,不同的延迟时间是根据嘀嗒声产生的模式在那里建模的!"。

亲爱的开发者,我请你解释一下指标的情况,因为我自己也不明白是什么原因--是代码中的错误还是测试人员的问题!?

我准备在PM中给你指标和EA,但告诉我给谁。

睡眠在这个指标中不起作用。此外,如果我们谈论的是测试器,甚至在专家顾问中也被忽略。

 
Ihor Herasko:

睡眠在指标中不起作用。此外,如果我们谈论的是测试器,甚至在专家顾问中也被忽略。

我已经写过,"睡眠 "在专家顾问中,如果它被忽略了,而且你对它有100%的把握,那么这就额外确认了错误在测试器中。

延迟可能不会及时发生,但它可以为程序所模拟。

新增: 睡眠 在测试器中是有效的,这里有一个简单的代码来证实它。

   Print(iClose(Symbol(),PERIOD_CURRENT,0));
   Sleep(15000);
   Print(iClose(Symbol(),PERIOD_CURRENT,0));

结果

2019.01.22 08:28:24.661 2019.01.21 23:49:00   66920.0
2019.01.22 08:28:24.661 2019.01.21 23:49:15   66928.0
 
Ihor Herasko:

睡眠在指标中不起作用。此外,即使在EA中,当涉及到测试者时,它也被忽略了

并非如此。

 
Aleksey Vyazmikin:

我已经写了 "睡眠 "是在EA中,如果它被忽略了,而且你100%确定这一点,那么这就额外证实了错误是在测试器中。

延迟可能不会及时发生,但它可以为程序所模拟。

新增: 睡眠在测试器中是有效的,这里有一个简单的代码来证实它。

结果

你的帖子中原本就是这种情况。

然而,我设法通过添加 "睡眠 "来使指标读数,在这里,它被揭示了......

这就是为什么我对 "睡眠"这个指标有反应。

关于EA中的睡眠,我不明白你为什么要让它在4和5中表现不同。 在4中,它是这样的。

void OnTick()
{
   Print("Before: ", TimeCurrent());
   Sleep(100000);
   Print("After: ", TimeCurrent());
}
2019.01.22 07:38:19.432 2018.11.08 00:02:05  Test AUDUSD,M5: After: 2018.11.08 00:02:05
2019.01.22 07:38:19.432 2018.11.08 00:02:05  Test AUDUSD,M5: Before: 2018.11.08 00:02:05
至于问题的事实。睡眠不应该对指标中的数据重新计算有任何影响。缓冲区的填充有问题。也许有一段可重复的代码?