mql5におけるOOP、テンプレート、マクロ、微妙な使い分け - ページ 27

 
Seric29:

そして、このクラス内のオブジェクトへのポインタをどうするか、どこに渡せばいいのか。

マクロに関しては、より簡単に作業できるようになりました。

どこでも作成されたオブジェクトを参照するために使用することができます。この例では、グローバルに生成されたオブジェクトへのポインタがコンストラクタに渡されますが、このクラス自体は別のクラス(オブジェクトが生成されるクラス)の中にネストすることができます。

マクロの使用例をご紹介します。

#define  foor1(a,b,v,g) \
for(;Funkziya(a,b,v)&&g;b++)

...

foor(a,b,c,isSomething?a>b:b>c){
    DoSomething();
}
...

どんな展開になるかは、わかりやすくするためにカッコを付けているので、ご覧ください。

for(;( Funkziya(a,b,c)&&isSomething)?a>b:b>c;b++){
    DoSomething();
}

その結果、コンパイラーにとっては絶対的に有効なコードができたが、プログラムの動作は意図したものとは断固として異なる。そして今、あなたは実際にエラーに気づかず、コードは動作し、そしてただターミナルを見つめ、なぜロボットが全預金でログインし、あなたの口座を失ったのか? ))))です。)

私はマクロが得意なのですが、それ故に、そして何故かとても嫌いなのです(開発者の方、もう一度constexprとSFINAEを同時にお願いします)。だから、私からのアドバイスは、コードの文字を減らすために使わないでほしいということです。実際、mqlのバージョンを落としても、強力なツールですが、非常に統制のとれたアプローチが必要です。

 

開発者の皆さん、マクロや関数内で引数を無制限に使えるようにしてください。 この静的なナンセンスにうんざりしています。マクロの引数は8個で、108個必要なら最低10個にしてください。あと、マクロをオーバーロードできるようにして、新しい名前とマクロを掛け合わせる必要がないようにする。を作ると、またカッコよくなりますね。

#define  Znah 0
#define  PrmI int    Peremen=6;
#define  PrmD double Peremen=3.345;

#if  Znah//если больше 0 то появится переменная int Peremen
   PrmI
#else
    PrmD//иначе появится переменная double Peremen
#endif

マクロ#if

 
Vladimir Simakov:

しかし、プログラムの動作は、意図したものとは決定的に異なっている。そして今、あなたがエラーに気づき、コードが動作し、そして、あなたは愚かにもターミナルを見て、なぜロボットが全体の預金で入力し、口座を失ったのか? )))))

マクロは得意なのですが、それゆえにあまり好きではありません(開発者の方、改めてconstexprとSFINAEを同時にお願いします)。だから、私からのアドバイスは、コードの文字を減らすために使わないでほしいということです。実際、mqlのバージョンを落としても、強力なツールですが、非常に統制のとれたアプローチが必要です。

何も推測せず、確実に仕事をこなしています。

CDataManager*  m_data;

m_data ポインターをどうするのですか?m_dataという 要素にアクセスしているのですか? 何が出てくるのですか?ここでもそうなんですね。

   CNewBar(CDataManager* data=NULL):m_data(!data?new CDataManager:data),cIsDelData(!data){}
   CNewBar(string symbol,ENUM_TIMEFRAMES frame):m_data(new CDataManager(symbol,frame)),cIsDelData(true){}

ただ、何を目指しているのかが明確でない(非常に複雑)。

この行はどうなるのでしょう

CDataManager*  m_data;

が公開で書かれることになる。

授業は謎が多い。2年経った今でもどう扱っていいかわからない。

 

テスト結果の 統計情報をデータベースのテーブルに書き込む必要がある。

あらかじめDBを作成し、EAの設定にsinput変数を入れて、対象のパスを書き込む

DATABASEです。

CREATE TABLE "TesterStatistics" (
        "id"    INTEGER,
        "MD5"   TEXT,
        "STAT_PROFIT"   REAL,
        "STAT_GROSS_PROFIT"     REAL,
        "STAT_GROSS_LOSS"       REAL,
        "STAT_MAX_PROFITTRADE"  REAL,
        "STAT_MAX_LOSSTRADE"    REAL,
        "STAT_CONPROFITMAX"     REAL,
        "STAT_CONPROFITMAX_TRADES"      INTEGER,
        "STAT_MAX_CONWINS"      REAL,
        "STAT_MAX_CONPROFIT_TRADES"     INTEGER,
        "STAT_CONLOSSMAX"       REAL,
        "STAT_CONLOSSMAX_TRADES"        INTEGER,
        "STAT_MAX_CONLOSSES"    REAL,
        "STAT_MAX_CONLOSS_TRADES"       INTEGER,
        "STAT_BALANCEMIN"       REAL,
        "STAT_BALANCE_DD"       REAL,
        "STAT_BALANCEDD_PERCENT"        REAL,
        "STAT_BALANCE_DDREL_PERCENT"    REAL,
        "STAT_BALANCE_DD_RELATIVE"      REAL,
        "STAT_EQUITYMIN"        REAL,
        "STAT_EQUITY_DD"        REAL,
        "STAT_EQUITYDD_PERCENT" REAL,
        "STAT_EQUITY_DDREL_PERCENT"     REAL,
        "STAT_EQUITY_DD_RELATIVE"       REAL,
        "STAT_EXPECTED_PAYOFF"  REAL,
        "STAT_PROFIT_FACTOR"    REAL,
        "STAT_RECOVERY_FACTOR"  REAL,
        "STAT_SHARPE_RATIO"     REAL,
        "STAT_MIN_MARGINLEVEL"  REAL,
        "STAT_CUSTOM_ONTESTER"  REAL,
        "STAT_DEALS"    INTEGER,
        "STAT_TRADES"   INTEGER,
        "STAT_PROFIT_TRADES"    INTEGER,
        "STAT_LOSS_TRADES"      INTEGER,
        "STAT_SHORT_TRADES"     INTEGER,
        "STAT_LONG_TRADES"      INTEGER,
        "STAT_PROFIT_SHORTTRADES"       INTEGER,
        "STAT_PROFIT_LONGTRADES"        INTEGER,
        "STAT_PROFITTRADES_AVGCON"      INTEGER,
        "STAT_LOSSTRADES_AVGCON"        INTEGER,
        PRIMARY KEY("id" AUTOINCREMENT)
)

このテーブルにこのコードで書き込んでいます。

DatabaseExecute(handleDB, StringFormat("INSERT INTO \"TesterStatistics\" "
                                             "VALUES (NULL, \'%s\',%G, %G, %G, %G, %G, %G, %d, %G, %d, %G, %d, %G, %d, "
                                             "%G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %G, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d);",
                                             md5txt, TesterStatistics(STAT_PROFIT),             TesterStatistics(STAT_GROSS_PROFIT),
                                             TesterStatistics(STAT_GROSS_LOSS),                 TesterStatistics(STAT_MAX_PROFITTRADE),
                                             TesterStatistics(STAT_MAX_LOSSTRADE),              TesterStatistics(STAT_CONPROFITMAX),
                                             (int)TesterStatistics(STAT_CONPROFITMAX_TRADES),   TesterStatistics(STAT_MAX_CONWINS),
                                             (int)TesterStatistics(STAT_MAX_CONPROFIT_TRADES),  TesterStatistics(STAT_CONLOSSMAX),
                                             (int)TesterStatistics(STAT_CONLOSSMAX_TRADES),     TesterStatistics(STAT_MAX_CONLOSSES),
                                             (int)TesterStatistics(STAT_MAX_CONLOSS_TRADES),    TesterStatistics(STAT_BALANCEMIN),
                                             TesterStatistics(STAT_BALANCE_DD),                 TesterStatistics(STAT_BALANCEDD_PERCENT),
                                             TesterStatistics(STAT_BALANCE_DDREL_PERCENT),      TesterStatistics(STAT_BALANCE_DD_RELATIVE),
                                             TesterStatistics(STAT_EQUITYMIN),                  TesterStatistics(STAT_EQUITY_DD),
                                             TesterStatistics(STAT_EQUITYDD_PERCENT),           TesterStatistics(STAT_EQUITY_DDREL_PERCENT),
                                             TesterStatistics(STAT_EQUITY_DD_RELATIVE),         TesterStatistics(STAT_EXPECTED_PAYOFF),
                                             TesterStatistics(STAT_PROFIT_FACTOR),              TesterStatistics(STAT_RECOVERY_FACTOR),
                                             TesterStatistics(STAT_SHARPE_RATIO),               TesterStatistics(STAT_MIN_MARGINLEVEL),
                                             TesterStatistics(STAT_CUSTOM_ONTESTER),            (int)TesterStatistics(STAT_DEALS),
                                             (int)TesterStatistics(STAT_TRADES),                (int)TesterStatistics(STAT_PROFIT_TRADES),
                                             (int)TesterStatistics(STAT_LOSS_TRADES),           (int)TesterStatistics(STAT_SHORT_TRADES),
                                             (int)TesterStatistics(STAT_LONG_TRADES),           (int)TesterStatistics(STAT_PROFIT_SHORTTRADES),
                                             (int)TesterStatistics(STAT_PROFIT_LONGTRADES),     (int)TesterStatistics(STAT_PROFITTRADES_AVGCON),
                                             (int)TesterStatistics(STAT_LOSSTRADES_AVGCON)));


ENUM_STATISTICSの列挙は、ヘルプのように順序があり、スクリプトで確認することができます。

void OnStart()
{
   for(int i = 0; i <= (int)STAT_LOSSTRADES_AVGCON; i++)
      printf("%d ^ %s", i, EnumToString(( ENUM_STATISTICS)i));
}


はすべて動作しますが、コードのテキストは非常に大量であり、タイプミスの可能性が高いです、より信頼性の高い方法でデータベースにこのクエリを取得する方法 - 主な問題はStringFormatに取得 する方法 です

 
Igor Makanu:

テスト結果の 統計情報をデータベースのテーブルに書き込む必要がある。

あらかじめDBを作成し、EAの設定にsinput変数を入れて、対象のパスを書き込む

DBです。

このテーブルにこのコードで書き込んでいます。


ENUM_STATISTICSの列挙は、ヘルプのように順序があり、スクリプトで確認することができます。


はすべて動作しますが、コードのテキストは非常に大量であり、タイプミスの可能性が高いです、より信頼性の高い方法でデータベースにこのクエリを取得する方法 - 主な問題はStringFormatに取得 する方法 です

ディファイン!!!(ただし、ここでは通常のオーバーロードで十分です)

そして、このStringFormatは何のためにあるのでしょうか?

普通のアドより全然速いんですけど...。(何十ギガバイトものテキストファイルをやったことがある=......)普通のアドオンでも速いんだから、そりゃあね...。


この正規の関数でやりたいのであれば、私もその問題は理解できません ))

 
Alexandr Andreev:

そして、この文字列の形式は何のためにあるのでしょうか?

通常のアドよりも決して速くはないのですが...。(何十ギガバイトものテキストファイルをやったことがある=......)普通のアドオンでも速いんですよ、それが...。

どうだろう。

ヘルプと記事を読み、サンプルを使ってデータベースクエリを作成しました。

うまくいっているようですが、このコードの一部を使うと、タイプミスをする可能性があります。

全体的に変な感じなので、どうすれば失敗せずにコンパクトにできるかを聞いています ))))

 
Igor Makanu:

テスト結果の 統計情報をデータベースのテーブルに書き込む必要がある。

あらかじめDBを作成し、EAの設定にsinput変数を入れて、対象のパスを書き込む

DATABASEです。

このテーブルにこのコードで書き込んでいます。


ENUM_STATISTICSの列挙は、ヘルプのように順序があり、スクリプトで確認することができます。


はすべて動作しますが、コードのテキストは非常に膨大で、タイプミスの可能性が高く、どのようにこのクエリをより信頼性の高い方法でデータベースに取得する - 主な問題は、どのようにStringFormatの

まず、SQLiteではフィールドの型は任意であり、型付けやキャストに煩わされることはないことを覚えておいてください。ライト」であるのには理由があります。

長いクエリは3-4-5つのパートに分けることができます :-)

BEGIN TRANSACTION

INSERT INTO myTable VALUES (...); --- тут можно получить PrimaryKey

UPDATE myTable .... ; --- обновить по Primary

UPDATE myTable ...  ; --- ещё...

COMMIT ; --- это если все запросы удачны.. иначе ROLLBACK

これは古い記憶ですが、つまり、ヘルプで確認する必要があります。

 
Igor Makanu:

どうだろう。

ヘルプと記事を読み、サンプルを使ってデータベースクエリを作成しました。

うまくいっているようですが、このコードを部分的に使うと、誤植が発生するのではないかと思っています

どうすれば失敗せずにコンパクトになるのか、お聞きしたいです )))

あなたの課題は、このように解決されるはずです。

string MakeRequest(string md5txt){
   static ENUM_STATISTICS intIndex[]={STAT_CONPROFITMAX_TRADES,
                                      STAT_MAX_CONPROFIT_TRADES,
                                      STAT_CONLOSSMAX_TRADES,
                                      STAT_MAX_CONLOSS_TRADES,
                                      STAT_DEALS,
                                      STAT_TRADES,
                                      STAT_PROFIT_TRADES,
                                      STAT_LOSS_TRADES,
                                      STAT_SHORT_TRADES,
                                      STAT_LONG_TRADES,
                                      STAT_PROFIT_SHORTTRADES,
                                      STAT_PROFIT_LONGTRADES,
                                      STAT_PROFITTRADES_AVGCON,
                                      STAT_LOSSTRADES_AVGCON};
   string ret="INSERT INTO \"TesterStatistics\" VALUES (NULL,"+md5txt;
   for (int i=0,ii=0;i<=STAT_LOSSTRADES_AVGCON;++i){
      ret+=",";
      if (i==intIndex[ii]){
         ret+=StringFormat("%d",(int)TesterStatistics((ENUM_STATISTICS)i));
         ++ii;}
      else ret+=StringFormat("%G",TesterStatistics((ENUM_STATISTICS)i));}
   return ret;}
   
DatabaseExecute(handleDB, MakeRequest("md5txt"));
 
Vladimir Simakov:

あなたの特別な問題は、このように解決されるはずです。

クソッ!

そうだ、アレイだ!

THANK YOU!!!!!!!

 
Maxim Kuznetsov:

SQLiteでは、フィールドの型はオプションで、型の指定やキャスティングに悩む必要はないと記憶しています。ライト」であるのには理由があります。

長いクエリを3-4-5に分割することができます :-)

BEGIN TRANSACTION

INSERT INTO myTable VALUES (...); --- тут можно получить PrimaryKey

UPDATE myTable .... ; --- обновить по Primary

UPDATE myTable ...  ; --- ещё...

COMMIT ; --- это если все запросы удачны.. иначе ROLLBACK

古いメモリからなので、ヘルプで確認する必要があります。

私は、再現可能なクエリーコードが欲しいのですが、ググっても時間がかかります。

理由: