Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 983

 

Hola colegas.

Pregunta: En mql4, para calcular el número de posiciones, se puede escribir la función así

//+------------------------------------------------------------------+
// Счетчик ордеров
//+------------------------------------------------------------------+
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);
}

¿Cómo se implementa en mql5? ¿Cómo puedo calcular el número de posiciones por magik o por tipo?

 
Los comentarios no relacionados con este tema han sido trasladados a "Preguntas de los principiantes de MQL4 MT4 MetaTrader 4".
 
Nikita Chernyshov:

Hola colegas.

Pregunta: En mql4, para calcular el número de posiciones, se puede escribir la función así

¿Cómo se implementa en mql5? ¿Cómo podemos calcular el número de posiciones por un número mágico o por un tipo?

Ejemplo en el códigoEhlers_CG EA, función CalculateAllPositions.

 
Vladimir Karputov:

Ejemplo en el códigoEhlers_CG EA, función CalculateAllPositions.

Muchas gracias. Traté de cambiarlo a una forma más comprensible. Pero devuelve 0 y abre un sinfín de pedidos, por favor, aconséjame, ¿dónde he metido la pata? No quiero prestar atención a mi idea de comercio, sólo quiero aprenderla en general.


#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:

Muchas gracias. Traté de cambiarlo a una forma que tiene más sentido para mí. Pero devuelve 0 y abre un sinfín de pedidos, por favor, aconséjame, ¿dónde he metido la pata? Por favor, no preste atención a mi idea de comercio, sólo estoy tratando de familiarizarse con ella.


La palabra clave de tu error es que no he escrito tanto código de verificación en mis EAs para nada. Has omitido casi todas las entrañas, y en particular OnTradeTransaction.

 

Me enfrenté a un problema, el EA basado en el indicador funciona correctamente en una cuenta real, pero está mintiendo en el probador, en los modos de generación de ticks tanto por OHLC como por todos los ticks - el resultado es el mismo. El resultado del error es el búfer vacío del indicador en la barra cero (sólo cuando hay una nueva barra en la TF superior, que se utiliza para el cálculo del indicador). Sin embargo, he logrado hacer que el indicador se calcule añadiendo Sleep a mi Expert Advisor. Pero he descubierto que dependiendo del modo de generación de ticks este Sleep debe ser diferente - para la generación a partir de todos los ticks Sleep(15000) es suficiente, mientras que para OHLC Sleep(30000) es necesario.

¡Entonces surge la pregunta - ¿es normal la situación con Sleep, porque lógicamente resulta que allí se modelan diferentes tiempos de retardo dependiendo del modo de generación de ticks!

Estimados desarrolladores, les pido que me expliquen la situación con el indicador, porque yo mismo no puedo entender cuál es la razón: ¡un error en el código o en el probador!

Estoy dispuesto a dar el indicador y el Asesor Experto en el PM, pero dime a quién.

 
Aleksey Vyazmikin:

Me enfrenté a un problema, el EA basado en el indicador funciona correctamente en la cuenta real, pero está mintiendo en el probador, en los modos de generación de ticks tanto por OHLC como por todos los ticks - el resultado es el mismo. El resultado del error es el búfer vacío del indicador en la barra cero (sólo cuando hay una nueva barra en la TF superior, que se utiliza para el cálculo del indicador). Pero he logrado hacer que el indicador se calcule añadiendo Sleep, y se descubrió, que dependiendo del modo de generación de ticks este Sleep debe ser diferente - para la generación de todos los ticks Sleep(15000) es suficiente, pero para OHLC Sleep(30000) es necesario.

Entonces surge la pregunta: ¿es normal la situación con Sleep, porque lógicamente parece que allí se modelan diferentes tiempos de retardo dependiendo del modo de generación de ticks?

Estimados desarrolladores, por favor expliquen la situación con el indicador, porque yo mismo no entiendo cuál es la razón - ¡un error en el código o en el probador!

Estoy dispuesto a darte el indicador y el EA en el MP, pero dime a quién.

El sueño no funciona en este indicador. Además, se ignora incluso en el Asesor Experto, si hablamos del probador.

 
Ihor Herasko:

El sueño no funciona en el indicador. Además, se ignora incluso en el Asesor Experto, si hablamos del probador.

Ya he escrito que Sleep está en el Expert Advisor, y si se ignora, y estás 100% seguro de ello, entonces esto es una confirmación extra de que el error está en el probador.

El retraso puede no producirse en el tiempo, pero puede emularse para el programa.

Añadido: El sueño funciona en el probador, aquí hay un código simple que lo confirma

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

Resultado

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:

El sueño no funciona en el indicador. Además, se ignora incluso en el EA cuando se trata del probador.

No lo es.

 
Aleksey Vyazmikin:

Ya he escrito que Sleep está en el EA, y si se ignora, y estás 100% seguro de ello, entonces es una confirmación extra de que el error está en el probador.

El retraso puede no producirse en el tiempo, pero puede emularse para el programa.

Añadido: El sueño funciona en el probador, aquí hay un código simple que lo confirma

Resultado

Este era el caso original de su puesto:

Sin embargo, conseguí que el indicador se leyera añadiendo Sleep, y aquí se reveló...

Por eso reaccioné a Dormir en el indicador.

Y sobre el Sueño en el EA, no entiendo por qué has tenido que hacer que se comporte de forma diferente en el 4 y en el 5. En el 4 es así:

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
En cuanto al hecho de la pregunta. El sueño no debería tener ningún efecto en el recálculo de los datos del indicador. Algo falla en el llenado del buffer. ¿Tal vez haya un trozo de código reproducible?