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

 
trader781:

では、前回の質問にお答えください。

1)構造体の配列を書き込む

2)他機能への移管

3) 構造体配列の要素の 取得と比較

4) 構造体の配列を印刷する

それをコードで書くことで、どのような形にしなければならないかを理解することが重要なのです。

すべては、目の前の課題次第です。タスクはいくらでも変えられるので、何を示すべきでしょうか。

まあ、書いても無駄だし、書いたものは四角いし。しかも、穴の形は三角形。その時、四角いものはどこに置けばいいのか?

 
Artyom Trishkin:

すべては、目の前の課題次第です。タスクはいくらでもあるので、何を見せるべきでしょうか。

まあ、書くよ、時間の無駄だけど、書いたものは四角いんだ。しかも、穴の形は三角形。その時、四角いものはどこに置けばいいのか?

は、ポスト699と約を取りましょう。

これを他の関数に渡して,構造体の要素を前のものと比較する方法

ということで、任意のオーダーを順番に取り込んで、すべての値をprintに出力することができます。

違いは、数字でないことと、記録のルールが違うことです。

 
trader781:

は、ポスト699と約を取りましょう。

これを他の関数に渡して,構造体要素を以前のものと比較する方法

というように、任意の順序を順番に取って、すべての値を印刷することができます。

違いは、数字でないことと、異なる書き方のルールが適用されることです。

必要なオーダーをすべてループさせる必要があります。

次に必要な順番が決まったら、配列を1つ増やし、その新しいセルにその順番のデータをすべて記録する。配列のセル自体には、注文のオープン時間(クローズした注文を検索する場合は、クローズ時間)が入ります。残りのデータは、構造体のフィールドに書き込んでください。

ループが終了したら、配列の値の昇順に並べ替える。

まずこれをやってください。あとは、さらに議論してください。

 
Vitalie Postolache:

これは、1サイクルで解決できる問題ではありません。

ありがとうございます。

 
Artyom Trishkin:
//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
struct myorder
  {
   int               Ticket;
   double            orderopenprice;
   int               ordertype;
   double            profit;
   double            stoploss;
   double            lot;
  };
myorder orders[][5];

int    i;
int    Magic=444;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   CalcOrders();

  }
//+------------------------------------------------------------------+
void CalcOrders()
  {
   int count1=-1;
   ArrayResize(orders,AccountInfoInteger(ACCOUNT_LIMIT_ORDERS),10);
   for(i=OrdersTotal()-1; i>=0; i--)
     {
      if((OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) && (OrderSymbol()==Symbol())
         && (OrderMagicNumber()==Magic) && (OrderType()<2))
        {
         count1++;
         orders[count1][0].Ticket=OrderTicket();
         orders[count1][1].lot=OrderLots();
         orders[count1][2].orderopenprice=OrderOpenPrice();
         orders[count1][3].ordertype=OrderType();
         orders[count1][4].profit=OrderProfit();
         orders[count1][5].stoploss=OrderStopLoss();
        }

     }
   ArraySort(orders,WHOLE_ARRAY,0,MODE_ASCEND);

  }
//+------------------------------------------------------------------+
ファイル:
test.mq4  3 kb
 
trader781:

あなたの投稿にあなたのコードを入れました。

さて、整理を始めると

  1. 構造体の配列を多次元配列にしたのはなぜですか?
  2. 関数CalcOrders()の構造体配列のサイズを「保留中の注文の最大許容数」に変更したのはなぜですか?ヘルプを開くと(常にそうすべきですが)、この識別子(ACCOUNT_LIMIT_ORDERS)がゼロを返すことがあり、これは、保留中の 注文の数に制限がないことを意味します。ループの前に配列のサイズを0にする必要があります。
  3. ループの中で配列のサイズを大きくしていないのはなぜですか?
 
Artyom Trishkin:

あなたの投稿にあなたのコードを入れました。

