MT4からMT5への乗り換えの問題。正確には、MT5で一部のアルゴリズムをerrなしで実行できないことです。 - ページ 10

 
Vict:

不思議なんですが、今までやろうと思わなかったんです。

メモリ割り当ての ような大量のエラーチェックをなくすことができる。

オプションではなく、EAはチャートから削除され、プログラムの任意の場所から次のティックの前に "OSに終了 "する必要があります。


おそらく、現在のティックのデータが利用できないことに関連する関数を安全に呼び出すために、すべてをマクロでエレガントにラップすることが可能であり、ここでは "ダミー" です。

void OnStart()
  {
   for(int i=0;i<10;i++)
     {
      double o=Open(i);
      if(o>0.0) printf("%d : %f",i,o);
      else
        {
         printf("Error № %d ",(int)o);
         return;
        }
     }
  }
//+------------------------------------------------------------------+

double Open(int shift)
  {
   ResetLastError();
   double result=iOpen(NULL,0,shift);
   int err=GetLastError();
   if(err>0) result=-err;
   return(result);
  }
//+------------------------------------------------------------------+

というのは、コードの可読性を考えると、そのように書くのがいいと思うんです。

void OnStart()
  {
   for(int i=0;i<10;i++)
     {
      double o=Try( Open(i),"Текст сообщения" );
      printf("%d : %f",i,o);
     }
  }


このTryは、現実的にはマクロで包んで、失敗した場合は「OSに抜ける」のでしょうか?

 
Igor Makanu:

は、このTryをマクロに包んで、失敗した場合に「OSに抜ける」のが現実的でしょうか?

#define  Try(VAR, EXPR, MES)          \
   VAR = EXPR;                       \
   if (VAR <= 0.0) {                 \
     printf("Error: %s ", MES);      \
     return;                         \
   }

double o;
Try(o, Open(i), "something goes wrong");

ダメ?

私はよく、関数の最初にいろいろなミニマムを書き、最後にundefineを書きます。当然ながら、アクションが頻繁に繰り返されるのであれば、そうでなければ意味がない。

#define  MYERR_HANDLER(INDEX)                                \
{                                                           \
   Alert(__FILE__, " ", __LINE__, "-", INDEX, ": error");   \
   this.state = obst_error;                                 \
   return obev_no_event;                                    \
}

中絶についても誤解がある、エラーによっては完璧だ。

 
Vict:

ダメ?

やった!

が、理想はその代わりに欲しいです。

double o;
Try(o, Open(i), "something goes wrong");

このように

double o = Try(Open(i), "something goes wrong");

Open()関数のシグネチャを変えればいいという問題ではないのです......。でも、この形なら本当に欲しいものが手に入る!;)

----------------------

追記: オプションとして、グローバルに記述された変数 Tryerror または bool Tryresult でもかまいません。

 
Igor Makanu:

このように

プラスでも可能かどうか疑問です(例外を投げ入れることはできますが、可能性は低いでしょう)。でも、いろいろなことが起こるから、もしかしたら誰かが驚いてくれるかもしれない・・・。

 

だから、ぱっと見で

Try(double, o, Open(i), "something goes wrong");

というのが、この状況での最大値でしょう。

 

まったくもって馬鹿だなぁ、できるんだろうなぁ。

double Try_helper;
#define  Try(EXPR, MES)               \
   Try_helper = EXPR;                \
   if (Try_helper <= 0.0) {          \
     printf("Error: %s ", MES);      \
     return;                         \
   }

double o = Try(Open(i), "something goes wrong");

コンパイルはしていませんが、動作するはずです。

 
Vict:

私、バカだから仕方ないよね。

コンパイルはしていませんが、動作するはずです。

マシンのシャイターン!!!うまくいった!!!

チェックとシミュレーションエラー ( shift>5 )

double Try_helper;
#define  Try(EXPR, MES)               \
   Try_helper = EXPR;                \
   if (Try_helper <= 0.0) {          \
     printf("Error: %s ", MES);      \
     return;                         \
   }

void OnStart()
  {
   for(int i=0;i<10;i++)
     {
      
      double o = Try(Open(i), "something goes wrong");
      printf("%d : %f",i,o);
     }
  }
//+------------------------------------------------------------------+

