Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 953

 
fxsaber:

¿Dónde lo utilizaría?

La idea es que digamos que tengo directorios con archivos para procesar en la dirección "..\MQL5\Files\00\dir_01". Usando tu maravilloso código, obtengo la ruta a estas carpetas en un array y quiero acceder a estos archivos, sabiendo exactamente qué archivos deben ser procesados, y tengo que escribir la ruta a ellos, por ejemplo "MQL5\Files\00\dir_01\A\Ntest.csv" y el código devuelve "MQL5\Files\00\dir_01\A\", y me pregunto si puedo modificarlo para que devuelva la ruta óptima que será aplicable en el código posterior.

 
Aleksey Vyazmikin:

¿Dónde lo utilizaría?

La idea es que digamos que tengo directorios con archivos para procesar en la dirección "..\MQL5\Files\00\dir_01". Usando su maravilloso código, obtengo la ruta de estas carpetas en un array y quiero acceder a estos archivos, sabiendo exactamente qué archivos necesito procesar, y necesito establecer la ruta a estos archivos, por ejemplo "MQL5\Files\00\dir_01\A\test.csv" y el código devuelve "MQL5\Files\00\dir_01\A\", y pregunto si se puede modificar para devolver la ruta óptima que será aplicable en el código posterior.

Simplemente no entiendes lo que es una doble barra - es un carácter que se denota por dos en la sintaxis: primera barra de comando, segunda barra de qué.

\n, \r, \t, \" y \\\N son caracteres que se establecen por esta regla. Es decir, siempre hay una barra en la ruta.

 
fxsaber:

Es que no entiendes lo que es una doble barra - es un carácter, que en la sintaxis se denota por dos: la primera barra de comando, la segunda barra qué.

\n, \r, \t, \" y \\\N son caracteres que se establecen por esta regla. Es decir, siempre hay una barra en el camino.

No excluyo que me esté perdiendo algo, pero necesito dos barras inclinadas para generar la ruta del archivo, no una.

 
Aleksey Vyazmikin:

No descarto que esté malinterpretando algo, pero necesito dos barras inclinadas para generar la ruta del archivo, no una.

No se necesitan dos barras inclinadas.

void OnStart()
{
  uchar Array[1] = {'\\'};
  
  Print(CharArrayToString(Array));
}
Intenta imprimir una, dos o tres barras en el registro. Tal vez entonces lo entiendas.
 
fxsaber:

No se necesitan dos barras inclinadas.

Intenta imprimir una, dos o tres barras en el registro. Quizá entonces lo entiendas.

Sí, entiendo que la barra es un comando, pero necesito escribir la ruta, y para ello uso la doble barra.

Este es el camino.

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

Tengo una cadena en el array Folders[0]:

00\dir_01\A\

Quiero acceder a un archivo con el mismo nombre pero en diferentes directorios cambiando el índice del array.

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

pero este comando obtendrá un error, ¿no?

 
Y en el archivo principal, se crea uno de los métodos объект класса incluido y se llama a uno de los métodos.

Es un desperdicio.

 

¡Hola!

Estoy tratando de cambiar de MQL4 a MQL5 y no puedo encontrar la última posición cerrada.
En MQL5, cuando enviamos una orden, es una orden, y cuando se abre se convierte en una posición, y lógicamente debería colocarse en el historial de posiciones y las órdenes pendientes eliminadas deberían colocarse en el historial de órdenes, pero lo único que veo es el historial de órdenes de operaciones, por lo que no sé dónde encontrar una posición cerrada.

Lo intenté de esta manera:

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]);   
} 

Pero muestra los números de las posiciones abiertas y cerradas. ORDER_TYPE siempre muestra 4, lo que tampoco está claro.

He intentado cambiar ORDEN por REPARTO, pero tampoco funciona.
Por favor, ayúdenme, ¿qué pasa?

 
vladzeit:

Vladimir, gracias.Ya conozco la funciónRefreshRates de la claseCSymbolInfo .Lo he visto en sus obras y lo he leído en una cartilla.

La llamada de esta función enOnTick y la salida de los valores de los precios enComment también me queda claro en el ejemplo. El procedimiento enOnInit para comprobar el símbolo actual también está claro para mí.

A la espera del ejemplo con la nueva barra, intentaré poner algo de práctica con tu ejemplo, no lo he utilizado en la práctica. Lo probaré.


Por lo tanto, este ejemplo sólo funciona en el momento en que nace una nueva barra.

Este ejemplo utiliza las variables estáticasPrevBars,prev_ask yprev_bid. La esencia de las variables estáticas es.

Las variables locales declaradas con la palabra clave static conservan sus valores durante lavida de la función. En cada llamada posterior de la función, estas variables locales contienen los valores que tenían en la llamada anterior.

Así que nuestras tres variables estáticas(PrevBars,prev_ask yprev_bid) son variables locales declaradas dentro de la función OnTick y almacenan sus valores, que tenían al entrar en la función OnTick previamente.

PrevBars almacena la hora de la barra anterior. Este tiempo se compara contime_0, el tiempo de la barra actual. MientrasPrevBars sea igual atime_0, estamos en la barra actual y salimos de la función OnTick. Lo mismo ocurre con las variables que almacenan los precios de la barra anterior: primero mostramos los precios anteriores y actuales y luego escribimos los precios actuales en las variablesprev_ask yprev_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);
  }
//+------------------------------------------------------------------+
Archivos adjuntos:
 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategia

FAQ de principiantes MQL5 MT5 MetaTrader 5

Aleksey Vyazmikin, 2018.12.05 00:39

Sé que es un comando de barra, pero necesito escribir la ruta.

Este es el camino digamos

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

Tengo una cadena en el array Folders[0]:

00\dir_01\A\

Quiero acceder a un archivo con el mismo nombre pero en diferentes directorios cambiando el índice del array.

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

pero este comando obtendrá un error, ¿no?


No habrá ningún error. Todavía no te has enterado de lo que es una doble barra.

 
Aleksey Vyazmikin:

Sí, entiendo que la barra es un comando, pero necesito escribir la ruta, y para ello uso la doble barra.

Esta es la ruta, por ejemplo

Tengo una cadena en el array Folders[0]:

Quiero acceder a un archivo con el mismo nombre pero en diferentes directorios cambiando el índice del array.

pero este comando obtendrá un error, ¿no?

Alexey, toma un ejemplo de la documentación

//+------------------------------------------------------------------+
//| 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());
  }

e imprimir las dos variables de cadena resaltadas en el código de ejemplo. Encuentre las diferencias y comprenda que la doble barra se escribe sólo en el código del programa, pero sólo se deja una en tiempo de compilación y se utiliza una en la ruta del archivo.

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