Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 983

 

Olá colegas.

Pergunta: Em mql4, a fim de calcular o número de posições, pode escrever a função assim

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

Como é implementado em mql5? Como posso calcular o número de posições por magik ou por tipo?

 
Comentários não relacionados com este tópico foram transferidos para "Perguntas dos principiantes do MQL4 MT4 MetaTrader 4".
 
Nikita Chernyshov:

Olá colegas.

Pergunta: Em mql4, a fim de calcular o número de posições, pode escrever a função assim

Como é implementado em mql5? Como podemos calcular o número de posições por um número mágico ou por um tipo?

Exemplo emEhlers_CG códigoEA, função CalculateAllPositions.

 
Vladimir Karputov:

Exemplo emEhlers_CG códigoEA, função CalculateAllPositions.

Muito obrigado. Tentou mudá-lo para uma forma mais compreensível. Mas devolve 0 e abre ordens intermináveis, por favor informe, onde é que eu fiz asneira? Não quero prestar atenção à minha ideia comercial, só a quero aprender em geral.


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

Muito obrigado. Tentei mudá-lo para uma forma que faz mais sentido para mim. Mas devolve 0 e abre ordens infinitas, por favor informe, onde é que eu fiz asneira? Por favor, não preste atenção à minha ideia comercial, estou apenas a tentar familiarizar-me com ela.


A palavra-chave do vosso erro é que não escrevi tanto código de verificação nos meus EAs para nada. Deixou de fora quase todas as vísceras, e em particular a OnTradeTransaction.

 

Enfrentei um problema, o indicador baseado EA funciona correctamente numa conta real, mas está deitado no testador, em modos de geração de carrapatos tanto pela OHLC como por todos os carrapatos - o resultado é o mesmo. O resultado do erro é o buffer vazio do indicador na barra zero (apenas quando há uma nova barra na TF superior, que é utilizada para o cálculo do indicador). No entanto, consegui fazer um indicador a ser calculado adicionando Sleep ao meu Expert Advisor. Mas descobri que dependendo do modo de geração de carraças este Sleep deve ser diferente - para geração de todas as carraças o Sleep(15000) é suficiente, enquanto para OHLC o Sleep(30000) é necessário.

Assim, a questão que se coloca - é a situação com o Sono normal, porque se verifica logicamente que os diferentes tempos de atraso são modelados lá dependendo do modo de geração de carraças!

Caros programadores, peço-vos que expliquem a situação com o indicador, porque eu próprio não consigo compreender qual é a razão - um erro no código ou no testador!

Estou pronto a dar o indicador e o Conselheiro Especialista no PM, mas digam-me a quem.

 
Aleksey Vyazmikin:

Enfrentei um problema, o indicador baseado EA funciona correctamente na conta real, mas está deitado no testador, nos modos de geração de carraças tanto pela OHLC como por todas as carraças - o resultado é o mesmo. O resultado do erro é o buffer vazio do indicador na barra zero (apenas quando há uma nova barra na TF superior, que é utilizada para o cálculo do indicador). Mas consegui fazer um indicador a ser calculado adicionando Sono, e descobri que, dependendo do modo de geração de carraças, este Sono deveria ser diferente - para geração de todas as carraças o Sono(15000) é suficiente, mas para OHLC o Sono(30000) é necessário.

Assim, a questão que se coloca - é a situação com o sono normal, porque parece logicamente que os diferentes tempos de atraso são modelados ali, dependendo do modo de geração de carraças!

Caros programadores, por favor expliquem a situação com o indicador, porque eu próprio não compreendo qual é a razão - um erro no código ou no testador!

Estou pronto a dar-vos o indicador e a EA na PM, mas digam-me a quem.

Dormir não funciona neste indicador. Além disso, é ignorado mesmo no Expert Advisor, se estivermos a falar do testador.

 
Ihor Herasko:

Dormir não funciona no indicador. Além disso, é ignorado mesmo no Expert Advisor, se estivermos a falar do testador.

Já escrevi que Sleep está no Expert Advisor, e se for ignorado, e estiver 100% certo disso, então é uma confirmação extra de que o erro está no testador.

O atraso pode não ocorrer a tempo, mas pode ser emulado para o programa.

Acrescentado: O sono funciona no testador, aqui está um código simples que o 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:

Dormir não funciona no indicador. Além disso, é ignorado mesmo no EA quando se trata do testador.

Não é.

 
Aleksey Vyazmikin:

Já escrevi que Sleep está no EA, e se for ignorado, e se estiver 100% seguro disso, então é uma confirmação extra de que o erro está no testador.

O atraso pode não ocorrer a tempo, mas pode ser emulado para o programa.

Acrescentado: O sono funciona no testador, aqui está um código simples que o confirma

Resultado

Este era originalmente o caso no seu posto:

No entanto, consegui que o indicador fosse lido acrescentando Sleep, e aqui foi revelado...

Foi por isso que reagi a Dormir no indicador.

E quanto a Dormir no EA, não compreendo porque teve de o fazer comportar-se de forma diferente em 4 e em 5. Em 4, é assim:

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
Quanto ao facto da pergunta. O sono não deve ter qualquer efeito no recálculo dos dados no indicador. Algo está errado com o enchimento de tampão. Talvez haja um pedaço de código reprodutível?