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

 
lil_lil:

Merci, comment puis-je écrire une boucle pour trouver le numéro de la barre qui croise les deux MAs lorsque les deux premiers points de l'algorithme sont respectés et qu'il y a des valeurs des deux MAs sur la première barre ?

/

.


Aha, tu n'as pas résolu le problème avec des tableaux après tout.

Note : La solution à travers les tableaux (copie des TROIS DERNIÈRES valeurs des indicateurs dans les tableaux First[], Second[] et Third[]) est lecroisement de deux iMAs- OnTick() :

//--- We look for crossing of two indicators
   double   First[];
   double   Second[];
   double   Third[];
   ArraySetAsSeries(First,true);    // index [0] - the most right bar on a charts
   ArraySetAsSeries(Second,true);   // index [0] - the most right bar on a charts
   ArraySetAsSeries(Third,true);    // index [0] - the most right bar on a charts
   int      buffer_num=0;           // indicator buffer number 
   int      start_pos=0;            // start position 
   int      count=3;                // amount to copy 
   if(!iMAGet(handle_iMA_First,buffer_num,start_pos,count,First))
      return;
   if(!iMAGet(handle_iMA_Second,buffer_num,start_pos,count,Second))
      return;
   if(InpFilterMA)
      if(!iMAGet(handle_iMA_Third,buffer_num,start_pos,count,Third))
         return;
//--- step 1: check in the arrays bars [0] and [1]
   if(First[0]>Second[0] && First[1]<Second[1]) // buy
     {
      if(InpFilterMA)
         if(Third[0]>=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[0] && First[1]>Second[1]) // sell
     {
      if(InpFilterMA)
         if(Third[0]<=First[0])
            return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }
//--- step 2: on a step of 1 crossing haven't found. check in the arrays bars [0] and [2]
   if(First[0]>Second[0] && First[2]<Second[2]) // buy
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Bid()-InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
      OpenBuy(sl,tp);
      return;
     }
   else if(First[0]<Second[2] && First[1]>Second[2]) // sell
     {
      //--- search in history
      if(SearchPositions(iTime(start_pos+3),iTime(start_pos)))
         return;
      if(!RefreshRates())
        {
         PrevBars=iTime(1);
         return;
        }
      double sl=m_symbol.Ask()+InpStopLoss*m_adjusted_point;
      double tp=m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
      OpenSell(sl,tp);
      return;
     }


Dans votre cas (une valeur à la fois), la boucle ressemblera à ceci :

   int      signal=0;                                 // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
   double   MA1_curr=iMAGet(handle_iMA_1,0);          // the value of the 1st MA on i bar
   double   MA2_curr=iMAGet(handle_iMA_2,0);          // the value of the 1st MA on i bar
   for(int i=0;i<100;i++)
     {
      double   MA1_prev=iMAGet(handle_iMA_1,i+1);     // the value of the 1st MA on i+1 th bar
      double   MA2_prev=iMAGet(handle_iMA_2,i+1);     // the value of the 1st MA on i+1 th bar
      //---
      signal=0;                                       // "-1" -> Sell; "0" -> Not signal; "1" -> Buy
      if(MA1_prev<MA2_prev && MA1_curr>MA2_curr)
         signal=1;
      else if(MA1_prev>MA2_prev && MA1_curr<MA2_curr)
         signal=-1;
      //---
      MA1_curr=MA1_prev;
      MA2_curr=MA2_prev;
     }

MA1_curr - la valeur de l'indicateur MA1 sur la barre #i, MA1_prev - la valeur de l'indicateur MA1 sur la barre #i+1
MA2_curr - la valeur de l'indicateur MA2 sur la barre #i, MA2_prev - la valeur de l'indicateur MA2 sur la barre #i+1

Lorsque vous obtenez un croisement (le signal de la variable est soit "-1" soit "1") - la valeur de i sera le numéro de la barre où le croisement a eu lieu.

Il s'agit de l'algorithme le plus simple pour trouver le croisement, mais il n'est pas le plus précis.

 
Vladimir Karputov:

Ouais, tu as décidé de ne pas utiliser les tableaux après tout...


Merci, votre autreMA Cross EA a été utilisé comme exemple.

Je veux l'entrer sur la troisième, cinquième ou... nième barre après le croisement.

Vladimir Karputov:

Dans votre cas (obtention d'une valeur), le cycle ressemblera à ceci

Pourquoi n'y a-t-il pas de sortie de la boucle lorsqu'un croisement est trouvé ?

Ces conditions peuvent-elles être placées en dehors de la boucle ?

 if(signal==-1)num_bar_b=i;
 if(signal==1)num_bar_s=i;

.

 

Bon après-midi. Pourriez-vous me dire dans quel format télécharger les données historiques du serveur Finam ou MFD.ru pour importer l' historique des cotations ? Je ne peux pas le faire du tout. Je ne peux que l'enregistrer de txt à csv et c'est tout.

 
Eol:

Bon après-midi. Pourriez-vous me dire dans quel format télécharger les données historiques du serveur Finam ou MFD.ru pour importer l'historique des cotations ? Je ne peux pas le faire du tout. Je ne peux que l'enregistrer de txt à csv et c'est tout.


Vous n'avez rien à télécharger dans MetaTrader 5 :) - Dès que vous vous connectez au serveur de trading, l'historique des ticks réels est à votre disposition. Regardez versCopyTicks

 
Vladimir Karputov:

Dans MetaTrader 5, vous n'avez pas besoin de télécharger quoi que ce soit :) - Dès que vous vous connectez au serveur de négociation, l'historique des ticks réels est à votre disposition. Regardez versCopyTicks


J'ai juste besoin de 10 ans d'actions russes. Mon courtier ne m'en donne pas autant et il est peu probable qu'il en trouve un.

 
5.0 Build 1755

Description du problème

Bonsoir, j'ai une question sur MQL5 si vous pouvez m'aider.
Je n'ai pas encore de manuels sur 5.
La question est la suivante .


#property indicator_level1 30 - J'ai défini le paramètre. Quand je charge l'indicateur sur le graphique. Je comprends.
Je change la ligne par la fonction ColorBuffer[], si la ligne descend en dessous de ce paramètre.

J'ai un problème ici. Si j'ouvre l'indicateur et que je change le paramètre pour un autre, même après avoir chargé l'indicateur, la ligne de niveau est placée là, mais l'indicateur la calcule en utilisant le paramètre qui a été défini auparavant, c'est-à-dire #property indicator_level1 30

Comment dois-je aborder ce niveau afin de le modifier au moment de l'exécution ?

- J'ai déjà essayé de vérifier le paramètre. Et recalculez toute la chaîne d'indicateurs.
Mais il ne le redessine toujours pas comme je le veux !

Au secours !
:)

Séquence des opérations

RSI.mqh

#property indicator_level1 30

#property indicator_level2 70


Dans le code de description de Calculaite. A la fin de la ligne où la ligne passe par For, j'ai ajouté la fonction pour changer la couleur de la ligne si elle est en dessous de ce niveau.
ExtColorsBuffer [i] =0 ;
si (ExtRSIBuffer [i]> indicator_level2& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =1 ;
}
si (ExtRSIBuffer [i]< indicator_level1& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =2 ;

Résultat attendu


La même chose que sur l'image, mais lorsque j'ouvre les paramètres et changer le niveau indicateur_niveau1 / 2 dans le processus d'utilisation de l'indicateur, il est prévu. L'indicateur est redessiné de sorte que si la ligne franchit un niveau, elle change de couleur. Mais pour moi, c'est au même niveau qu'avant :)

Plus d'informations

...

Dossiers :
rrgpusgf5g.png  69 kb
 
Ivan Stepanenko:
5.0 Build 1755

Description du problème

Bonsoir, j'ai une question sur MQL5 si vous pouvez m'aider.
Je n'ai pas encore de manuels sur 5.
La question est la suivante .


#property indicator_level1 30 - J'ai défini le paramètre. Quand je charge l'indicateur sur le graphique. Je comprends.
Je change la ligne par la fonction ColorBuffer[], si la ligne descend en dessous de ce paramètre.

J'ai un problème ici. Si j'ouvre l'indicateur et que je change le paramètre pour un autre, même après avoir chargé l'indicateur, la ligne de niveau est placée là, mais l'indicateur la calcule en utilisant le paramètre qui a été défini auparavant, c'est-à-dire #property indicator_level1 30

Comment dois-je aborder ce niveau afin de pouvoir le modifier au moment de l'exécution ?

- J'ai déjà essayé de vérifier le paramètre. Et recalculez toute la chaîne d'indicateurs.
Mais il ne le redessine toujours pas comme je le veux !

Au secours !
:)