double Open(int shift)
  {
   ResetLastError();
   double result=iOpen(NULL,0,shift);
   int err=GetLastError()>0;
   if(err>0) result=-err;
   if(shift>5) result = -999;
   return(result);
  }
//+------------------------------------------------------------------+

2019.07.31 16:58:48.154 tst1 (EURUSD,H1) 0 : 1.115010

2019.07.31 16:58:48.154 tst1 (EURUSD,H1) 1 : 1.114670

2019.07.31 16:58:48.154 tst1 (EURUSD,H1) 2 : 1.114590

2019.07.31 16:58:48.154 tst1 (EURUSD,H1) 3 : 1.114400

2019.07.31 16:58:48.154 tst1 (EURUSD,H1) 4 : 1.115240

2019.07.31 16:58:48.154 tst1 (EURUSD,H1) 5 : 1.115450

2019.07.31 16:58:48.154 tst1 (EURUSD,H1) Error: Something goes wrong.


すごい!マクロのコードもとてもシンプルになりました。


ありがとうございました。- あなたは間違いなくマジシャンです!(笑)

 

どうぞ、お気軽にご利用ください。

上のマクロには欠点があります。ヘルパーの型がハードコードされているため、文字列を返す Try 関数に、2 つのマクロを作らないと double を渡すことができません。私はスポーツに興味を持ちました - それを回避する方法(すべてのタイプに対して1つのマクロを記述すること。オプションなしのµlでは、c++では、そこは本当に必要ではありませんが、それでも)?誰も自分のバリエーションを提案しようとしないのか(まあ、結局のところ、自分の体調を維持する必要があるのだが)。

 
Vict:

ぜひ使ってみてください。

上のマクロには欠点があります。ヘルパーの型がハードウエア化されているため、文字列を返す関数を Try

なぜダメかというと、+記号が解除されていないのです

このように、あなたのマクロを梳かし、どのように使おうとしているのか。

int    _GetLastError;
double _Try_helper;
string _Try_FUNCSIG;
#define  Try(FUNC,MSG, EXCEPT) _Try_helper=FUNC;if(_GetLastError>0){printf("%s : error № %d %s ",_Try_FUNCSIG,_GetLastError,MSG);EXCEPT;}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
  {
   for(int i=0;i<10;i++)
     {

      double o = Try(Open(i), "something goes wrong"+Txt(),return);
      printf("%d : %f",i,o);
     }
  }
//+------------------------------------------------------------------+

double Open(int shift)
  {
   _Try_FUNCSIG=__FUNCSIG__;
   ResetLastError();
   double result=iOpen(NULL,0,shift);
   _GetLastError=GetLastError();
   if(shift>5)_GetLastError=999;
   return(result);
  }
//+------------------------------------------------------------------+
string Txt()
{
return(" Txt ");

マクロのパラメータEXCEPT が例外処理となり、ログに出力しない場合は return または ; - として動作しますが、OnTick() のボディを残しません

2019.07.31 19:01:28.353 tst1 (EURUSD,H1) 0 : 1.113350

2019.07.31 19:01:28.353 tst1 (EURUSD,H1) 1 : 1.114180

2019.07.31 19:01:28.353 tst1 (EURUSD,H1) 2 : 1.115110

2019.07.31 19:01:28.353 tst1 (EURUSD,H1) 3 : 1.115010

2019.07.31 19:01:28.353 tst1 (EURUSD,H1) 4 : 1.114670

2019.07.31 19:01:28.353 tst1 (EURUSD,H1) 5 : 1.114590

2019.07.31 19:01:28.353 tst1 (EURUSD,H1) double Open(int) : error #999 something goes wrong Txt.

 
Igor Makanu:

まあ、つまり、こういうことです。

string f(int) {return "hello world";}
double f(double) {return 35;}

int main()
{
   double d = Try(f(0.), "double error");
   string s = Try(f(0), "stirng error");
   cout << s << "-" << d << endl;  // hello world-35
   return 0;
}

ここの人たちはギャンブルをしないようです。おいおい、どうしたんだ。

template <typename T> T Try_helper;
#define  Try(EXPR, MES)                                  \
   Try_helper<decltype(EXPR)> = EXPR;                   \
   if (Try_helper<decltype(EXPR)> == decltype(EXPR){}) {\
      printf("%s\n", MES);                              \
      return 1;                                         \
   }
理由: