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

 
mwwm:

comment le faire correctement ?

Comment faites-vous ?
 
Artyom Trishkin:
Comment faites-vous ?
int OnCalculate(const int rates_total, 
                const int prev_calculated, 
                const datetime &time[], 
                const double &Op[], 
                const double &Hi[], 
                const double &Lo[], 
                const double &Cl[], 
                const long &tick_volume[], 
                const long &volume[], 
                const int &spread[]) 
  { 
   ArraySetAsSeries(time,true); 
   ArraySetAsSeries(Op,true); 
   ArraySetAsSeries(Hi,true); 
   ArraySetAsSeries(Lo,true); 
   ArraySetAsSeries(Cl,true); 
//--- 
double mas[];
   if(prev_calculated==0) 
     { 
      int prices1=CopyOpen(Symbol(),0,0,Bars(_Symbol,_Period),Op);
      int prices2=CopyHigh(Symbol(),0,0,Bars(_Symbol,_Period),Hi); 
      int prices3=CopyLow(Symbol(),0,0,Bars(_Symbol,_Period),Lo); 
      int prices4=CopyClose(Symbol(),0,0,Bars(_Symbol,_Period),Cl); 
      int prices5=CopyTime(Symbol(),0,0,Bars(_Symbol,_Period),time); 

     } 
   else 
     { 

      int prices1=CopyOpen(Symbol(),0,0,1,Op);
      int prices2=CopyHigh(Symbol(),0,0,1,Hi); 
      int prices3=CopyLow(Symbol(),0,0,1,Lo); 
      int prices4=CopyClose(Symbol(),0,0,1,Cl);     
      int prices5=CopyTime(Symbol(),0,0,1,time);     
       }   
      for(int i=rates_total-1;i>=0 && !IsStopped();) {
      mas[i]=Op[i]/Cl[i];
      i--;
      }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+-------------------------------

En simplifiant, je comprends que CopyOpen est superflu pour OnCalculate, mais qu'il ne voit que l'historique de la fenêtre du terminal ?

 
mwwm:

En simplifiant, CopyOpen est inutile pour OnCalculate, mais pour qu'il ne voie que l'historique de la fenêtre du terminal ?

Array mas est créé avec une taille nulle à chaque tic et ne change pas sa taille ailleurs. Ainsi, tout accès à ce dernier entraînera un dépassement du tableau.

Pour résoudre ce problème, nous devons soit le redimensionner à la taille qui contiendra les lectures de toutes les barres de l'historique, soit le lier au tampon de l'indicateur (déclaré comme variable globale du programme). Si je comprends bien, ces valeurs doivent être affichées à l'aide de l'indicateur.

 
mwwm:

Simplifié, CopyOpen je comprends que c'est superflu pour OnCalculate, mais pour qu'il ne voit que l'historique de la fenêtre du terminal ?

Exemple :

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot OC
#property indicator_label1  "Open/Close"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         BufferOC[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Задаём массив BufferOC как буфер индикатора
   SetIndexBuffer(0,BufferOC,INDICATOR_DATA);
//--- Устанавливаем ему направление индексации как у таймсерии
   ArraySetAsSeries(BufferOC,true);
//---
   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[])
  {
//--- Проверка на минимальное колиество баров для расчёта
   if(rates_total<1) return 0;
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(close,true);
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1) // если это первый запуск, или изменение истории, или открытие нового бара
     {
      limit=rates_total-1;                   // установим начало цикла на начало исторических данных
      ArrayInitialize(BufferOC,EMPTY_VALUE); // инициализируем массив
     }
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      if(close[i]==0) continue;
      BufferOC[i]=open[i]/close[i];
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Ihor Herasko:

Le tableau mas est créé avec une taille nulle à chaque tick et ne change pas sa taille ailleurs. Par conséquent, toute référence à celui-ci entraînera la sortie du tableau.

Pour résoudre le problème, vous devez soit le redimensionner à la taille qui contiendra les lectures de toutes les barres de l'historique, soit le lier au tampon de l'indicateur (déclaré comme une variable globale du programme). Si je comprends bien, ce sont ces valeurs qui doivent être affichées à l'aide de l'indicateur.

Mon erreur, mas[] devrait vraiment être un tableau global, mais le tampon indicateur ne convient pas non plus, ce sera plutôt un tableau multidimensionnel intermédiaire. Quelle est la meilleure façon de déterminer la taille optimale d'un tableau pour M5, sans passer par le tampon indicateur ?

 
mwwm:

Mon imprécision, mas[] est vraiment un tableau global, mais le tampon indicateur ne convient pas non plus, il s'agirait plutôt d'un tableau multidimensionnel intermédiaire. Quelle est la meilleure façon de déterminer la taille optimale d'un tableau pour M5, sans passer par le tampon indicateur ?

Je ne comprends pas ce que j'entends par multidimensionnel. Nous parlons d'un tableau unidimensionnel. En outre, dans MQL4, la dimension maximale d'un tableau est de 4.

Pour que le tableau ait la même taille que la série temporelle, nous devons le redimensionner en fonction du nombre de barres disponibles sur le graphique pour le symbole et la période nécessaires :

double fArray[];
int nBarsCnt = iBars(<символ>, <таймфрейм>);
if (ArrayResize(fArray, nBarsCnt) != nBarsCnt)
{
   // Не удалось изменить размер массива
   return;
}

ArraySetAsSeries(fArray, true);
 
mwwm:

Mon imprécision, mas[] est vraiment un tableau global, mais le tampon indicateur ne convient pas non plus, il s'agirait plutôt d'un tableau multidimensionnel intermédiaire. Quelle est la meilleure façon de déterminer la taille optimale du tableau pour M5, sans passer par un tampon indicateur ?

Pourquoi ne pas utiliser les tableaux comme tampons indicateurs ? Ils sont surveillés par le sous-système, ce qui vous facilite la tâche.

Et le tableau tampon des indicateurs intermédiaires est facile à réaliser :

SetIndexBuffer(1,BufferMA,INDICATOR_CALCULATIONS);
 

Bonjour.

Les volumes sur la plateforme sont des volumes en tick, y aura-t-il des volumes réels ?

 
Олег Литинский:

Bonjour.

Sur la plateforme, les volumes s'affichent, y aura-t-il des volumes réels ?

Ça n'arrivera pas. Utilisez MT5, certains courtiers y fournissent des volumes réels.

 

Bonjour !

Veuillez m'aider à résoudre le problème suivant :

1) Lorsque certaines conditions sont remplies, un ordre en suspens s'ouvre :

{
price=High[1]+OrderPoint*Point;
stoploss=Low[1]-Point;
takeprofit=price+price-stoploss;
OrderSend(Symbol(),OP_BUYSTOP,1,price,3,stoploss,takeprofit);
}

Veuillez me dire ce qu'il faut ajouter et où il faut supprimer un ordre en attente si le prix a déjà dépassé le stop loss (de cet ordre en attente).

Désolé pour cette question stupide, je me suis perdu dans les forums en cherchant une réponse.

Merci d'avance !