エラー、バグ、質問 - ページ 616

 

開発者の方に質問です。

テスターで構造体のフィールドを取得できないのはなぜですか?

MqlTradeResultprice;// 取引における価格、ブローカーによって確認された?0を与える。

デモでは正常に動作しています。

 
x100intraday:

タイムフレームのリスト構造とオブジェクトの可視性フラグには何か関係があるのでしょうか(リストの長ささえ22と23で異なるため)。一般的には、フラグを手動でリストアップしてまとめるのではなく、与えられた境界を持つサイクルの時間枠にオブジェクトの可視性を 効率的かつコンパクトに割り当てるために質問しています。任意の時間枠をランダムに取り、その上にグラフィックオブジェクトを構築し、現在の時間枠より古くないすべての時間枠(すなわち構築されたもの)で表示できるようにする必要がある場合、どのようなロジックを使用するのでしょうか。アルゴリズムは、ある特定のケースのためではなく、普遍的であるべきです。インデックス相関はもうダメですね、インデックスマッチすらありません。名前の文字列のパースと比較は、可視性定数の場合、文字列を扱うことができないため、やはり失敗します。今のところ、複雑で曖昧で非常に曲者な実装が思い浮かびます。

もちろん相関はあるのですが、あまりに暗黙的なので、<visibility_flag> = F(<timeframe>)と書くしかないのです。

int PeriodToTimeframeFlag(ENUM_TIMEFRAMES period)
  {
   flags=0;
   static ENUM_TIMEFRAMES _p_int[]={PERIOD_M1, PERIOD_M2, PERIOD_M3, PERIOD_M4, PERIOD_M5, PERIOD_M6,
                                    PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M20,PERIOD_M30,
                                    PERIOD_H1, PERIOD_H2, PERIOD_H3, PERIOD_H4, PERIOD_H6, PERIOD_H8,PERIOD_H12,
                                    PERIOD_D1, PERIOD_W1, PERIOD_MN1};
//--- cycle for all timeframes
   for(int i=0;i<ArraySize(_p_int);i++)
      if(period==_p_int[i])
        {
         //--- at the same time generate the flag of the working timeframe
         flags=((int)1)<<i;
         break;
        }
   return(flags);
  }
 

x100intraday:

任意の時間枠をランダムに取り、その上にグラフィカルなオブジェクトを構築 し、現在の時間枠より古くないすべての時間枠(つまり構築されたもの)でその可視性を許可する必要がある場合、どのようなロジックを使用するのですか?

チェッカーでない場合)

ENUM_TIMEFRAMES TF[21]={PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,
                     PERIOD_M12,PERIOD_M15,PERIOD_M20,PERIOD_M30,PERIOD_H1,PERIOD_H2,PERIOD_H3,
                     PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1};

int Visibility[21]={1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,
            16383,32767,65535,131071,262143,524287,1048575,2097151};

TF[i]を考慮し、Visibility[i]を設定する...。

または visibility=(int)(MathPow(2,i+1)-1) となります。

 
Swan:

必要であれば、チェッカーボードではない)

TF[i]を考慮し、Visibility[i]を設定する...。

または visibility=(int)(MathPow(2,i+1)-1) となります。

Visibilityの公式をありがとうございます - 多分、私はそれを適応します。タイムフレームの値から、何かの度合いであることは明らかでしたが、自分で計算式を再構築してみたわけではありません。

1は必要ですか?一般に、Visibility[]には正しくない値が含まれているようです。実際には、-1なしの値、つまり、1、2、4、8、16...が含まれるはずです。

 
uncleVic:

もちろん関係はあるのですが、<visibility_flag>=F(<timeframe>)と書くしかないほど暗黙の了解になっています。


ありがとうございます、エレガント。シフトそのものを除けば、まさに私がやろうとしていたことです。

そして、最後に、_p_int 時間枠配列の回帰ループの各ターンでのフラグ値の計算について質問しました(最終的にはフラグで何かが追加されるはずです)、現在のものだけではありません。じゃあ、現在のタイムフレームで可視化フラグの 値をずらして、iを 1回転させるごとに、どこかで何かが変わるはず......。そこで指数計算式を適用するか、同じシフトの原理を使う必要があります。まだやり方がわからない...。

...とはいえ、TF-argumentを持つ関数なので、ループさせてみることにします...

ところが、それがまた間違っている。説明しよう。例では、21項目に対して静的なENUM_TIMEFRAMES _p_int[]がありますが、ここで私が欲しいのは、すでにそのような配列を持っているが、それは任意の長さにすることができることです。これはタイムフレームを含む配列で、その上に何かが構築されます。 しかし、それらはすべての下位タイムフレームにも表示されるべきで、どの配列も既存のものとは別に、または追加でそれらで満たされることはありません。そこで、現在のタイムフレームとそれより下位のタイムフレームのフラグを計算し、現在のものから踊りながら、その場で回帰ループの中で合計する必要性について言及しています。コツは、あらゆるもののプリセット値(時間枠や視認性フラグも)の完全な配列を作り、それをいじるのではなく、各ターンのプリセット時間枠の不完全な配列だけを頭の中で計算することです。

しばらく行ってみて、行き詰まったら聞くことにしています。

 

なぜ私は(int)(MathPow(2,i+1)-1)や((int)1)<<i...を急いで使っていないのでしょう?iがあれば、簡単にループに代入して実行できるかもしれません...。しかし、掛け算やシフトの場合と同じように、常に安全でいられるのでしょうか?仮に、開発者が新しいタイムフレームを追加した場合、すべてのロジックが狂ってしまうのではないでしょうか?早速ですが、シフトの例では、現在の期間とプリセットの期間が一致することを想定しています。

if(period==_p_int[i])
そのため、実際のケースでは、理論的に完全なシーケンスからいくつかの時間枠が省略されたり、開発者によってこのシーケンスが延長されたりしても、ロジックはクロールされないはずである。しかし、純粋に数学に頼って、新しい時間軸の有無の可能性を見ずに、境界から境界まで数式でサイクルを回すだけでは、遅かれ早かれ、次のビルドで歪みが出てくるでしょう...」と。
 
x100intraday:

なぜ私は(int)(MathPow(2,i+1)-1)や((int)1)<<i...を急いで使っていないのでしょう?iがあれば、簡単にループに代入して実行できるかもしれません...。しかし、掛け算やシフトの場合と同じように、常に安全なのでしょうか?仮に、開発者が新しいタイムフレームを追加した場合、ロジック全体がおかしくなるのでは?この例では、現在の期間がプリセットされた期間と同じであることを想定しています。

そのため、現実のケースでは、理論的に完全な順序からいくつかの時間枠が省略されたり、開発者によってこの順序が延長されたとしても、その論理が入り込むことはないはずです。しかし、純粋に数学に頼って、新しい時間軸の不在や存在に注意を払うことなく、境界から境界まで数式でサイクルを実行すれば、遅かれ早かれ、次のビルドで、スキューが発生するでしょう......。

私たちの懸念は非常に合理的です。上記のコードでは、設定された可視性フラグが 実際にはマクロであることを正当化しています。

通して作業する方が正しいのでしょう。

int result=0;
//---
switch(period)
  {
   case PERIOD_M1: result=OBJ_PERIOD_M1; break;
   case PERIOD_M2: result=OBJ_PERIOD_M2; break;
   case PERIOD_M3: result=OBJ_PERIOD_M3; break;
   case PERIOD_M4: result=OBJ_PERIOD_M4; break;
   case PERIOD_M5: result=OBJ_PERIOD_M5; break;

//--- и так далее

   default: print("Что-то новенькое");
  }

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Видимость объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Видимость объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Видимость объектов - Документация по MQL5
 
x100intraday:

視認性の良い数式をありがとうございます。適応してみようかな。タイムフレームの値から、何かの度合いであることはわかりましたが、自分で計算式を再構築してみたわけではありません。

