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

 
Bonjour !
Peut-être à partir de https://ru.investing.com/tools/correlation-calculator
Est-il possible de transférer les informations sur l'horaire ?
Comment cela peut-il être fait ?
Merci d'avance.
 
Irina Dymura:
Bonjour !
Peut-être à partir de https://ru.investing.com/tools/correlation-calculator
Est-il possible de transférer les informations sur l'horaire ?
Comment cela peut-il être fait ?
Merci d'avance.
EssayezWebRequest().
 
Ihor Herasko:

Oui. Il n'y a aucune raison de traduire le temps en chaîne, puisque le temps est un nombre de secondes. Ce nombre est beaucoup plus facile et rapide à travailler que les cordes.

Vous avez corrigé une chose et gâché une autre).

Dans la deuxième partie, au lieu de :

retour :

Vous aviez cette ligne correcte dans votre tentative précédente.


Merci pour les réponses ! J'ai essayé les deux options.

Je ne vois pas ce qu'il y a d'étonnant - il entre toujours dans le système lorsqu'il se ferme sur une butée :

lil_lil:

Dites votre condition à haute voix et vous verrez ce qui se passe).

if ( TimeSeconds(TimeCurrent()) - TimeSeconds(OrderCloseTime()) > TimeSeconds(30*60) )
if ( TimeCurrent() -OrderCloseTime() > 30*60 )

En fait, il y a != condition partout, c'est-à-dire que le contraire > devrait être là, si j'ai bien compris ce que vous voulez dire. Mais toutes les variantes ont fonctionné - et fonctionnent toujours.

 

Aide à comprendre la logique, à trouver l'erreur

J'ai commenté le code en détail.

J'ai besoin qu'il dessine des fractales avec un point, avec un type "zigzag", de sorte que les fractales inférieures supérieures se suivent et ainsi de suite.

Mais le résultat est que les fractales répétées apparaissent quand même sur le graphique.

La base est tirée de l'indicateur fractal standard. Capture d'écran ci-dessous avec fractale répétée sur la période 5

//+------------------------------------------------------------------+
//|                                                     Fractals.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//---- indicator settings
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_ARROW
#property indicator_type2   DRAW_ARROW
#property indicator_color1  Gray
#property indicator_color2  Gray
#property indicator_label1  "Fractal Up"
#property indicator_label2  "Fractal Down"
bool high_f, low_f, lastIsUpper = true, lastIsLower = true;
int lastLowerIndex, lastUpperIndex;
//---- input data
input int period = 5;
int per = period;
//---- indicator buffers
double ExtUpperBuffer[];
double ExtLowerBuffer[];
//--- 10 pixels upper from high price
int    ExtArrowShift=-10;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
  if(per % 2 == 0) per++; //период фракталов только нечетный
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_ARROW,217);
   PlotIndexSetInteger(1,PLOT_ARROW,218);
//---- arrow shifts when drawing
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift);
//---- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- initialization done
  }

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 < per)
      return(0);
//---
   if(prev_calculated < per + (per - 1) / 2)
     {
      limit = (per - 1) / 2;
      //--- clean up arrays
      ArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
      ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE);
     }
   else limit = rates_total - per;
   for(i = limit; i < rates_total - (per + 1) / 2 && !IsStopped(); i++)
     {
      high_f = true; low_f = true;//с самого начала считаем что есть фрактал в i свече
      for(int g = 1; g < (per+1)/2; g++){//проверка на наличие фрактала (одновременной справа и слева от свечи с возможным фракталом)
         //---- Upper Fractal
         if(high[i-g] >= high[i] || high[i+g] > high[i]){//если одно из условий выполнено (high какой либо свечи справа или слева выше чем исследуемый), то фрактала сверху нет
            ExtUpperBuffer[i] = EMPTY_VALUE;
            high_f = false;            
         }        
         //---- Lower Fractal
         if(low[i-g] <= low[i] || low[i+g] < low[i]){ //если одно из условий выполнено, то фрактала снизу нет        
            ExtLowerBuffer[i] = EMPTY_VALUE;
            low_f = false;   
         }  
      }  
       //устанавливаем верхний
      if(high_f){//если фрактал все таки есть (из цикла-проверки выше)
         if(lastIsLower){//еси последний фрактал был нижний
            ExtUpperBuffer[i] = high[i];//устанавливаем сверху
            lastUpperIndex = i;//записываем индекс в буффере установленного
            lastIsLower = false;//говорим что последний - не нижний
            lastIsUpper = true;//а верхний
         }else{
            if(lastIsUpper){//если последний верхний (а мы пытаемся установить верхний)
               if(high[i] > ExtUpperBuffer[lastUpperIndex]){//если устанавливаем выше предыдущего
                  ExtUpperBuffer[lastUpperIndex] = EMPTY_VALUE;//удаляем предыдущий
                  ExtUpperBuffer[i] = high[i];//устанавливаем новый
                  lastUpperIndex = i;//записываем индекс нового
               }
            }
         }
      }
      //аналогично для фрактала снизу
      if(low_f){
         if(lastIsUpper){
            ExtLowerBuffer[i] = low[i];
            lastLowerIndex = i;
            lastIsLower = true;
            lastIsUpper = false;
         }else{
            if(lastIsLower){
               if(low[i] < ExtLowerBuffer[lastLowerIndex]){
                  ExtLowerBuffer[lastLowerIndex] = EMPTY_VALUE;
                  ExtLowerBuffer[i] = low[i];
                  lastLowerIndex = i;
               }
            }
         }
      }   
    }
  
//--- OnCalculate done. Return new prev_calculated.
   return(rates_total);
  }

//+------------------------------------------------------------------+
Dossiers :
6gvzow.JPG  149 kb
 
Pouvez-vous nous conseiller sur la façon d'obtenir le volume des positions ouvertes dans MQL4, si SYMBOL_SESSION_INTEREST n'est pas supporté ? Merci !
 
kotaries:
Pouvez-vous nous indiquer comment obtenir le volume des positions ouvertes dans MQL4, si SYMBOL_SESSION_INTEREST n'est pas supporté ? Merci !

Passez en revue toutes les positions et calculez leur volume total :OrderLots()

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает сумму лотов открытых позиций                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - торговая операция          ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
  double l=0;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              l+=OrderLots();
            }
          }
        }
      }
    }
  }
  return(l);
}
Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 

Je n'arrive pas à comprendre pourquoi une certaine valeur de prev_calculated est renvoyée ?

Comment est-il calculé en premier lieu ?

 
Roman Sharanov:

Je n'arrive pas à comprendre pourquoi une certaine valeur de prev_calculated est renvoyée ?

Comment est-il calculé en premier lieu ?

Le système en tiendra compte. En fait, vous ne devriez vous intéresser qu'à sa valeur, et non à la manière dont elle est calculée en interne.
 
Roman Sharanov:

Je n'arrive pas à comprendre pourquoi une certaine valeur de prev_calculated est renvoyée ?

Comment est-il calculé ?

Il s'agit de la valeur renvoyée par OnCalculate() lors de la dernière itération. Ceci est explicitement indiqué dans la documentation :

Il convient de noter la relation entre la valeur renvoyée par OnCalculate() et le deuxième paramètre d'entrée prev_calculé. Le paramètre prev_calculé, lorsque la fonction est appelée, contient la valeurrenvoyée par OnCalculate() lors de l' appelprécédent. Cela permet d'utiliser des algorithmes économiques pour le calcul de l'indicateur personnalisé afin d'éviter des calculs répétés pour les barres qui n'ont pas changé depuis l'appel précédent de cette fonction.

 

La tâche consiste à trouver la barre avec la fermeture minimale

for(int x=0 ; x<=xBars -1 ; x++)

{

contre++ ;

// Print(Close[x],",",counter) ;

int h = ArrayMinimum(Close[x]) ;

if(counter > 20) break ;

}

Le compilateur jure sur Close