MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 659

 
Roman Sharanov:

また、CopyClose()の呼び出しが 多すぎるという重大な欠点も発見しました。

通貨ペアの配列からループで気配値をコピーする方法を教えてください。

それはダブル配列に見えるでしょう、だからMQLはそれをサポートしないのです、%のように。

MQL4は2次元の動的配列を扱うようです。 ArayResize()で1次元目を変更し、2次元目をCopyClose()に渡すとよいでしょう。

あるいは、MQL5では2次元の動的配列が動かないので、1次元の配列を構造体で包んで、その構造体の配列を作るという開発者の普遍的な解決策もありますが......。コツがつかめれば、ほぼクラスができたと考えてください。より最適なのは、データをロードしてクラスのプロパティ(フィールド)に格納するメソッドを持つクラスです。
 
Igor Makanu:

MQL4では2次元の動的配列を扱うようですが、1次元目を変更するにはArayResize()、2次元目を変更するにはCopyClose() を使用します。

とか、MQL5では2次元の動的配列が動かないので、1次元の配列を構造体で包んで、その構造体の配列を作るとか、開発者の万能な解決策もありますが...。コツがつかめれば、ほぼクラスができたと考えてください。より最適なのは、データそのものをロードして、クラスのプロパティ(フィールド)に格納するメソッドを持つクラスです。

ありがとうございます。

 

インジケーターについてもう一つ質問です、ここでは他にどうしたらいいかわかりません

入力したペアの終値とその移動平均の 差を表示したいのですが。

他にどうすればいいのかわからない。

#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);
  }
//+------------------------------------------------------------------+
 
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)です。
}

 
Андрей:
なぜ、全注文の情報が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
 
Artyom Trishkin:

どうしてそう思うんですか?そ んなことはない。

そのティックの到着で開始したすべての計算が完了するまで、それ以降のティックはスキップ されます。

すぐ上に書いたように、私も同じ状況ですが、ただ、すでにあるところまで単純化して、通常は計算をしないだけでなく、注文を一つ一つ調べて、その数字をログに出力すればよいという結論に達しました。

私も「ある刻みの到来を起点としたすべての計算が完了するまで、それ以降の刻みはスキップされる」と考えてきました。そうであればいいのですが、新しいダニ以外の理由はまだ見つかりません。

 
Artyom Trishkin:

コードがなければ誰もわからない。

以下は極端に簡略化したコードですが、同じ問題があります。新しいティックがあると、オーダー番号の連続出力が狂ってしまうのです。

int test()
{
int total;
total =OrdersTotal();
log("total = " + total +"; ");

for (int j = 0; j <)total; j++)
{
log("j = " + j +";");
}
return(0);
}.

 
Algotrader18:

以下は、同じ問題を持つ極めて単純化されたコードです。新しい目盛りは、注文番号の順次出力を狂わせます。

int test()
{
intの合計です。
total = OrdersTotal();
log("total = " + total +"; ");

for (int j = 0; j < total; j++)
{
log("j = " + j +"; ");
}
return(0)です。
}

このコードは本当にエラーなくコンパイルできるのでしょうか?信じられない...
 
Roman Sharanov:

インジケーターについてもう一つ質問です、ここでは他にどうしたらいいかわかりません

入力したペアの終値とその移動平均の 差を表示したいのですが。

結局、MAを使わずに差分を表示するだけですが、何か問題があるのでしょうか?

これはカッコイイ!

ローマン!

例えば私は、20年の経験を持つトレーダーとして成功しています。

なぜ、「エントリーしたペアの終値と その移動平均 の差」が必要なのか理解できない。

さらに、この差分を移動平均にする方法をご存知でしょうか?- ファンタスティック!

単純に相場の移動平均を描けばいいのか?- また、違うのか?

では、何が問題なのでしょうか?

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