初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 953

 
fxsaber:

どこで使うか?

This whole idea is that let's let I have directories with files for processing at "..\MQL5Files00dir_01" address. Using your wonderful code, I get path to these folders in array and want to access these files, knowing exactly what files should be processed, and I have to write the path, example "MQL5Files↘TEST.".csv "と入力すると、"MQL5⇄Files00⇄dir_01A⇄"と返されます。

 
Aleksey Vyazmikin:

どこで使うか?

This whole idea is that let's let I have directories with files for processing at "..\MQL5Files00dir_01" address. Using your wonderful code, I get path to these folders in array and want to access these files, knowing exactly what files I need to process, and I need to set path to these files, for example "MQL5╱Files00↩dir_01╱test.".csv "と入力すると "MQL5⇄Files00⇄dir_01A↩"と返ってくるので、これを修正して、さらにコードに適用できる最適パスを返せるかどうか聞いています。

ダブルスラッシュの意味を理解していないだけで、構文上では1つの文字が2つで表記されます:最初のスラッシュコマンド、2番目のスラッシュ何。

\n, \r, \t, \", \ はこの規則で設定される文字である。すなわち、パスには常にスラッシュが1つ含まれます。

 
fxsaber:

ダブルスラッシュの意味を理解していないだけで、構文上は1つの文字で、最初のスラッシュコマンド、2番目のスラッシュ何と2つで表現されます。

\n, \r, \t, \", \ はこの規則で設定される文字である。すなわち、パスの中に常にスラッシュが1つある。

私は何かを見逃していることを除外しないが、私は1つではなく、2つのスラッシュをファイルパスを生成するために必要です。

 
Aleksey Vyazmikin:

私が何かを誤解している可能性は排除できませんが、ファイルパスを生成するにはスラッシュが1つではなく、2つ必要です。

スラッシュは2つも必要ありません。

void OnStart()
{
  uchar Array[1] = {'\\'};
  
  Print(CharArrayToString(Array));
}
ログにスラッシュを1つ、2つ、3つ出力してみて ください。その時、理解できるかもしれません。
 
fxsaber:

スラッシュは2つも必要ありません。

ログにスラッシュを1つ、2つ、3つ出力してみてください。そうすれば、理解できるかもしれません。

はい、スラッシュがコマンドであることは理解していますが、パスを書く必要があり、そのためにダブルスラッシュを使っています。

これがその道筋です。

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

が、このコマンドはエラーになりますよね?

 
そして、メインファイルでは、メソッドの1つが作成されています объект класса が含まれており、いずれかのメソッドが呼び出されます。

それはもったいない。

 

こんにちは。

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 キーワードで宣言されたローカル 変数は、その関数の有効 期間中、値を保持 します。その後の関数の呼び出しでは、これらのローカル変数に直前の呼び出し時の値が格納されます。

つまり、3つの静的変数(PrevBars,prev_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);
  }
//+------------------------------------------------------------------+
ファイル:
 

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

初心者からのFAQ MQL5 MT5 MetaTrader 5

アレクセイ・ヴャズミキン さん 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]に文字列を取得しました。

同じ名前で異なるディレクトリにあるファイルに、配列のインデックスを変えて アクセスしたい。

が、このコマンドはエラーになりますよね?

Alexey、ドキュメントから例を挙げてみましょう。

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

と入力し、サンプルコードで強調表示されている2つの文字列変数を表示します。違いを見つけて、ダブルスラッシュはプログラムコードにしか書かれていないが、コンパイル時には1つだけ残り、ファイルパスには1つだけ使われることを理解する。

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