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

 
皆さんこんにちは!
mql4に関する質問、特にArraySort()関数について
以下は私のコードです
.
double LoY[31][31];
int P1;
void OnTick()
{
if (TimeCurrent()==1262568096)
{
for(int r=0; r<31;r++)
{
LoY[r][0]=1.6104;
LoY[r][1]=r;
P1=1;
}
}
if (TimeCurrent()>1262568095)
{
ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND);
for( r=0; r<31;r++)
Print("-------------------------------------LoY[r][1]--------------=",  LoY[r][1],"  r ",   r,"  LoY[r][0] ",  DoubleToString( LoY[r][0],5));
}

if (Bid-LoY[0][0]>=0.0030)
{
OrderSend(Symbol(),OP_SELL,0.1,Bid, 3,Ask+300*Point,Ask-100*Point,"300",0);
LoY[0][0]=Bid;
}
}

注文開始後、LoY[0][0]がBid( 1.6134)を取得した時点で、ArraySort(LoY,WHOLE_ARRAY,0,MODE_ASCEND)は配列を一次元目で昇順にソートし、値が最大の配列要素を 先頭に移動しています。そのため、昇順にソートされた配列ではLoY[0][0] はその値と共にLoY[30][0] となる。これは論理的であり、したがって私も同意する。


私の考えでは、何が論理的でないのか、何が受け入れられないのか。ArraySort()LoY[15][0] の値 (1.61040) は 30 番目を除く他の配列項目の値と等しいにもかかわらず、なぜインデックスの下に 0 が配置されるのでしょうか?同じように、ArraySort()LoY[30][0] は、その値(1.61040)が30番目以外の他のすべての配列要素の値と等しいにもかかわらず、なぜインデックス15を置く のかが明らかではありません。

質問:このティックでインデックス0の要素をLoY[1][0]、インデックス15の要素をLoY[15][0]、インデックス29の要素をLoY[30][0]
とする方法はありますか。つまり、同じ値の要素をさらにソートしない関数を
作るにはどうすればよいのでしょう。 論理的でなく、感覚的である。

よろしくお願いします。

 

これがソートアルゴリズム だろう。配列の要素にはいくつかの順列があります。

他の並べ替えも試してみてください。

Методы сортировки и их визуализация с помощью MQL5
Методы сортировки и их визуализация с помощью MQL5
  • www.mql5.com
Для работы с графикой в MQL5 создана специальная библиотека Graphic.mqh. В статье описан пример ее практического применения и поясняется сама суть сортировок. По каждой сортировке существует как минимум отдельная статья, а по ряду из них уже опубликованы целые исследования, поэтому здесь описывается лишь общая идея.
 
Aleksei Stepanenko:

これがソートアルゴリズム だろう。配列の要素にはいくつかの順列があります。

他の並べ替えも試してみてください。

アドバイスをいただき、ありがとうございました。mql4で他のソートオプションがあるかどうか教えてください。もしそうなら、ディレクトリのどこにあるのでしょうか?

 

を試してみてください。

//функция быстрой сортировки
void SortArray(int &eArray[], int eFirst, int eLast)
   {
   int eMiddle, eTemp;
   int eLeft=eFirst, eRight=eLast;
   //вычисление опорного элемента
   eMiddle=eArray[(eLeft+eRight)/2];
   do
      {
      while(eArray[eLeft]<eMiddle) eLeft++;
      while(eArray[eRight]>eMiddle) eRight--;
      //перестановка элементов
      if(eLeft<=eRight)
         {
         eTemp=eArray[eLeft];
         eArray[eLeft]=eArray[eRight];
         eArray[eRight]=eTemp;
         eLeft++;
         eRight--;
         }
      }
   while(eLeft<eRight);
   if(eFirst<eRight) SortArray(eArray,eFirst,eRight);
   if(eLeft<eLast) SortArray(eArray,eLeft,eLast);
   }

は1次元の配列に対する関数ですが、作り直すことができます。

 
Aleksei Stepanenko:

を試してみてください。

確かに1次元の配列に対する関数ですが、作り直せばいいんです。

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

 

ひとことお願いします。

コードは開いているチャートを 探し、シンボルの名前でラベルを作成しますが、2つのチャートが同じシンボルを持っている場合。

とすると、1つのチャートにしかラベルが作成されないのですが、どうしたらいいのでしょうか?

//---
   string name;
   for(int i=0; i<10; i++)
     {
      if(ChartSymbol(ChartFirst()+i)=="EURGBP")
        {name="EURGBP";
         if(ObjectFind(ChartFirst()+i,name+IntegerToString(i))!=0)
           {
            Create_Label(ChartFirst()+i,name+IntegerToString(i),0,5,5,CORNER_RIGHT_UPPER,name,"Times New Roman",10,
                      clrBlack,0,ANCHOR_RIGHT_UPPER," ",false,false,false,true,0);
           }
        }
     }
 
MakarFX:

ひとことお願いします。

コードは開いているチャートを 探し、シンボルの名前でラベルを作成しますが、2つのチャートが同じシンボルを持っている場合。

ラベルが1つのチャートにしか作成されないのですが、何が間違っているのでしょうか?

同じシンボルのチャートID(ChartID())が異なる。使ってみてください。

 
Artyom Trishkin:

同一シンボルの ChartID()識別子が異なる。使ってみてください。

そのために使っているんです。
ChartFirst()+i

かいひょう

それとも、私が誤解していたのでしょうか?コードという形で、明確にする方法はないのでしょうか?

 
非常に不思議なことに、新しく開いた すべてのチャートに マークが付き、1つのチャートだけが無視される(
 
MakarFX:
非常に不思議なことに、すべての新規オープンのチャートに マークが付き、1つのチャートだけが無視される(

ドキュメントとサンプルコードをよく読んでください。ループが正しく構成されていません。

//--- переменные для идентификаторов графиков
   long currChart,prevChart=ChartFirst();
   int i=0,limit=100;
   Print("ChartFirst = ",ChartSymbol(prevChart)," ID = ",prevChart);
   while(i<limit)// у нас наверняка не больше 100 открытых графиков
     {
      currChart=ChartNext(prevChart); // на основании предыдущего получим новый график
      if(currChart<0) break;          // достигли конца списка графиков
      Print(i,ChartSymbol(currChart)," ID =",currChart);
      prevChart=currChart;// запомним идентификатор текущего графика для ChartNext()
      i++;// не забудем увеличить счетчик
     }
forとwhileのループが同じように動作するなんて言わないでください。問題はそこではなく、ハイライトされたラインです。