초보자의 질문 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- :
그들은 추측하지 않았습니다. 열거형은 어쨌든 작동합니다. 인덱스 값이 배열의 크기를 초과하면 저주를 받을 것이지만 그렇지는 않습니다. 0이 있는 값이 있지만 N은 0과 같지 않을 수 있습니다! 검사도 발생하고 어레이가 데이터를 쓰지 않는 것으로 나타났습니다.
추측하지는 않았지만 제안 된주기의 부정확성을 지적했습니다. 배열 크기 가 5인 위치와 위치에 대해 스스로 생각해 보십시오. 루프가 필요합니다.
 
Artyom Trishkin :
추측하지는 않았지만 제안 된주기의 부정확성을 지적했습니다. 배열 크기가 5인 위치와 위치를 스스로 생각해 보십시오. 루프가 필요합니다.
내 버전과 귀하의 버전에는 모두 다섯 가지 값이 있습니다. 차이점은 무엇입니까? 설명하십시오.
 
-Aleks- :
내 버전과 귀하의 버전에는 모두 다섯 가지 값이 있습니다. 차이점은 무엇입니까? 설명하십시오.

배열 크기는 5입니다. 0을 포함하여 4에서 0까지 배열을 인덱싱하면 루프가 배열의 모든 값을 통과합니다. 5에서 색인을 생성하려고 하면 범위를 벗어난 배열이 있습니다. 0을 포함하지 않고 4에서 0으로 인덱싱하면 루프가 전체 배열을 통과하지 않습니다. 배열의 0 셀은 읽히지 않습니다.

즉, 다음과 같이 사실입니다.

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

또는

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

배열 인덱스(i)
4

2
하나
0
배열 셀 번호
5
4

2
하나
 
Artyom Trishkin :

배열의 크기는 5입니다. 0을 포함하여 4에서 0까지 배열을 인덱싱하면 루프가 배열의 모든 값을 통과합니다. 5에서 색인을 생성하려고 하면 범위를 벗어난 배열이 있습니다. 0을 포함하지 않고 4에서 0으로 인덱싱하면 루프가 전체 배열을 통과하지 않습니다. 배열의 0 셀은 읽히지 않습니다.

즉, 다음과 같이 사실입니다.

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

또는

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

배열 인덱스(i)
4

2
하나
0
배열 셀 번호
5
4

2
하나
그래서 당신은 내가 코드에서 작성한 것을 예제에 썼습니다. 차이점이 뭔지 이해가 안가네요...
 
Leanid Aladzyeu :

끝에서 반복 (목록이 변경되면 반복이 먼저 데이터를 잃을 수 있기 때문에)


 

Leanid Aladzyeu :


Leanid Aladzyeu :

끝에서 반복 (목록이 변경되면 반복이 먼저 데이터를 잃을 수 있기 때문에)


사람들은 왜 백미러 사용법을 배우지 않고 도로 룰 하나만 배우고 방향지시등을 켜고 앞도 보지 않고 운전을 하는 걸까요???

왜, 열린 주문 목록에서 여러 주문을 닫을 때 더 큰 인덱스에서 더 작은 인덱스로 주문을 정렬해야 한다는 것을 읽은 후에 적용하고 심지어 모든 곳에서 다른 사람들에게 그러한 열거 방향을 적용하도록 조언합니다. ..

 
Alexey Viktorov :

사람들은 왜 백미러 사용법을 배우지 않고 도로 룰 하나만 배우고 방향지시등을 켜고 앞도 보지 않고 운전을 하는 걸까요???

왜, 열린 주문 목록에서 여러 주문을 닫을 때 더 큰 인덱스에서 더 작은 인덱스로 주문을 정렬해야 한다는 것을 읽은 후에 적용하고 심지어 모든 곳에서 다른 사람들에게 그러한 열거 방향을 적용하도록 조언합니다. ..

열거의 가능성은 오리무중, 나는 한 번 마지막에서 처음으로 폐쇄, 그 반대였어야 했다고 긴장했다. 그리고 그는 카운터를 돌릴뿐만 아니라 뉘앙스가 있습니다.
 
Alexey Viktorov :

사람들은 왜 백미러 사용법을 배우지 않고 도로 룰 하나만 배우고 방향지시등을 켜고 앞도 보지 않고 운전을 하는 걸까요???

왜, 열린 주문 목록에서 여러 주문을 닫을 때 더 큰 인덱스에서 더 작은 인덱스로 주문을 정렬해야 한다는 것을 읽은 후에 적용하고 심지어 모든 곳에서 다른 사람들에게 그러한 열거 방향을 적용하도록 조언합니다. ..

이것은 루프에서 반복하는 동안 삭제되는 모든 것(주문, 그래프 개체 등)에 적용됩니다. 삭제할 때 "객체 배열"의 이전 셀은 후속 "객체"로 채워집니다. 물론 일반적으로 상황을 기반으로 구축해야 합니다. 예를 들어, 지표를 작성할 때 마지막 요소(rates_total-1)부터 그리기 시작하는 것은 가볍게 말해서 어리석은 일입니다.
 
Vladimir Zubov :
열거의 가능성은 오리무중, 나는 한 번 마지막에서 처음으로 폐쇄, 그 반대였어야 했다고 긴장했다. 그리고 그는 카운터를 돌릴뿐만 아니라 뉘앙스가 있습니다.
타포춘 :
이것은 루프에서 반복하는 동안 삭제되는 모든 것(주문, 그래프 개체 등)에 적용됩니다. 삭제할 때 "객체 배열"의 이전 셀은 후속 "객체"로 채워집니다. 물론 일반적으로 상황을 기반으로 구축해야 합니다. 예를 들어, 지표를 작성할 때 마지막 요소(rates_total-1)부터 그리기 시작하는 것은 가볍게 말해서 어리석은 일입니다.

제대로 하는 방법을 알려주는 것 같죠? 아니면 내가 뭔가를 이해하지 못했습니까?

사실, 내가 황량한 도로를 운전할 때 주변에 자동차나 트랙터가 한 대도 보이지 않으면 방향 지시등을 켜지 않습니다.

사유: