Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 953

 
fxsaber:

Dove potrei usarlo?

L'intera idea è che diciamo che ho delle directory con dei file da processare all'indirizzo "..\MQL5\Files\00\dir_01". Usando il vostro meraviglioso codice, ottengo il percorso di queste cartelle in un array e voglio accedere a questi file, sapendo esattamente quali file devo processare, e devo impostare il percorso di questi file, per esempio "MQL5\Files\00\dir_01\A\test.csv" e il codice restituisce "MQL5\Files\00\dir_01\A\", e sto chiedendo se posso modificarlo per restituire il percorso ottimale che sarà applicabile in ulteriore codice.

 
Aleksey Vyazmikin:

Dove potrei usarlo?

L'intera idea è che diciamo che ho delle directory con dei file da processare all'indirizzo "..\MQL5\Files\00\dir_01". Usando il vostro meraviglioso codice, ottengo il percorso di queste cartelle in un array e voglio accedere a questi file, sapendo esattamente quali file devo processare, e devo impostare il percorso di questi file, per esempio "MQL5\Files\00\dir_01\A\test.csv" e il codice restituisce "MQL5\Files\00\dir_01\A\", e sto chiedendo se può essere modificato per restituire il percorso ottimale che sarà applicabile in ulteriore codice.

Semplicemente non capisci cos'è un doppio slash - è un carattere che è denotato da due nella sintassi: primo slash comando, secondo slash cosa.

\n, \r, \t, \" e \" sono caratteri che sono impostati da questa regola. Cioè c'è sempre una barra nel percorso.

 
fxsaber:

Semplicemente non capisci cos'è una doppia barra - è un carattere, che nella sintassi è denotato da due: la prima barra di comando, la seconda barra cosa.

\n, \r, \t, \" e \" sono caratteri che sono impostati da questa regola. Cioè c'è sempre una barra nel percorso.

Non escludo che mi manchi qualcosa, ma ho bisogno di due slash per generare il percorso del file, non uno.

 
Aleksey Vyazmikin:

Non escludo che sto fraintendendo qualcosa, ma ho bisogno di due slash per generare il percorso del file, non uno.

Non hai bisogno di due slash.

void OnStart()
{
  uchar Array[1] = {'\\'};
  
  Print(CharArrayToString(Array));
}
Prova a stampare una, due o tre barre nel registro. Forse allora capirete.
 
fxsaber:

Non hai bisogno di due slash.

Provate a stampare uno, due o tre slash nel registro. Forse allora capirete.

Sì, capisco che lo slash è un comando, ma ho bisogno di scrivere il percorso, e uso il doppio slash per questo.

Ecco il percorso.

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

Ho ottenuto una stringa nell'array Folders[0]:

00\dir_01\A\

Voglio accedere a un file con lo stesso nome ma in directory diverse cambiando l'indice dell'array.

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

ma questo comando otterrà un errore, vero?

 
E nel file principale viene creato uno dei metodi объект класса incluso e viene chiamato uno dei metodi.

È uno spreco.

 

Ciao!

Sto cercando di passare da MQL4 a MQL5 e non riesco a trovare l'ultima posizione chiusa.
In MQL5, quando inviamo un ordine, è un ordine, e quando viene aperto diventa una posizione, e logicamente dovrebbe essere messo nella cronologia delle posizioni e gli ordini pendenti cancellati dovrebbero essere messi nella cronologia degli ordini, ma tutto quello che vedo è la cronologia degli ordini delle operazioni, quindi non so dove trovare una posizione chiusa.

Ho provato in questo modo:

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

Ma mostra i numeri delle posizioni aperte e chiuse. ORDER_TYPE mostra sempre 4, anche questo non è chiaro.

Ho provato a cambiare ORDER in DEAL, ma non funziona nemmeno questo.
Per favore, aiutatemi, cosa c'è che non va?

 
vladzeit:

Vladimir, grazie.Ho già familiarità con la funzioneRefreshRates della classeCSymbolInfo .L'ho visto nelle sue opere e l'ho letto in un abbecedario.

La chiamata di questa funzione inOnTick e l' output dei valori di prezzo inComment sono anche chiari per me dall'esempio.Anche la procedura inOnInit per controllare il simbolo corrente mi è chiara.

In attesa dell'esempio con la nuova barra, cercherò di fare un po' di pratica con il tuo esempio, non l'ho usato nella pratica. Lo proverò.


Quindi, questo esempio funziona solo nel momento in cui nasce una nuova barra.

Questo esempio utilizza le variabili statichePrevBars,prev_ask eprev_bid. L'essenza delle variabili statiche è.

Levariabili locali dichiarate con la parola chiave static mantengono i loro valori pertutta la durata della funzione. In ogni chiamata successiva della funzione, queste variabili locali contengono i valori che avevano nella chiamata precedente.

Così le nostre tre variabili statiche(PrevBars,prev_ask eprev_bid) sono variabili locali dichiarate all'interno della funzione OnTick e memorizzano i loro valori, che avevano quando sono entrate nella funzione OnTick prima.

PrevBars memorizza il tempo della barra precedente. Questo tempo viene confrontato contime_0, il tempo della barra corrente. FinchéPrevBars è uguale atime_0, siamo alla barra corrente e usciamo dalla funzione OnTick. Lo stesso vale per le variabili che memorizzano i prezzi della barra precedente: prima visualizziamo i prezzi precedenti e attuali e poi scriviamo i prezzi attuali nelle variabiliprev_ask eprev_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);
  }
//+------------------------------------------------------------------+
 

Forum sul trading, sistemi di trading automatico e test di strategia

FAQ da principianti MQL5 MT5 MetaTrader 5

Aleksey Vyazmikin, 2018.12.05 00:39

So che è un comando slash, ma ho bisogno di scrivere il percorso.

Ecco il percorso, diciamo

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

Ho ottenuto una stringa nell'array Folders[0]:

00\dir_01\A\

Voglio accedere a un file con lo stesso nome ma in directory diverse cambiando l'indice dell'array.

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

ma questo comando otterrà un errore, vero?


Non ci sarà un errore. Non hai ancora capito cos'è un doppio slash.

 
Aleksey Vyazmikin:

Sì, capisco che lo slash è un comando, ma ho bisogno di scrivere il percorso, e uso il doppio slash per questo.

Ecco il percorso per esempio

Ho ottenuto una stringa nell'array Folders[0]:

Voglio accedere a un file con lo stesso nome ma in directory diverse cambiando l'indice dell'array.

ma questo comando otterrà un errore, vero?

Alexey, prendi un esempio dalla documentazione

//+------------------------------------------------------------------+
//| 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 stampare le due variabili stringa evidenziate nel codice di esempio. Trovate le differenze e capite che la doppia barra è scritta solo nel codice del programma, ma solo una è lasciata al momento della compilazione e una è usata nel percorso del file.

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