初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 196

 
Vitaly Muzichenko:

これはレイアウトで、4と5の違いはありません

ハンドルは各ステップ毎ではなく、OnInit()で一度だけ作成する必要があります。まだ知らないの?

 
削除、要検討。
 
Vitaly Muzichenko:

これはどうでしょう?

そして、この方法でも、すべてのティックにハンドルが作成 されます。 Stylerを 使えば、ロジックの間違いがすぐにわかります。

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
          ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index)
  {
#ifdef __MQL4__
   return(iMA(symb,tf,period,ma_shift,method,price,index));
#else
   double buf[1];
   static int hMA=-1;
   int handle=iMA(symb,tf,period,ma_shift,method,price);
   if(handle<hMA)
     {
      PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
      return(WRONG_VALUE);
     }
   else
     {
      if(CopyBuffer(handle,0,index,1,buf)<0)
        {
         PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
         return(WRONG_VALUE);
        }
     }
   hMA=handle;
   return(buf[0]);
#endif
  }
 
Vladimir Karputov:

それでも、刻み目ごとにハンドルを作って いるのですね。 Stylerを 使えば、ロジックの間違いがすぐにわかります。

このように

double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
                                      ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index) {
 #ifdef __MQL4__
  return(iMA(symb,tf,period,ma_shift,method,price,index));
 #else
  double buf[1];
  static int handle=-1;
   if(handle<0) {
    handle=iMA(symb,tf,period,ma_shift,method,price);
   }
   if(handle<0) {
    PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }
そして、残りのピークサーチコードはクロスプラットフォーム化されています
 
Vitaly Muzichenko:

そうだと思います。

そして、残りのピークサーチコードはクロスプラットフォーム化されています

ああ、それは...

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
          ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index)
  {
#ifdef __MQL4__
   return(iMA(symb,tf,period,ma_shift,method,price,index));
#else
   double buf[1];
   static int handle=-1;
   if(handle<0)
     {
      handle=iMA(symb,tf,period,ma_shift,method,price);
     }
   if(handle<0)
     {
      PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
      return(WRONG_VALUE);
     }
   else
     {
      if(CopyBuffer(handle,0,index,1,buf)<0)
        {
         PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
         return(WRONG_VALUE);
        }
     }
   return(buf[0]);
#endif
  }

が明らかに良い。しかし、このブロックは場所がずれて います。 ハンドラを作成した 直後に置かれるべきものです。

 
Vladimir Karputov:

はい、今すぐ

が明らかに良い。しかし、このブロックは間違った場所に あります。 ハンドルを作成した 直後に配置されるべきものです。

一番良い方法は、おそらくこのような方法で、一度だけ作成エラーを表示しますが、その後、if(...)のチェックが少なくなることです。

double MA(string symb,ENUM_TIMEFRAMES tf,int period,int ma_shift,
                                      ENUM_MA_METHOD method,ENUM_APPLIED_PRICE price,int index) {
 #ifdef __MQL4__
  return(iMA(symb,tf,period,ma_shift,method,price,index));
 #else
  double buf[1];
  static int handle=-1;
   if(handle<0) {
    handle=iMA(symb,tf,period,ma_shift,method,price);
    PrintFormat("Failed to create handle MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
    return(WRONG_VALUE);
   } else {
    if(CopyBuffer(handle,0,index,1,buf)<0) {
     PrintFormat("Failed to copy data from the indicator MA %s/%s, Error: %d",symb,sTF(tf),GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
 #endif
 }
 
Vitaly Muzichenko:

一番良い方法は、このような方法でしょう。一度だけ作成エラーを表示しますが、そうすれば、if(...)のチェックが少なくなります。

私はあなたの混乱の中で何も見ることができません - それはすべてぼやける。

スタイラーを 使う。
 
Vladimir Karputov:

お粥の中に何も見えない、全部溶け込んでいる。

スタイラーを 使う。

どちらかというと、スタイリング剤に自分のスタイルを見いだせず、ああいうのが多いですね

ファイル:
cc.PNG  100 kb
 

残念ながら、私のインデクサはMQL4をベースにしており、この機能はそのごく一部に過ぎません。

だから、MQL5を実装するのは効率が悪いし、全部書き直すとなると時間もかかるし、問題も多いんです。

 
GlaVredFX:

残念ながら、私のインデクサはMQL4をベースにしており、この機能はそのごく一部に過ぎません。

だから、MQL5を実装するのは効率が悪いし、全部書き直すとなると時間もかかるし、問題も多いんです。

MQL5でインジケータを書き換えるのに平均30分。コーヒーと一緒に。