Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1421

 
viktor:
Dites-moi où vous pouvez télécharger MT4 1320.
Alpari
 

L'indicateur OBV dans mt5 n'a pas la possibilité de sélectionner le type de calcul du prix.

Dans mt4 cette option est disponible.

Pourquoi ?

En fait, l'OBV est calculé comme la somme de tous les volumes sur l'ensemble de l'historique, lorsque la bougie est en baisse le volume est "négatif"
Alors pourquoi est-il possible de sélectionner le type de prix pour le calcul de l'indicateur dans mt4 ? s'il n'est pas impliqué dans le calcul

 

Il y a une partie du code pour calculer le nombre séparé d'ordres d'achat et de vente. (b - ordres d'achat, s - ordres de vente)

Ensuite, je veux écrire une condition selon laquelle si un nouvel ordre est ouvert ou un ordre existant est fermé. C'est-à-dire que nous devons comparer le nombre d'ordres ouverts précédemment et le nombre de changements ultérieurs, mais je ne sais pas comment écrire cela dans le code. Comment enregistrer les modifications du nombre de commandes ? Aidez-moi, s'il vous plaît.

double LB=0, LS=0 ;
double RaznSB=0, RaznBS=0 ;
int b=0,s=0 ;
int izmb=0, izms=0 ;
for (int i=0 ; i<OrdersTotal() ; i++)
{
si(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
si (OrderSymbol()==Symbol())
{
int tip = OrderType() ;
si (tip==OP_BUY)
{
LB += OrderLots() ;
b++ ;
}
si (tip==OP_SELL)
{
LS += OrderLots() ;
s++ ;
}
}
}
}
if (izmb>b ||izmb<b || izms>s || izms<s) {
izmb=b ;
izms=s
}
 
Roman Sharanov:

L'indicateur OBV dans mt5 n'a pas la possibilité de sélectionner le type de calcul du prix.

Dans mt4 cette option est disponible.

Pourquoi ?

En fait, l'OBV est calculé comme la somme de tous les volumes sur l'ensemble de l'historique, lorsque la bougie est à la baisse le volume est "négatif"
. Alors comment se fait-il que dans mt4 il soit possible de sélectionner le type de prix pour le calcul de l'indicateur? s'il n'est pas impliqué dans le calcul

Une bonne question est la moitié de la réponse.

 
scomoroh:

Une partie du code permet de calculer un nombre distinct d'ordres d'achat et de vente.

Et il y a un endroit pour l'insérer)

 
Artyom Trishkin:

Une question bien définie contient la moitié de la réponse.

Donc le choix du type de prix dans mt4 ts OBV ne signifie rien et n'affecte rien ?
 
MakarFX:

Et il y a un endroit pour le mettre).

Alors je vais répéter la question.

Il y a une partie du code pour calculer le nombre séparé d'ordres d'achat et de vente. (b - ordres d'achat, s - ordres de vente)

Ensuite, j'ai écrit une condition selon laquelle, si un nouvel ordre est ouvert ou un ordre existant est fermé, l'action suivante est déclenchée. C'est-à-dire que nous devons comparer le nombre d'ordres ouverts précédemment et le nombre de changements ultérieurs, mais je ne sais pas comment écrire cela dans le code. Comment enregistrer les modifications du nombre de commandes ? Aidez-moi, s'il vous plaît.


   double LB=0,LS=0;
   int b=0,s=0;
   int izmb=0, izms=0;
   
   for (int i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      { 
         if (OrderSymbol()==Symbol())
         { 
            int tip = OrderType(); 
            if (tip==OP_BUY)             
             {  
               LB  += OrderLots();
               b++; 
             }                                         
            if (tip==OP_SELL)        
             {
               LS  += OrderLots();
               s++;
            } 
         }
     }     
   }
   if (izmb>b ||izmb<b || izms>s || izms<s){ //условие сравнения количества ордеров, изменилось или нет,
    izmb=b;                                   //если изменилось то присваиваем новое значение, как его сохранить? Ведь с новым тиком
    izms=s                                    // оно опять будет равно "0"???
     }
 
Vitaly Muzichenko:

Le cas échéant, vous devez le faire de manière statique, sinon il se réinitialise.

J'ai l'habitude de rendre les drapeaux globaux. Bien sûr, dans le corps de la fonction sera redéclarer et Static est nécessaire. Mais pourquoi personne n'a remarqué que les crochets sont absents)))) print & assignment should be in brackets)

Et sans statique, bien sûr, il s'imprimera à chaque appel de fonction puisqueprintsimbol="" deviendra ZERO et le symbole se verra attribuer la valeur courante)

static string symbol, printsimbol="";
      long currChart=ChartFirst(); int i=0;
      while(currChart>=0)
        {
         if(ChartGetInteger(currChart,CHART_BRING_TO_TOP,0)==true) 
           { 
            if(ChartSymbol(currChart)!=symbol)
                {
                 symbol=ChartSymbol(currChart);
                 if(printsimbol!=symbol)
                   { Print(symbol);printsimbol=symbol;}
                }
           } 
         currChart=ChartNext(currChart);  i++;
        }
 
scomoroh:

Alors je vais répéter la question.

Il y a une partie du code pour calculer le nombre séparé d'ordres d'achat et de vente. (b - ordres d'achat, s - ordres de vente)

J'ai ensuite écrit une condition selon laquelle, si un nouvel ordre est ouvert ou un ordre existant est fermé, l'action est transmise. C'est-à-dire que nous devons comparer le nombre d'ordres ouverts précédemment et le nombre de changements ultérieurs, mais je ne sais pas comment écrire cela dans le code. Comment enregistrer les modifications du nombre de commandes ? Aidez-moi, s'il vous plaît.


J'essaierais de faire ça

//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
int izmb,izms;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(200);

   izmb=0; izms=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(CountOrders(0,0)!=izmb){izmb=CountOrders(0,0);}
   if(CountOrders(0,1)!=izms){izms=CountOrders(0,1);}
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
//|  0 - ордера типа BUY          1 - ордера типа SELL               |
//|  2 - ордера типа BUYLIMIT     3 - ордера типа SELLLIMIT          |
//|  4 - ордера типа BUYSTOP      5 - ордера типа SELLSTOP           |
//|  6 - ордера типа Balance     -1 - Все типы ордеров               |
//+------------------------------------------------------------------+
int CountOrders(string symb="", int or_ty=-1) 
  {
   int cnt=0;
   if(symb=="0") symb=_Symbol;
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()==symb || symb=="")
           {
            if(or_ty<0 || or_ty==OrderType()) cnt++;
           }
        }
     }
   return(cnt);
  }
//+------------------------------------------------------------------+
 
Qui sait pourquoi le conseiller dans le testeur fonctionne bien, fait des demandes, etc., mais dans le compte réel, les demandes ne sont pas exposées bien que le robot soit actif.