Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 421

 

Fatto il calcolo solo al cambio di barra - il mio metodo :) Se avete delle idee per l'ottimizzazione - vi ascolterò!

//+------------------------------------------------------------------+
//|                                                       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-:
Sbagliato - l'enumerazione funziona così com'è, se il valore dell'indice superasse la dimensione dell'array, verrebbe maledetto, e non è così. C'è un valore con degli zeri, e N può essere non zero! Si scopre che anche il controllo avviene, poi si scopre che l'array non scrive dati.
Non stavo tirando a indovinare, stavo sottolineando la scorrettezza del ciclo proposto. Pensate a voi stessi from-where e to-where con un array di dimensioni pari a cinque è necessario fare un ciclo...
 
Artyom Trishkin:
Non stavo tirando a indovinare, stavo sottolineando la scorrettezza del ciclo proposto. Pensate a voi stessi from-where e to-where con un array di dimensioni pari a cinque, è necessario fare un ciclo...
Sia nella mia che nella tua variante ci sono cinque valori, spiega la differenza.
 
-Aleks-:
Sia il mio che il tuo hanno cinque valori, qual è la differenza - spiega per favore.

La dimensione della matrice è cinque. Se indicizzate l'array da 4 a 0, compreso lo zero, il ciclo passerà attraverso tutti i valori dell'array. Se cercate di indicizzare da cinque, l'array è fuori portata. Se indicizzate da 4 a zero, senza includere lo zero, il ciclo non passerà attraverso tutto l'array - la cella zero dell'array non sarà letta.

Cioè questo è corretto:

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

o

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

L'indice della matrice (i)
4
3
2
1
0
Numero di cella della matrice
5
4
3
2
1
 
Artyom Trishkin:

La dimensione della matrice è cinque. Se indicizzate l'array da 4 a 0, compreso lo zero, il ciclo passerà attraverso tutti i valori dell'array. Se cercate di indicizzare da cinque, l'array è fuori portata. Se indicizzate da 4 a zero, senza includere lo zero, il ciclo non passerà attraverso tutto l'array - la cella zero dell'array non sarà letta.

Cioè questo è corretto:

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

o

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

L'indice della matrice (i)
4
3
2
1
0
Numero di cella della matrice
5
4
3
2
1
Quindi hai scritto nell'esempio quello che avevo scritto nel codice. Non vedo quale sia la differenza qui...
 
Leanid Aladzyeu:

fare un attacco di forza bruta dalla fine (poiché l'attacco di forza bruta potrebbe prima perdere dati se la lista viene cambiata)


 

Leanid Aladzyeu:


Leanid Aladzyeu:

Fare il re-build dalla fine (poiché il re-build può perdere i dati prima quando si cambia la lista)


Non smette mai di stupirmi... Perché invece di imparare a usare gli specchietti retrovisori, la gente impara solo una regola del traffico e gira l'angolo senza guardare e va avanti...?

Non so perché una volta ho letto che quando si chiudono diversi ordini dalla lista di quelli aperti si deve passare da un indice più grande a uno più piccolo e anche consigliare agli altri di andare sempre in questa direzione...

 
Alexey Viktorov:

Non smette mai di stupirmi... Perché invece di imparare a usare gli specchietti retrovisori, la gente impara solo un punto delle regole del traffico e gira l'angolo senza guardare e va dritto?

Perché una volta leggere che se chiudiamo diversi ordini da una lista di quelli aperti, dovremmo guardare da un indice più grande a uno più piccolo e consigliare agli altri di usare sempre questa direzione...?

Le possibilità di ricerca possono essere quelle che vuoi, mi ha dato fastidio quando chiudevo dall'ultimo al primo, avrebbe dovuto essere viceversa. E ha fatto, solo ci sono sfumature, non solo il contatore a ruotare.
 
Alexey Viktorov:

Non smette mai di stupirmi... Perché invece di imparare a usare gli specchietti retrovisori, la gente impara solo un punto delle regole del traffico e gira l'angolo senza guardare e va dritto?

Perché una volta leggere che se si chiudono diversi ordini da una lista di quelli aperti si deve passare da un indice più grande a uno più piccolo e consigliare agli altri di andare sempre in questa direzione...?

Questo è vero per tutto ciò che viene cancellato nel ciclo (ordini, oggetti grafici, ecc.), perché la cancellazione riempie le celle precedenti della "matrice degli oggetti" con gli "oggetti" successivi. In generale, ovviamente, dobbiamo considerare la situazione. Per esempio, quando si disegnano gli indicatori, è sciocco, per usare un eufemismo, iniziare a disegnare dall'ultimo elemento (rates_total-1).
 
Vladimir Zubov:
Duck, puoi farlo come vuoi, io mi sforzavo di chiudere dall'ultimo al primo, avrei dovuto farlo al contrario. E l'ho fatto, solo che ci sono delle sfumature, non solo il contatore da girare.
Tapochun:
Questo è vero per tutto ciò che viene cancellato nel ciclo (ordini, oggetti del grafico, ecc.) perché la cancellazione riempie le celle precedenti dell'"array di oggetti" con "oggetti" successivi. In generale, ovviamente, dobbiamo considerare la situazione. Per esempio, quando si scrivono gli indicatori, è sciocco, per usare un eufemismo, iniziare a disegnare dall'ultimo elemento (rates_total-1).

Stai cercando di spiegarmi come farlo correttamente? O forse ho capito male qualcosa?

In realtà, se sto guidando su una strada deserta e non vedo una sola macchina o trattore in giro, non giro.