Вопросы от начинающих 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 и открывает бесконечное кол-во ордеров, подскажите, где я косякнул? На торгую идею прошу не обращать внимание, это я просто для общего освоения. 


Ключевое слово Вашей ошибки - я ведь не зря столько кода проверочного пишу в своих советниках. Вы выкинули почти все внутренности и в частности OnTradeTransaction.

 

Столкнулся с проблемой, советник на базе индикатора работает на реальном счете корректно, а в тестере врет, во режимах генерации тиков как по OHLC так и по всем тикам - результат одинаковый. Результатом ошибки является незаполненный буфер индикатора на нулевом баре (только когда появляется новый бар на верхнем TF, по которому идет расчет индикатора). Однако, мне удалось заставить считать индикатор, добавив Sleep в советник, и тут было выявлено, что в зависимости от режима генерации тиков этот Sleep должен быть разным - для генерации по всем тикам достаточно Sleep(15000), а для OHLC нужно уже Sleep(30000).

Поэтому возникает вопрос, нормальна ли ситуация со Sleep, ведь получается логически, что там разное время задержки моделируется в зависимости от режима генерации тиков!?

Уважаемые разработчики, прошу Вас пояснить по поводу описанной ситуации с индикатором, так-как сам я не могу понять в чем причина - ошибка в коде или в тестере!

Индикатор и советник готов предоставить в личку, только скажите кому.

 
Aleksey Vyazmikin:

Столкнулся с проблемой, советник на базе индикатора работает на реальном счете корректно, а в тестере врет, во режимах генерации тиков как по OHLC так и по всем тикам - результат одинаковый. Результатом ошибки является незаполненный буфер индикатора на нулевом баре (только когда появляется новый бар на верхнем TF, по которому идет расчет индикатора). Однако, мне удалось заставить считать индикатор, добавив Sleep, и тут было выявлено, что в зависимости от режима генерации тиков этот Sleep должен быть разным - для генерации по всем тикам достаточно Sleep(15000), а для OHLC нужно уже Sleep(30000).

Поэтому возникает вопрос, нормальна ли ситуация со Sleep, ведь получается логически, что там разное время задержки моделируется в зависимости от режима генерации тиков!?

Уважаемые разработчики, прошу Вас пояснить по поводу описанной ситуации с индикатором, так-как сам я не могу понять в чем причина - ошибка в коде или в тестере!

Индикатор и советник готов предоставить в личку, только скажите кому.

Sleep в индикаторе не работает. Более того, он игнорируется даже в советнике, если речь идет о тестере.

 
Ihor Herasko:

Sleep в индикаторе не работает. Более того, он игнорируется даже в советнике, если речь идет о тестере.

Я написал же уже, что в советнике Sleep, а если игнорируется, и Вы в этом 100% уверены, то это лишнее подтверждение, что ошибка в тестере.

Задержка может не происходить во времени, но может эмулироватся для программы.

Добавлено: Sleep работает в тестере, вот код простой это подтверждает

   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:

Sleep в индикаторе не работает. Более того, он игнорируется даже в советнике, если речь идет о тестере.

Это не так.

 
Aleksey Vyazmikin:

Я написал же уже, что в советнике Sleep, а если игнорируется, и Вы в этом 100% уверены, то это лишнее подтверждение, что ошибка в тестере.

Задержка может не происходить во времени, но может эмулироватся для программы.

Добавлено: Sleep работает в тестере, вот код простой это подтверждает

Результат

Изначально в Вашем сообщении было так:

Однако, мне удалось заставить считать индикатор, добавив Sleep, и тут было выявлено..

Поэтому я и отреагировал на Sleep в индикаторе.

А насчет Sleep в советнике, непонятно, зачем было делать разное поведение в 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
По факту же вопроса. Sleep не должен никак влиять на пересчет данных в индикаторе. Что-то не так с заполнением буферов. Может есть воспроизводимый кусок кода?
Причина обращения: