Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 953

 
fxsaber:

Wo würde ich es verwenden?

Die ganze Idee ist, dass, sagen wir, ich habe Verzeichnisse mit Dateien für die Verarbeitung auf "...\MQL5\\Files\00\dir_01" Adresse. Mit Ihrem wunderbaren Code, erhalte ich den Pfad zu diesen Ordnern in einem Array und möchte auf diese Dateien zugreifen, genau zu wissen, welche Dateien ich verarbeiten müssen, und ich muss den Pfad zu diesen Dateien, zum Beispiel "MQL5\\Files\00\dir_01\A\test.csv" und der Code gibt "MQL5\Files\00\\dir_01\A\" zurück, und ich möchte wissen, ob ich ihn so ändern kann, dass er den optimalen Pfad zurückgibt, der in weiterem Code verwendet werden kann.

 
Aleksey Vyazmikin:

Wo würde ich es verwenden?

Die ganze Idee ist, dass, sagen wir, ich habe Verzeichnisse mit Dateien für die Verarbeitung auf "...\MQL5\\Files\00\dir_01" Adresse. Mit Ihrem wunderbaren Code, erhalte ich den Pfad zu diesen Ordnern in einem Array und möchte auf diese Dateien zugreifen, genau zu wissen, welche Dateien ich verarbeiten müssen, und ich muss den Pfad zu diesen Dateien, zum Beispiel "MQL5\\Files\00\dir_01\A\test.csv" und der Code gibt "MQL5\Files\00\\dir_01\A\" zurück, und ich frage, ob er geändert werden kann, um den optimalen Pfad zurückzugeben, der in weiterem Code anwendbar sein wird.

Sie verstehen einfach nicht, was ein doppelter Schrägstrich ist - es ist ein Zeichen, das in der Syntax durch zwei gekennzeichnet ist: erster Schrägstrich Befehl, zweiter Schrägstrich was.

\n, \r, \t, \" und \\\\ sind Zeichen, die durch diese Regel festgelegt werden. D.h. es gibt immer einen Schrägstrich im Pfad.

 
fxsaber:

Sie verstehen einfach nicht, was ein doppelter Schrägstrich ist - es ist ein Zeichen, das in der Syntax durch zwei bezeichnet wird: der erste Schrägstrich befiehlt, der zweite Schrägstrich was.

\n, \r, \t, \" und \\\\ sind Zeichen, die durch diese Regel festgelegt werden. D.h. es gibt immer einen Schrägstrich im Pfad.

Ich schließe nicht aus, dass ich etwas übersehe, aber ich brauche zwei Schrägstriche, um den Dateipfad zu erzeugen, nicht einen.

 
Aleksey Vyazmikin:

Ich schließe nicht aus, dass ich etwas falsch verstehe, aber ich brauche zwei Schrägstriche, um den Dateipfad zu erstellen, nicht einen.

Sie brauchen keine zwei Schrägstriche.

void OnStart()
{
  uchar Array[1] = {'\\'};
  
  Print(CharArrayToString(Array));
}
Versuchen Sie, einen, zwei oder drei Schrägstriche in das Protokoll zu drucken. Vielleicht werden Sie dann verstehen.
 
fxsaber:

Sie brauchen keine zwei Schrägstriche.

Versuchen Sie, einen, zwei oder drei Schrägstriche in das Protokoll zu drucken. Vielleicht werden Sie es dann verstehen.

Ja, ich verstehe, dass der Schrägstrich ein Befehl ist, aber ich muss den Pfad schreiben, und dafür verwende ich einen doppelten Schrägstrich.

Hier ist der Weg.

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

Ich habe eine Zeichenkette in dem Array Folders[0]:

00\dir_01\A\

Ich möchte auf eine Datei mit demselben Namen, aber in verschiedenen Verzeichnissen zugreifen, indem ich den Index des Arrays ändere.

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

aber dieser Befehl führt zu einer Fehlermeldung, nicht wahr?

 
Und in der Hauptdatei wird eine der Methoden erstellt объект класса enthaltene Datei und eine der Methoden wird aufgerufen.

Das ist eine Verschwendung.

 

Hallo!

Ich versuche, von MQL4 zu MQL5 zu wechseln, und ich kann die letzte geschlossene Position nicht finden.
In MQL5, wenn wir einen Auftrag senden, ist es ein Auftrag, und wenn es geöffnet wird, wird es eine Position, und logischerweise sollte es in der Positionshistorie platziert werden und die gelöschten schwebenden Aufträge sollten in der Auftragshistorie platziert werden, aber alles, was ich sehe, ist die Historie der Aufträge von Geschäften, so ist es unklar, wo eine geschlossene Position zu finden ist.