さて、整理を始めると

  1. なぜ、構造体の配列を多次元配列にしたのですか?
  2. CalcOrders()関数の構造体配列のサイズを「有効な保留注文の最大許容 数」に変更するのはなぜですか?ヘルプを開くと(常にそうすべきですが)、この識別子(ACCOUNT_LIMIT_ORDERS)がゼロを返すことがあり、これは、保留中の 注文の数に制限がないことを意味します。ループの前に配列のサイズを0にする必要があります。
  3. ループの中で配列のサイズを大きくしていないのはなぜですか?

1) 与えられた課題に対して、X次Y次パラメータ番号がより適切であると考えた

2) 口座の種類によって50か100に等しくしており、他には何もしていません。

3)count1++; が通過するたびに増加し,配列がその値を獲得 するようにする。

 
trader781:

1) このタスクにはX次Y次パラメータ番号がより適切であると考えた

2) 口座の種類によって50または100に等しく、それ以外のものはない。

3)count1++; が通過するたびに増加し,配列がその値を獲得 するようにする。

1.それでは、どのような仕組みになっているのでしょうか?

2.このパラメータは、「何が行ったか、何が行われたか」のマーケットポジションの配列に必要です...ループ前の配列のサイズは0 でなければならない。

3.そうなんです。配列の先頭のサイズは0です。新しい注文が見つかるたびに、配列は必要な注文の数と同じ大きさになります。

 
Artyom Trishkin:

1)それでは、どのような仕組みになっているのでしょうか。

2.このパラメータは、マーケットポジションの配列「何が行き、何が去ったのか」に必要です。ループ前の配列のサイズは0 でなければならない。

3.そうなんです。配列の先頭のサイズは0です。新しい注文が見つかるたびに、配列は必要な注文の数と同じ大きさになります。

1) 2次元目を入れないとコンパイラが文句を言い、「クラス型を指定してください、パラメータが不明です」とすぐにポップアップする

2) 起動時に「critical error array out of range」と表示され、ロボットが即死する。

3) setint count1=-1; で、ループを 抜ける。どうしたんですか?

 
trader781:

1) 2次元目が設定されていない場合、コンパイラは文句を言います。

2) その場合、ボットは起動時に "critical error array out of range" と表示されて即死します。

3) just setint count1=-1; ここで何が問題なのでしょうか?

次元の1つを削除する必要があることを教えてくれているに過ぎません。1次元の配列を宣言し、それを2次元の配列に書き込みたいとします。最終的に何が手に入るのか?もちろん、コンパイラからエラーが出ます。

2.ループの中で正しく配列を埋める必要があります。ランダムなサイズの変数を与えて、そこにランダムなサイズのものを押し込むだけではありません。

3.変数を-1にしているのはあなたです。また、ループの前の配列のサイズは0でなければなりません。ここではっきりしないのは?

連想ゲームをしてみよう

  • 内部容積がゼロ(配列サイズがゼロ)の、膨らんだ風船(空の配列)を想像してみてください。この吹き出しの中(配列の中)に、コイン(欲しい順番)を入れたいのです。ここで、各コインは、バルーンに収納するのに適していると判断すると(希望のオーダーが見つかるごとに)、バルーンの内容積を増やすことになります(コイン自身だけがバルーンを伸ばすので、配列サイズを1大きくしてオーダーを1つ詰め込むという自分でやる必要があります)。
    最後に、すべてのコインを見つけ、ボールに詰め込むと、ボールは膨らみません - その内部容積はコインによって拡張されています(探索サイクルの終了時に、配列のサイズは、見つかった必要な順序の数と同じになります、あなたは見つかった必要な順序ごとに配列のサイズを1ずつ増やしたので)。

    ここで、最初にコインをゴムでできていて大きさを変えられるボールではなく、大きさが制限 されている小さな貯金箱に入れたとします(最初に配列の大きさを決めて、それ以上大きくしていない)。どうなるんだろう?すべてのコインが貯金箱に収まるわけではありません。バルーンになります。

ここでアソシエーションを紹介します。