Séquence des opérations

RSI.mqh

#property indicator_level1 30

#property indicator_level2 70


Dans le code de description de Calculaite. A la fin de la ligne où la ligne passe par For, j'ai ajouté la fonction pour changer la couleur de la ligne si elle est en dessous de ce niveau.
ExtColorsBuffer [i] =0 ;
si (ExtRSIBuffer [i]> indicator_level2& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =1 ;
}
si (ExtRSIBuffer [i]< indicator_level1& indicator_levelcolor!=NULL) {
ExtColorsBuffer [i] =2 ;

Résultat attendu


Je vois la même chose que sur l'image mais lorsque j'ouvre les paramètres et que je change le niveau indicator_level1 / 2 dans le processus d'utilisation de l'indicateur, j'obtiens un redessin. L'indicateur est redessiné de sorte que si la ligne franchit un niveau - elle change de couleur. Mais pour moi, c'est au même niveau qu'avant :)

Plus d'informations

...

IndicatorSetInteger(INDICATOR_LEVELCOLOR,0,clrCrimson);      // Поменяет цвет самого первого по счёту уровня на цвет Crimson
IndicatorSetInteger(INDICATOR_LEVELCOLOR,1,clrDeepSkyBlue);  // Поменяет цвет второго по счёту уровня на цвет DeepSkyBlue
 
Ivan Stepanenko:
5.0 Build 1755

Description du problème

Bonsoir, j'ai une question sur MQL5 si vous pouvez m'aider.
Je n'ai pas encore de manuels sur 5.
La question est la suivante .

Je voudrais savoir pourquoi je n'aime pas la réponse dans un sujet séparé.

Il s'agit du forum pour le trading, les systèmes de trading automatisés et les tests de stratégies.

J'ai besoin d'aide dans MQL5 #property indicator_level

Alexey Viktorov, 2018.01.31 09:06

Igor, nous avons tous les deux tort. Je n'ai pas compris immédiatement la tâche...

En plus de la directive #property, vous pouvez définir le niveau de l'indicateur avec la fonction

IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);

Par conséquent, ce niveau doit être fixé dans les paramètres des indicateurs entrants. Dans ce cas, le niveau sera dessiné par la valeur spécifiée et il doit être modifié par cette valeur.

Cas de test

#property indicator_separate_window
#property indicator_buffers     1
#property indicator_type1       DRAW_LINE
#property indicator_plots       1
#property indicator_color1      clrGreenYellow
#property indicator_level1      0
#property indicator_levelcolor  clrPurple

input double level = 0.6;
double buf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, buf, INDICATOR_DATA);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, level);
//---
   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 = 0, limit = prev_calculated == 0 ? 0 : rates_total-1;
    for(i = limit; i < rates_total; i++)
     {
      buf[i] = i%2;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

J'espère qu'il n'est pas difficile de changer la couleur en fonction du niveau défini dans les paramètres d'entrée.
 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Bugs, bugs, questions

Aleksey Rodionov, 2018.02.06 16:31

En voici une intéressante :

Print("Баланс на счёте = ",AccountInfoDouble(ACCOUNT_BALANCE));
printf("ACCOUNT_BALANCE =  %G",AccountInfoDouble(ACCOUNT_BALANCE));


Si vous supprimez %G dans pintf, la valeur ne sera pas affichée, mais dans Print, elle est affichée sans %G.

De même, dans Print la valeur de la balance 10000.0 est affichée, mais dans printf seulement le nombre entier 10000.

Je suis plus intéressé par la différence entre Print et Printf et, surtout, par la raison pour laquelle il n'est pas affiché sans %G. Je n'ai rien compris au livre de référence.


 

Bonjour chers collègues, j'ai une question, j'essaie d'insérer un widget de mon signal dans la signature sur le forum "forex money", mais ils ont désactivé ou bloqué le HTML, y a-t-il un moyen de le refaire dans l'URL ? car ils sont normalement insérés et affichés.

Voici le code <iframe frameborder="0" width="220" height="140" src="https://www.mql5.com/ru/signals/widget/signal/328l?t=green"></iframe>