Questions des débutants MQL4 MT4 MetaTrader 4 - page 219

 
Vitaly Muzichenko:
Vitaly Muzichenko:
void OnTick()
  {
     ......здесь работаем с закрытием (тралом и прочим)....
if (Hour()>=10 && Hour()<11) return (0);
     ......остальной код, в частности для открытия....
  }


выдает ошибку: 'return' - 'void' function returns a value Vitaly Muzichenko:
 
Oventu:
void OnTick()
  {
     ......здесь работаем с закрытием (тралом и прочим)....
if (Hour()>=10 && Hour()<11) return;
     ......остальной код, в частности для открытия....
  }
 
Vitaly Muzichenko:
Vitaly Muzichenko:
Merci !
 
Bonjour, qu'en est-il de OrdersTotal() ?
J'ai toujours su qu'il contient le nombre d'ordres -1, c'est-à-dire OrdersTotal()-1 et tout fonctionnait, mais j'ai commencé à écrire un programme et soudain, un ordre n'est plus compté, j'ai demandé OrdersTotal() et il m'a donné le nombre total d'ordres = 3, au lieu de 3-1.
Que se passe-t-il ?

La forme habituelle de la boucle dans l'aide :

int total=OrdersTotal();
for(int pos=0;pos<total;pos++)
{
}

C'est-à-dire que le premier ordre est égal à zéro.

Mais non, en fait, le premier ordre est 1, ce qui signifie que nous devons commencer la recherche à partir de 1 et non de zéro ?
Les métacitations ont-elles fait quelque chose de mal ou suis-je stupide ?

Документация по MQL5: Торговые функции / OrdersTotal
Документация по MQL5: Торговые функции / OrdersTotal
  • www.mql5.com
Не следует путать между собой действующие отложенные ордера и позиции, которые также отображаются на вкладке "Торговля" в панели "Инструменты". Ордер – это распоряжение на проведение торговой операции, а позиция является результатом одной или нескольких сделок.
 
Maksim Mihajlov:
Bonjour, que se passe-t-il avec OrdersTotal() ?
J'ai toujours su qu'il contient le nombre de commandes -1, c'est-à-dire OrdersTotal()-1, et tout fonctionnait, mais j'ai commencé à écrire un programme et soudain une commande n'est pas comptée. J'ai demandé OrdersTotal() et il dit total des commandes = 3, au lieu de 3-1.
Que se passe-t-il ?

La forme habituelle de la boucle dans l'aide :

int total=OrdersTotal();
for(int pos=0;pos<total;pos++)
{
}

C'est-à-dire que le premier ordre est égal à zéro.

Mais non, en fait, le premier ordre est 1, ce qui signifie que nous devons commencer la recherche à partir de 1 et non de zéro ?
Les métacitations ont-elles fait quelque chose de mal, ou suis-je stupide ?

Vous avez confondu les ORDRES RELATIFS et les POISONS. Lisez la référence. Soyez plus précis dans votre question : qu'essayez-vous de compter : les ORDRES SUPPRIMÉS ou les POSITIONS ? Et oui, rien n'a changé : l'indice du premier élément commence par "0".


Ajouté : exemple

Exemple : Calculer les positions et les ordres en suspens

How to start with MQL5
How to start with MQL5
  • 2020.03.12
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 
Vladimir Karputov:

Vous avez confondu les ORDRES RELATIFS et les POSITIONS. Lisez la référence. Formulez votre question de manière plus précise : qu'essayez-vous de compter : ORDRES RETRAITÉS ou POSTES ? Et oui, rien n'a changé : l'indice du premier élément commence par "0".


Ajouté : exemple

Exemple : Calculer les positions et les ordres en suspens

Je veux dire MQL4, pas MQL5, il n'y a pas de différence entre les ordres en attente et les ordres au marché !

 
Maksim Mihajlov:

Je veux dire le MQL4, pas le MQL5, il n'y a pas de division entre en attente et en attente de marché !

Vous êtes en train d'écrire dans le forum MQl5. Vous écrivez dans la section principale. Vous postez dans le forum MQL5 - et vous obtiendrez des réponses sur MQL5.

Les questions relatives à l'ancien terminal sont adressées à la section spéciale : MQL4 et MetaTrader 4. A partir de maintenant, écrivez là. Je lui transmettrai vos questions.

 

J'ai comparé deux variantes, dans la première, j'ai utilisé OrdersTotal()-1 et j'ai commencé la recherche à partir de zéro - j'ai obtenu l'erreur
. Dans la deuxième variante, j'ai commencé par un et j'ai pris la totalité de OrdersTotal() - pas d'erreur cette fois-ci

Dans les captures d'écran, vous pouvez voir que OrdersTotal() indique le nombre réel de commandes, et non OrdersTotal()-1 ...

La
question est de savoir pourquoi OrdersTotal() affiche le nombre réel de commandes, plutôt que -1, devrait-il en être ainsi ou s'agit-il d'une nouveauté ?
Car dans ce cas, nous devons commencer la recherche non pas à partir de zéro, mais à partir de un !

Dossiers :
4.png  181 kb
2.png  186 kb
 
Maksim Mihajlov:

J'ai comparé deux variantes, dans la première, j'ai utilisé OrdersTotal()-1 et j'ai commencé la recherche à partir de zéro - j'ai obtenu l'erreur
. Dans la deuxième variante, j'ai commencé par un et j'ai pris la totalité de OrdersTotal() - pas d'erreur cette fois-ci

Dans les captures d'écran, vous pouvez voir que OrdersTotal() indique le nombre réel de commandes, et non OrdersTotal()-1 ...

