新人对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以避免警告。

但这也救不了 "俄罗斯民主之父",因为你不是在索引上加1,而是在Mas[]数组中由索引Blizko2存储的值上加1。

所以,很自然地,要从数组的附近单元格中获得一个值,你需要在索引上加或减1。但这里我们有一个你偶然发现的错误:如果索引指向一个数组的最外层单元--要么是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中,你有价格的数组单元的索引。
然后你把变量Blizko1中包含的值写进数组--Blizko2+1单元格中(为什么???)--你应该在那里有价格,但你把它们塞进了难以理解的数值。

你需要弄清楚你在做什么,一般来说--只要注释出你的函数的每一行。深思熟虑。

 
Artyom Trishkin:

有了这个结构

你在从Blizko2索引单元格获得的数值上加1,这就是价格被存储的地方--一个双倍数值。你正在添加一个整数1。你需要写+1.0以避免警告。

但这也救不了 "俄罗斯民主之父",因为你不是在索引上加1,而是在Mas[]数组中由索引Blizko2存储的值上加1。

所以,很自然地,要从数组的附近单元格中获得一个值,你需要在索引上加或减1。但这里我们有一个你偶然发现的错误:如果索引指向一个数组的最外层单元格--要么是0,要么是最末端,那么减去1(在0处)或加上1(在最末端),你将落在数组之外--那里没有这样的单元格。因此,你需要控制Blizko2+1不超过ArraySize(Mas)-1,或者Blizko2-1不小于0。

还有......有人告诉你,你不需要在循环的每次迭代中对数组进行排序,你需要刹车吗?

要对其进行排序,我们必须检查数组的大小是否超过1。

而这种构造一点也不清楚。

看:在Blizko2中,你有价格的数组单元的索引。
然后你把变量Blizko1中包含的值写进数组--Blizko2+1单元格中(为什么???)--你应该在那里有价格,但你把它们塞进了难以理解的数值。

你需要弄清楚你在做什么,一般来说--只要注释出你的函数的每一行。深思熟虑。


谢谢你的翔实回答!我想创建数组的目的是为了确定低于该价格和高于该价格的最近订单的价格,如果有的话。如果它们是可用的,并且从它们到价格的距离超过了我定义的距离,那么就打开相应的订单。我想它会是这样的(我在这里尽可能地描述了我的行动逻辑)

//---Создаем массив для учета всех ордеров в терминале
  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初学者的问题,帮助和讨论算法和代码

Alexey Viktorov, 2017.10.04 09:32


来自帮助

返回的值

返回找到的第一个元素的索引。如果没有找到所需的值,它将返回 所需值所在的最接近的小 元素的索引

Mas[Blizko2]是数组中最接近的小值。


只需要补充一点,该参考文献没有说到对数组排序方向的依赖性。因此,在ArrayBsearch之后不需要进行任何操作。任务已经完成。

Artyom已经进一步解释了一切。检查一个索引是否等于零,以及一个数组的大小是否跳出界外...

 

怎样才能使鼠标在点击按钮后才开始被追踪?但情况发生了(在通过鼠标点击EA将所有订单的止损转移到一个点的想法中),当我点击按钮时,所有订单的止损在点击按钮的价格上开始被一次性转移。这个属性怎么能如果(id==CHARTEVENT_CLICK)

只有在这个按钮被点击后才能运行 if(ObjectGetInteger(0, "cm STOP ALL",OBJPROP_STATE))

 
Basicprof:

怎样才能使鼠标在点击按钮后才开始被追踪?但情况发生了(在通过鼠标点击EA将所有订单的止损转移到一个点的想法中),当我点击按钮时,所有订单的止损在点击按钮的价格上开始被一次性转移。这个属性怎么能如果(id==CHARTEVENT_CLICK)

只有在这个按钮被点击后才能运行 if(ObjectGetInteger(0, "cm STOP ALL",OBJPROP_STATE))


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