Ich habe es auf diese Weise versucht:

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

Es werden jedoch sowohl die Zahlen der geöffneten als auch der geschlossenen Positionen angezeigt. ORDER_TYPE zeigt immer 4 an, was ebenfalls nicht eindeutig ist.

Ich habe versucht, ORDER in DEAL zu ändern, aber auch das funktioniert nicht.
Bitte, helfen Sie mir, was ist los?

 
vladzeit:

Wladimir, ich danke dir.Ich bin bereits mit der FunktionRefreshRates der KlasseCSymbolInfo vertraut. Ich habe es in Ihren Werken gesehen und in einer Fibel gelesen.

Der Aufruf dieser Funktion inOnTick und die Ausgabe der Kurswerte inComment sind mir auch aus dem Beispiel klar. Die Prozedur inOnInit zur Überprüfung des aktuellen Symbols ist mir auch klar.

Während ich auf das Beispiel mit der neuen Leiste warte, werde ich versuchen, mit Ihrem Beispiel zu üben, ich habe es noch nicht in der Praxis verwendet. Ich werde es versuchen.


Dieses Beispiel funktioniert also nur in dem Moment, in dem ein neuer Balken geboren wird.

In diesem Beispiel werden die statischen VariablenPrevBars,prev_ask undprev_bid verwendet. Das Wesentliche an statischen Variablen ist.

Lokale Variablen, die mit dem Schlüsselwort static deklariert werden, behalten ihre Werte währendder gesamten Lebensdauer der Funktion. Bei jedem nachfolgenden Aufruf der Funktion enthalten diese lokalen Variablen die Werte, die sie beim vorherigen Aufruf hatten.

Unsere drei statischen Variablen(PrevBars,prev_ask undprev_bid) sind also lokale Variablen, die innerhalb der OnTick-Funktion deklariert sind und ihre Werte speichern, die sie beim Eintritt in die OnTick-Funktion hatten.

PrevBars speichert die Zeit des vorherigen Taktes. Diese Zeit wird mittime_0, der Zeit des aktuellen Taktes, verglichen. SolangePrevBars gleichtime_0 ist, befinden wir uns im aktuellen Takt und verlassen die Funktion OnTick. Das Gleiche gilt für die Variablen, die die Preise des vorangegangenen Balkens speichern: Wir zeigen zunächst die vorherigen und aktuellen Preise an und schreiben dann die aktuellen Preise in die Variablenprev_ask undprev_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);
  }
//+------------------------------------------------------------------+
Dateien:
 

Forum für Handel, automatisierte Handelssysteme und Strategietests

FAQ von Anfängern MQL5 MT5 MetaTrader 5

Aleksey Vyazmikin, 2018.12.05 00:39

Ich weiß, dass es ein Schrägstrich-Befehl ist, aber ich muss den Pfad angeben.

Hier ist der Pfad, sagen wir

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

Ich habe eine Zeichenfolge in Folders[0] Array:

00\dir_01\A\

Ich möchte auf eine Datei mit demselben Namen, aber in verschiedenen Verzeichnissen zugreifen, indem ich den Array-Index ändere.

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

aber dieser Befehl führt zu einer Fehlermeldung, nicht wahr?


Es wird kein Fehler auftreten. Du hast immer noch nicht herausgefunden, was ein doppelter Schrägstrich ist.

 
Aleksey Vyazmikin:

Ja, ich verstehe, dass der Schrägstrich ein Befehl ist, aber ich muss den Pfad schreiben, und dafür verwende ich einen doppelten Schrägstrich.

Hier ist der Pfad zum Beispiel

Ich habe eine Zeichenkette in dem Array Folders[0]:

Ich möchte auf eine Datei mit demselben Namen, aber in verschiedenen Verzeichnissen zugreifen, indem ich den Index des Arrays ändere.

aber dieser Befehl führt zu einer Fehlermeldung, nicht wahr?

Alexey, nehmen Sie ein Beispiel aus der Dokumentation

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

und geben Sie die beiden im Beispielcode hervorgehobenen String-Variablen aus. Finden Sie die Unterschiede und verstehen Sie, dass der doppelte Schrägstrich nur im Programmcode geschrieben wird, aber nur einer zur Kompilierzeit übrig bleibt und einer im Dateipfad verwendet wird.

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