La
question est de savoir pourquoi OrdersTotal() affiche le nombre réel de commandes, plutôt que -1, devrait-il en être ainsi ou s'agit-il d'une nouveauté ?
Car dans ce cas, nous devons commencer la recherche non pas à partir de zéro, mais à partir de un !

Je pense avoir compris mon erreur, désolé...
Il y a un décalage de -1 dans cette condition :
if (OrderSelect(i-1,SELECT_BY_POS)==true){}
Désolé d'être brutal, j'ai pris la chaîne d'un autre programme et n'ai pas fait attention au décalage !

 
Bonjour. J'ai besoin de votre aide pour corriger l'indicateur. L'essence de l'indicateur est la suivante. Calculez l'ampleur de l'augmentation du prix par rapport à la barre précédente. Pour zéro, il faut une barre d'étoile. C'est-à-dire que le prix d'ouverture est égal au prix de clôture. Lors de la compilation aucune erreur, mais lors du test une erreur sur la ligne 80 20 caractères. Laligne de signal estégalement mal dessinée. Mais je pense que c'est la raison du calcul incorrect du tampon principal. Veuillez m'aider à le réparer.
//+------------------------------------------------------------------+
//|                                                         MSBB.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#include <MovingAverages.mqh>

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1  clrGreen
#property indicator_color2  clrRed
#property  indicator_width1  1
input int            InpMSBBPeriod=3;        // Period
input ENUM_MA_METHOD InpMSBBMethod=MODE_SMA;  // Method
//--- indicator buffers
double         ExtMSBBBuffer[];
double         ExtTempBuffer[];
double         ExtPriceBuffer[];
double         ExtSignalBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- indicator buffers mapping
   IndicatorDigits(Digits-2);
//--- drawing settings
   IndicatorBuffers(4);
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,ExtMSBBBuffer);
   SetIndexBuffer(1,ExtSignalBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(2,ExtTempBuffer);
   SetIndexBuffer(2,ExtPriceBuffer);
   SetIndexDrawBegin(1,InpMSBBPeriod);
//--- name for DataWindow and indicator subwindow label
   IndicatorShortName("MSBB("+IntegerToString(InpMSBBPeriod)+")");
   SetIndexLabel(0,"MSBB");
   SetIndexLabel(1,"Signal");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int    i;//limit;
//------
   if(rates_total<=InpMSBBPeriod || InpMSBBPeriod<=2)
      return(0);
   /*//--- counting from 0 to rates_total
      ArraySetAsSeries(ExtMSBBBuffer,false);
      ArraySetAsSeries(ExtSignalBuffer,false);
      ArraySetAsSeries(open,false);
      ArraySetAsSeries(high,false);
      ArraySetAsSeries(low,false);
      ArraySetAsSeries(close,false);*/
//---
  // limit=rates_total-prev_calculated;
   //if(prev_calculated>0)
     // limit++;
//--- typical price and its moving average
   for(i=0; i<rates_total; i++)
     {
      ExtTempBuffer[i] = NormalizeDouble((close[i]-open[i])/Point(),2);
      ExtPriceBuffer[i] = NormalizeDouble((close[i+1]-open[i+1])/Point(),2);
      //ExtMSBBBuffer[i]=price_open+ExtTempBuffer[i];
      //Print("ExtPriceBuffer[i] = ", ExtPriceBuffer[i]);
      if(ExtTempBuffer[i]==0)
         ExtMSBBBuffer[i]=0.0;
      if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]>0)
        {
         double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2);
         if((price_open<0 && price_close>0)||(price_open>0 && price_close<0))
            ExtMSBBBuffer[i] = 0.0;
         if((price_open<0 && price_close<0)||(price_open>0 && price_close>0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]<0)
        {
         double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2);
         if((price_open<0 && price_close>0)||(price_open>0 && price_close<0))
            ExtMSBBBuffer[i] = 0.0;
         if((price_open>0 && price_close>0)||(price_open<0 && price_close<0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]<0)
        {
         double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2);
         if((price_open<0 && price_close>0)||(price_open>0 && price_close<0))
            ExtMSBBBuffer[i]=0.0;
         if((price_open<0 && price_close<0)||(price_open>0 && price_close>0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]>0)
        {
         double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2);
         if((price_open>0 && price_close<0)||(price_open<0 && price_close>0))
            ExtMSBBBuffer[i]=0.0;
         if((price_open>0 && price_close>0)||(price_open<0 && price_close<0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      //--- signal line counted in the 2-nd buffer
      //ExtSignalBuffer[i]=iMAOnArray(ExtMSBBBuffer,0,InpMSBBPeriod,0,InpMSBBMethod,0);
      SimpleMAOnBuffer(rates_total,prev_calculated,1,InpMSBBPeriod+2,ExtMSBBBuffer,ExtSignalBuffer);
      Print ("ExtSignalBuffer = ", ExtSignalBuffer[i]);
      //--- done
     }
   /* if(ExtPriceBuffer[i]>0||ExtPriceBuffer[i]<0)
     {
      ExtMSBBBuffer[i] = ExtPriceBuffer[i]+ExtTempBuffer[i];
      Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]);
     }
   if(ExtPriceBuffer[i]==0)
     {
      ExtMSBBBuffer[i] = 0.0;
      Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]);
     }
   }*/
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
  • www.mql5.com
Некоторые технические индикаторы имеют несколько отрисовываемых на графике буферов. Нумерация индикаторных буферов начинается с 0. При копировании значений индикатора функцией CopyBuffer() в массив типа double для некоторых индикаторов можно указывать не номер копируемого буфера, а идентификатор этого буфера.