初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1501

 
Sergey Voytsekhovsky #:

こんばんは。

どこに行けば、どこに行けば、どこに行けば、どこに行けば、どこに行けば、どこに行けば、どこに行けば、どこに行けば、どこに行けば、どこに行けば読めるのか、教えていただけませんか?

入力はちょうど3より大きい正の整数の配列で、出力はNOD(最大公約数)です。

ユークリッドのアルゴリズムに基づいて自分で書こうとしましたが、混乱してしまいました。一般的に、私は経験が不足している。

もし、どなたか合格された方がいらっしゃいましたら、労作と思わずに、情報をお聞かせください。ありがとうございました!

アルゴリズム自体は複雑ではない。紙や電卓で計算するのは簡単ですが、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 #:

私のフォーラムでのコミュニケーションの実践から言えることは、すでに書いたコードを一度に見せれば、相手は早く答えてくれるし、コードのどこにエラーがあるのかも教えてくれる。

よろしく、ウラジミール。

ご意見ありがとうございます。やってみよう。理解のために簡単に背景を説明します。私は、メインチャートに重ね合わせたRenkoベースのインジケータでこの関数を使用する予定です。現在のレンガの大きさを判断する必要があります。ZigZagはRenkoチャートに基づいて構築されており、トップとボトムの2つの配列を持っています。レンガのサイズを自動的に調整するために、それらの間の距離の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 #:
Sergey、NODを見つけたい数値の配列を作り、それを私の前の投稿のArrayGcd()関数に渡してください。

ありがとう、前回の投稿を送った後にあなたのメッセージを見ました。

 
Sergey Voytsekhovsky #:

ありがとう。前回のメッセージを送った後で、あなたのメッセージを見ました。

コード中のいたるところでulongをintに置き換えることができますが、その場合、配列内のすべての数値が正であることを確認する必要があります。
 
Yuriy Bykov #:
セルゲイ、NODを見つけたい数値の配列を作り、前の記事のArrayGcd()関数に渡す。

しかし、このケースでNODを使えるかどうかはわかりません。自明でない公約数が存在し、それらの間に厳密な関係がない数について計算したいようです。
そうすれば、高い確率で常にNOD = 1となる。

おそらく確認する必要があり、それはアルゴリズムをコーディングした後になります。ご意見ありがとうございました。

 

あるEAから別のEAに機能をインポート することは可能でしょうか?

例えば、注文をオープンするEAがあり、口座の状態を監視するEAがあり、そこではドローダウンなどのパラメータが指定されています、

2つ目のEAのドローダウンに達すると、1つ目のEAは注文を出さないようにしたいのですが・・・。

例えばどうすればいいでしょうか?

理由: