Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 421

 

Fez o cálculo apenas na mudança de bar - o meu método :) Se tem alguma ideia para optimização - eu vou ouvir!

//+------------------------------------------------------------------+
//|                                                       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-:
Errado - a enumeração funciona como está, se o valor do índice excedesse o tamanho da matriz, receberia maldições, e não há nenhuma. Há um valor com zeros, e N pode ser não-zero! Acontece que a verificação também acontece, e depois acontece que a matriz não escreve dados.
Eu não estava a adivinhar, estava a apontar a incorrecção do laço proposto. Pense de onde e para onde, com um tamanho de matriz igual a cinco, precisa de fazer um loop...
 
Artyom Trishkin:
Eu não estava a adivinhar, estava a apontar a incorrecção do laço proposto. Pense de onde e para onde, com um tamanho de matriz igual a cinco, precisa de fazer um loop...
Tanto nas minhas como nas suas variantes existem cinco valores, por favor explique a diferença.
 
-Aleks-:
Tanto o meu como o seu têm cinco valores, qual é a diferença - por favor explique.

O tamanho da matriz é cinco. Se se indexar a matriz de 4 a 0, incluindo zero, o laço passará por todos os valores da matriz. Se tentar indexar a partir de cinco, a matriz está fora de alcance. Se indexar de 4 a zero, não incluindo zero, o laço não passará por todo o conjunto - a célula zero do conjunto não será lida.

Isto é, isto é, está correcto:

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

ou

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

O índice da matriz (i)
4
3
2
1
0
Número de célula da matriz
5
4
3
2
1
 
Artyom Trishkin:

O tamanho da matriz é cinco. Se se indexar a matriz de 4 a 0, incluindo zero, o laço passará por todos os valores da matriz. Se tentar indexar a partir de cinco, a matriz está fora de alcance. Se indexar de 4 a zero, não incluindo zero, o laço não passará por todo o conjunto - a célula zero do conjunto não será lida.

Isto é, isto é, está correcto:

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

ou

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

O índice da matriz (i)
4
3
2
1
0
Número de célula da matriz
5
4
3
2
1
Assim, escreveu no exemplo o que eu tinha escrito no código. Não vejo qual é a diferença aqui...
 
Leanid Aladzyeu:

fazer um ataque por força bruta a partir do fim (pois o ataque por força bruta pode primeiro perder dados se a lista for alterada)


 

Leanid Aladzyeu:


Leanid Aladzyeu:

Fazer a reconstrução a partir do fim (uma vez que a reconstrução pode perder dados primeiro ao alterar a lista)


Nunca deixa de me surpreender... Porque é que, em vez de aprenderem a utilizar os espelhos retrovisores, as pessoas aprendem apenas uma regra de trânsito e viram a esquina sem olhar e vão em frente...?

Porque é que, depois de ter lido que ao fechar várias encomendas de uma lista de encomendas abertas, tem de ir do maior para o mais pequeno índice e até aconselhar outros a irem nesta direcção em todo o lado...

 
Alexey Viktorov:

Nunca deixa de me surpreender... Porque é que em vez de aprenderem a usar espelhos retrovisores, as pessoas aprendem apenas um ponto das regras de trânsito e viram a esquina sem olhar e seguem em frente??

Porquê ler uma vez que se fecharmos várias encomendas a partir de uma lista de encomendas abertas devemos tentar mudar uma encomenda de um índice maior para um índice menor, e aconselhar os outros a usarem sempre esta direcção...?

As possibilidades de busca podem ser o que quiserem, incomodou-me quando estava a fechar do último para o primeiro, deveria ter sido vice-versa. E fez, apenas existem nuances, não apenas o contador para rodar.
 
Alexey Viktorov:

Nunca deixa de me surpreender... Porque é que em vez de aprenderem a usar espelhos retrovisores, as pessoas aprendem apenas um ponto das regras de trânsito e viram a esquina sem olhar e seguem em frente??

Porquê ler uma vez que se fechar várias encomendas a partir de uma lista de encomendas abertas deve passar de um índice maior para um índice menor e aconselhar os outros a irem sempre nessa direcção...?

Isto é verdade para tudo o que é eliminado no laço (ordens, objectos gráficos, etc.), porque a eliminação preenche as células anteriores da "matriz de objectos" com os "objectos" subsequentes. Em geral, é claro, temos de considerar a situação. Por exemplo, quando se está a escrever os indicadores, para começar a desenhar a partir do último elemento (rates_total-1), para o dizer de forma suave, não é sensato.
 
Vladimir Zubov:
Duck, podes fazê-lo da maneira que quiseres, eu estava a esforçar-me para fechar de último para primeiro, devia tê-lo feito ao contrário. E fi-lo, só que há nuances, não só o contador a virar.
Tapochun:
Isto é verdade para tudo o que é eliminado no laço (ordens, objectos gráficos, etc.) porque a eliminação preenche as células anteriores da "matriz de objectos" com "objectos" subsequentes. Em geral, é claro, temos de considerar a situação. Por exemplo, quando se escreve indicadores, é uma parvoíce, para o dizer de forma suave, começar a desenhar a partir do último elemento (rates_total-1).

Está a tentar explicar-me como o fazer correctamente? Ou talvez eu tenha entendido mal alguma coisa?

Na verdade, se estou a conduzir numa estrada deserta e não vejo um único carro ou tractor por perto, não viro.

Razão: