初学者的问题 MQL5 MT5 MetaTrader 5 - 页 421

 

只在酒吧变化时进行计算 - 我的方法 :)如果你有任何优化的想法--我愿意倾听

//+------------------------------------------------------------------+
//|                                                       Target.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict


double CC;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if (Close[1]-CC!=0)
   {
   CC=Close[1]; 
 
   double MAT=NormalizeDouble(iMA(Symbol(),0,100,0,0,0,0),Digits);
   double S=11*Point;
   double Target;
   int Buy=1;
   int Sell=1;
   if(Open[0]-MAT>S || MAT-Open[0]<S) //Условие убытка - надо искать новый TP
     {
      if(Buy==1) //Если условно ордеров на покупку больше, чем ордеров на продажу (проверять лучше по объему позиции)
        {
         double TargetMassiv[5];        //Создаем массив
         double TargetMassivOk[5];      //Создаем массив
         int N=0;                       //Переменная для изменения размера массива
         int X=0;                       //Переменная для получение информации о номере индекса массива, наиболее соответствующему усредненному значению массива
 
         int Max=0;
         int Min=0;
         int MaxBuy=0;
         int MinBuy=0;
         double sr_Target=0;

         ArrayFree  (TargetMassiv);         //Очищаем массив
         ArrayFree  (TargetMassivOk);       //Очищаем массив
         ArrayResize(TargetMassiv,5,0);     //Восстанавливаем размер массива
         ArrayResize(TargetMassivOk,5,0);   //Восстанавливаем размер массива

         TargetMassiv[0]=NormalizeDouble (iMA(Symbol(),0,100,0,0,0,100),Digits);
         TargetMassiv[1]=NormalizeDouble (iMA(Symbol(),0,100,0,1,0,0),Digits);
         TargetMassiv[2]=NormalizeDouble (iMA(Symbol(),0,55,0,2,0,0),Digits);
         TargetMassiv[3]=NormalizeDouble (iMA(Symbol(),0,88,0,3,0,0),Digits);
         TargetMassiv[4]=NormalizeDouble (iMA(Symbol(),0,12,0,0,0,0),Digits);

         for(int i=0;i<5;i++) //Записываем значение в новый массив по условию
           {
            if(TargetMassiv[i]>MAT && TargetMassiv[i]!=0)
              {
               TargetMassivOk[i]=TargetMassiv[i];
               N++;

              }

           }

         ArraySort(TargetMassivOk,WHOLE_ARRAY,0,MODE_DESCEND);    //Сортировка массива
         if(N!=0)

           {
            ArrayResize(TargetMassivOk,N,0);

            Max=ArrayMaximum(TargetMassiv,WHOLE_ARRAY,0);
            Min=ArrayMinimum(TargetMassiv,WHOLE_ARRAY,0);
            MaxBuy=ArrayMaximum(TargetMassivOk,WHOLE_ARRAY,0);
            MinBuy=ArrayMinimum(TargetMassivOk,WHOLE_ARRAY,0);
            sr_Target=NormalizeDouble(iMAOnArray(TargetMassivOk,0,N,0,0,0),Digits);

            if(N==0)
              {X=N;}

            else

              {
               for(int i=0;i<N-1;i++)
                 {
                  if(sr_Target<=TargetMassivOk[i] && sr_Target>TargetMassivOk[i+1]) X=i;  //Берем большее значение т.к. для ордеров на покупку
                 }
              }

            Target=TargetMassivOk[X];
           }

         else

           {
            Max=0;
            Min=0;
            MaxBuy=0;
            MinBuy=0;
            sr_Target=0;
            Target=-1;
           }

         Print("Покупка");
         Print("Значения последних 5 элементов массива");
         for(int i=0;i<5;i++) printf("TargetMassiv[%d] = %G",i,TargetMassiv[i]);
         for(int i=0;i<N;i++) printf("TargetMassivOk[%d] = %G",i,TargetMassivOk[i]);

         Print("MAT= ",MAT);
         Print("Max= ",TargetMassiv[Max],"Min=",TargetMassiv[Min],"MaxBuy=",TargetMassivOk[MaxBuy],"MinBuy=",TargetMassivOk[MinBuy]);
         Print("Среднее значение массива TargetMassivOk= ",sr_Target);
         Print("Среднее значение массива TargetMassivOk наиболее соответствует индексу= ",X);
         Print("Target= ",Target);
        }

      /////////////////////////////////////////////////////////////////////////////

      if(Sell==1) //Если условно ордеров на продажу больше, чем ордеров на продажу (проверять лучше по объему позиции)     
        {
         double TargetMassiv[5];        //Создаем массив
         double TargetMassivOk[5];      //Создаем массив
         int N=0;                       //Переменная для изменения размера массива
         int X=0;                       //Переменная для получение информации о номере индекса массива, наиболее соответствующему усредненному значению массива
 
         int Max=0;
         int Min=0;
         int MaxSell=0;
         int MinSell=0;
         double sr_Target=0;


         ArrayFree  (TargetMassiv);         //Очищаем массив
         ArrayFree  (TargetMassivOk);       //Очищаем массив
         ArrayResize(TargetMassiv,5,0);     //Восстанавливаем размер массива
         ArrayResize(TargetMassivOk,5,0);   //Восстанавливаем размер массива

         TargetMassiv[0]=NormalizeDouble (iMA(Symbol(),0,100,0,0,0,100),Digits);
         TargetMassiv[1]=NormalizeDouble (iMA(Symbol(),0,100,0,1,0,0),Digits);
         TargetMassiv[2]=NormalizeDouble (iMA(Symbol(),0,55,0,2,0,0),Digits);
         TargetMassiv[3]=NormalizeDouble (iMA(Symbol(),0,88,0,3,0,0),Digits);
         TargetMassiv[4]=NormalizeDouble (iMA(Symbol(),0,12,0,0,0,0),Digits);

       // for(int i=0;i<5;i++)
         for(int i=4; i>=0; i--)
           {
            if(TargetMassiv[i]<MAT && TargetMassiv[i]!=0) //Записываем значение в новый массив по условию
              {
               TargetMassivOk[i]=TargetMassiv[i];
               N++;
              }

           }
         Print("N=",N);
         for(int i=0;i<N;i++) printf("До обработки TargetMassivOk[%d] = %G",i,TargetMassivOk[i]);
         ArraySort(TargetMassivOk,WHOLE_ARRAY,0,MODE_DESCEND);
        // ArraySort(TargetMassivOk,N,0,MODE_ASCEND);                //Сортировка массива
         if(N!=0)
           {
            ArrayResize(TargetMassivOk,N,0);
      //      ArraySort(TargetMassivOk,WHOLE_ARRAY,0,MODE_DESCEND);          //Дополнительная сортировка
            Max=ArrayMaximum(TargetMassiv,WHOLE_ARRAY,0);
            Min=ArrayMinimum(TargetMassiv,WHOLE_ARRAY,0);
            MaxSell=ArrayMaximum(TargetMassivOk,WHOLE_ARRAY,0);
            MinSell=ArrayMinimum(TargetMassivOk,WHOLE_ARRAY,0);
            sr_Target=NormalizeDouble(iMAOnArray(TargetMassivOk,0,N,0,0,0),Digits);

            for(int i=0;i<N-1;i++)
              {
               if(sr_Target<=TargetMassivOk[i] && sr_Target>TargetMassivOk[i+1]) X=i;
               //              if (X=!0) X=X-1;
              }
            Target=TargetMassivOk[X];
           }


         else

           {
            Max=0;
            Min=0;
            MaxSell=0;
            MinSell=0;
            sr_Target=0;
            Target=-1;
           }

         Print("Продажа");
         Print("Значения последних 5 элементов массива");
         for(int i=0;i<5;i++) printf("TargetMassiv[%d] = %G",i,TargetMassiv[i]);
         for(int i=0;i<N;i++) printf("TargetMassivOk[%d] = %G",i,TargetMassivOk[i]);

         Print("MAT=",MAT);
         Print("Max=",TargetMassiv[Max],"Min=",TargetMassiv[Min],"MaxSell=",TargetMassivOk[MaxSell],"MaxSell=",TargetMassivOk[MinSell]);
         Print("Среднее значение массива TargetMassivOk= ",sr_Target);
         Print("Среднее значение массива TargetMassivOk наиболее соответствует индексу= ",X);
         Print("Target= ",Target);
        }

     }
  }
}
//+------------------------------------------------------------------+

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
-Aleks-:
错了--枚举的工作原理是这样的,如果索引值超过了数组的大小,就会被诅咒,而它并没有。有一个带零的值,而N可以是非零的!事实证明,检查也发生了,那么事实证明,数组并没有写数据。
我不是在猜测,我是在指出提议的循环的不正确性。想想自己从哪里来,到哪里去,数组大小 等于5,你需要做一个循环......
 
Artyom Trishkin:
我不是在猜测,我是在指出提议的循环的不正确性。只要自己想一想,在数组大小等于5的情况下,从哪里和到哪里,你需要做一个循环......
在我和你的变体中,都有五个值,请解释一下区别。
 
-Aleks-:
我的和你的都有五个值,有什么区别--请解释。

阵列的大小为5。如果你将数组的索引 从4到0,包括0,那么循环将遍历所有的数组值。如果你试图从5开始索引,那么数组就超出了范围。如果你的索引从4到0,不包括0,那么循环就不会穿过整个数组--数组的零单元不会被读取。

即这是正确的。

for(int i=4; i>=0; i-){}。

for(int i=0; i<5; i++) {}。

阵列的索引(i)。
4
3
2
1
0
阵列单元号
5
4
3
2
1
 
Artyom Trishkin:

阵列的大小为5。如果你将数组的索引 从4到0,包括0,那么循环将遍历所有的数组值。如果你试图从5开始索引,那么数组就超出了范围。如果你的索引从4到0,不包括0,那么循环就不会穿过整个数组--数组的零单元不会被读取。

即这是正确的。

for(int i=4; i>=0; i--){}。

for(int i=0; i<5; i++) {}。

阵列的索引(i)。
4
3
2
1
0
阵列单元号
5
4
3
2
1
所以你在例子中写了我在代码中写的东西。我不明白这里的区别是什么...
 
Leanid Aladzyeu:

从最后进行暴力攻击(因为如果列表被改变,暴力攻击可能会首先丢失数据)。


 

Leanid Aladzyeu:


利安尼德-阿拉德兹耶乌

从末尾开始重建(因为如果列表被改变,重建可能首先丢失数据)。


它从来没有停止过让我感到惊讶...为什么人们不学习如何使用后视镜,而只是学习一条交通规则,不看就转弯,直接向前走...?

为什么一旦你读懂了,当从一个开放的订单列表中关闭几个订单时,你必须从最大的指数到最小的指数,甚至建议其他人在任何地方向这个方向走......

 
Alexey Viktorov:

它从来没有停止过让我感到惊讶...为什么人们不学习如何使用后视镜,而只是学习一点交通规则,不看就转弯,直接往前走?

为什么有一次读到,如果我们从一个开放的订单列表中关闭几个订单,我们应该尝试从一个较大的指数到一个较小的指数,并建议其他人到处这样做...?

搜索的可能性可以是你想要的,当我从最后一个关闭到第一个时,它困扰着我,它应该是反过来的。而我做到了,只是有细微的差别,不仅仅是反转的问题。
 
Alexey Viktorov:

它从来没有停止过让我感到惊讶...为什么人们不学习如何使用后视镜,而只是学习一点交通规则,不看就转弯,直奔前方?

为什么曾经读到过,如果你从一个开放的订单列表中关闭几个订单,你必须从一个较大的指数到一个较小的指数,并建议其他人总是向这个方向走......?

对于在循环中被删除的所有东西(订单、图形对象等)来说都是如此,因为删除后的 "对象数组 "的前几个单元格中充满了后续的 "对象"。当然,在一般情况下,我们必须考虑情况。例如,当你绘制指标 时,从最后一个元素(rates_total-1)开始绘制是很愚蠢的,说得不好听。
 
Vladimir Zubov:
鸭子,你想怎么做就怎么做,我在努力地从最后一名接近到第一名,我应该反过来做。而我做到了,只是有细微的差别,不仅仅是反转。
Tapochun:
对于在循环中被删除的所有东西(订单、图形对象等)都是如此,因为删除后会用后续的 "对象 "填充 "对象阵列 "的前几个单元格。当然,在一般情况下,我们必须考虑情况。例如,当你写指标 时,从最后一个元素(rate_total-1)开始画图,说起来很傻。

你是想向我解释如何正确地做吗?或者,也许我误解了什么?

实际上,如果我在一条无人的道路上行驶,周围没有看到一辆汽车或拖拉机,我就不会转弯。