Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 953

 
fxsaber:

И как бы куда это использовать?

Вся эта затея в том, что допустим по адресу "..\MQL5\Files\00\dir_01" у меня лежат директории, в которых есть файлы для обработки, с помощью Вашего замечательного кода я получаю в массив путь к этим папкам и хочу дальше уже, зная четко какие файлы мне надо обработать, обратиться к этим файлам, а для этого нужно написать до них путь к примеру так "MQL5\\Files\\00\\dir_01\\A\\test.csv", а код возвращает такой путь "MQL5\Files\00\dir_01\A\", вот я и спрашиваю, можно ли его модифицировать для оптимального возврата пути, пригодного для применения в дальнейшем коде.

 
Aleksey Vyazmikin:

И как бы куда это использовать?

Вся эта затея в том, что допустим по адресу "..\MQL5\Files\00\dir_01" у меня лежат директории, в которых есть файлы для обработки, с помощью Вашего замечательного кода я получаю в массив путь к этим папкам и хочу дальше уже, зная четко какие файлы мне надо обработать, обратиться к этим файлам, а для этого нужно написать до них путь к примеру так "MQL5\\Files\\00\\dir_01\\A\\test.csv", а код возвращает такой путь "MQL5\Files\00\dir_01\A\", вот я и спрашиваю, можно ли его модифицировать для оптимального возврата пути, пригодного для применения в дальнейшем коде.

Вы просто не понимаете, что такое двойной слэш - это один символ, который в синтаксисе обозначается двумя: первый слэш-команда, второй - какая. 

\n, \r, \t, \" и \\ - это символы, задающиеся по таком правилу. Т.е. в пути всегда один слэш.

 
fxsaber:

Вы просто не понимаете, что такое двойной слэш - это один символ, который в синтаксисе обозначается двумя: первый слэш-команда, второй - какая. 

\n, \r, \t, \" и \\ - это символы, задающиеся по таком правилу. Т.е. в пути всегда один слэш.

Не исключаю, что я что-то не понимаю, но мне то нужна два слеша для генерации пути к файлу, а не один.

 
Aleksey Vyazmikin:

Не исключаю, что я что-то не понимаю, но мне то нужна два слеша для генерации пути к файлу, а не один.

Вам не нужно два слэша.

void OnStart()
{
  uchar Array[1] = {'\\'};
  
  Print(CharArrayToString(Array));
}
Попробуйте вывести в лог один, два, три  слэша через Print. Возможно, тогда поймете.
 
fxsaber:

Вам не нужно два слэша.

Попробуйте вывести в лог один, два, три  слэша через Print. Возможно, тогда поймете.

Да я понимаю, что слэш это команда, но мне же нужно прописать путь, а для этого и использую двойной слэш.

Вот путь допустим

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

я получил в массив Folders[0] строку:

00\dir_01\A\

хочу получить меняя индекс массива доступ к файлу с одним и тем же названием, но лежащим в разных директориях, я полагаю, что надо делать так

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

но по такой команде будет получена ошибка, разве нет?

 
 А в основном файле создается объект класса включаемого файла и вызывается один из методов.

Эт зря. 

 

Добрый день!

Пытаюсь перейти с MQL4 на MQL5 и не могу найти последнию закрытую позицию.
В MQL5, когда мы посылаем ордер - это ордер, когда он открылся - он стал позицией и, по логике, после того как он закрылся, он должен попасть в историю позиций, а удаленные отложенные ордера должны быть в истории ордеров, но вижу только историю ордероа с сделок - поэтому непонятно где искать закрытую позицию.

Пробовал вот так:

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

Но выводит номера и открытых и закрытых позиций. ORDER_TYPE всегда выводит 4, что тоже непонятно.

Пробовал менять ORDER на DEAL, но тоже не работает.
Подскажите, пожалуйста, что не так?

 
vladzeit:

Vladimir, спасибо. С функцией обновления котировок RefreshRates из класса CSymbolInfo я уже немного познакомился. Видел её в Ваших работах, ну и в букваре почитал.

Вызов этой функции в OnTick и вывод значений цен в Comment мне тоже понятны из примера. Процедура в OnInit по проверке текущего символа мне тоже понятна.

Пока буду ждать примера с новым баром, поупражняюсь с Вашим примером, не применял его ещё на практике. Попробую.


Итак пример, который работает только в момент рождения нового бара.

В данном примере используются статические переменные PrevBarsprev_ask и prev_bid. Суть статических переменных - 

Локальные переменные, объявленные с ключевым словом static сохраняют свои значения в течение всего времени существования  функции. При каждом следующем вызове функции такие локальные переменные содержат те значения, которые они имели при предыдущем вызове.

Таким образом наши три статических переменных (PrevBarsprev_ask и prev_bid) - это локальные переменные объявленные внутри функции OnTick и они сохраняют свои значения, которые имели при предыдущем входе в функцию OnTick.

PrevBars хранит время предыдущего бара. Это время сравнивается с time_0 - временем текущего бара. Пока PrevBars равно time_0 - мы находимся на текущем баре и выходим из функции OnTick. Аналогично с переменными, которые хранят цены предыдущего бара: сначала отображаем предыдущие и текущие цены, затем записываем текущие цены в переменные prev_ask и prev_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);
  }
//+------------------------------------------------------------------+
Файлы:
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы от начинающих MQL5 MT5 MetaTrader 5

Aleksey Vyazmikin, 2018.12.05 00:39

Да я понимаю, что слэш это команда, но мне же нужно прописать путь, а для этого и использую двойной слэш.

Вот путь допустим

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

я получил в массив Folders[0] строку:

00\dir_01\A\

хочу получить меняя индекс массива доступ к файлу с одним и тем же названием, но лежащим в разных директориях, я полагаю, что надо делать так

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

но по такой команде будет получена ошибка, разве нет?


Ошибки не будет. Вы так и не осознали, что такое двойной слэш.

 
Aleksey Vyazmikin:

Да я понимаю, что слэш это команда, но мне же нужно прописать путь, а для этого и использую двойной слэш.

Вот путь допустим

я получил в массив Folders[0] строку:

хочу получить меняя индекс массива доступ к файлу с одним и тем же названием, но лежащим в разных директориях, я полагаю, что надо делать так

но по такой команде будет получена ошибка, разве нет?

Алексей, возьми из документации пример

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

и распечатай две string переменные, выделенные в коде примера. Найди отличия и пойми, что двойной слеш пишется только в коде программы, но при компиляции остаётся только один и один используется в пути к файлу.

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