初学者的问题 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));
}
尝试 一个、两个或三个斜线打印 到日志中。也许那时你会明白。
 
fxsaber:

你不需要两个斜线。

尝试将一个、两个或三个斜线打印到日志中。也许那时你会明白。

是的,我明白斜线是一个命令,但我需要写路径,我用双斜线来写。

这里是路径。

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:

弗拉基米尔,谢谢你。我已经熟悉了CSymbolInfo 类中RefreshRates 函数 我在你的作品中看到过它,也在一本初级读物中读到过它。

OnTick 中调用这个函数Comment 中输出价格值,我从这个例子中也很清楚。OnInit检查当前符号 的程序对我来说也很清楚

在等待新栏的例子的同时,我将尝试用你的例子进行一些实践,我还没有在实践中使用它。我将尝试一下。


所以,这个例子只在一个新条形物诞生的时刻起作用。

这个例子使用静态变量PrevBarsprev_askprev_bid。静态变量的本质是。

用static关键字声明的局部变量函数生命周期保留其值在函数的每次后续调用中,这些局部变量都包含它们在前一次调用中的值。

因此,我们的三个静态变量(PrevBarsprev_askprev_bid)是在OnTick函数中声明的局部变量,它们存储的是它们之前进入OnTick函数时的值。

PrevBars 存储的是前一个条形图的时间。这个时间与当前条形图的时间time_0 进行比较。只要PrevBars 等于time_0,我们就处于当前的bar,并退出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());
  }

并打印示例代码中强调的两个字符串变量。找出差异,了解双斜线只写在程序代码中,但在编译时只留下一个,在文件路径中使用一个。

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