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

 
Artyom Trishkin:
なんとなく(@fxsaber さんからの解答)。

//+------------------------------------------------------------------+
//| Возвращает смещение бара по времени                              |
//+------------------------------------------------------------------+
int GetBarShift(const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) {
   int res=-1;
   datetime last_bar;
   if(SeriesInfoInteger(symbol_name,timeframe,SERIES_LASTBAR_DATE,last_bar)) {
      if(time>last_bar) res=0;
      else {
         const int shift=Bars(symbol_name,timeframe,time,last_bar);
         if(shift>0) res=shift-1;
         }
      }
   return(res);
}
//+------------------------------------------------------------------+
ある人がどこかに書いていましたが、選択した行で次のようにするといいそうです:if(time>=last_bar) res=0;

正直なところ、確認していないんですよねー。チェックして結果を書いてください。
書いたのは私です。そしてそれは論理的なもので、もし時間が現在のバーの開始時間と一致すれば、そのインデックスは0になるからです。はい、純粋なfxsaberのソリューションは、エラーで動作します。
 
Alexey Kozitsyn:
私の解決策が「より簡単」かどうかは分かりませんが、こちらをお試しください: https://www.mql5.com/ru/forum/160945#comment_4053382

言語には標準的な 機能がなく、みんなが自分で自転車を組み立てて、その性能を 測らなければならないのでしょうか。

これ以外は見つかったようですが、いろいろな解決策を見てみると、「誰が何をできるのか」ということが明らかになりました。

 
Vitaly Muzichenko:

言語には標準的な 機能がなく、みんなが自分で自転車を組み立てて、その性能を 測らなければならないのでしょうか。

これ以外は見つかったようですが、いろいろな解決策を見ていると、「誰が何をできるのか」ということになりそうです。

標準的なものがないのです。https://www.mql5.com/ru/articles/81 の記事から変種を提供しましたね。そこには「松葉づえ」のことも書かれています。
Переход с MQL4 на MQL5
Переход с MQL4 на MQL5
  • 2010.05.11
  • Sergey Pavlov
  • www.mql5.com
Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
 

最後にもう一つ質問です。今日、コードベースで「マスター」のコードを見たので、これを使うのです。

   double open_1=iOpen(1);
   double open_2=iOpen(2);
   double high_0=iHigh(0);
   double high_1=iHigh(1);
   double high_2=iHigh(2);
   double high_3=iHigh(3);
   double low_0=iLow(0);
   double low_1=iLow(1);
   double low_2=iLow(2);
   double low_3=iLow(3);
   double close_1=iClose(1);
   double close_2=iClose(2);


ちょうど昨日も似たようなことを書きましたが、このように書きました。

ArraySetAsSeries(Tick,true);
if(CopyRates(dSymbol,0,1,3,Tick)<0) return;
  open1 = Tick[0].open;  open2 = Tick[1].open;  open3 = Tick[2].open;
  high1 = Tick[0].high;  high2 = Tick[1].high;  high3 = Tick[2].high;
  low1  = Tick[0].low;   low2  = Tick[1].low;   low3  = Tick[2].low;
  close1= Tick[0].close; close2= Tick[1].close; close3= Tick[2].close;


今日のことを見て、なんとなく自分の判断の正しさを疑うようになった。

質問:勉強中なので、どのオプションが良いですか?

 
Vitaly Muzichenko:

最後にもう一つ質問です。今日、コードベースで「マスター」のコードを見たので、これを使うのです。

   double open_1=iOpen(1);
   double open_2=iOpen(2);
   double high_0=iHigh(0);
   double high_1=iHigh(1);
   double high_2=iHigh(2);
   double high_3=iHigh(3);
   double low_0=iLow(0);
   double low_1=iLow(1);
   double low_2=iLow(2);
   double low_3=iLow(3);
   double close_1=iClose(1);
   double close_2=iClose(2);


ちょうど昨日も似たようなことを書きましたが、このように書きました。

ArraySetAsSeries(Tick,true);
if(CopyRates(dSymbol,0,1,3,Tick)<0) return;
  open1 = Tick[0].open;  open2 = Tick[1].open;  open3 = Tick[2].open;
  high1 = Tick[0].high;  high2 = Tick[1].high;  high3 = Tick[2].high;
  low1  = Tick[0].low;   low2  = Tick[1].low;   low3  = Tick[2].low;
  close1= Tick[0].close; close2= Tick[1].close; close3= Tick[2].close;


今日見て、なんとなく自分の判断の正しさを疑うようになった。

質問:勉強中なので、どのバリアントが良いのでしょうか?

この場合、実装はより高速に動作するはずです。コピーの呼び出しが少なくなるため、1つではなく3つの値を一度にコピーすることになります。

一度に1つの値を得るためにコードを変換することは誰も止めないが。

//+------------------------------------------------------------------+
//| Get Close for specified bar index                                |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  {
   if(symbol==NULL)
      symbol=Symbol();
   if(timeframe==0)
      timeframe=Period();
   double Close[1];
   double close=0;
   int copied=CopyClose(symbol,timeframe,index,1,Close);
   if(copied>0) close=Close[0];
   return(close);
  }

を、複数の値を一度に取得するためのコードに変換します。怠けているだけなんです :)

 
Vladimir Karputov:

この場合、実装はより高速に動作するはずです。コピーコールが少なくなるため、一度に1つの値ではなく、3つの値を一度にコピーすることになります。

一度に1つの値を得るためにコードを変換することは誰も止めないが。

//+------------------------------------------------------------------+
//| Get Close for specified bar index                                |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
  }

を、複数の値を一度に取得するためのコードに変換します。怠けているだけなんです :)

返信ありがとうございました

では、私が投稿した解決策を適用するのが良いのでしょうか? チェックが1回で済み、エラーにならないのでしょうか?

 
Vitaly Muzichenko:

返信ありがとうございました

つまり、私が投稿した解決策を適用するのが良いのでしょうか? 1回のチェックで十分であり、エラーは発生しないのでしょうか?

CopyRatesは 少なくとも2つのチェックが必要です。

  1. エラーチェック
  2. 関数が正しい値を返すかどうかをチェックする (3つ要求して2つしか返されなかったらどうするか)
また、非常に望ましいのは、ゴミの価格をチェックすること(価格の代わりに「0」を返す可能性もある)

 
Vitaly Muzichenko:

返信ありがとうございました

つまり、私が投稿した解決策を適用するのが良いのでしょうか? 1回のチェックで十分であり、エラーは発生しないのでしょうか?

あなたの解決策も最適とは言えません。なぜなら、すでに持っている配列の値で多くの変数を初期化しているからです。問題は、「なぜ?アレイのみ使用可能な場合とは?バーズと名付ければ、幸せになれる。

ArraySetAsSeries(Bars, true);
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...
 
Vasiliy Sokolov:

この解決策も最適とは言えません。なぜなら、すでに導き出された配列の値で変数の束を初期化しているからです。問題は、「なぜ?アレイのみ使用可能な場合とは?バーズと呼ぶだけで、幸せになれますよ。

ArraySetAsSeries(Bars, true);
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...

Barsと 呼ぶと、コンパイラが平手打ちをしてくれる。この構成を確認したのか、それともうまくいくはずだと思い込んでいるのか、私のやり方が間違っているのか。

 
Vitaly Muzichenko:

バーズと 呼ばれ、コンパイラは地獄のように叱られる。この設計をテストしたのか、それとも単にうまくいくはずだと思い込んでいるのか?

バー[]
理由: