オープンポジションをグループ分けする - ページ 5

 
Alexey Viktorov:

たくさんあるのは?毎回のクリックでも埋まらない配列項目?どのように目立たせるのか?

このコードは、わざと悪くしたかのように目に刺さる。

まあ、違いがないのなら、この方法でやってみよう。

for(int i = 0; i < 10; i++)
   {
    ArrayResize(arrTest, i+1);
    arrTest[i][0] = iOpen(_Symbol, PERIOD_CURRENT, i);
    arrTest[i][1] = iClose(_Symbol, PERIOD_CURRENT, i);

    for(int j=0;j<100;j++)
    Sleep(1);
   }

なぜダメなのか?

ArrayResize(arrTest, 10);
for(int i = 0; i < 10; i++)
  {
    arrTest[i][0] = iOpen(_Symbol, PERIOD_CURRENT, i);
    arrTest[i][1] = iClose(_Symbol, PERIOD_CURRENT, i);
  }
 
Aliaksandr Hryshyn:

このコードは、わざと悪くしたかのように目に刺さる。

まあ、違いがないのなら、この方法でやってみよう。

なぜ?

ps; あ~、なるほどね。まあ、これは一例ですが。作業配列が埋まるとき,おそらく1つのインデックスで埋まるでしょう.そんな微妙なところに気を配らなければならないバリアントではない。
 
Alexey Viktorov:

なぜ?

おそらく、サイズがあらかじめ分かっている場合に、ループ内で配列を変更させるためでしょう。

正確な理由は分かりませんが :)。

フリーランスなんでしょう!?恐るべし :)

 
Aliaksandr Hryshyn:

おそらく、サイズがあらかじめ分かっている場合に、ループ内で配列を変更させるためでしょう。

正確な理由は分かりませんが :)。

フリーランスなんでしょ!恐るべし :)

それがどうした?

 
Alexey Viktorov:

それはゴミだ。マニュアルを読まずにこの機能を使ってしまった ...

うまくいきました!ありがとうございました。私が書いたことは確かにナンセンスでした。ArrayRemoveの 削除関数は、 どのような次元の配列に対しても問題なく 機能します。

エラーは他の場所にあった。関数を適用した後、次のステップでこの変数が再びループ内で使用され、配列が範囲外になったため、今度はより小さな配列に 再定義する必要がありました(用語が間違っているかもしれませんが、自分では明確に理解できたと思います)。

以下、添付ファイルに作業用バージョンを掲載します。微妙な点が強調されています。

//+------------------------------------------------------------------+
int Array_Caste_Positions_Creating(){
   int  n           = 0;
   long ticket      = 0;
   bool new_pos     = true;
//---Запись новых тикетов в массив позиций        
   int All_Position = PositionsTotal();
   int Array_Size   = ArrayRange(Arr_Position,0);
//---  
   for(int i = 0; i < All_Position; i++){
      if(m_position.SelectByIndex(i)){
         ticket  = PositionGetInteger(POSITION_TICKET);
         new_pos = true;}
      for(int e = 0; e < Array_Size; e++){
         if(Arr_Position[e][0]==ticket){
            new_pos = false;
            n++;
            break;}}
      if(new_pos){
         int New_Size = Array_Size+1;
         ArrayResize(Arr_Position,New_Size,0);
            Arr_Position[Array_Size][0] = (int)ticket;//Ticket
            Arr_Position[Array_Size][1] = 0;//Number_Caste (0 = начальные позиции)
            n++;}}                       
//---Удаление из массива мёртвых тикетов 
      Array_Size   = ArrayRange(Arr_Position,0);
      All_Position = PositionsTotal();
//---      
      for(int e = 0; e < Array_Size; e++){
         int  ticket_dead = Arr_Position[e][0];
         bool dead_pos    = true;
         for(int i = 0; i < All_Position; i++){
            if(m_position.SelectByIndex(i)){
                  if(ticket_dead == PositionGetInteger(POSITION_TICKET)){
                        dead_pos = false;
                        n++;
                        break;}}}
         if(dead_pos){
            ArrayRemove(Arr_Position,e,1);
            Array_Size   = ArrayRange(Arr_Position,0);}}
//---     
return(n);}
//+------------------------------------------------------------------+
ファイル:
Sower_1_6.mq5  19 kb
 

自分の教え方が正しいと主張する2人の教師の言い争いに、知らず知らずのうちに同席している悪ガキのような気分である。

私の繊細な意見を述べさせてください。

Alexey Viktorovが 投稿した例のコードは若干不完全でしたが、彼が提示した考えは正しく、私たちの理解を助けるものでした。また、フリーランスの人が、1円でも余計なお金を取ろうとせず、無償で手伝ってくれるのであれば、私はその人を尊敬しています。ありがとうございます。

アリクサンデル・フリシン 「ありがとうございます。あなたも無関心ではなく、心から助けたいと思い、それを実行してくれました。あなたの批判がなければ、どのような展開になっていたか、誰にもわからないでしょう。

 
Sergey Voytsekhovsky:

うまくいきました!ありがとうございました。私が書いたことは本当にナンセンスでした。ArrayRemoveの 削除関数は、 どのような次元の配列に対しても問題なく 機能します。

エラーは他の場所にあった。関数を適用した後、次のステップでこの変数が再びループ内で使用され、配列が範囲外になったため、今度はより小さな配列に再定義する必要がありました(用語が間違っているかもしれませんが、自分では明確に理解できたと思います)。

以下、添付ファイルに作業用バージョンを掲載します。微妙な点が強調されています。

クイックチュートリアル

ここにあるのは

      if(m_position.SelectByIndex(i)){
         ticket  = PositionGetInteger(POSITION_TICKET);

で置き換えることができます。

      t icket = PositionGetTicket(i);
 
Alexey Viktorov:

ちょっとしたリテラシー

この1枚

に置き換えることができます。

素晴らしい、もしコードの他の場所が拒絶反応を起こすなら - 私に見せてください、私は自作コーダーです、私が掘ったもの、それは私のものです、知識は体系的ではなく、断片的です。正しい道筋をご指導いただけると大変ありがたいです。

修正され、現在はこのようになっています。

//---Запись новых тикетов в массив позиций        
   int All_Position = PositionsTotal();
   int Array_Size   = ArrayRange(Arr_Position,0);
//---  
   for(int i = 0; i < All_Position; i++){
      ticket = (int)PositionGetTicket(i);
      new_pos = true;
      for(int e = 0; e < Array_Size; e++){
         if(Arr_Position[e][0]==ticket){
            new_pos = false;
            n++;
            break;}}
      if(new_pos){
         int New_Size = Array_Size+1;
         ArrayResize(Arr_Position,New_Size,0);
            Arr_Position[Array_Size][0] = (int)ticket;//Ticket
            Arr_Position[Array_Size][1] = 0;//Number_Caste (0 = начальные позиции)
            n++;}}                       
 
Sergey Voytsekhovsky:

素晴らしい、もしコードの中に拒絶反応を起こす場所が他にあれば - ぜひ見せてください。私は自作コーダーで、見つけたものは私のもので、知識は体系的ではなく、断片的です。正しい道筋をご指導いただければ幸いです。

たまにしかない。記録は残さない。実は私も独学で、独学のおっさんなんです。

mql5のチケットはulong です。

そうすれば、タイプに持ち込むものが少なくなる

 
Alexey Viktorov:

何かきっかけがあったときだけ。私は見ませんよ。そして、一般的には、私も独学で、しかも古い独学でやっています。

mql5のチケットはulong型 です。

そうすれば、タイプに持ち込むものが少なくなる

ありがとうございます、参考にさせていただきます、後ほどこちらでやり直します。