Yeni başlayanlardan sorular MQL5 MT5 MetaTrader 5 - sayfa 421

 

Sadece çubuğu değiştirirken bir hesaplama yaptım - kendi yöntemim :) Optimizasyon için fikirleriniz varsa dinlerim!

//+------------------------------------------------------------------+
//|                                                       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- :
Tahmin etmediler - numaralandırma yine de işe yarıyor, eğer indeks değeri dizinin boyutunu aşarsa, lanetler alacaktı, ama yapmıyorlar. Sıfırlı bir değer varken N sıfıra eşit olmayabilir! Kontrolün de gerçekleştiği ortaya çıktı, ardından dizinin veri yazmadığı ortaya çıktı.
Tahmin etmedim, ancak önerilen döngünün yanlışlığına dikkat çektim. Beşe eşit bir dizi boyutuyla nereden ve nereye kendiniz düşünün, döngü yapmanız gerekir ...
 
Artyom Trishkin :
Tahmin etmedim, ancak önerilen döngünün yanlışlığına dikkat çektim. Beş kişilik bir dizi boyutuyla nereden ve nereye kendi başınıza düşünün, döngüye ihtiyacınız var ...
Hem benim hem de sizin versiyonunuzda beş değer var, fark nedir - lütfen açıklayın.
 
-Aleks- :
Hem benim hem de sizin versiyonunuzda beş değer var, fark nedir - lütfen açıklayın.

Dizinin boyutu beştir. Diziyi sıfır dahil 4'ten 0'a indekslerseniz, döngü dizinin tüm değerlerinden geçecektir. Beşten indekslemeye çalışırsanız, sınırların dışında bir dizi olacaktır. Sıfır dahil olmak üzere 4'ten sıfıra indekslerseniz, döngü tüm diziden geçmez - dizinin sıfır hücresi okunmaz.

Yani şu şekilde doğrudur:

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

veya

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

Dizi indeksi (i)
4
3
2
1
0
dizi hücre numarası
5
4
3
2
1
 
Artyom Trishkin :

Dizi boyutu beştir. Diziyi sıfır dahil 4'ten 0'a indekslerseniz, döngü dizinin tüm değerlerinden geçecektir. Beşten indekslemeye çalışırsanız, sınırların dışında bir dizi olacaktır. Sıfır dahil olmak üzere 4'ten sıfıra indekslerseniz, döngü tüm diziden geçmez - dizinin sıfır hücresi okunmaz.

Yani şu şekilde doğrudur:

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

veya

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

Dizi indeksi (i)
4
3
2
1
0
dizi hücre numarası
5
4
3
2
1
Yani kodda yazdığımı örnekte yazdınız. ne farkı var anlamadım...
 
Leanid Aladzyeu :

sondan yineleyin (çünkü yineleme, liste değiştiğinde önce verileri kaybedebilir)


 

Leanid Aladzyeu :


Leanid Aladzyeu :

sondan yineleyin (çünkü yineleme, liste değiştiğinde önce verileri kaybedebilir)


Merak etmekten asla vazgeçmiyorum... İnsanlar neden dikiz aynalarını kullanmayı öğrenmek yerine, yolun kurallarının bir noktasını öğrenip dönüş sinyalini açıp bakmadan ilerliyorlar ???

Neden, açık olanlar listesinden birkaç siparişi kapatırken, siparişleri daha büyük bir dizinden daha küçük bir dizine göre sıralamak gerektiğini bir kez okuduktan sonra, uygularlar ve EVEN başkalarına her yerde ve her yerde böyle bir numaralandırma yönünü uygulamalarını tavsiye eder. ..

 
Alexey Viktorov :

Merak etmekten asla vazgeçmiyorum... İnsanlar neden dikiz aynalarını kullanmayı öğrenmek yerine, yolun kurallarının bir noktasını öğrenip dönüş sinyalini açıp bakmadan ilerliyorlar ???

Neden, açık olanlar listesinden birkaç siparişi kapatırken, siparişleri daha büyük bir dizinden daha küçük bir dizine göre sıralamak gerektiğini bir kez okuduktan sonra, uygularlar ve EVEN başkalarına her yerde ve her yerde böyle bir numaralandırma yönünü uygulamalarını tavsiye eder. ..

Dilediğiniz gibi sayma ihtimalini sikeyim, bir zamanlar sondan ilk kapanışa kadar gergindim, tam tersi olmalıydı. Ve yaptı, sadece nüanslar var, sadece sayacı çevirmek için değil.
 
Alexey Viktorov :

Merak etmekten asla vazgeçmiyorum... İnsanlar neden dikiz aynalarını kullanmayı öğrenmek yerine, yolun kurallarının bir noktasını öğrenip dönüş sinyalini açıp bakmadan ilerliyorlar ???

Neden, açık olanlar listesinden birkaç siparişi kapatırken, siparişleri daha büyük bir dizinden daha küçük bir dizine göre sıralamak gerektiğini bir kez okuduktan sonra, uygularlar ve EVEN başkalarına her yerde ve her yerde böyle bir numaralandırma yönünü uygulamalarını tavsiye eder. ..

Bu, döngüdeki yineleme sırasında silinen her şey için geçerlidir (siparişler, grafik nesneleri vb.) çünkü silerken, "nesne dizisinin" önceki hücreleri sonraki "nesneler" ile doldurulur. Genel olarak, elbette, durum üzerine inşa etmeniz gerekir. Örneğin, gösterge yazarken son elemandan (rates_total-1) çizime başlamak, en hafif tabirle saçmadır.
 
Vladimir Zubov :
Dilediğiniz gibi sayma ihtimalini sikeyim, bir zamanlar sondan ilk kapanışa kadar gergindim, tam tersi olmalıydı. Ve yaptı, sadece nüanslar var, sadece sayacı çevirmek için değil.
Tapochun :
Bu, döngüdeki yineleme sırasında silinen her şey için geçerlidir (siparişler, grafik nesneleri vb.) çünkü silerken, "nesne dizisinin" önceki hücreleri sonraki "nesneler" ile doldurulur. Genel olarak, elbette, durum üzerine inşa etmeniz gerekir. Örneğin, gösterge yazarken son elemandan (rates_total-1) çizime başlamak, en hafif tabirle saçmadır.

Sanki bana nasıl doğru yapılacağını açıklıyormuşsun gibi? Yoksa bir şey mi anlamadım?

Aslında, ıssız bir yolda ilerliyorsam ve etrafta tek bir araba veya traktör görmüyorsam, dönüş sinyalini açmıyorum.