초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 1501

 
Sergey Voytsekhovsky #:

안녕하세요.

어디서 찾고, 보고, 읽을 수 있는지 알려주시겠어요?

입력은 정확히 3보다 큰 양의 정수 배열이고 출력은 NOD(최대공약수)입니다.

유클리드 알고리즘을 기반으로 직접 작성하려고했지만 혼란스러워졌습니다. 일반적으로 저는 경험이 부족합니다.

누군가에게 전달되면 노동이라고 생각하지 말고 plez 정보를 공유하십시오. 감사합니다!!!

알고리즘 자체는 복잡하지 않습니다. 종이나 계산기로는 쉽게 계산할 수 있지만, MQL5 언어로 번역할 수 없습니다!

 

Sergey Voytsekhovsky #:

... 유클리드의 알고리즘을 기반으로 직접 작성하려고했지만 혼란 스러웠습니다. 일반적으로 경험이 부족합니다 ...

... 알고리즘 자체는 복잡하지 않습니다. 종이 한 장이나 계산기로 계산하는 것은 간단하지만 MQL5 언어로 번역 할 수 없습니다!

포럼에서의 커뮤니케이션 관행을 바탕으로 이미 작성한 코드를 보여 주면 더 빨리 답변을받을 수 있고 코드의 오류 위치를 알려줄 것이라고 말할 수 있습니다.

감사합니다, 블라디미르.

 
ulong gcd(ulong a, ulong b) {
   ulong c;
   if(a < b) {
      c = a;
      a = b;
      b = c;
   }

   while(b > 0) {
      c = a % b;
      a = b;
      b = c;
   }

   return a;
}

ulong ArrayGcd(ulong &a[]) {
   int n = ArraySize(a);
   if(n == 1) {
      return 0;
   }
   ulong c = gcd(a[0], a[1]);

   for(int i = 2; i < n; i++) {
      c = gcd(a[i], c);
      if(c == 1) {
         break;
      }
   }
   return c;
}

int OnInit() {
   PrintFormat("gcd(35, 140) = %d", gcd(35, 140));
   PrintFormat("gcd(35, 147) = %d", gcd(35, 147));
   PrintFormat("gcd(35, 149) = %d", gcd(35, 149));
   
   ulong a1[] = {35, 140, 28, 7};
   ulong a2[] = {35, 140, 28, 6};
   ulong a3[] = {32, 140, 28, 16};
   PrintFormat("gcd(35, 140, 28, 7) = %d", ArrayGcd(a1));
   PrintFormat("gcd(35, 140, 28, 6) = %d", ArrayGcd(a2));
   PrintFormat("gcd(32, 140, 28, 16) = %d", ArrayGcd(a3));
   return(INIT_SUCCEEDED);
}
 
MrBrooklin #:

포럼에서 소통하는 제 경험에 비추어 볼 때, 이미 작성한 코드를 한 번에 보여 주면 더 빨리 답변해 주고 코드의 오류 위치를 알려 줍니다.

감사합니다, 블라디미르.

네, 의견 주셔서 감사합니다. 한번 해보겠습니다. 이해를 돕기 위한 간단한 배경 설명입니다. 저는 이 함수를 기본 차트에 겹쳐진 렌코 기반 인디케이터에서 사용할 계획입니다. 현재 벽돌의 크기를 결정할 필요가 있습니다. 지그재그는 렌코 차트를 기반으로 구축되었으며, 무엇보다도 상단과 하단의 두 가지 배열이 있습니다. 이제 벽돌의 크기를 자동으로 조정하기 위해 벽돌 사이의 거리의 최대공약분(GreatestCommonDivider)을 결정해야 합니다.

이런 종류의 크라코자브라를 스케치한 지금 당장은 당황스럽고 다음에 무엇을 해야 할지 생각할 수 없습니다.

//+------------------------------------------------------------------+
//| Вычисляем значение НОД(НаибольшийОбщийДелитель)=размера кирпичика|
//+------------------------------------------------------------------+
int CalculateBrickSize(int &size_brick, double &Arr_PeakBuff[], double &Arr_BottomBuff[])
  {
   int    size_zigbuf = 0;
   double peak        = 0.0;
   double bottom      = 0.0;

   int zigLag   = 0.0;
   int Arr_ZigLag[];

   if(!ArrayGetAsSeries(Arr_PeakBuff))
      ArraySetAsSeries(Arr_PeakBuff,   true);
   if(!ArrayGetAsSeries(Arr_BottomBuff))
      ArraySetAsSeries(Arr_BottomBuff, true);
   ArrayInitialize(Arr_ZigLag, 0.00);

   size_zigbuf = MathMin(ArraySize(Arr_PeakBuff), ArraySize(Arr_BottomBuff));
   size_zigbuf = MathMin(size_zigbuf, ChartVisibleBars()) - 1;

   if(size_zigbuf > 0)
      ArrayResize(Arr_ZigLag, size_zigbuf);
   for(int i = 0; i < size_zigbuf; i++)
     {
      if(Arr_PeakBuff[i] != EMPTY_VALUE)
         peak = NormalizeDouble(Arr_PeakBuff[i], _Digits);
      if(Arr_BottomBuff[i] != EMPTY_VALUE)
         bottom = NormalizeDouble(Arr_BottomBuff[i], _Digits);
      if(peak == 0 || bottom == 0)
        {
         zigLag = 1;
        }
      else
         zigLag = (int)DoubleToString(MathAbs(peak - bottom)*100000, 0);
      Arr_ZigLag[i] = zigLag;
     }
//---
   int delimoe = 0;
   int delitel = 1;
   int ostatok = 1;
   ArraySort(Arr_ZigLag);

   for(int i = ArraySize(Arr_ZigLag)-1; i > 0; i--)
     {
      if(Arr_ZigLag[i] != Arr_ZigLag[i-1])
        {
         if(delimoe == 0)
            delimoe = MathMax(Arr_ZigLag[i], Arr_ZigLag[i-1]);
         if(delitel == 1)
            delitel = MathMin(Arr_ZigLag[i], Arr_ZigLag[i-1]);
         ostatok = (int)MathMod(delimoe, delitel);
         if(ostatok == 0)
           {
            delimoe = delitel;
            delitel = 1;
            ostatok = 1;
            continue;
           }
         else
            while(ostatok != 0)
              {
               ostatok = (int)MathMod(delimoe, delitel);
               delimoe = delitel;
               delitel = ostatok;
              }
        }
     }
   //Print("delimoe = ", delimoe);
   //Print("delitel = ", delitel);
   //Print("ostatok = ", ostatok);
   return(size_brick);
  }
//+------------------------------------------------------------------+
 
물론 이것은 초안 일 뿐이므로 엄격하게 판단하지 마십시오. 어딘가 잘못되었다고 생각하고, 모든 것이 지저분하고, 더 간단하고 명확한 해결책을 찾아야하지만 아직 머릿속에 떠오르지 않습니다.....
 
Sergey Voytsekhovsky #:
물론 이것은 초안 일 뿐이므로 엄격하게 판단하지 마십시오. 어딘가 잘못되었다고 생각하고, 모든 것이 지저분하고, 더 간단하고 명확한 해결책을 찾아야하지만 아직 생각할 수 없습니다....
세르게이, NOD를 찾으려는 숫자 배열을 만들어서 이전 게시물의 ArrayGcd() 함수에 전달하세요.

하지만 이 경우 NOD를 사용할 수 있을지 잘 모르겠습니다. 숫자 사이에 엄격한 관계가 없는 숫자에 대해 계산하여 사소하지 않은 공통 제수의 존재를 보장하려는 것 같습니다.
그러면 높은 확률로 항상 NOD = 1을 얻을 수 있습니다.
 
Yuriy Bykov #:
세르게이, NOD를 찾고자 하는 숫자의 배열을 만들어서 이전 게시물의 ArrayGcd() 함수에 전달해 주세요.

고마워요, 마지막 메시지를 보낸 후에 귀하의 메시지를 보았으므로 이제 적용하려고합니다.

 
Sergey Voytsekhovsky #:

고마워요, 마지막 메시지를 보낸 후에 귀하의 메시지를 보았으므로 이제 적용하려고합니다.

코드의 모든 곳에서 ulong을 int로 바꿀 수 있지만 배열의 모든 숫자가 양수인지 확인해야 합니다.
 
Yuriy Bykov #:
세르게이, NOD를 찾고자 하는 숫자의 배열을 만들어 이전 게시물의 ArrayGcd() 함수에 전달해 주세요.

하지만 이 경우 NOD를 사용할 수 있을지 잘 모르겠습니다. 숫자 사이에 엄격한 관계가 없는 숫자에 대해 계산하고 싶고, 사소하지 않은 공통 제수가 있다는 것을 제공하는 것처럼 보입니다.
그러면 높은 확률로 항상 NOD = 1을 얻을 수 있습니다.

아마도 알고리즘을 코딩 한 후에 확인해야 할 것입니다. 피드백을 주셔서 감사합니다.

 

안녕하세요, 한 EA에서 다른 EA로 함수를 가져올 수 있는지 알려주시겠습니까?

예를 들어, 주문을 여는 EA가 있고 매개 변수 드로 다운 등이 지정된 계정 상태를 모니터링하는 EA가 있습니다,

두 번째 EA의 드로다운에 도달하면 첫 번째 EA가 주문을 열지 않아야합니다....

예를 들어 어떻게 해야 하나요?

사유: