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

 
andrey46:
Strategy TesterのExpert Advisorは正常に動作し、注文も発注されるのに、実際の口座では ロボットは動いているのに、注文が発注されないのはなぜか。

雑誌を読んでみてください、答えがあるかもしれません。

 

これを入手する方法を教えてください。

double w = 18.2

いい加減にしろ

int w = 18
 
TrederMT5:

これを入手する方法を教えてください。

いい加減にしろ

int w1;
double w = 18.2;
w1=(int)w;
w=round (w);

明示的な型変換。

非整数から整数を丸めることもできますが、その場合、double は 18.0 になります。

 
scomoroh:

では、質問を繰り返します。

という表現があります。

if (izmb>b ||izmb<b || izms>s || izms<s)

はこれと同じです。

if (izmb!=b || izms!=s)

そして、何かを保存したい場合は、グローバル 変数で行います。

これは、関数本体の外で宣言されるものです。

int izmb=0, izms=0;


void OnTick()
   {
   .........
 
Valeriy Yastremskiy:


ありがとうございました。
 

皆さん、ごきげんよう。

MQL4について質問です。以下は簡単なコードです。

double LoY[31][31],LoU,LoU1;
int S,S1,S2;
void OnTick()
{
if (Minute()==20&&Minute()!=S1)
{
ArrayFill(LoY,0,31,0.5555);
S1=Minute();
}
//***************************************************************
if (Minute()!=S)
{
LoY[0][0]=Bid;
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
Print("----LoY[0][1]-- Горизонтально ---  [0}  ",  LoY[0][0],"  [1] ",   LoY[0][1],"  [2] ",   LoY[0][2],"  [3] ",   LoY[0][3],"  [4] ",   LoY[0][4],"  [26] ",   LoY[0][26],"  [27] ",   LoY[0][27],"  [28] ",   LoY[0][28],"  [29] ",   LoY[0][29],"  [30] ",   LoY[0][30]);
Print("----LoY[1][0]-- Вертикалььно ---  [0}  ",  LoY[0][0],"  [1] ",   LoY[1][0],"  [2] ",   LoY[2][0],"  [3] ",   LoY[3][0],"  [4] ",   LoY[4][0],"  [26] ",   LoY[26][0],"  [27] ",   LoY[27][0],"  [28] ",   LoY[28][0],"  [29] ",   LoY[29][0],"  [30] ",   LoY[30][0]);
S=Minute();
}
}

2次元の配列を作成し、その中に値を入れる。ArrayFill(LoY,0,31,0.5555); と ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND); リファレンスマニュアルによると、どちらの関数も2次元配列で動作するようです。ArrayFill() は、水平方向に 埋め尽くされた配列に対して厳密に動作します。 Reference book では、左から右へ(上から下、下から上ではなく)厳密に 配列に値を埋め 尽くすように指定されています。 ArraySort() は、二次元配列を最初の次元でソートします。Referenceには、水平方向で満たされた配列と垂直方向で満たされた配列のどちらをソートするかは書かれていません。私のコードの実行から判断すると、ArraySort()は垂直方向に 充填された配列のみを ソートします。この2つの関数は、1つのプログラム内で同じ配列を扱うことはできないようです。

Q.ArraySort()が正しく動作することが重要なのですが、 ArrayFill() が動作するように、 ArraySort() 水平方向に充填された配列をソート することは可能でしょうか? あるいは、MQL4で動作するMQL5のソート関数が、代わりに私を助けてくれるのでしょうか?あるいは、水平に 埋め尽くされた配列のすべての値を垂直に変換する関数はないでしょうか。

ArrayFill() の代わりにループを使っても、うまくいきません。

ありがとうございました。

 
ANDREY:

皆さん、ごきげんよう。

MQL4について質問です。以下は簡単なコードです。

2次元の配列を作成し、その中に値を入れる。ArrayFill(LoY,0,31,0.5555); と ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND); リファレンスマニュアルによると、どちらの関数も2次元配列で動作するようです。ArrayFill() は、水平方向に 埋め尽くされた配列に対して厳密に動作します。 Reference book では、左から右へ(上から下、下から上ではなく)厳密に 値を埋め 尽くすように指定されています。 ArraySort() は、二次元配列を最初の次元で並べ替えます。Referenceには、水平方向で満たされた配列と垂直方向で満たされた配列のどちらをソートするかは書かれていません。私のコードの実行から判断すると、ArraySort()は垂直方向に 充填された配列のみを ソートします。この2つの関数は、1つのプログラム内で同じ配列を扱うことはできないようです。

Q.ArraySort()が正しく動作することが重要なのですが、 ArrayFill() が動作するように、 ArraySort() 水平方向に充填された配列をソート することは可能でしょうか? あるいは、MQL4で動作するMQL5のソート関数が、代わりに私を助けてくれるのでしょうか?あるいは、水平に 埋め尽くされた配列のすべての値を垂直に変換する関数はないでしょうか。

ArrayFill() の代わりにループを使っても、うまくいきません。

よろしくお願いします。

にお気づきですか?

書簡

アレイフィル

多次元配列を ArrayFill()で処理すると1次元に見える。例えば、array[2][4]はarray[8]として処理 されるので、この配列を扱う場合は初期要素のインデックスを5と指定しても良い。つまり、array[2][4]に対してArrayFill(array, 5, 2, 3.14)を呼ぶとarray[1][1]とarray[1][2]に3.14を充填することになります。


この文字列

ArrayFill(LoY,0,31,0.5555);

を指定すると、配列はちょうど一行で埋め尽くされます。

垂直・水平に関しては、エントリーを見るときに頭をどのように持つかということです。Excellの表を見れば、すべてが明らかになる。A列に値を入れると、1次元の配列になります。どのように配置されているのですか?そうですね...水平に、ソファに寝転がって見ているので...............。

 
Alexey Viktorov:

にお気づきですか?

書簡

このライン

を指定すると、配列はちょうど一行で埋め尽くされます。

垂直・水平に関しては、エントリーを見るときに頭をどのように持つかということです。Excellの表を見れば、すべてが明らかになる。A列に値を入れると、1次元の配列になります。どのように配置されているのですか?そうですね...水平に、ソファに寝転がって見ているので............。

返信ありがとうございました。あなたの書いたものをすべて手に入れました。しかし、あなたが書いたことの意味が私の問題に即して理解できなかった。

私のコードでいう水平2次元配列とは、インデックス0または1の下に2行、インデックス0から30の下に列がある場合を指します。1次元目は,[0][0],[0][1],[0][2],...と表記する.[0][30] 2次元 目は[1][0],[1][1],[1][2], ...と表記する.[1][30]

私のコードでいう垂直2次元配列とは、0から30のインデックスを持つ31行と、0と1のインデックスを持つ2 列がある場合を指します。1次元 目は、[0][0][1] [0][2][0]、...と表記する。[30][0] 2次元 目は[0][1][1][2][1] ...と表記する.[30][1]

私のコードを実行すると、配列は縦に埋まります。そして、ArraySort() 関数は、その通りに配列を並べ替 えます。

QUESTION この場合、なぜArrayFill()関数が動作 しないのでしょうか?結局、配列の1次元目(31項目)を20分目に同じ値0.5555で埋めるように依頼しました。
よろしくお願いします。

 
MakarFX:

それを試してみたい。

よろしくお願いします。試してみます。

 
Aleksei Stepanenko:

はこれと同じです。

そして、何かを保存したい場合は、グローバル 変数で行います。

これは、関数本体の外で宣言されるものです。

EAに入るための検索条件を毎ティックではなく、他のEAや手動で別の注文が開閉された場合のみ確認したかった(処理系に無駄な負荷がかからないようにするため)。そのため、1ティックごとに注文数が対応しているかどうかを確認する必要があるのです。

スタティック変数は使えないのでしょうか? そのような形でプログラムは 動くのでしょうか?

    double LB=0,LS=0;
    int b=0,s=0;
    static int izmb, izms; // статическая переменная
   
   for (int i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      { 
         if (OrderSymbol()==Symbol())
         { 
            int tip = OrderType(); 
            if (tip==OP_BUY)             
            {  
               LB  += OrderLots();
               b++; 
            }                                         
            if (tip==OP_SELL)        
            {
               LS  += OrderLots();
               s++;
            } 
         }
     }
     
   }
    if (izmb!=b || izms!=s){ 
    izmb=b;
    izms=s 
           // далее идут условия для открытия ордера.
     }