Questions des débutants MQL5 MT5 MetaTrader 5 - page 983

 

Bonjour chers collègues.

Question : Dans mql4, afin de calculer le nombre de positions, vous pouvez écrire la fonction comme ceci

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

Comment est-elle mise en œuvre dans mql5 ? Comment puis-je calculer le nombre de positions par magik ou par type ?

 
Les commentaires non liés à ce sujet ont été déplacés vers "Questions des débutants de MQL4 MT4 MetaTrader 4".
 
Nikita Chernyshov:

Bonjour chers collègues.

Question : Dans mql4, afin de calculer le nombre de positions, vous pouvez écrire la fonction comme ceci

Comment est-elle mise en œuvre dans mql5 ? Comment calculer le nombre de positions par un nombre magique ou par un type ?

Exemple dans le codeEA Ehlers_CG, fonction CalculateAllPositions.

 
Vladimir Karputov:

Exemple dans le codeEA Ehlers_CG, fonction CalculateAllPositions.

Merci beaucoup. J'ai essayé de le changer en une forme plus compréhensible. Mais il renvoie 0 et ouvre des commandes sans fin, s'il vous plaît conseillez, où ai-je foiré ? Je ne veux pas faire attention à mon idée de trading, je veux juste l'apprendre en général.


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

Merci beaucoup. J'ai essayé de le changer en un formulaire qui a plus de sens pour moi. Mais il renvoie 0 et ouvre des commandes sans fin, s'il vous plaît conseillez, où est-ce que je me suis trompé ? Ne prêtez pas attention à mon idée de trading, j'essaie juste de m'y familiariser.


Le mot clé de votre erreur est que je n'ai pas écrit autant de code de vérification dans mes EAs pour rien. Vous avez laissé de côté presque tous les rouages, et en particulier OnTradeTransaction.

 

J'ai fait face à un problème, l'EA basé sur l'indicateur fonctionne correctement sur le compte réel, mais il est couché dans le testeur, dans les modes de génération de tick à la fois par OHLC et par tous les ticks - le résultat est le même. Le résultat de cette erreur est le tampon vide de l'indicateur à la barre zéro (seulement quand il y a une nouvelle barre au TF supérieur, qui est utilisé pour le calcul de l'indicateur). Cependant, j'ai réussi à faire en sorte que l'indicateur soit calculé en ajoutant le Sleep à mon Expert Advisor. Mais j'ai découvert que selon le mode de génération des ticks, ce Sleep doit être différent - pour la génération à partir de tous les ticks, Sleep(15000) est suffisant, alors que pour OHLC Sleep(30000) est nécessaire.

La question se pose donc de savoir si la situation de Sleep est normale, car il apparaît logiquement que des délais différents y sont modélisés en fonction du mode de génération des tics !

Chers développeurs, veuillez expliquer la situation de l'indicateur, car je ne comprends pas moi-même quelle en est la raison - une erreur dans le code ou chez le testeur !

Je suis prêt à donner l'indicateur et le Conseiller Expert dans le PM, mais dites-moi à qui.

 
Aleksey Vyazmikin:

J'ai fait face à un problème, l'EA basé sur l'indicateur fonctionne correctement sur le compte réel, mais il est couché dans le testeur, dans les modes de génération de tick à la fois par OHLC et par tous les ticks - le résultat est le même. Le résultat de cette erreur est le tampon vide de l'indicateur à la barre zéro (seulement quand il y a une nouvelle barre au TF supérieur, qui est utilisé pour le calcul de l'indicateur). Mais j'ai réussi à faire en sorte que l'indicateur soit calculé en ajoutant le Sleep, et j'ai découvert que, selon le mode de génération des ticks, ce Sleep doit être différent - pour la génération à partir de tous les ticks, Sleep(15000) est suffisant, mais pour OHLC Sleep(30000) est nécessaire.

La question se pose donc : la situation avec Sleep est-elle normale, car il s'avère logiquement que différents temps de retard y sont modélisés en fonction du mode de génération des ticks !

Chers développeurs, je vous demande d'expliquer la situation de l'indicateur, car je n'arrive pas à comprendre quelle en est la raison - un bug dans le code ou chez le testeur !

Je suis prêt à vous donner l'indicateur et l'EA dans le PM, mais dites-moi à qui.

Le sommeil ne fonctionne pas dans cet indicateur. De plus, il est ignoré même dans l'Expert Advisor, si l'on parle du testeur.

 
Ihor Herasko:

Le sommeil ne fonctionne pas dans l'indicateur. De plus, il est ignoré même dans l'Expert Advisor, si l'on parle du testeur.

J'ai déjà écrit que le sommeil se trouve dans le conseiller expert, et s'il est ignoré, et que vous en êtes sûr à 100%, alors c'est une confirmation supplémentaire que l'erreur se trouve dans le testeur.

Le retard peut ne pas se produire à temps, mais il peut être émulé pour le programme.

Ajouté : Sleep fonctionne dans le testeur, voici un code simple qui le confirme

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

Résultat

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:

Le sommeil ne fonctionne pas dans l'indicateur. De plus, il est ignoré même dans l'EA lorsqu'il s'agit du testeur.

Ce n'est pas le cas.

 
Aleksey Vyazmikin:

J'ai déjà écrit que Sleep est dans l'EA, et si elle est ignorée, et que vous en êtes sûr à 100%, alors c'est une confirmation supplémentaire que l'erreur est dans le testeur.

Le retard peut ne pas se produire à temps, mais il peut être émulé pour le programme.

Ajouté : Sleep fonctionne dans le testeur, voici un code simple qui le confirme

Résultat

C'était initialement le cas dans votre message :

Cependant, j'ai réussi à faire lire l'indicateur en ajoutant Sleep, et le voici révélé...

C'est pourquoi j'ai réagi à "Dormir dans l'indicateur ".

Et à propos de Sleep dans l'EA, je ne comprends pas pourquoi vous avez dû le faire se comporter différemment en 4 et en 5. En 4, c'est comme ça :

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
Quant au fait de la question. Le sommeil ne devrait pas avoir d'effet sur le recalcul des données dans l'indicateur. Il y a un problème avec le remplissage des tampons. Peut-être y a-t-il un morceau de code reproductible ?
Raison: