MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 659 1...652653654655656657658659660661662663664665666...1953 新しいコメント Igor Makanu 2018.10.12 16:01 #6581 Roman Sharanov:また、CopyClose()の呼び出しが 多すぎるという重大な欠点も発見しました。 通貨ペアの配列からループで気配値をコピーする方法を教えてください。 それはダブル配列に見えるでしょう、だからMQLはそれをサポートしないのです、%のように。 MQL4は2次元の動的配列を扱うようです。 ArayResize()で1次元目を変更し、2次元目をCopyClose()に渡すとよいでしょう。 あるいは、MQL5では2次元の動的配列が動かないので、1次元の配列を構造体で包んで、その構造体の配列を作るという開発者の普遍的な解決策もありますが......。コツがつかめれば、ほぼクラスができたと考えてください。より最適なのは、データをロードしてクラスのプロパティ(フィールド)に格納するメソッドを持つクラスです。 Roman Sharanov 2018.10.12 16:56 #6582 Igor Makanu:MQL4では2次元の動的配列を扱うようですが、1次元目を変更するにはArayResize()、2次元目を変更するにはCopyClose() を使用します。 とか、MQL5では2次元の動的配列が動かないので、1次元の配列を構造体で包んで、その構造体の配列を作るとか、開発者の万能な解決策もありますが...。コツがつかめれば、ほぼクラスができたと考えてください。より最適なのは、データそのものをロードして、クラスのプロパティ(フィールド)に格納するメソッドを持つクラスです。ありがとうございます。 Roman Sharanov 2018.10.12 16:59 #6583 インジケーターについてもう一つ質問です、ここでは他にどうしたらいいかわかりません 入力したペアの終値とその移動平均の 差を表示したいのですが。 他にどうすればいいのかわからない。 #property copyright "Copyright 2018, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property indicator_separate_window #property indicator_buffers 4 #property indicator_plots 2 #property indicator_type1 DRAW_COLOR_LINE #property indicator_style1 STYLE_SOLID #property indicator_type2 DRAW_LINE #property indicator_style2 STYLE_SOLID #property indicator_width1 1 #include <MovingAverages.mqh> input string active_1 = "EURUSD"; input string active_2 = "USDJPY"; input ENUM_TIMEFRAMES timeframe = PERIOD_H1; input int ma_period = 30; double firstBuffer[], secondBuffer[], dataBuffer[], maBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0, dataBuffer, INDICATOR_DATA); SetIndexBuffer(1, maBuffer, INDICATOR_DATA); SetIndexBuffer(2, firstBuffer, INDICATOR_CALCULATIONS); SetIndexBuffer(3, secondBuffer, INDICATOR_CALCULATIONS); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- CopyClose(active_1,timeframe,0,rates_total,firstBuffer); CopyClose(active_2,timeframe,0,rates_total,secondBuffer); int first, bar; if(prev_calculated == 0) first = begin; else first = prev_calculated - 1; for(bar = first; bar<rates_total; bar++){ dataBuffer[bar] = firstBuffer[bar]-secondBuffer[bar]; } ExponentialMAOnBuffer(rates_total,prev_calculated,begin,ma_period,dataBuffer,maBuffer); //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+ Algotrader18 2018.10.12 17:59 #6584 Igor Makanu:注文はティック毎ではなく、ループで列挙されるべきです...。正確には、1ティックが来て、すべての注文がループでカウントされました:for(j=0;j<OrderTotal;j++) OrdersTotal() は、未決済の注文の数 (保留中の注文を 含む、すべてのシンボルの注文を含む) を表示します...合わせて...ターミナルで開いている注文の数-これが ))))です。 注文番号は配列のように0からOrdersTotal()-1まで、これが最後の注文で、おそらく存在しないチケット番号[OrdersTotal()]などの情報が刻々とジャーナルに表示されていると思いますが、これは推測が難しいですね。そうですね。そして、すべての注文を通せるようにしてほしいです。当初は少し変わった機能でしたが、原因を突き止めて修正できればと思い、できるだけ簡略化しました。完全な連続リトレースメントは、ティックが稀な場合か、私がEAをチャートから削除して新しいティックが入らなくなった後にのみ発生します。 EAが関数本体に入った場合、ループを抜けるまで他のティックに反応しないはずだとずっと思っていたのですが、そうではないようですね。この状況を打開するにはどうしたらいいのでしょうか? int test() { intの合計です。 total = OrdersTotal(); log("total = " + total +"; "); for (int j = 0; j < total; j++){ log("j = " + j +"; "); } return(0)です。} Algotrader18 2018.10.12 18:13 #6585 Андрей: なぜ、全注文の情報が1ティックごとに 必要なのでしょうか?1分おき、5分おき、...、1時間おきなど、表示順序に制限を設けた方が良いのでは?問題は、すべてのティックの情報が必要なわけでもなく、私の理解が正しければ、新しいティックが到着する前にループが終了する時間がなく、新しいティックが何らかの形でアカウントを壊してしまうことなのです。前回のスクリーンショットを探さなくてもいいように、もう一枚スクリーンショットを掲載します。EAが52までカウントアップし、93までジャンプしたことを示しています。新しいティックが原因とは考えにくかったのですが、稀なティックでは口座が正常に終了し、EAをチャートから削除した後の最後のサイクルも同様なので、他の理由を見つけることができません。 すでにコードは可能な限り簡略化しています。 int test() { intの合計です。 total = OrdersTotal(); log("total = " + total +"; "); for (int j = 0; j < total; j++){ log("j = " + j +"; "); } return(0)です。} ファイル: test.jpg 82 kb Algotrader18 2018.10.12 18:27 #6586 Artyom Trishkin:どうしてそう思うんですか?そ んなことはない。 そのティックの到着で開始したすべての計算が完了するまで、それ以降のティックはスキップ されます。すぐ上に書いたように、私も同じ状況ですが、ただ、すでにあるところまで単純化して、通常は計算をしないだけでなく、注文を一つ一つ調べて、その数字をログに出力すればよいという結論に達しました。 私も「ある刻みの到来を起点としたすべての計算が完了するまで、それ以降の刻みはスキップされる」と考えてきました。そうであればいいのですが、新しいダニ以外の理由はまだ見つかりません。 Algotrader18 2018.10.12 18:32 #6587 Artyom Trishkin:コードがなければ誰もわからない。以下は極端に簡略化したコードですが、同じ問題があります。新しいティックがあると、オーダー番号の連続出力が狂ってしまうのです。 int test(){ int total; total =OrdersTotal(); log("total = " + total +"; "); for (int j = 0; j <)total; j++){ log("j = " + j +";");} return(0);}. Alexey Viktorov 2018.10.12 18:35 #6588 Algotrader18:以下は、同じ問題を持つ極めて単純化されたコードです。新しい目盛りは、注文番号の順次出力を狂わせます。 int test() { intの合計です。 total = OrdersTotal(); log("total = " + total +"; "); for (int j = 0; j < total; j++){ log("j = " + j +"; "); } return(0)です。} このコードは本当にエラーなくコンパイルできるのでしょうか?信じられない... 削除済み 2018.10.12 18:40 #6589 Roman Sharanov:インジケーターについてもう一つ質問です、ここでは他にどうしたらいいかわかりません 入力したペアの終値とその移動平均の 差を表示したいのですが。 結局、MAを使わずに差分を表示するだけですが、何か問題があるのでしょうか? これはカッコイイ! ローマン! 例えば私は、20年の経験を持つトレーダーとして成功しています。 なぜ、「エントリーしたペアの終値と その移動平均 の差」が必要なのか理解できない。 さらに、この差分を移動平均にする方法をご存知でしょうか?- ファンタスティック! 単純に相場の移動平均を描けばいいのか?- また、違うのか? では、何が問題なのでしょうか? Igor Makanu 2018.10.12 19:19 #6590 Algotrader18:以下は、同じ問題を持つ極めて単純化されたコードです。新しい目盛りは、オーダー番号の順次出力を狂わせます。 int test() { intの合計です。 total = OrdersTotal(); log("total = " + total +"; "); for (int j = 0; j < total; j++){ log("j = " + j +"; "); } return(0)です。} このコードが機能するように、類推してやってください。 int NumberOfOrders(int magic_) { int i,res=0,k=OrdersTotal(); string sy=Symbol(); for(i=0; i<k; i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if((OrderMagicNumber()==magic_) && (OrderSymbol()==sy)) res++; } } return(res); } 1...652653654655656657658659660661662663664665666...1953 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
また、CopyClose()の呼び出しが 多すぎるという重大な欠点も発見しました。
通貨ペアの配列からループで気配値をコピーする方法を教えてください。
それはダブル配列に見えるでしょう、だからMQLはそれをサポートしないのです、%のように。
MQL4は2次元の動的配列を扱うようです。 ArayResize()で1次元目を変更し、2次元目をCopyClose()に渡すとよいでしょう。
あるいは、MQL5では2次元の動的配列が動かないので、1次元の配列を構造体で包んで、その構造体の配列を作るという開発者の普遍的な解決策もありますが......。コツがつかめれば、ほぼクラスができたと考えてください。より最適なのは、データをロードしてクラスのプロパティ(フィールド)に格納するメソッドを持つクラスです。MQL4では2次元の動的配列を扱うようですが、1次元目を変更するにはArayResize()、2次元目を変更するにはCopyClose() を使用します。
とか、MQL5では2次元の動的配列が動かないので、1次元の配列を構造体で包んで、その構造体の配列を作るとか、開発者の万能な解決策もありますが...。コツがつかめれば、ほぼクラスができたと考えてください。より最適なのは、データそのものをロードして、クラスのプロパティ(フィールド)に格納するメソッドを持つクラスです。ありがとうございます。
インジケーターについてもう一つ質問です、ここでは他にどうしたらいいかわかりません
入力したペアの終値とその移動平均の 差を表示したいのですが。
他にどうすればいいのかわからない。
注文はティック毎ではなく、ループで列挙されるべきです...。正確には、1ティックが来て、すべての注文がループでカウントされました:for(j=0;j<OrderTotal;j++)
OrdersTotal() は、未決済の注文の数 (保留中の注文を 含む、すべてのシンボルの注文を含む) を表示します...合わせて...ターミナルで開いている注文の数-これが ))))です。
注文番号は配列のように0からOrdersTotal()-1まで、これが最後の注文で、おそらく存在しないチケット番号[OrdersTotal()]などの情報が刻々とジャーナルに表示されていると思いますが、これは推測が難しいですね。
そうですね。そして、すべての注文を通せるようにしてほしいです。当初は少し変わった機能でしたが、原因を突き止めて修正できればと思い、できるだけ簡略化しました。完全な連続リトレースメントは、ティックが稀な場合か、私がEAをチャートから削除して新しいティックが入らなくなった後にのみ発生します。
EAが関数本体に入った場合、ループを抜けるまで他のティックに反応しないはずだとずっと思っていたのですが、そうではないようですね。この状況を打開するにはどうしたらいいのでしょうか?
int test()
{
intの合計です。
total = OrdersTotal();
log("total = " + total +"; ");
for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0)です。
}
なぜ、全注文の情報が1ティックごとに 必要なのでしょうか?1分おき、5分おき、...、1時間おきなど、表示順序に制限を設けた方が良いのでは?
問題は、すべてのティックの情報が必要なわけでもなく、私の理解が正しければ、新しいティックが到着する前にループが終了する時間がなく、新しいティックが何らかの形でアカウントを壊してしまうことなのです。前回のスクリーンショットを探さなくてもいいように、もう一枚スクリーンショットを掲載します。EAが52までカウントアップし、93までジャンプしたことを示しています。新しいティックが原因とは考えにくかったのですが、稀なティックでは口座が正常に終了し、EAをチャートから削除した後の最後のサイクルも同様なので、他の理由を見つけることができません。
すでにコードは可能な限り簡略化しています。
int test()
{
intの合計です。
total = OrdersTotal();
log("total = " + total +"; ");
for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0)です。
}
どうしてそう思うんですか?そ んなことはない。
そのティックの到着で開始したすべての計算が完了するまで、それ以降のティックはスキップ されます。
すぐ上に書いたように、私も同じ状況ですが、ただ、すでにあるところまで単純化して、通常は計算をしないだけでなく、注文を一つ一つ調べて、その数字をログに出力すればよいという結論に達しました。
私も「ある刻みの到来を起点としたすべての計算が完了するまで、それ以降の刻みはスキップされる」と考えてきました。そうであればいいのですが、新しいダニ以外の理由はまだ見つかりません。
コードがなければ誰もわからない。
以下は極端に簡略化したコードですが、同じ問題があります。新しいティックがあると、オーダー番号の連続出力が狂ってしまうのです。
int test()
{
int total;
total =OrdersTotal();
log("total = " + total +"; ");
for (int j = 0; j <)total; j++)
{
log("j = " + j +";");
}
return(0);
}.
以下は、同じ問題を持つ極めて単純化されたコードです。新しい目盛りは、注文番号の順次出力を狂わせます。
int test()
{
intの合計です。
total = OrdersTotal();
log("total = " + total +"; ");
for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0)です。
}
インジケーターについてもう一つ質問です、ここでは他にどうしたらいいかわかりません
入力したペアの終値とその移動平均の 差を表示したいのですが。
結局、MAを使わずに差分を表示するだけですが、何か問題があるのでしょうか?
これはカッコイイ!
ローマン!
例えば私は、20年の経験を持つトレーダーとして成功しています。
なぜ、「エントリーしたペアの終値と その移動平均 の差」が必要なのか理解できない。
さらに、この差分を移動平均にする方法をご存知でしょうか?- ファンタスティック!
単純に相場の移動平均を描けばいいのか?- また、違うのか?
では、何が問題なのでしょうか?
以下は、同じ問題を持つ極めて単純化されたコードです。新しい目盛りは、オーダー番号の順次出力を狂わせます。
int test()
{
intの合計です。
total = OrdersTotal();
log("total = " + total +"; ");
for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0)です。
}
このコードが機能するように、類推してやってください。