Данная статья, построенная в форме справочника по функциям MQL4, призвана помочь переходу с MQL4 на MQL5. Для каждой функции языка MQL4 приведено описание и представлен способ ее реализации на MQL5, что позволит вам значительно ускорить перевод своих программ с MQL4 на MQL5. Для удобства функции разбиты на группы, как в документации по MQL4.
//+------------------------------------------------------------------+ //| Get Close for specified bar index | //+------------------------------------------------------------------+ doubleiClose(constint index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) { if(symbol==NULL) symbol=Symbol(); if(timeframe==0) timeframe=Period(); doubleClose[1]; double close=0; int copied=CopyClose(symbol,timeframe,index,1,Close); if(copied>0) close=Close[0]; return(close); }
//+------------------------------------------------------------------+ //| Get Close for specified bar index | //+------------------------------------------------------------------+ doubleiClose(constint index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT) }
なんとなく(@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);
}
//+------------------------------------------------------------------+
正直なところ、確認していないんですよねー。チェックして結果を書いてください。
私の解決策が「より簡単」かどうかは分かりませんが、こちらをお試しください: https://www.mql5.com/ru/forum/160945#comment_4053382
言語には標準的な 機能がなく、みんなが自分で自転車を組み立てて、その性能を 測らなければならないのでしょうか。
これ以外は見つかったようですが、いろいろな解決策を見てみると、「誰が何をできるのか」ということが明らかになりました。
言語には標準的な 機能がなく、みんなが自分で自転車を組み立てて、その性能を 測らなければならないのでしょうか。
これ以外は見つかったようですが、いろいろな解決策を見ていると、「誰が何をできるのか」ということになりそうです。
最後にもう一つ質問です。今日、コードベースで「マスター」のコードを見たので、これを使うのです。
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);
ちょうど昨日も似たようなことを書きましたが、このように書きました。
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;
今日のことを見て、なんとなく自分の判断の正しさを疑うようになった。
質問:勉強中なので、どのオプションが良いですか?
最後にもう一つ質問です。今日、コードベースで「マスター」のコードを見たので、これを使うのです。
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);
ちょうど昨日も似たようなことを書きましたが、このように書きました。
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);
}
を、複数の値を一度に取得するためのコードに変換します。怠けているだけなんです :)
この場合、実装はより高速に動作するはずです。コピーコールが少なくなるため、一度に1つの値ではなく、3つの値を一度にコピーすることになります。
一度に1つの値を得るためにコードを変換することは誰も止めないが。
//| Get Close for specified bar index |
//+------------------------------------------------------------------+
double iClose(const int index,string symbol=NULL,ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT)
}
を、複数の値を一度に取得するためのコードに変換します。怠けているだけなんです :)
返信ありがとうございました
では、私が投稿した解決策を適用するのが良いのでしょうか? チェックが1回で済み、エラーにならないのでしょうか?
返信ありがとうございました
つまり、私が投稿した解決策を適用するのが良いのでしょうか? 1回のチェックで十分であり、エラーは発生しないのでしょうか?
CopyRatesは 少なくとも2つのチェックが必要です。
返信ありがとうございました
つまり、私が投稿した解決策を適用するのが良いのでしょうか? 1回のチェックで十分であり、エラーは発生しないのでしょうか?
あなたの解決策も最適とは言えません。なぜなら、すでに持っている配列の値で多くの変数を初期化しているからです。問題は、「なぜ?アレイのみ使用可能な場合とは?バーズと名付ければ、幸せになれる。
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...
この解決策も最適とは言えません。なぜなら、すでに導き出された配列の値で変数の束を初期化しているからです。問題は、「なぜ?アレイのみ使用可能な場合とは?バーズと呼ぶだけで、幸せになれますよ。
if(CopyRates(Symbol(), 0, 1, 3, Bars)<0) return;
double value = Bars[0].open;
...
Barsと 呼ぶと、コンパイラが平手打ちをしてくれる。この構成を確認したのか、それともうまくいくはずだと思い込んでいるのか、私のやり方が間違っているのか。
バーズと 呼ばれ、コンパイラは地獄のように叱られる。この設計をテストしたのか、それとも単にうまくいくはずだと思い込んでいるのか?