新人对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]将0放在索引下面,尽管它的值(1.61040)等于除第30个以外所有其他数组项的值同样不清楚的是,为什么ArraySort()LoY[30][0]的索引是15,尽管它的值(1.61040)等于数组中除第30个元素外的所有其他元素的值

一个问题:如何使一个索引为0的元素在这个tick上成为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);
   }

虽然该函数是针对一维数组的,但也可以重新设计

 
Aleksei Stepanenko:

试试吧。

的确,这个函数是针对一维数组的,但它可以被重新加工。

非常感谢你。

 

请给我一个忠告。

代码寻找开放的图表 并创建一个带有符号名称的标签,但如果两个图表有相同的符号。

那么它只在一个图表上创建一个标签。我做错了什么?

//---
   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:

请给我一个忠告。

代码寻找开放的图表 并创建一个带有符号名称的标签,但如果两个图表有相同的符号。

它只在一个图表上创建标签。我做错了什么?

同一符号的图表ID(ChartID())是不同的。使用它们。

 
Artyom Trishkin:

同一符号的ChartID()标识符是不同的。使用它们。

这就是我使用它的原因。
ChartFirst()+i

即翻阅所有开放的图表

还是我误解了你的意思?有没有办法以代码的形式把它说清楚呢?

 
非常奇怪,在所有新开的图表 上都打上了标记,只有一个图表被忽略了(
 
MakarFX:
非常奇怪,在所有新开的图表 上都放了一个标记,只有一个图表被忽略了(

仔细阅读文档和示例代码。你的循环没有正确组织起来。

//--- переменные для идентификаторов графиков
   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循环的工作方式是一样的。这不是问题,问题是突出的线条。