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

 
Vladimir Pastushak:

商品説明の スペースが少ない。

3600文字というのは、大規模で本格的な番組では極めて短い。

多くの人が納得してくれると思います。

プログラムの説明には、5000〜10000文字以上の文字数が必要です。せめてプログラム設定名のタブだけでも

司会者はいつでも水の除去を依頼することができます。

今、プログラムの説明文を書いているのですが、設定の説明だけで3600字全部使ってしまって、機能の半分も書いていないんです......。

ウラジミール、何か買ったことある?マニュアルを読むのにどれだけの時間を費やしたか?

何冊もある本を読む人はいませんし、3~5分以上の動画も見てくれません。
それは、他のほとんどのプログラムと同じように、プログラムのインターフェイスにツールチップを表示することです。インタラクティブなチュートリアルのようなもの。また、上級者向けの詳しい説明は、ブログや自社サイトに掲載することができます。欲しい人は見つけてダウンロードする。

 
Vladimir Pastushak:

商品説明の スペースが少ない。

3600文字というのは、大規模で本格的な番組では極めて短い。

多くの人が納得してくれると思います。

プログラムの説明には、5000〜10000文字以上の文字数が必要です。せめてプログラム設定名のタブだけでも

司会者はいつでも水の除去を依頼することができます。

今、プログラムの説明文を書いているのですが、設定を説明するだけで3600字全部使ってしまって、機能の半分も書いていない......。

納得がいきません。簡潔は才能の姉妹である。

"多くの言葉で聞き届けられると思うな"

マタイによる福音書6章7節

 
Andrey Khatimlianskii:

ウラジミール、何か買ったことある?説明書を読むのにどれだけの時間を費やしたか?

何巻もある本は誰も読まないし、3〜5分のビデオも見ない。
それは、現在ほとんどどこでも行われているように、プログラムのインターフェイスにヒントを追加することです。インタラクティブなチュートリアルのようなもの。また、上級者向けの詳しい説明は、ブログや自社サイトに掲載することができます。欲しい人は見つけてダウンロードする。

読まないで買わない人、何のための商品か理解しないまま、多くの商品を買っていませんか?

では、すべてをブログで公開すればいいのでしょうか?

 
Nikolai Semko:

私はそうは思いません。簡潔は才能の姉妹である。

"饒舌になれば聞いてもらえると思ってはいけない"

マタイによる福音書6章7節

そうなんですが、ブリーフ3600でも物足りない...。

 
Vladimir Pastushak:

読まないで買わない人、何のための商品か理解しないまま、多くの商品を買っていませんか?

では、すべてをブログで公開すればいいのでしょうか?

取扱説明書から製品の目的を理解する?

そんなバカな。デモをダウンロードして触ってみます。

 
A100:

このコードは、コンパイラの不具合に基づくものです

結果:1...なぜ2つではないのですか?

C++ではコンパイル時にエラーが出ますが、これは両方の関数が明らかに適合しており、さらに構文上、明示的に関数を呼び出す ことができないためです(2)

さらに、MQLの特定の機能を考慮すると、逆に、パラメータを(現在のように)値で渡すのではなく、const参照で渡すことを優先させる方が論理的です(その利点は、文字列の例で特に明らかです)。

void f(       string  ) { Print( __FUNCSIG__ ); } //1
void f( const string& ) { Print( __FUNCSIG__ ); } //2
string g() { return "ABCDEF4"; }
void OnStart()
{
          string text1 = "ABCDEF1";
    const string text2 = "ABCDEF2";
//  вызываемая функция: сейчас  предлагается
    f( text1 );     //    1       2               
    f( text2 );     //    *       2 потому что const или оставить *
    f( "ABCDEF3" ); //    1       1
    f( g());        //    1       1
//Примечание: * - неопределенность
}

長い文字列は参照で渡せるのに、なぜ値で渡す(実際にはコピーする)のかが不明です。

 

コンパイルエラー

#import  "Test.dll" //Error: '#import' - #import was not closed
#include "Test.h"
#import
//Test.h
void f();

.hファイルの内容は、単にインクルードすればよいのに、なぜ手動で移動させるのか(特に、時々変更される可能性があるため)。

 

こんにちは、アドバイスをお願いします。

ローカルネットワークファームやMQL5クラウドネットワークを使用して、最適化結果を ファイルに書き出すにはどうすればよいですか?

OnTester()内にプロシージャがあり、使用します。

string toWrite = "test";
fileHandle=FileOpen(fileName,FILE_CSV|FILE_READ|FILE_WRITE|FILE_ANSI|FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_COMMON,",");
FileWrite(fileHandle,toWrite);
FileClose(fileHandle);

ローカルエージェントを使用している場合、最適化結果のファイルが共有フォルダに作成され、ローカルネットワークファームまたはMQL5クラウドネットワークを使用している場合、ファイルはありません。

Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
Тестирование стратегий - Алгоритмический трейдинг, торговые роботы - MetaTrader 5
  • www.metatrader5.com
Тестер стратегий позволяет тестировать и оптимизировать торговые стратегии (советники) перед началом использования их в реальной торговле. При тестировании советника происходит его однократная прогонка с начальными параметрами на исторических данных. При оптимизации торговая стратегия прогоняется несколько раз с различным набором параметров...
 
Nikolai Semko: 何が問題なのか?減速の原因はどこにあるのか?

調べてみると、そうだった。

  1. SQRTのCPU直接命令へのマッピング

  2. SQRT+数学の計算が 分岐なしで進み、1命令(128ビットのデータ)で2つの根を同時に計算する

    このコードは、次のようなアセンブラSSEコードに変化します。
             D1=sqrt((X1-X)*(X1-X)+(Y1-Y)*(Y1-Y));
             D2=sqrt((X2-X)*(X2-X)+(Y2-Y)*(Y2-Y));
             D3=sqrt((X3-X)*(X3-X)+(Y3-Y)*(Y3-Y));
             D4=sqrt((X4-X)*(X4-X)+(Y4-Y)*(Y4-Y));
             D5=sqrt((X5-X)*(X5-X)+(Y5-Y)*(Y5-Y));
             D6=sqrt((X6-X)*(X6-X)+(Y6-Y)*(Y6-Y));
             D7=sqrt((X7-X)*(X7-X)+(Y7-Y)*(Y7-Y));
             D8=sqrt((X8-X)*(X8-X)+(Y8-Y)*(Y8-Y));
            ...
            sqrtsd  xmm1, xmm1
            unpcklpd        xmm4, xmm4
            movapd  xmm3, xmmword ptr [rsp + 432]
            unpcklpd        xmm3, xmmword ptr [rsp + 384]
            subpd   xmm3, xmm4
            mulpd   xmm3, xmm3
            unpcklpd        xmm0, xmm0
            movapd  xmm5, xmmword ptr [rsp + 416]
            unpcklpd        xmm5, xmmword ptr [rsp + 400]
            subpd   xmm5, xmm0
            mulpd   xmm5, xmm5
            addpd   xmm5, xmm3
            sqrtpd  xmm8, xmm5
            movapd  xmm5, xmmword ptr [rsp + 464]
            subpd   xmm5, xmm4
            mulpd   xmm5, xmm5
            movapd  xmm7, xmm9
            subpd   xmm7, xmm0
            mulpd   xmm7, xmm7
            addpd   xmm7, xmm5
            movapd  xmm6, xmm10
            unpcklpd        xmm6, xmm11
            subpd   xmm6, xmm4
            movapd  xmm3, xmmword ptr [rsp + 368]
            unpcklpd        xmm3, xmmword ptr [rsp + 352]
            subpd   xmm3, xmm0
            movapd  xmm4, xmm8
            shufpd  xmm4, xmm4, 1
            sqrtpd  xmm5, xmm7
            mulpd   xmm6, xmm6
            mulpd   xmm3, xmm3
            addpd   xmm3, xmm6
            sqrtpd  xmm15, xmm3
            movapd  xmm0, xmm14
            unpcklpd        xmm0, xmmword ptr [rsp + 336]
            subpd   xmm0, xmm2
            mulpd   xmm0, xmm0
            movapd  xmm2, xmm0
            shufpd  xmm2, xmm2, 1
            addsd   xmm2, xmm0
            movapd  xmm0, xmm15
            shufpd  xmm0, xmm0, 1
            sqrtsd  xmm12, xmm2
    これは、実は芸術作品なんです。アセンブラ命令の4回の呼び出しで8個の根を計算した。1回の呼び出しで2つの倍数が評価される。

  3. 配列を操作する場合、double->integer indexの変換中にチェック、分岐、ロスが発生し、すべてが通常通り行われます。

  4. この例で配列を扱う場合、FPUとALUが常に混在することになり、生産性が非常に悪くなる

  5. 動的配列アクセスの最適化は、賞賛に値する素晴らしいものです。しかし、FPU/ALU演算+ダブル→整数+分岐の混在は時間を浪費する

全体的な結論:完璧な最適化により、MQL5の数学が勝利する。ここで負けるのはアレイではなく、数学の勝利です。

 

そして、同じコードにVisual C++ 2017 x64で完全最適化で作ったポルノがこちら。

; 52   :       int X=pos%Width;
; 53   :       int Y=int(pos/Width);
; 54   :       
; 55   :       D1=sqrt((X1-X)*(X1-X)+(Y1-Y)*(Y1-Y));

  0046 f 0 f 28 c8         movaps  xmm1, xmm0
  00472 8 b c3            mov     eax, ebx
  00474 99               cdq
  00475 45 0 f 57 db      xorps   xmm11, xmm11
  00479 f7 ff            idiv    edi
  0047 b 0 f 57 f6         xorps   xmm6, xmm6
  0047 e 41 0 f 28 c4      movaps  xmm0, xmm12
  00482 f2 44 0 f 2 a d8   cvtsi2sd xmm11, eax
  00487 f2 0 f 2 a f2      cvtsi2sd xmm6, edx
  0048 b f2 41 0 f 5 c cb   subsd   xmm1, xmm11
  00490 f2 0 f 5 c c6      subsd   xmm0, xmm6
  00494 f2 0 f 59 c9      mulsd   xmm1, xmm1
  00498 f2 0 f 59 c0      mulsd   xmm0, xmm0
  0049 c f2 0 f 58 c1      addsd   xmm0, xmm1
  004 a0 e8 00 00 00 00   call    sqrt

; 56   :       D2=sqrt((X2-X)*(X2-X)+(Y2-Y)*(Y2-Y));
; 57   :       D3=sqrt((X3-X)*(X3-X)+(Y3-Y)*(Y3-Y));

  004 a5 41 0 f 28 cf      movaps  xmm1, xmm15
  004 a9 41 0 f 28 c6      movaps  xmm0, xmm14
  004 ad f2 0 f 5 c c6      subsd   xmm0, xmm6
  004 b1 f2 41 0 f 5 c cb   subsd   xmm1, xmm11
  004 b6 f2 0 f 59 c0      mulsd   xmm0, xmm0
  004 ba f2 0 f 59 c9      mulsd   xmm1, xmm1
  004 be f2 0 f 58 c1      addsd   xmm0, xmm1
  004 c2 e8 00 00 00 00   call    sqrt

; 58   :       D4=sqrt((X4-X)*(X4-X)+(Y4-Y)*(Y4-Y));

  004 c7 f2 0 f 10 8 c 24
        90 01 00 00      movsd   xmm1, QWORD PTR Y4$1$[rsp]
  004 d0 f2 0 f 10 84 24
        98 01 00 00      movsd   xmm0, QWORD PTR X4$1$[rsp]
  004 d9 f2 41 0 f 5 c cb   subsd   xmm1, xmm11
  004 de f2 0 f 5 c c6      subsd   xmm0, xmm6
  004 e2 f2 0 f 59 c9      mulsd   xmm1, xmm1
  004 e6 f2 0 f 59 c0      mulsd   xmm0, xmm0
  004 ea f2 0 f 58 c1      addsd   xmm0, xmm1
  004 ee e8 00 00 00 00   call    sqrt

; 59   :       D5=sqrt((X5-X)*(X5-X)+(Y5-Y)*(Y5-Y));
; 60   :       D6=sqrt((X6-X)*(X6-X)+(Y6-Y)*(Y6-Y));
; 61   :       D7=sqrt((X7-X)*(X7-X)+(Y7-Y)*(Y7-Y));
; 62   :       D8=sqrt((X8-X)*(X8-X)+(Y8-Y)*(Y8-Y));

  004 f3 f2 0 f 10 44 24
        20               movsd   xmm0, QWORD PTR X8$1$[rsp]
  004 f9 41 0 f 28 c8      movaps  xmm1, xmm8
  004 fd f2 0 f 5 c c6      subsd   xmm0, xmm6
  00501 f2 41 0 f 5 c cb   subsd   xmm1, xmm11
  00506 f2 0 f 59 c0      mulsd   xmm0, xmm0
  0050 a f2 0 f 59 c9      mulsd   xmm1, xmm1
  0050 e f2 0 f 58 c1      addsd   xmm0, xmm1
  00512 e8 00 00 00 00   call    sqrt
  00517 f2 0 f 10 4 c 24
        28               movsd   xmm1, QWORD PTR Y2$1$[rsp]
  0051 d 41 0 f 28 c5      movaps  xmm0, xmm13
  00521 f2 44 0 f 10 44
        24 30            movsd   xmm8, QWORD PTR Y5$1$[rsp]
  00528 f2 41 0 f 5 c cb   subsd   xmm1, xmm11
  0052 d f2 44 0 f 10 54
        24 40            movsd   xmm10, QWORD PTR Y6$1$[rsp]
  00534 f2 0 f 5 c c6      subsd   xmm0, xmm6
  00538 f2 44 0 f 10 64
        24 50            movsd   xmm12, QWORD PTR Y7$1$[rsp]
  0053 f f2 45 0 f 5 c c3   subsd   xmm8, xmm11
  00544 f2 0 f 10 7 c 24
        38               movsd   xmm7, QWORD PTR X5$1$[rsp]
  0054 a f2 45 0 f 5 c d3   subsd   xmm10, xmm11
  0054 f f2 44 0 f 10 4 c
        24 48            movsd   xmm9, QWORD PTR X6$1$[rsp]
  00556 f2 45 0 f 5 c e3   subsd   xmm12, xmm11
  0055 b f2 44 0 f 10 5 c
        24 58            movsd   xmm11, QWORD PTR X7$1$[rsp]
  00562 f2 0 f 5 c fe      subsd   xmm7, xmm6
  00566 f2 0 f 59 c0      mulsd   xmm0, xmm0
  0056 a f2 44 0 f 5 c ce   subsd   xmm9, xmm6
  0056 f f2 0 f 59 c9      mulsd   xmm1, xmm1
  00573 f2 44 0 f 5 c de   subsd   xmm11, xmm6
  00578 f2 0 f 58 c1      addsd   xmm0, xmm1
  0057 c e8 00 00 00 00   call    sqrt
  00581 f2 0 f 59 ff      mulsd   xmm7, xmm7
  00585 f2 45 0 f 59 c0   mulsd   xmm8, xmm8
  0058 a f2 41 0 f 58 f8   addsd   xmm7, xmm8
  0058 f 0 f 28 c7         movaps  xmm0, xmm7
  00592 e8 00 00 00 00   call    sqrt
  00597 f2 45 0 f 59 c9   mulsd   xmm9, xmm9
  0059 c f2 45 0 f 59 d2   mulsd   xmm10, xmm10
  005 a1 f2 45 0 f 58 ca   addsd   xmm9, xmm10
  005 a6 41 0 f 28 c1      movaps  xmm0, xmm9
  005 aa e8 00 00 00 00   call    sqrt
  005 af f2 45 0 f 59 db   mulsd   xmm11, xmm11
  005 b4 f2 45 0 f 59 e4   mulsd   xmm12, xmm12
  005 b9 f2 45 0 f 58 dc   addsd   xmm11, xmm12
  005 be 41 0 f 28 c3      movaps  xmm0, xmm11
  005 c2 e8 00 00 00 00   call    sqrt
  005 c7 f2 0 f 10 84 24
        88 01 00 00      movsd   xmm0, QWORD PTR Y1$1$[rsp]

; 63   : 
; 64   :       double d=fabs(D1+D3+D4+D8)/(D1+D2+D3+D4+D5+D6+D7+D8);

MQL5で生成されたコードの非限定複数形。

驚いたことに、MSVCは最適化しようともせず、まるで20年前のプロセッサのために書かれたように、すべての数学はライブラリを通して駆動されます。また、AVXコマンドセットを有効にしても、コンパイラの動作は全く変わりません。

テスト用C++ファイルを添付しました。テスト例にエラーがある」という考えを表現する必要はなく、エラーはないのです。

ファイル:
Test.cpp.zip  1 kb