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

 
fxsaber:

Où pourrais-je l'utiliser ?

L'idée est la suivante : disons que j'ai des répertoires contenant des fichiers à traiter à l'adresse "..\MQL5\\Files\00\dir_01". En utilisant votre merveilleux code, j'obtiens le chemin d'accès à ces répertoires dans un tableau et je veux accéder à ces fichiers, en sachant exactement quels fichiers je dois traiter, et j'ai besoin de définir le chemin d'accès à ces fichiers, par exemple "MQL5\\\Files\\00\dir_01\A\test.csv" et le code renvoie "MQL5\Files\00\\dir_01\A\", et je demande si je peux le modifier pour qu'il renvoie le chemin optimal qui sera applicable dans un code ultérieur.

 
Aleksey Vyazmikin:

Où pourrais-je l'utiliser ?

L'idée est la suivante : disons que j'ai des répertoires contenant des fichiers à traiter à l'adresse "..\MQL5\\Files\00\dir_01". En utilisant votre merveilleux code, j'obtiens le chemin d'accès à ces répertoires dans un tableau et je veux accéder à ces fichiers, en sachant exactement quels fichiers je dois traiter, et j'ai besoin de définir le chemin d'accès à ces fichiers, par exemple "MQL5\\\Files\\00\dir_01\A\test.csv" et le code renvoie "MQL5\Files\00\\dir_01\A\", et je demande s'il peut être modifié afin de renvoyer le chemin optimal qui sera applicable dans un code ultérieur.

Vous ne comprenez pas ce qu'est une double barre oblique - c'est un caractère qui est désigné par deux dans la syntaxe : première barre oblique commande, deuxième barre oblique quoi.

\n, \r, \t, \" et \\\\N sont des caractères qui sont définis par cette règle. C'est-à-dire qu'il y a toujours une barre oblique dans le chemin.

 
fxsaber:

Vous ne comprenez tout simplement pas ce qu'est une double barre oblique - c'est un caractère qui, dans la syntaxe, est désigné par deux : la première barre oblique commande, la deuxième barre oblique quoi.

\n, \r, \t, \" et \\\\N sont des caractères qui sont définis par cette règle. C'est-à-dire qu'il y a toujours une barre oblique dans le chemin.

Je n'exclue pas que quelque chose m'échappe, mais j'ai besoin de deux barres obliques pour générer le chemin du fichier, et non d'une seule.

 
Aleksey Vyazmikin:

Je n'exclus pas que je comprenne mal quelque chose, mais j'ai besoin de deux barres obliques pour générer le chemin du fichier, et non d'une seule.

Vous n'avez pas besoin de deux barres obliques.

void OnStart()
{
  uchar Array[1] = {'\\'};
  
  Print(CharArrayToString(Array));
}
Essayez d'imprimer une, deux ou trois barres obliques dans le journal. Peut-être que vous comprendrez alors.
 
fxsaber:

Vous n'avez pas besoin de deux barres obliques.

Essayez d'imprimer une, deux ou trois barres obliques dans le journal. Peut-être qu'alors vous comprendrez.

Oui, je comprends que la barre oblique est une commande, mais j'ai besoin d'écrire le chemin, et j'utilise la double barre oblique pour cela.

Voici le chemin.

int zz=FileOpen(" 00\\dir_01\\A\\ZZ_Analiz_Open.bin",FILE_BIN|FILE_READ);

J'ai obtenu une chaîne dans le tableau Folders[0] :

00\dir_01\A\

Je veux accéder à un fichier avec le même nom mais dans des répertoires différents en changeant l'index du tableau.

int zz=FileOpen(Folders[0]+"ZZ_Analiz_Open.bin",FILE_BIN|FILE_READ);

mais cette commande va obtenir une erreur, n'est-ce pas ?

 
Et dans le fichier principal, une des méthodes est créée объект класса inclus et l'une des méthodes est appelée.

C'est du gaspillage.

 

Bonjour !

J'essaie de passer de MQL4 à MQL5 et je ne parviens pas à trouver la dernière position fermée.
Dans MQL5, lorsque nous envoyons un ordre, c'est un ordre, et lorsqu'il est ouvert, il devient une position, et logiquement il devrait être placé dans l'historique des positions et les ordres en attente supprimés devraient être placés dans l'historique des ordres, mais tout ce que je vois est l'historique des ordres des transactions, donc je ne sais pas où trouver une position fermée.

