Скачать MetaTrader 5

Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 421

Aleksey Vyazmikin
12535
Aleksey Vyazmikin  

Сделал расчет только при смене бара - свой метод :) Если есть идеи по оптимизации - прислушаюсь!

//+------------------------------------------------------------------+
//|                                                       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, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
Artyom Trishkin
Модератор
98879
Artyom Trishkin  
-Aleks-:
Не угадали - перебор и так работает, если бы значение индекса выходило за размер массива, то получал бы ругательства, а их нет. Есть значение с нулями, при этом N может равняться не нулю! Выходит, что проверка так же происходит, тогда получается, что массив не записывает данные.
Я не угадывал, а указал на неверность предложенного цикла. Сами подумайте от-куда и до-куда при размере массива, равном пяти, нужно делать цикл...
Aleksey Vyazmikin
12535
Aleksey Vyazmikin  
Artyom Trishkin:
Я не угадывал, а указал на неверность предложенного цикла. Сами подумайте от-куда и до-куда при размере массива, равном пяти, нужно делать цикл...
И в моем и в вашем варианте пять значений, в чем разница - поясните, пожалуйста.
Artyom Trishkin
Модератор
98879
Artyom Trishkin  
-Aleks-:
И в моем и в вашем варианте пять значений, в чем разница - поясните, пожалуйста.

Размер массива равен пяти. Если индексировать массив от 4 до 0, включая ноль, то цикл пройдёт по всем значениям массива. Если же пытаться индексировать от пяти, то будет выход за пределы массива. Если же индексировать от 4 до нуля, не включая ноль, то цикл пройдёт не по всему массиву - нулевая ячейка массива не будет прочитана.

Т.е., верно так:

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
Aleksey Vyazmikin
12535
Aleksey Vyazmikin  
Artyom Trishkin:

Размер массива равен пяти. Если индексировать массив от 4 до 0, включая ноль, то цикл пройдёт по всем значениям массива. Если же пытаться индексировать от пяти, то будет выход за пределы массива. Если же индексировать от 4 до нуля, не включая ноль, то цикл пройдёт не по всему массиву - нулевая ячейка массива не будет прочитана.

Т.е., верно так:

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
5160
Leanid Aladzyeu  
Leanid Aladzyeu:

осуществяйте переборку с конца ( так как при переборке сначала могут теряться данные при изменение списка )


Alexey Viktorov
25649
Alexey Viktorov  

Leanid Aladzyeu:


Leanid Aladzyeu:

осуществяйте переборку с конца ( так как при переборке сначала могут теряться данные при изменение списка )


Не перестаю удивляться... Почему люди вместо того чтобы научиться пользоваться зеркалами заднего вида, просто выучили один пункт правил дорожного движения и не глядя включают поворотку  и прут напролом???

Почему однажды прочитав, что при закрывании нескольких ордеров из списка открытых надо перебирать ордера от большего к меньшему индексу применяют и ДАЖЕ советуют другим везде и всюду применять именно такое направление перебора...

Kino
6992
Kino  
Alexey Viktorov:

Не перестаю удивляться... Почему люди вместо того чтобы научиться пользоваться зеркалами заднего вида, просто выучили один пункт правил дорожного движения и не глядя включают поворотку  и прут напролом???

Почему однажды прочитав, что при закрывании нескольких ордеров из списка открытых надо перебирать ордера от большего к меньшему индексу применяют и ДАЖЕ советуют другим везде и всюду применять именно такое направление перебора...

Дак возможности перебора как угодно, меня когда то напрягло что закрытие от последнего к первому, надо было наоборот. И сделал, только там есть нюансы, не только счетчик повернуть.
Alexey Kozitsyn
9182
Alexey Kozitsyn  
Alexey Viktorov:

Не перестаю удивляться... Почему люди вместо того чтобы научиться пользоваться зеркалами заднего вида, просто выучили один пункт правил дорожного движения и не глядя включают поворотку  и прут напролом???

Почему однажды прочитав, что при закрывании нескольких ордеров из списка открытых надо перебирать ордера от большего к меньшему индексу применяют и ДАЖЕ советуют другим везде и всюду применять именно такое направление перебора...

Это справедливо для всего, что при переборе в цикле удаляется (ордера, граф. объекты и т.д.) т.к. при удалении идет заполнение предыдущих ячеек "массива объектов" последующими "объектами". А вообще, конечно, нужно отталкиваться от ситуации. Например, при написании индикаторов начинать отрисовку с последнего элемента (rates_total-1), мягко говоря, глупо.
Alexey Viktorov
25649
Alexey Viktorov  
Vladimir Zubov:
Дак возможности перебора как угодно, меня когда то напрягло что закрытие от последнего к первому, надо было наоборот. И сделал, только там есть нюансы, не только счетчик повернуть.
Tapochun:
Это справедливо для всего, что при переборе в цикле удаляется (ордера, граф. объекты и т.д.) т.к. при удалении идет заполнение предыдущих ячеек "массива объектов" последующими "объектами". А вообще, конечно, нужно отталкиваться от ситуации. Например, при написании индикаторов начинать отрисовку с последнего элемента (rates_total-1), мягко говоря, глупо.

Это, типа вы мне разъясняете как правильно делать? Или я что-то не понял?

Вообще-то если я еду на пустынной дороге и не вижу вокруг ни одной машины или трактора, то поворотку не включаю.