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

 
Добрый день. Прошу помощи. Уже пару недель безуспешно пытаюсь заставить индикатор круглых уровней заставить (см.код) передавать их для использования в эксперте через iCustom. Прошу помочь поправить код.




#property indicator_chart_window

extern string H                     = " --- Mode_Settings ---";
extern bool   Show_00_50_Levels     = true;
extern bool   Show_20_80_Levels     = true;
extern color  Level_00_Color        = Lime;
extern color  Level_50_Color        = Gray;
extern color  Level_20_Color        = Red;
extern color  Level_80_Color        = Green;

double dXPoint = 1;
double Div = 0;
double i = 0;
double HighPrice = 0;
double LowPrice = 0;
int iDigits;
  
int start() 
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
  
  if(Show_00_50_Levels)
  {
   for (i = LowPrice; i <= HighPrice; i++) 
   {
      if (MathMod(i, 5) == 0.0) {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
            if(MathMod(i, 10) == 0.0)
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_00_Color);
            }
            else
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_50_Color);
            }
         }
      }
   }
   
  }
  
  if(Show_20_80_Levels)
  {
  
   for (i = LowPrice; i <= HighPrice; i++) 
   {
         
        if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="20") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT); 
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_20_Color);
            
            }
         }
        
         
         if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="80") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
           
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_80_Color);
            }
         }
         
   }
   
  }
  
   return (0);
}

int init() 
{
   iDigits = Digits;
   if(Digits==5 || Digits==3)dXPoint=10;
   if(Digits==3)  iDigits=2;
   if(Digits==5)  iDigits=4;
   
   Div = 0.1 / (Point*dXPoint);
   return (0);
}

int deinit()
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
   for (i = LowPrice; i <= HighPrice; i++) ObjectDelete("RoundPrice " + DoubleToStr(i, 0));
   return (0);
 
Aleksey Mavrin:
Si vous dites que vous n'êtes pratiquement pas doué pour la programmation, alors pourquoi acceptez-vous des tâches aussi atypiques, en commençant peut-être par des tâches simples ? Ou améliorer vos connaissances de base ? C'est plus facile de le faire faire pour toi, oui.

Je n'ai pas écrit : "Fais-moi un indicateur". J'ai demandé de l'aide. Je n'ai pas besoin de maîtriser complètement mql4. Je vérifie juste les idées. J'en ai déjà assez de l'excel).

 
Oleg Bondarev:

Je vous ai prévenu que j'étais un "hacker")

Voilà comment j'ai fait.

Maintenant, il dessine un graphique en tick, mais il y a des ruptures de ligne.

Je le fais en 4.

Des lignes brisées signifient qu'il n'y a pas de valeurs dans Label1Buffer[ХХХ].

et le second, que j'ai écrit ci-dessus, une fois de plus - le tampon de l'indicateur (Label1Buffer) est contrôlé par le terminal, si vous voyez une nouvelle barre, les valeurs vont toutes changer automatiquement - exécutez le code sur M1 et observez

ZS : pas un hacker, mais quelqu'un qui essaie d'apprendre par lui-même ! ))))

 
Igor Makanu:

des lignes brisées signifient qu'il n'y a aucune valeur dans le tampon Label1Buffer[XXX].

et la seconde, que j'ai écrite ci-dessus, une fois de plus - le tampon de l'indicateur (Label1Buffer) est contrôlé par le terminal, si une nouvelle barre apparaît, alors les valeurs se déplaceront toutes automatiquement - exécutez le code sur M1 et observez

ZS : pas un hacker, mais quelqu'un qui essaie d'apprendre par lui-même ! ))))

Label1Buffer[XXX] - cela signifie-t-il 3 nombres composés ?


 
Oleg Bondarev:

Label1Buffer[XXX] - s'agit-il d'un nombre à 3 composantes ?


Non, j'ai écrit les premières lettres dont je me souvenais.

c'est le numéro de l'article.

regardez votre code, vous avez écrit votre code de façon similaire à ma boucle, où vous déplacez le tampon de l'indicateur Label1Buffer d'un élément - remarquez à chaque appel de l'indicateur (chaque tick)

et après avoir déplacé le contenu de Label1Buffer, affectez lanouvelle valeur à Label1Buffer[0].

et quelles seront les valeurs des autres éléments ? au premier lancement, ils auront une "valeur vide" (EMPTY_VALUE), puis vous les décalerez une fois et assignerez une nouvelle valeur à..... et ensuite le terminal lui-même décalera TOUTES les valeursde Label1Buffer lorsqu'une nouvelle barre apparaîtra.


En général, il y a un léger décalage dans vos connaissances, mais essayez de dessiner simplement le prix de clôture de la barre avec l'indicateur, voici le code

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot line1
#property indicator_label1  "line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=10;
//--- indicator buffers
double         line1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,line1Buffer);
   IndicatorDigits(Digits);
   
//---
   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(prev_calculated==0){
      limit=rates_total-1;
   }else
      limit=rates_total-prev_calculated+1; // или limit=rates_total-prev_calculated ; чтобы не перерисовывать бар №1
//--- Основной цикл расчета
//Print("limit = ",limit);
   for(i=limit; i>=0; i--){
      line1Buffer[i]=close[i];
    }
//---
  return(rates_total);

  }
//+------------------------------------------------------------------+
 
Je vous entends. Je vais devoir y réfléchir. Merci !
 

Comment enregistrer des données dans Excel ? - MQL5.

Le format de fichier Excel est xlsx, mais la fonction FileOpen crée et travaille avec des fichiers txt et csv.


Après avoir testé dans OnTester, je dois décharger les données des tampons qui contiennent l'historique des différentes données au moment de l'ouverture de chaque tick et sortir les données de toutes les transactions sur un graphique.
Comme vous le comprenez, les données seront très nombreuses, même pour une seule transaction, sans parler de toutes les transactions, de sorte que l'option de "transfert manuel" ne convient pas.


Que recommandez-vous ?

 
Alexandr Sokolov:

Comment importer des données dans Excel ? - MQL5.

Le format de fichier Excel est xlsx et la fonction FileOpen crée et travaille avec des fichiers txt et csv.


Après avoir testé dans OnTester, j'ai besoin de décharger les données des tampons qui contiennent l'historique des différentes données au moment où la position a été ouverte sur chaque tick, puis d'afficher les données de toutes les transactions sur un graphique.
Comme vous le comprenez, les données seront très nombreuses, même pour une seule transaction, sans parler de toutes les transactions, de sorte que l'option de "transfert manuel" ne convient pas.


Que recommandez-vous ?

Eh bien, le résultat est simple - vous ne pouvez pas écrire directement dans Excel en utilisant MQL5, mais vous pouvez importer des données à partir d'un fichier texte dans Excel sous l'onglet "données" >>> "à partir du texte".

 
Bonjour, je reçois une erreur à propos d'objets infructueux après avoir effectué un test d'explorateur, et j'ai créé absolument tous les objets, d'après ce que je comprends, dans la pile, c'est-à-dire sans new. Veuillez expliquer ce problème.
 
Alexandr Sokolov:

Que recommandez-vous ?

Écrire en .csv et ouvrir dans Excel

Raison: