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

 

データ処理の高速化を優先したMT4用EAのToRを書いています。

計算の順序やサンプリング(代表というのが正しいか)が高速化のために重要かどうかアドバイスしてください。

ブロック図の写真で2種類のバリエーションを添付しています。

もし可能なら、ブロックの選択的実行が-純粋にプリミティブなレイアウトになる場合、コードがどのように見えるべきかを書いてください、そして、これにより大幅な速度向上が得られるでしょうか

ファイル:
Logic_V_01.png  26 kb
Logic_V_02.png  30 kb
 
void OnStart()
{
        uchar max=0;
        for(int t=0;t<LONG_MAX;t++)   {max++;}    //так получаем предупреждение expression is always true, цикл работает
        for(int t=0;t<LONG_MAX+1;t++) {max++;}    //так предупреждение есть, но цикл не работает
        for(int t=0;t<ULONG_MAX;t++)  {max++;}    //так нет предупреждения и цикл не пашет
        Print("Done!");
}
 

テスターのポジションを閉じる というのは、どのように説明されるのでしょうか。スプレッド拡大が原因か?

MetaTrader取引プラットフォームのスクリーンショット

EURUSD, M20, 2014.04.12

Alfa-Forex、MetaTrader 5、リアル

temp_file_screenshot_63279.png。

EURUSD, M20, 2014.04.12, Alfa-Forex, MetaTrader 5, Real


 
Crucian:

テスターのポジションを閉じる というのは、どのように説明されるのでしょうか。スプレッドの拡大でしょうか?

[img]https://charts.mql5.com/4/434/eurusd-m20-alfa-foreks-temp-file-screenshot-63279-png.png[/img].

スプレッドが広がっていれば(スクリーンショットで判断すると、5桁で720ポイント!)、すべてが正しいということになります。

売りポジションはAsk価格で決済されました。ストップがかかっていた場合です。

ところで、あなたのブローカーAlfa-Forexは週の終わりと始まりにちょうど巨大なスプレッドが あります。

おそらく、気配値履歴に記録され、テスターがその上で売買のシミュレーションを行ったのでしょう。

週末の停車は危険です。どうせギャップから救われないし、スプレッド拡大で簡単に捕まってしまいます。

 
Fleder:
for(int t=0;t<LONG_MAX+1;t++) {max++;}    //так предупреждение есть, но цикл не работает

LONG_MAX+1< 0 のため、エラーは発生しない。

for(int t=0;t<LONG_MAX;t++)   {max++;}    //так получаем предупреждение expression is always true, цикл работает
ここで、警告は有効です (t<LONG_MAX if t int always true ) 無限ループ
 
void OnStart()
{
  uchar max=0;
  for(int t=0;t<ULONG_MAX-1 e0;t++)  {max++;}      //так цикл работает, предупреждения нет так как ULONG_MAX-1e0 имеет тип double
  for(int t=0;t<ULONG_MAX-1;t++)    {max++;}      //а так нет и предупреждения тоже нет
  Print("Done!");
}
 
Fleder:
for(int t=0;t<ULONG_MAX-1;t++)    {max++;}      //а так нет и предупреждения тоже нет
ULONG_MAX-1< 0、つまり比較演算がintまたはlongに変換 されるため、ここでエラーは発生しない- より正確にはビット単位の比較が 行われる
 
A100:
ULONG_MAX-1< 0 なので,比較演算はintに還元 されるのでエラーはない。

では、どう説明するのか。

void OnStart()
{
  long t=0;
  bool comp=(ULONG_MAX-1>t);
  Print("comp = ",comp);   //comp = true
  Print(ULONG_MAX-1);      //18446744073709551614
  Print(ULONG_MAX);        //18446744073709551615
}
 
A100:
ULONG_MAX-1< 0、すなわち比較演算がintまたはlongにキャスト されるため、ここでエラーは発生しません。

ループ内のtest式での比較のことでしょうか?

単純な比較ではそうは思えないからです。

 
A100:

入れ替えるだけでいいんです :)

この再配置は何をするのか? tはULONG_MAX-1より 低く、今もそうである。

void OnStart()
{
  long t=0;
  Print( (t < ULONG_MAX-1) == (ULONG_MAX-1 < t)); //false
}