どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 131

 
Sepulca:

脳にとって良い仕事です。こんな風に試してみてはいかがでしょうか。

ディメンジョン4のテスト結果。 配列の X 要素が選択されていない場合は,配列[digit]と 6 次元用のフラグメントを使用します.


あなたのコードを見ましたが、以下の点がよくわかりません。
 
//chief2000:

あなたのコードに目を通しましたが、理解できないのは次の点です。どのステップでも元の配列のデータを読んでいません。 その中の要素数だけを読んでいます。


なぜ、元の配列のデータが必要なのですか?あなたのアイデアに従って、配列の要素を サンプリングしているだけです。そして、サンプリングしたデータをどうするかは、あなた次第です。すなわちN[0]=3、N[1]=2、N[2]=1、N[3]=0であれば、array[N[0]], array[N[1]], array[N[2]], array[N[3]] でさらに解析、 N[0]=3, N[1]=2, N[2]<...0, N[3]<0 の場合、N[2]<0, N[3]<0 なので、以降の解析では array[N[0]], array[N[1]] のみを使用します。あなたの投稿によると、繰り返さないすべての可能な組み合わせを試しています(配列の数値は0からArraySize(array)-1までと仮定しています)。

[4] <=> { 1 2 3 4 }

1, 12, 13, 14, 123, 124, 134, 1234, 
2, 23, 24, 234, 
3, 34,
4

そして、そのアルゴリズムにしたがって行動してください。

if(NewComb){
// Получили новую комбинацию в массиве N размерностью k    
    
    for(i=0;i<k;i++){// Перебираем массив N. Если N[i]<0 то элемент array[N[i]] не участвует в выборке.
                     // Например, для размерности 4 если N[0]=3,N[1]=1,N[2}<0,N[3]<0 то это выборка array[3] и array[1]
                     //                             если N[0]=3,N[1]=2,N[2]=1,N[3]=0 то это выборка array[3] и array[2] array[1] и array[0]
     if(N[i]>=0){// использовать как-то array[N[i]]}
    }

   }
 
Sepulca:


なぜ、元の配列のデータが必要なのですか?私は、あなたの考えに従って、配列の要素をサンプリングしているだけです。そして、サンプリングしたデータをどうするかは、あなた次第です。すなわちN[0]=3、N[1]=2、N[2]=1、N[3]=0であれば、array[N[0]], array[N[1]], array[N[2]], array[N[3]] でさらに解析、 N[0]=3, N[1]=2, N[2]<...0, N[3]<0 の場合、N[2]<0, N[3]<0 なので、以降の解析では array[N[0]], array[N[1]] のみを使用します。あなたの投稿に従って、繰り返されないすべての可能な組み合わせを列挙します(配列の番号が0からArraySize(配列)-1まで始まることを考慮に入れて)。

そして、あなたのアルゴリズムに従って進めてください。


これでクリアです(次のステップでデータを読み込んでいます、ただ、自分のコードでないものを扱うのに慣れていないだけです)。
ありがとうございました。

 

関数のエラーを見つけるのを手伝ってください。

問題は、MAより上のバーを数えた場合、関数が正しい値を返すことです。

しかし、MAより下にある場合、この関数は常に1(1)を返します。

int CheckFiltr ()
   {
   int i=1;
   for (;;)
      {
      if (NormalizeDouble(High[i],Norm)&&NormalizeDouble(Low[i],Norm)<NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm)||NormalizeDouble(High[i],Norm)&&NormalizeDouble(Low[i],Norm)>NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm))
         {
         i++;
         Comment ("Фильтр = ", i);         
         }
      else break;
      }
   return (i);
   }
 
MarkTrade:

関数のエラーを見つけるのを手伝ってください。

問題は、MAより上のバーを数えた場合、関数が正しい値を返すことです。

しかし、MAより下にある場合、この関数は常に1(1)を返します。

一見するとこちらの方が良いのですが、文法を修正しただけなので、コードは大幅に最適化することができます。

int CheckFiltr ()
   {
   int i=1;
   int Norm=Digits;
   for (;;)
      {
      if (
           (   NormalizeDouble(High[i],Norm)<NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm)
            && NormalizeDouble(Low[i] ,Norm)<NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm)
           )
          ||
           (   NormalizeDouble(High[i],Norm)>NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm) 
            && NormalizeDouble(Low[i] ,Norm)>NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm)
           )
         )

         {
         i++;
         Comment ("Фильтр = ",i);         
         }
      else break;
      }
   return (i);
   }
 
paladin80:

この例では、実際には何の違いもありませんが、いずれにせよ配列の開始と終了を指定する必要があります。

配列が大きい場合は、先頭が違います。例えば、配列の末尾にルールとして条件が発生する場合は、末尾から開始した方が良い。この例は、オーダー/ポジション検索の典型的な例です。もちろん、この場合、最初に検索を行えば、いずれにせよプログラムはこの時点までたどり着くが、より多くのリソースを必要とすることになる。


いつもありがとうございます。現在、「チェック可能な」バーの数を最適化しようとしましたが、ウィンドウの結果はそこではありません。最初と最後の両方から数え始めようとしたが、無駄だった。

extern int number=3;
//------------------------------------+
for (int x=number; x>=1; x--)
{
 if(Open[x]==Open[x-1]) continue;
    if(Open[x]<Open[x-1])
   {
   //--- action
   }
 else{
    if(Open[x]>Open[x-1])
   {
   //--- action
  }
 }
}
 
Sepulca:
一見するとこちらの方が良いのですが、コードはかなり最適化できるはずです。


これが効くんです...。ありがとうございました。

なぜ私のバージョンは動きたがらないのか理解したいのですが...。

 
MarkTrade:


仕組みはこうだ...ありがとうございました。

私のバージョンがなぜ動作したくないのか、理解できればいいのですが...。


あなたのコードを詳しく見てみましょう

 if (NormalizeDouble(High[i],Norm)&&NormalizeDouble(Low[i],Norm)<NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm)
||NormalizeDouble(High[i],Norm)&&NormalizeDouble(Low[i],Norm)>NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm))
     
第1項を0と比較しているに過ぎない、つまり真か偽かを判断しているのです。
 
MarkTrade:


効いてる...。ありがとうございました。

私のバージョンがなぜ動作したくないのか、理解できればいいのですが...。

あなたのコード

int CheckFiltr ()
   {
   int i=1;
   for (;;)
      {
      if (NormalizeDouble(High[i],Norm)&&
          NormalizeDouble(Low[i],Norm)<NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm)
            ||    
          NormalizeDouble(High[i],Norm)&&
          NormalizeDouble(Low[i],Norm)>NormalizeDouble(iMA(NULL,0,PerMa,0,MetMa,AplPr,i),Norm))
         {
         i++;
         Comment ("Фильтр = ",i);         
         }
      else break;
      }
   return (i);
   }

わかりやすいかも・・・。

おっと...もう言われちゃいましたね、正規化しなくてもできるんですね...。

 
Roger:


あなたのコードを詳しく見てみましょう

単純に第1項を0と比較する、つまり真か偽かを判断するのです。


では、「aと cが cより 大きい場合」という表現は正しくないが、「aが cより 大きく、cが cより 大きい場合」という表現は正しいのか。