事前計算された - ページ 6 1234567891011121314 新しいコメント Dmitry Fedoseev 2016.10.18 17:03 #51 ただ、アイアンを刺すのはやめましょう。 Vladimir Karputov 2016.10.18 17:09 #52 Alexey Viktorov: これはドキュメントに書かれていないことです。結果的に、これは自由なテーマでのエッセイとなった。ちょうど、自動初期化についての私の発言と同じで、さらにクールです。少なくとも私のは免責事項が書かれていた...。ドキュメントにすべてを記述することは不可能です。 prev_calculate==0 "の場合 -インジケータバッファ 全体を通過する必要があることを意味します。prev_calculate!=0 "の場合、右端のバーまたはいくつかの新しいバーだけが計算されます(ここではlimitを 使用します)。 const int &spread[]) {//--- if(prev_calculated==0) { Print("prev_calculated==0"); for(int i=0;i<rates_total;i++) { //--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) ) } return(rates_total); }//--- экономный пересчёт только самого правого бара или новых баров int limit=rates_total-prev_calculated+1;//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров for(int i=0;i<limit;i++) { ExtBuffer[i]=чевой-то там; } prev_calculated MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 Any questions from newcomers Alexey Viktorov 2016.10.18 17:21 #53 Karputov Vladimir:ドキュメントにすべてを記述することは不可能です。 prev_calculate==0 "の場合 -インジケータバッファ 全体を通過する必要があることを意味します。prev_calculate!=0 "の場合、右端のバーまたはいくつかの新しいバーだけが計算されます(ここではlimitを 使用します)。 const int &spread[]) {//--- if(prev_calculated==0) { Print("prev_calculated==0"); for(int i=0;i<rates_total;i++) { //--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) ) } return(rates_total); }//--- экономный пересчёт только самого правого бара или новых баров int limit=rates_total-prev_calculated+1;//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров for(int i=0;i<limit;i++) { ExtBuffer[i]=чевой-то там; }その価値とは?一番右のバー以外の値は必要ない。しかし!!!そして、この一番右のものが左に移動したときに、このデータを保存しなければならない......。バッファを全部書く必要はありませんが、私の希望を考慮して1つだけ書いてください。初回実行の場合は、すべての履歴が空のはずです。履歴のスワップの結果、prev_calculatedがリセットされた場合、バッファに入れられたすべての ものは変更されないままでなければなりません。たとえ、穴があっても。 Alexey Viktorov 2016.10.18 17:26 #54 Karputov Vladimir:予備的な結論1.インジケータは、OnInit()におけるインジケータ・アレイの初期 化に依存することはできません。//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+int OnInit() {//--- indicator buffers mapping... ArrayInitialize(balance, 0.0); // принудительная ArrayInitialize(equityMax, 0.0); // инициализация ArrayInitialize(equityMaxB, 0.0); // всех ArrayInitialize(equityMin, 0.0); // буферов ArrayInitialize(equityMinB, 0.0); // индикатора...//--- return(INIT_SUCCEEDED); }2.インジケータでは、OnCalculate()で配列全体または変更された要素のみを通過させることが義務付けられています。 何をバカなことを言ってるんだ?この初期化をOnCalculateで 実装すると、ループなしで初期化されます。しかし、prev_calculatedとすると、作業中に蓄積されたデータをすべてクリアしてしまう...。 Vladimir Karputov 2016.10.18 17:53 #55 Alexey Viktorov: なぜ、くだらないことを言うのですか?この初期化をOnCalculateに入れると、何のサイクルもなくゼロになる。しかし、prev_calculatedをゼロにすると、演算中に蓄積されたデータがすべてクリアされてしまう...。 表現でお願いします。And look at examples of indicators from standard delivery: Data Catalogue (データカタログ), DataMQL5 Indicators (インジケーター), DataExamples. Vladimir Karputov 2016.10.18 18:00 #56 Alexey Viktorov:価値ってなんだ?一番右のバー以外の値は必要ない。しかし!!!そして、この一番右のものが左に移動したときに、そのデータを保存する必要がある...。...すでに方法は提案しています。 トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム 事前計算された カルプトフ ウラジミール, 2016.10.18 15:11 返信が遅くなり申し訳ございません。ある時間枠の計算値を保存する唯一の方法は、ファイルに保存することです。ファイルから読み込むときに、データがそれぞれのバーに配置されるように、同期を取る必要があります。最も論理的な方法は、バーのオープン 時間と同期させることですが、ニュアンスが異なる場合があります。例えば、バーのオープン時間(ファイルに保存)は2016.09.05. 25:02 でしたが、現在チャートには2016.09.05. 25:01 と同じ時間のバーが表示されています。インジケータはデータベースやリポジトリではありません。 したがって、インジケータがその後にヒストリー上で計算できないデータを表示する場合、インジケータバッファをファイルに保存し、(ヒストリースワップの場合)そのファイルとバーを読み込んで同期させるだけでよいのです。 Alexey Viktorov 2016.10.18 18:06 #57 Karputov Vladimir:すでに方法は提案しています。インジケータはデータベースやリポジトリではありません。 したがって、インジケータがデータを表示し、その後ヒストリー上で計算できない場合は、インジケータのバッファをファイルに保存し、(ヒストリースワップの場合)読み込みを実行してファイルとバーを同期させるだけでよいのです。アレクセイ・ヴィクトロフ...で、できればファイルに書き込まず、さらにGVにも書き込まない。 prev_calculated www.mql5.com Форум трейдеров MQL5.community Alexander Puzanov 2016.10.18 18:13 #58 Vladimirさん、このトピックはprev_calculatedに特化しているので、このトピックに役立つようにしてください。まず、この変数で通常発生する問題を指定する必要があります。これらの問題に馴染みのない方のために、定式化します。---a -- ヘルプに書いてあるにもかかわらずprev_calculated // обработано баров на предыдущем вызове理由は(ヘルプに書いてある+開発者に聞いた)、チェックサムが変わると変数がゼロにリセットされるからで、通常はヒストリースワップが原因です。---b - 最初のonCalculate の実行 フラグとして prev_calculated == 0 を使用することもできません。同じ理由で---c - また、prev_calculated == 0 をヒストリのページングフラグとして使用することはできません。---ユーザーへの負担を減らすため、表現は簡潔かつ明確であるべきです。現在のOnCalculateの呼び出しで履歴ページングが起こっていない場合、prev_calculatedは前の呼び出しで処理されたバーの数を含んで います。発生した場合 - ゼロにリセットされます---この3つの問題は、松葉杖で解決することができます。しかし、MT5は定義上、松葉杖を持つことができないので、ウラジミールさん、この3つの問題に対して魅力的な解決策を作っていただけませんか?ブサイクはこんな感じ。#property indicator_chart_window#property indicator_buffers 0#property indicator_plots 0struct BROWNIE { int i_Prew_Calculated; // кол-во посчитанных баров bool b_First_Run; // флаг первого запуска bool b_History_Updated; // флаг обновления истории BROWNIE() { i_Prew_Calculated = WRONG_VALUE; b_First_Run = true; b_History_Updated = false; } void f_Reset(bool b_Reset_First_Run = true) { i_Prew_Calculated = WRONG_VALUE; if(b_Reset_First_Run) b_First_Run = true; b_History_Updated = false; } void f_Update(int i_New_Prew_Calculated = WRONG_VALUE) { if(i_New_Prew_Calculated > -1) { b_History_Updated = i_New_Prew_Calculated == 0 && i_Prew_Calculated > WRONG_VALUE; if(b_First_Run) b_First_Run = false; if(i_Prew_Calculated == WRONG_VALUE) i_Prew_Calculated = i_New_Prew_Calculated; else if(i_New_Prew_Calculated > 0) i_Prew_Calculated = i_New_Prew_Calculated; } }}; BROWNIE go_Brownie;int OnInit(void) {return(INIT_SUCCEEDED);}void OnDeinit(const int reason) { go_Brownie.f_Reset(reason != REASON_CHARTCHANGE);}int OnCalculate(const int rates_total, const int prev_calculated, const datetime &Time[], const double &Open[], const double &High[], const double &Low[], const double &Close[], const long &TickVolume[], const long &Volume[], const int &Spread[]) { if(go_Brownie.b_First_Run) {/* обработка 1го запуска */} if(go_Brownie.b_History_Updated) {/* обработка обновления истории */} go_Brownie.f_Update(prev_calculated); return(rates_total);}免責事項:コード - 単なるアイデアであり、チャートで試したわけではありません。OnDeinitには、バッファを使用しないインジケータの処理サンプルがあり、TFやシンボルを気にせず、TF/シンボルが変わるたびに、ゼロから始める必要がありません。例えば、既存のグラフィック要素と連動し、アカウントの状態や注文などの情報を出力します。---ちなみにKarputov Vladimir:もし、インジケーターバッファをファイルに保存し、(ヒストリー読み込みの場合)ファイルとバーを読み込んで同期させる必要があるとしたら、どうすればよいでしょうか。 ディスクを破棄しなくても、チャートアイテムに保存することができます prev_calculated エラー、バグ、質問 mt5のObjectDeleteにはバグがあるのでしょうか? Konstantin Gruzdev 2016.10.18 18:19 #59 Alexey Viktorov:...で、できればファイルや、さらに言えばGVに書き込まないで欲しい。それで いいのでしょうか? Alexey Viktorov 2016.10.18 18:42 #60 Konstantin Gruzdev: もしかしたら、これが お似合いかも?詳しくは書きませんでしたが、これはこの行で解決します。配列をインデックスシフトして自分自身にコピーする。double arr[5];ArrayCopy(arr, arr, 0, 1, 4);// и дальнейшее заполнение 4го индекса массива. 逆にして、ゼロのインデックスからコピーして、最初のインデックスからペーストしてもよい。すると、配列の0番目のインデックスが埋められます。そして、これは全く別物です...)) 1234567891011121314 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
これはドキュメントに書かれていないことです。結果的に、これは自由なテーマでのエッセイとなった。ちょうど、自動初期化についての私の発言と同じで、さらにクールです。少なくとも私のは免責事項が書かれていた...。
ドキュメントにすべてを記述することは不可能です。
prev_calculate==0 "の場合 -インジケータバッファ 全体を通過する必要があることを意味します。prev_calculate!=0 "の場合、右端のバーまたはいくつかの新しいバーだけが計算されます(ここではlimitを 使用します)。
{
//---
if(prev_calculated==0)
{
Print("prev_calculated==0");
for(int i=0;i<rates_total;i++)
{
//--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
}
return(rates_total);
}
//--- экономный пересчёт только самого правого бара или новых баров
int limit=rates_total-prev_calculated+1;
//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров
for(int i=0;i<limit;i++)
{
ExtBuffer[i]=чевой-то там;
}
ドキュメントにすべてを記述することは不可能です。
prev_calculate==0 "の場合 -インジケータバッファ 全体を通過する必要があることを意味します。prev_calculate!=0 "の場合、右端のバーまたはいくつかの新しいバーだけが計算されます(ここではlimitを 使用します)。
{
//---
if(prev_calculated==0)
{
Print("prev_calculated==0");
for(int i=0;i<rates_total;i++)
{
//--- здесь принудительно каждому элементу массива присваиваем значение (мне лень писать эти массивы :) )
}
return(rates_total);
}
//--- экономный пересчёт только самого правого бара или новых баров
int limit=rates_total-prev_calculated+1;
//--- а ниже нужно использовать цикл для обсчета самого правого бара или новых баров
for(int i=0;i<limit;i++)
{
ExtBuffer[i]=чевой-то там;
}
その価値とは?一番右のバー以外の値は必要ない。しかし!!!そして、この一番右のものが左に移動したときに、このデータを保存しなければならない......。
バッファを全部書く必要はありませんが、私の希望を考慮して1つだけ書いてください。初回実行の場合は、すべての履歴が空のはずです。履歴のスワップの結果、prev_calculatedがリセットされた場合、バッファに入れられたすべての ものは変更されないままでなければなりません。たとえ、穴があっても。
予備的な結論
なぜ、くだらないことを言うのですか?この初期化をOnCalculateに入れると、何のサイクルもなくゼロになる。しかし、prev_calculatedをゼロにすると、演算中に蓄積されたデータがすべてクリアされてしまう...。
価値ってなんだ?一番右のバー以外の値は必要ない。しかし!!!そして、この一番右のものが左に移動したときに、そのデータを保存する必要がある...。
...
すでに方法は提案しています。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
事前計算された
カルプトフ ウラジミール, 2016.10.18 15:11
返信が遅くなり申し訳ございません。ある時間枠の計算値を保存する唯一の方法は、ファイルに保存することです。ファイルから読み込むときに、データがそれぞれのバーに配置されるように、同期を取る必要があります。最も論理的な方法は、バーのオープン 時間と同期させることですが、ニュアンスが異なる場合があります。例えば、バーのオープン時間(ファイルに保存)は2016.09.05. 25:02 でしたが、現在チャートには2016.09.05. 25:01 と同じ時間のバーが表示されています。インジケータはデータベースやリポジトリではありません。
したがって、インジケータがその後にヒストリー上で計算できないデータを表示する場合、インジケータバッファをファイルに保存し、(ヒストリースワップの場合)そのファイルとバーを読み込んで同期させるだけでよいのです。すでに方法は提案しています。
インジケータはデータベースやリポジトリではありません。
したがって、インジケータがデータを表示し、その後ヒストリー上で計算できない場合は、インジケータのバッファをファイルに保存し、(ヒストリースワップの場合)読み込みを実行してファイルとバーを同期させるだけでよいのです。...で、できればファイルに書き込まず、さらにGVにも書き込まない。
Vladimirさん、このトピックはprev_calculatedに特化しているので、このトピックに役立つようにしてください。まず、この変数で通常発生する問題を指定する必要があります。これらの問題に馴染みのない方のために、定式化します。
---
a -- ヘルプに書いてあるにもかかわらず
理由は(ヘルプに書いてある+開発者に聞いた)、チェックサムが変わると変数がゼロにリセットされるからで、通常はヒストリースワップが原因です。
---
b - 最初のonCalculate の実行 フラグとして prev_calculated == 0 を使用することもできません。同じ理由で
---
c - また、prev_calculated == 0 をヒストリのページングフラグとして使用することはできません。
---
ユーザーへの負担を減らすため、表現は簡潔かつ明確であるべきです。現在のOnCalculateの呼び出しで履歴ページングが起こっていない場合、prev_calculatedは前の呼び出しで処理されたバーの数を含んで います。発生した場合 - ゼロにリセットされます
---
この3つの問題は、松葉杖で解決することができます。しかし、MT5は定義上、松葉杖を持つことができないので、ウラジミールさん、この3つの問題に対して魅力的な解決策を作っていただけませんか?ブサイクはこんな感じ。
#property indicator_buffers 0
#property indicator_plots 0
struct BROWNIE {
int i_Prew_Calculated; // кол-во посчитанных баров
bool b_First_Run; // флаг первого запуска
bool b_History_Updated; // флаг обновления истории
BROWNIE() {
i_Prew_Calculated = WRONG_VALUE;
b_First_Run = true;
b_History_Updated = false;
}
void f_Reset(bool b_Reset_First_Run = true) {
i_Prew_Calculated = WRONG_VALUE;
if(b_Reset_First_Run) b_First_Run = true;
b_History_Updated = false;
}
void f_Update(int i_New_Prew_Calculated = WRONG_VALUE) {
if(i_New_Prew_Calculated > -1) {
b_History_Updated = i_New_Prew_Calculated == 0 && i_Prew_Calculated > WRONG_VALUE;
if(b_First_Run) b_First_Run = false;
if(i_Prew_Calculated == WRONG_VALUE) i_Prew_Calculated = i_New_Prew_Calculated;
else if(i_New_Prew_Calculated > 0) i_Prew_Calculated = i_New_Prew_Calculated;
}
}
};
BROWNIE go_Brownie;
int OnInit(void) {return(INIT_SUCCEEDED);}
void OnDeinit(const int reason) {
go_Brownie.f_Reset(reason != REASON_CHARTCHANGE);
}
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &Time[],
const double &Open[],
const double &High[],
const double &Low[],
const double &Close[],
const long &TickVolume[],
const long &Volume[],
const int &Spread[]
) {
if(go_Brownie.b_First_Run) {/* обработка 1го запуска */}
if(go_Brownie.b_History_Updated) {/* обработка обновления истории */}
go_Brownie.f_Update(prev_calculated);
return(rates_total);
}
免責事項:コード - 単なるアイデアであり、チャートで試したわけではありません。
OnDeinitには、バッファを使用しないインジケータの処理サンプルがあり、TFやシンボルを気にせず、TF/シンボルが変わるたびに、ゼロから始める必要がありません。例えば、既存のグラフィック要素と連動し、アカウントの状態や注文などの情報を出力します。
---
ちなみに
もし、インジケーターバッファをファイルに保存し、(ヒストリー読み込みの場合)ファイルとバーを読み込んで同期させる必要があるとしたら、どうすればよいでしょうか。
...で、できればファイルや、さらに言えばGVに書き込まないで欲しい。
もしかしたら、これが お似合いかも?
詳しくは書きませんでしたが、これはこの行で解決します。配列をインデックスシフトして自分自身にコピーする。
ArrayCopy(arr, arr, 0, 1, 4);
// и дальнейшее заполнение 4го индекса массива.