1は本当に必要なのか?実は、Visibility[]が間違って記入されているようです。実際には、-1なしで、つまり、1、2、4、8、16...のように、どこでも記入されるべきなのです。

1,2,4 など。- の視認性を1つのタイムフレームで表示します。=MathPow(2,i)です。

を、現在より小さい1、1+2、1+2+4、1+2+4+8などで、taki =MathPow(2,i+1)-1 とします。

バイナリーコードを見れば一目瞭然です。

ビックおじさん

その不安は、とても合理的なものです。上記のコードは、可視性フラグの セットが実際にはマクロであることを正当化しているに過ぎない。

正しい方法は、それをやり過ごすことです。

原理的には同じことです。tfのリストで変更する場合、コードを編集する必要があります。

普遍的な解決策は考えられませんし、起こりうる変化を予見することも理論的には不可能なのではないでしょうか。


x100intraday です。

また間違えましたが。説明しよう。例では、静的ENUM_TIMEFRAMES _p_int[]が21項目分作成されていますが、ここで私が欲しいのは、すでにそのような配列を持っているが、任意の長さにすることができる、というものです。これはタイムフレームを含む配列で、その上に何かが構築されます。 しかし、それらはすべての下位タイムフレームにも表示されるべきで、どの配列も既存のものとは別に、または追加でそれらで満たされることはありません。そこで、現在のタイムフレームとそれより下位のタイムフレームのフラグを計算し、現在のタイムフレームから踊りながら、その場で回帰ループで合計する必要性について言及しています。そのコツは、あらゆるもののプリセット値(タイムフレームや可視性フラグも)の完全な配列を作り、それをループさせるのではなく、毎ターン、プリセットタイムフレームの不完全な配列だけを念頭に置いて計算することである。

いいえ、そんなことはありません。タイムフレームと可視性の対応関係を定義する必要がある。あるいは対応する2つのアレイ、あるいはスイッチ。

必要な TF を +array に配置し、使用する TF 毎にオブジェクトの可視性を +init で計算します。こんな感じかな...)

 

何が問題なのかがわからない。

double VirtualSL;
MqlTick tick;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   VirtualSL=0.0;
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   trail();
  }
//+------------------------------------------------------------------+
void trail()
  {
   double stopcal;

   SymbolInfoTick(_Symbol,tick);
   stopcal=tick.bid;

//   if((VirtualSL!=0.0 && stopcal>VirtualSL) || VirtualSL==0.0) // так все работает

   if(VirtualSL==0.0 || (VirtualSL!=0.0 && stopcal>VirtualSL)) // так не хочет работать
     {
      VirtualSL=stopcal;
      Print("use Ok!");
     }
   if(VirtualSL<stopcal) Print("o_O ((((( stopcal = ",stopcal,"   VirtualSL = ",VirtualSL);
  }
//+------------------------------------------------------------------+

2011.12.29 01:16:07 Core 1 2011.09.26 02:54:13 o_O ((( stopcal = 1.54508 VirtualSL = 1.53378

2011.12.29 01:16:07 Core 1 2011.09.26 02:54:12 o_O ((( stopcal = 1.54507 VirtualSL = 1.53378

2011.12.29 01:16:07 Core 1 2011.09.26 02:54:12 o_O ((( stopcal = 1.54508 VirtualSL = 1.53378


 
her.human:

何が問題なのか理解できません。

コンパイラのオプティマイザのエラーです。メッセージありがとうございました、修正いたします。

以下のような構成でエラーが発生します。

if(VirtualSL==0.0 || (VirtualSL!=0.0 && stopcal>VirtualSL))
if(VirtualSL<stopcal)
VirtualSL!=0.0は、最初の部分がチェックされた後、この式は常に真になるので、最初のif条件の2番目の部分から削除することができます。オプティマイザーのエラーは消えます。


修正されました。次のビルドで修正されます。