J'ai essayé de cette façon :

ulong GetLastCloseTicket()
{
    datetime to=TimeCurrent();
    datetime from=to-3*PeriodSeconds(PERIOD_D1);
    HistorySelect(from,to);    
    int Htotal=HistoryOrdersTotal();
    ulong lastOrders[2];
    ulong ticket;
    ArrayInitialize(lastOrders, 0);
 
    for (uint j = 0; j < Htotal; j++)
    {           
        if(ticket= HistoryOrderGetTicket(j)) {            
            if (HistoryOrderGetInteger(ticket,ORDER_TYPE)== ORDER_TYPE_BUY || HistoryOrderGetInteger(ticket,ORDER_TYPE)== ORDER_TYPE_SELL) {
                Print("ticket = " +ticket+";");
                Print("ORDER_TYPE = " +ORDER_TYPE+";");                
                // хранить самый последний (недавно закрытый) ордер в lastOrders[1]
                // а предпоследний в lastOrders[0]
                if (ticket > lastOrders[0]) {
                    if (ticket > lastOrders[1]) {
                        lastOrders[0] = lastOrders[1];
                        lastOrders[1] = ticket;                   
                    } else {
                        lastOrders[0] = ticket;
                    }
                }
            }
        }
    }
    Print("lastOrders[1] = " +lastOrders[1]+";");
    return (lastOrders[1]);   
} 

Mais il affiche les chiffres des positions ouvertes et fermées. ORDER_TYPE affiche toujours 4, ce qui n'est pas clair non plus.

J'ai essayé de changer ORDER en DEAL, mais cela ne fonctionne pas non plus.
S'il vous plaît, aidez-moi, qu'est-ce qui ne va pas ?

 
vladzeit:

Vladimir, merci.Je connais déjà la fonctionRefreshRates de la classeCSymbolInfo .Je l'ai vu dans vos travaux et je l'ai lu dans un abécédaire.

L'appel de cette fonction dansOnTick et la sortie des valeurs de prix dansComment sont également clairs pour moi dans l'exemple. La procédure dansOnInit pour vérifier le symbole actuel est également claire pour moi.

En attendant l'exemple avec la nouvelle barre, je vais essayer de mettre en pratique votre exemple, je ne l'ai pas utilisé en pratique. Je vais l'essayer.


Ainsi, cet exemple ne fonctionne qu'au moment où une nouvelle barre est née.

Cet exemple utilise les variables statiquesPrevBars,prev_ask etprev_bid. L'essence des variables statiques est.

Lesvariables locales déclarées avec le mot clé static conservent leurs valeurs pendant toute ladurée de vie de la fonction. À chaque appel ultérieur de la fonction, ces variables locales contiennent les valeurs qu'elles avaient lors de l'appel précédent.

Ainsi, nos trois variables statiques(PrevBars,prev_ask etprev_bid) sont des variables locales déclarées à l'intérieur de la fonction OnTick et elles stockent leurs valeurs, qu'elles avaient lorsqu'elles sont entrées dans la fonction OnTick précédemment.

PrevBars enregistre l'heure de la barre précédente. Ce temps est comparé àtime_0, le temps de la barre actuelle. Tant quePrevBars est égal àtime_0, nous sommes à la barre actuelle et quittons la fonction OnTick. Il en va de même pour les variables qui stockent les prix de la barre précédente : nous affichons d'abord les prix précédents et actuels, puis nous écrivons les prix actuels dans les variablesprev_ask etprev_bid.

//+------------------------------------------------------------------+
//|                                      Display previous prices.mq5 |
//|                              Copyright © 2018, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.000"
//---
#include <Trade\SymbolInfo.mqh>  
CSymbolInfo    m_symbol;                     // symbol info object
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(!m_symbol.Name(Symbol())) // sets symbol name
      return(INIT_FAILED);
   RefreshRates();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- we work only at the time of the birth of new bar
   static datetime PrevBars=0;
   datetime time_0=iTime(m_symbol.Name(),Period(),0);
   if(time_0==PrevBars)
      return;
   PrevBars=time_0;
   if(!RefreshRates())
     {
      PrevBars=0;
      return;
     }
//---
   static double prev_ask=0.0;
   static double prev_bid=0.0;
   Comment("       Previous | Current","\n",
           "Ask: ",DoubleToString(prev_ask,m_symbol.Digits())," | ",DoubleToString(m_symbol.Ask(),m_symbol.Digits()),"\n",
           "Bid:  ",DoubleToString(prev_bid,m_symbol.Digits())," | ",DoubleToString(m_symbol.Bid(),m_symbol.Digits()));
   prev_ask=m_symbol.Ask();
   prev_bid=m_symbol.Bid();
  }
//+------------------------------------------------------------------+
//| Refreshes the symbol quotes data                                 |
//+------------------------------------------------------------------+
bool RefreshRates(void)
  {
//--- refresh rates
   if(!m_symbol.RefreshRates())
     {
      Print("RefreshRates error");
      return(false);
     }
//--- protection against the return value of "zero"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
Dossiers :
 

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

FAQ des débutants MQL5 MT5 MetaTrader 5

Aleksey Vyazmikin, 2018.12.05 00:39

Je sais que c'est une commande slash, mais je dois écrire le chemin.

Voici le chemin, disons

int zz=FileOpen(" 00\\dir_01\\A\\ZZ_Analiz_Open.bin",FILE_BIN|FILE_READ);

J'ai obtenu une chaîne dans le tableau Folders[0] :

00\dir_01\A\

Je veux accéder à un fichier avec le même nom mais dans des répertoires différents en changeant l'index du tableau.

int zz=FileOpen(Folders[0]+"ZZ_Analiz_Open.bin",FILE_BIN|FILE_READ);

mais cette commande va obtenir une erreur, n'est-ce pas ?


Il n'y aura pas d'erreur. Tu n'as toujours pas compris ce qu'est une double barre oblique.

 
Aleksey Vyazmikin:

Oui, je comprends que la barre oblique est une commande, mais j'ai besoin d'écrire le chemin, et j'utilise la double barre oblique pour cela.

Voici le chemin par exemple

J'ai obtenu une chaîne dans le tableau Folders[0] :

Je veux accéder à un fichier avec le même nom mais dans des répertoires différents en changeant l'index du tableau.

mais cette commande va obtenir une erreur, n'est-ce pas ?

Alexey, prenez un exemple dans la documentation

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- неправильный способ открытия файла
   string terminal_data_path=TerminalInfoString(TERMINAL_DATA_PATH);
   string filename=terminal_data_path+"\\MQL5\\Files\\"+"fractals.csv";
   int filehandle=FileOpen(filename,FILE_WRITE|FILE_CSV);
   if(filehandle<0)
     {
      Print("Неудачная попытка открыть файл по абсолютному пути");
      Print("Код ошибки ",GetLastError());
     }
//--- правильный способ работы в "файловой песочнице"
   ResetLastError();
   filehandle=FileOpen("fractals.csv",FILE_WRITE|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(), EnumToString(_Period));
      FileClose(filehandle);
      Print("FileOpen OK");
     }
   else Print("Операция FileOpen неудачна, ошибка ",GetLastError());
//--- еще один пример с созданием вложенной директории в MQL5\Files\
   string subfolder="Research";
   filehandle=FileOpen(subfolder+"\\fractals.txt",FILE_WRITE|FILE_CSV);
      if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(), EnumToString(_Period));
      FileClose(filehandle);
      Print("Файл должен быть создан в папке "+terminal_data_path+"\\"+subfolder);
     }
   else Print("Операция FileOpen неудачна, ошибка ",GetLastError());
  }

et imprimer les deux variables de type chaîne mises en évidence dans l'exemple de code. Trouvez les différences et comprenez que le double slash n'est écrit que dans le code du programme, mais qu'il n'en reste qu'un au moment de la compilation et qu'un seul est utilisé dans le chemin du fichier.

Документация по MQL5: Файловые операции / FileOpen
Документация по MQL5: Файловые операции / FileOpen
  • www.mql5.com
[in]  Имя открываемого файла, может содержать подпапки. Если файл открывается для записи, то указанные подпапки будут созданы в случае их отсутствия. [in]  значение, используемое в качестве разделителя в txt или csv-файле. Если для csv-файла разделитель не указан, то по умолчанию используется символ табуляции. Если для txt-файла разделитель не...
Raison: