MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1689

 
MakarFX #:

もし、「-1」が嫌なら、こうすればいい。

いいえ、できません。この方法で配列にアクセスすると、プログラムがクラッシュします。

せいぜい内部の配列にアクセスしても、必要なデータを見逃すか、単にループの中で到達できないだけでしょう。

 
Nikolay Ivanov #:

基本的にはシンプルで、あなたのユニークは、異なるマジシャン間のミスマッチな注文をすべてまとめる...というものです。

例えば、3つの注文がある場合

最初の反復でmagic=1unique=0、反復の終わりでunique=2に なる。

2回目の反復でmagik=2unique=2、反復終了時にuniqueは=3に なる

3>=全オーダーの数なので、whileループが壊れる...。そして魔法=3は確認されなかった...。だから、魔法はまた2であり、すべてにおいてそうである。

1次にはデフォルトでマジック=1が与えられています。

反復の開始 magic = 1 unique = 0, 終了時 (magic = 1 のオーダーがすでに1つあるとき) magic = 1 はまだ 1 で unique = 0
2回目の反復 magic = 2 unique = 0, 終了時 magic = 2 and unique = 1 (no match) and the retorn is given to the 2nd order magic = 2.
3回も同じはずですが...。

全工程を印刷したかったのですが、何か問題が発生しました。

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique)
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}

-----------------------------------

'endless cycle.mq4'     endless cycle.mq4       1       1
'}' - semicolon expected        endless cycle.mq4       49      7
'else' - 'while' expected       endless cycle.mq4       50      5
'else' - illegal 'else' without matching 'if'   endless cycle.mq4       50      5
'OnTick' - function declarations are allowed on global, namespace or class scope only   endless cycle.mq4       60      6
'OnTick' - function already defined and has body        endless cycle.mq4       60      6
   see previous declaration of function 'OnTick'        endless cycle.mq4       60      6
'}' - unexpected end of program endless cycle.mq4       63      1
6 errors, 0 warnings            7       1
 
Nerd Trader #:

1次には、デフォルトで magic = 1 が与えられる。

反復の開始 magic = 1 unique = 0, 終了時 (magic = 1 のオーダーがすでに1つあるとき) magic はまだ 1 and unique = 0
2回目の反復 magic = 2 unique = 0, 終了時 magic = 2 and unique = 1 (一致しない) そして retorn は2次 magic = 2 に割り当てられる。
3番目は同じはずだ...。

全工程を印刷したかったのですが、何か問題が発生しました。

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique); // <---
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}


 
Artyom Trishkin #:

より多くのすべてのプログラミング 言語を目指します。

単純なことです。プログラミング言語では、カウントはゼロから始まります。配列の最初のセルのインデックスは0になります。したがって、それを含むゼロの前に逆ループを行う必要があります。すなわち >=0

OrdersTotal()は、例えば10と出力します。そして、配列の最後のインデックスが9であるのに対して、10からループを開始します(ゼロから開始することをお忘れですか)。また、存在しない配列セルにアクセスした場合はどうなるのでしょうか?その通りです。配列の限界を超えて、メモリの未割り当て領域に入って しまったため、プログラムはクリティカルエラーでクラッシュします。

これは確かにしっかりした松葉杖 です。読めば、学べば、すべてが見えてくる。

ありがとうございます。そういう意味じゃないんです。mqlはオープンなライセンスであれば、何でも許される。そうでなければ、私はあなたをいじめていることになります。まあ、例えばNormalizeDouble関数にフラグを立てて、プレーストリミングや算術丸めを使っても良かったような気もしますが。あるいは、例えば、売りのみ、買いのみ、保有ポジション数を返すなど、ポジション処理の機能を拡張することも可能です。また、より詳細なヘルプを書くことができる。しかし、これはあくまでも素人の意見です。また、前言は厳しいと思われたかもしれませんが、ご容赦ください。
 

C/C++については、無料の良いコースが山ほどあります。

Mqlは彼らに近く、自由に学ぶことができる。幸いなことに、深い知識は必要ありません。しかし、少なくとも言語の構文や アルゴリズムの基本的な基礎は知っている。

そうでなければ、プラットフォームやアルゴリズムに関する協議ではなく、どこに置くか、ループとは何か、なぜインデックスが0なのか、といった小学校レベルの対話になり、ナンセンスな話題になってしまいます。

例えば、intuit.ruというサイトがあります。C言語やアルゴリズムのコースがあり、時間をかけて、長くても2週間ほどです。同時に紙も手に入れることができます :-)

 
Maxim Kuznetsov 言語の構文や アルゴリズムの基本的な基礎は知っている。

そうでなければ、プラットフォームやアルゴリズムに関する協議ではなく、どこに置くか、ループとは何か、なぜインデックスが0なのか、といった小学校レベルの対話になり、ナンセンスな話題になってしまいます。

例えば、intuit.ruというサイトがあります。C言語やアルゴリズムのコースがあり、時間をかけて、長くても2週間ほどです。同時に紙も手に 入るかもしれません:-)

こんな感じ?


 
Artyom Trishkin #:

OrdersTotal() は、例えば10と表示されます。しかし、配列の最後のインデックスは9です(ゼロから数えていることを思い出してください)。また、存在しない配列セルにアクセスした場合はどうなるのでしょうか?その通りです。配列の限界を超えて、メモリの未割り当て領域に入って しまったため、プログラムはクリティカルエラーでクラッシュします。

訂正します...致命的なエラーは発生せず、OrderSelectのブール値がfalseを返すだけです...それだけです...もちろん、避けるに越したことはないのですが......間違ったコード機能を使うと、起こりうるエラーを予測するのが難しくなるからです......。


ナードトレーダー#:

1次には、デフォルトで magic = 1 が与えられる。

反復の開始 magic = 1 unique = 0, 終了時 (magic = 1 のオーダーがすでに1つある場合) magic = 1 and unique = 0
2回目の反復 magic = 2 unique = 0, 終了時 magic = 2 and unique = 1 (no match) and retorn is assigned to the 2nd order magic = 2.
3回も同じことをする...。

ただ、ユニークの 充填がすごく早くなって限界に達して、魔法がほとんど育たなく なるのが目に見えているので......。一般的に、ループ制御と、この変数が膨らむループ内のロジックの両方に同じ変数を使うのは間違いでした......。

この文脈で解決策を見つけるには、印刷が必要ですが、私は問題を再定式化することをお勧めします......例えば、ループによって注文の最大マジックを求め、それを+1して返す、それが正しいシンプルな解決方法でしょう。

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2021.10.19
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 

このようにすれば、コードは必要に応じて呼び出されるため、その重さは問題にはなりません

テストでは、Buy/Sellを使用しました。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  Print(GetMagic());
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetMagic()
{
//Если должен быть открыт стопордер и если есть уже открытые или отложенные
//ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать
//для нашего ордера уникальный маджик
  int arr[];
  int n=-1;
  int OT=OrdersTotal();
  for(int i=0; i<OT; i++) {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
      if(OrderType() == OP_SELL || OrderType() == OP_BUY) {
        if(ArraySearchInt(arr, OrderMagicNumber())==-1) {
          n++;
          ArrayResize(arr,n+1);
          arr[n]=OrderMagicNumber();
        }
      }
    }
  }
  ArraySort(arr);
  OT=ArraySize(arr);
  for(int i=0; i<OT; i++)
    if(arr[i]!=i) return i;
  return OT;
}
//-- удаляет копии с массива
int ArraySearchInt(int& m[], int e)
{
  for(int i=0; i<ArraySize(m); i++) {
    if(m[i]==e) return(i);
  }
  return(-1);
}
 

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するTips、ディスカッションなど。

ヴィタリー・ムジチェンコ, 2021.10.19 23:08

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique); // <---
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}


セミョン・セミョーニク
Nikolay Ivanov #:

少し訂正させていただきます。クリティカルなエラーは発生せず、OrderSelectというブール変数がfalseを返すだけ...です。しかし、もちろん避けたほうがいい...なぜなら、コードの機能を正しく使用しないと、起こりうる落とし穴を予測するのが難しいから...。


魔法はほとんど成長 しないのに、ユニークはものすごいスピードで充填されて限界に達して いるようにしか見えないのですが......。一般に、ループ制御とループ内のロジックの両方に同じ変数を使うのは間違っていて、この変数が膨らんでしまう...。

この文脈で解決策を見つけるには、印刷が必要ですが、私は問題を再定式化することをお勧め します......例えば、ループによって注文の最大マジックを求め、それを+1して 返す、それが正しいシンプルな解決方法でしょう。

このオプションがうまくいかなかった場合の、最後の手段です。とりあえず、プリントはこんな感じになりました。

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber()){
              unique ++;
              Print (" MAGIC ", magic, " | UNIQUE ", unique);
            }
          }
        }
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}
------------------------------------------------

2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #10  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 9
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #9  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #8  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #7  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #6  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #5  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #4  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #3  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #2  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #1  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.827 2021.01.04 00:00:00  endless cycle test started

 
Vitaly Muzichenko #:

このようにすれば、コードは必要に応じて呼び出されるため、その重さは問題にはなりません

テストでは、Buy/Sellを使用しました。

明日見てみます、今は気合が入りません。