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

 
Alexey Viktorov:

配列の 要素を追加するたびに、配列をソートする必要はありません。ソートを移動させた方が良い

参考文献より

Mas[Blizko2]は配列の中で最も近い小さい値です

ご返信ありがとうございました教えてください。配列の次の要素を決定するために、すでに見つかった要素+1を使用しましたが、テスターはこの場所でエラーを出します。

 double Mas[];                                                                //массив для упорядочивания всех ордеров
  for(int i=0; i<OrdersTotal(); i++)                                           // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       Price=OrderOpenPrice();
       ArrayResize(Mas, i+1);                                                 //задан размер массива
       Mas [i] = Price; 
       ArraySort (Mas,WHOLE_ARRAY,0,MODE_DESCEND);                           // Теперь цены открытия упорядочены по убыванию
     }
   } 
   if(ArraySize(Mas)>1)                                                         //Если массив не пустой
   
         { 
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
        

        Mas[Blizko2+1]= Blizko1;     // В этой строке перед квадратной скобкой выдает ошибку!                           //Определен индекс ближайшего меньшего по значению елемента к текущей цене

        PriceBlizko1=Mas[Blizko1];
        PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера   

次の要素を探さないといけない。明らかに+1なのですが、プログラムがエラーになるのですもしかしたら、他の方法があるのかもしれないし、私のやり方が間違っているのかもしれない。ヒントをください)

Blizko1 = Mas[Blizko2]+1;

とか、こんな感じ?

しかし、その後、データ損失の可能性に関する警告をコンパイルする際に

 
vikzip:

この構造で

Blizko1 = Mas[Blizko2]+1;

Blizko2のインデックスセルから得た値に1を足すと、そこに価格が格納されます - ダブル値です。整数の1を足しています。警告を回避するためには、+1.0と記述する必要があります。

しかし、これでは「ロシア民主主義の父」も救えません。インデックスではなく、インデックスBlizko2によってMas[]配列に格納された値に1を足しているのですから。

ですから、当然、配列の近くのセルから値を取り出すには、インデックスに1を足したり引いたりする必要があります。しかし、ここであなたがつまずいたエラーがあります。indexが配列の一番外側のセル(0か一番後ろ)を指している場合、1(0)を引くか1(一番後ろ)を加えると、配列の外に出て しまいます - そんなセルはないのです。従って、Blizko2+1 が ArraySize(Mas)-1 以下、または Blizko2-1 が 0 以下であることを制御する必要がある。

そして...ループの各反復で配列をソートする必要はないと言われましたが、ブレーキは必要でしょうか?

配列のサイズが1より大きいかどうかをチェックした後、ソートする必要があります。

そしてこのデザインは、まったくもって明確ではありません。

int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене

Mas[Blizko2+1]= Blizko1; // В этой строке перед квадратной скобкой выдает ошибку! //Определен индекс ближайшего меньшего по значению елемента к текущей цене

        PriceBlizko1=Mas[Blizko1];
        PriceBlizko2 = Mas[Blizko2];                                      // Цена выбранного ордера   

Blizko2では、価格が表示されている配列のセルのインデックスが表示されています。
そして、配列に書き込む - そのセルBlizko2+1に、変数Blizko1に含まれる値(なぜ?

一般的に何をやっているのか把握する必要があります。関数の各行をコメントアウトすればよいのです。思慮深く。

 
Artyom Trishkin:

この構造で

Blizko2のインデックスセルから得た値に1を足すと、そこに価格が格納されます - ダブル値です。整数の1を足しています。警告を回避するためには、+1.0と書く必要があります。

しかし、これでは「ロシア民主主義の父」も救えません。インデックスではなく、インデックスBlizko2によってMas[]配列に格納された値に1を足しているのですから。

ですから、当然、配列の近くのセルから値を取り出すには、インデックスに1を足したり引いたりする必要があります。しかし、ここであなたがつまずいたエラーがあります。indexが配列の一番外側のセル(0か一番後ろのセル)を指している場合、(0に)1を引いたり(一番後ろに)1を加えたりすると、配列の外に出て しまいます - そんなセルはそこにはないのです。従って、Blizko2+1 が ArraySize(Mas)-1 以下、または Blizko2-1 が 0 以下であることを制御する必要がある。

そして...ループの各反復で配列をソートする必要はないと言われましたが、ブレーキは必要でしょうか?

ソートするには、配列のサイズが1以上かどうかを確認する必要があります。

そして、この構成はまったく明確ではありません。

参照:Blizko2では、価格が表示された配列のセルのインデックスが表示されます。
そして、配列に書き込む - そのセルBlizko2+1に、変数Blizko1に含まれる値(なぜ?

一般的に何をやっているのか把握する必要があります。関数の各行をコメントアウトすればよいのです。思慮深く。


参考になる回答ありがとうございました配列を作成したい目的は、価格より下にある直近の注文の価格と、価格より上にある注文の価格があれば、それを判断するためです。もしそれらが利用可能で、それらから価格までの距離が私が定義した距離を超えていれば、対応する注文をオープンします。こんな感じかと(ここに自分の行動のロジックを思いっきり記述しました)。

//---Создаем массив для учета всех ордеров в терминале
  double Price;                                                               // Цена выбранного ордера
  double Mas[];                                                                //массив для упорядочивания всех ордеров
  for(int i=0; i<OrdersTotal(); i++)                                           // Цикл перебора ордер
   {
    if(OrderSelect(i,SELECT_BY_POS))                                           // Если есть следующий
     {
       Price=OrderOpenPrice();                                                //Цена ордера
       ArrayResize(Mas, i+1);                                                 //задан размер массива
       Mas [i] = Price; 
       ArraySort (Mas,WHOLE_ARRAY,0,MODE_DESCEND);                           // Теперь цены открытия упорядочены по убыванию. Я намеренно сортирую массив, потому что ордера добовляются в него в том порядке в котором появляются в 
                                                                             //терминале и не сортируются по убыванию(Верно ли это мое утверждение??)А мне необходимо позже точно определить ближайший ордер выше и ниже цены

     }
   } 
   if(ArraySize(Mas)>1)                                                         //Если массив не пустой
   
         { 
        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене
                                                                               //Здесь я справку прочитал и если указано MODE_ASCEND тогда будет найдено ближайшее меньшее значение, но первым я намерен определить ордер выше цены и 
                                                                               // поэтому поставил MODE_DESCEND. Скажите пожалуйста - это верно?? 
         PriceBlizko1 = Mas[Blizko2]+1;                                        //!!!Вот здесь я намереваюсь определить ордер сразу ниже цены и так как я намеренно упорядочил по убыванию уже все ордера в массиве, то по логике после 
                                                                               //определения ближайшего верхнего ордера к цене Blizko2 следующим в массиве будет ордер уже ниже цены(Верно ли мое утверждение??)И вот на этом месте я не 
                                                                               //могу понять: каким же образом это сделать? Ведь мне очевидно что он следующий, но как это записать в код я не могу понять))) Пробовал и в скобках уже 
                                                                               //прибавлять еденицу)) А мне нужно что бы PriceBlizko1 была присвоена цена ордера сразу ниже цены!! Подскажите пожалуйста как определить цену ордера ниже 
                                                                               //цены PriceBlizko2 ??
         PriceBlizko2 = Mas[Blizko2];                                          // Цена выбранного ордера выше цены         

        
 

私なら、次のような感じになります。

double levelDown=0;
double levelUp=DBL_MAX;

int totalOrders=OrdersTotal();


   for(int i=0;i<totalOrders;i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         double price=OrderOpenPrice();
         
         if (price-Ask>_Point && levelUp-price>_Point)
            levelUp=price;
         
         if (Bid-price>_Point && price-levelDown>_Point)
            levelDown=price;
         }
      }
 
Taras Slobodyanik:

私なら、次のような感じになります。


ありがとうございます。トップレベルのDBL_MAXとは どのような意味ですか?

 
vikzip:

ありがとうございます!DBL_MAXとは どういう意味ですか?

巧妙なフォーラムエンジンによって、リンクまで挿入されたんですね。回答を待つより、クリックした方が楽だからです。

 
Artyom Trishkin:

巧妙なフォーラムエンジンによって、リンクまで挿入されたんですね。返信を待つより、クリックした方が楽だから。


ありがとうございました。こんなエンジンがあったらいいなぁ)))

 
vikzip:

参考になるお返事ありがとうございました私が配列を作成しようとする目的は、価格より下にある直近の注文と価格より上にある注文があれば、その価格を判断することです。それらが利用可能であり、それらから価格までの距離が一定以上である場合、対応する注文を開く。こんな感じかと(ここに自分の行動のロジックを思いっきり記述しました)。

この行のコメントには誤りがあります。

        int Blizko2=ArrayBsearch(Mas,Ask,WHOLE_ARRAY,0,MODE_DESCEND);          //Определен индекс ближайшего большего по значению елемента к текущей цене


トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム。

MQL4初心者の質問、ヘルプ、アルゴリズムやコードに関するディスカッションなど何でもOK

アレクセイ・ビクトロフ, 2017.10.04 09:32


ヘルプより

戻り値

最初に見つかった要素のインデックスを返す。求める値が見つからない場合、求める値が位置する最も近い小さい 要素のインデックスを返す

Mas[Blizko2]は配列の中で最も小さい値に近い値です。


ただ、この文献には配列のソート方向への依存性については何も書かれていないことを付け加えておきます。そのため、ArrayBsearch以降の操作は必要ない。タスクはすでに終わっている。

アルチョムからさらに説明がありました。インデックスが0であることと,配列のサイズが境界を飛び越えないことを確認し...

 

ボタンがクリックされて初めてマウスの追従を開始するようにするにはどうしたらよいですか?しかし、(EAからマウスクリックで全注文のストップを一点に移すという考えで)ボタンをクリックすると、ボタンをクリックした価格での全注文のストップが一斉に移され始めるという事態が起きています。このプロパティ if(id==CHARTEVENT_CLICK) はどのようにすればよいのでしょうか?

if(ObjectGetInteger(0, "cm STOP ALL",OBJPROP_STATE))

 
Basicprof:

ボタンがクリックされて初めてマウスの追従を開始するようにするにはどうしたらよいですか?しかし、(EAからマウスクリックで全注文のストップを一点に移すという考えで)ボタンをクリックすると、ボタンをクリックした価格での全注文のストップが一斉に移され始めるという事態が起きています。このプロパティ if(id==CHARTEVENT_CLICK) はどのようにすればよいのでしょうか?

if(ObjectGetInteger(0, "cm STOP ALL",OBJPROP_STATE))


if(id==CHARTEVENT_OBJECT_CLICK && sparam == "cm STOP ALL") { // код }