記事"MQL4からMQL5への移植"についてのディスカッション - ページ 4

 
Interesting :

私はこのデザインの機能性に疑問を抱き始めた。ブロックのロジックをいくら理解しようとしても、理解できなかったのだ(そして、懸命に理解しようとした)......。

何を疑っているのか?正しくカウントされている。

//+------------------------------------------------------------------+
//|をテストします。mq5
//+------------------------------------------------------------------+
#include <InitMQL4.mqh>
double   close[];
int      total,count;
datetime time[];
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnStart()
  {
   count=Bars(_Symbol,_Period);
   total=CopyClose(_Symbol,_Period,0,count,close);
   total=CopyTime(_Symbol,_Period,0,count,time);
   ArraySetAsSeries(time,true);
   ArraySetAsSeries(close,true);
   int N=7;
   int shift=iBarShiftMQL4(_Symbol,_Period,time[N]);
   Print("TIME",time[N],"BAR=",shift," CLOSE=",close[shift]);
  }
//+------------------------------------------------------------------+
int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }
//+------------------------------------------------------------------+
削除済み  
DC2008 :

何が問題なんだ?彼は正確にカウントしている。

そして、次はホカホカの話だ


1.MT4でこの行を書き、H4でコードを実行する。

Print(iBarShift(Symbol(),Period(),1274356800,false)); //日付 2010年5月20日 12:00

次にMT5と同じことをする。

int shift=iBarShiftMQL4(_Symbol,_Period,StringToTime("20.05.2010 12:00"),false);

その結果、8が得られる。


2.その後、まったく同じ操作をD1で行う。

その結果、MT4は-1を返し、MT5は0を返す。

さて、iBarShiftMQL 4のこの実装が、必要なものにどれだけ対応しているか、教えてくれる人はいるだろうか...。

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
      return(ArraySize(Arr)-1);
   else return(-1);
  }
 

これを試してみてほしい:

int iBarShiftMQL4(string symbol,
                  int tf,
                  datetime time,
                  bool exact=false)
  {
   if(time<0) return(-1);
   ENUM_TIMEFRAMES timeframe=TFMigrate(tf);
   datetime Arr[],time1;
   CopyTime(symbol,timeframe,0,1,Arr);
   time1=Arr[0];
   if(CopyTime(symbol,timeframe,time,time1,Arr)>0)
     {
      if(ArraySize(Arr)>2) return(ArraySize(Arr)-1);
      if(time<time1) return(1);
      else return(0);
     }
   else return(-1);
  }
 

もう一度言いますが、あなたが書いている機能について読んだことがありますか?

mcl4では正確に次のように書かれています。

double iClose( string symbol, int timeframe, int shift)
shift パラメータで指定された対応するチャート(シンボルタイムフレーム)のバーの終値の値を返します。エラーの場合、この関数は0を返します。エラーに関する詳細情報を取得するには、 GetLastError() 関数を呼び出します。
現在のチャートでは、終値に関する情報は定義済みのClose[] 配列にあります。

そして、あなたは....

return(-1);

モデレーターは何を見ているのでしょうか?

 

ありがとう、CoreWinTT。

修正された関数:iClose、iLow、iHigh、iOpen、iTime、iVolume。エラー時に-1ではなく0を返すようにした。

 

そして、いつ図書館にあるのだろうか?

というように、少なくとも

開けば疑問が生じるからであり、上に書いた意味は?

また、少なくともすべての問題が解決された関数を収集し、残りの部分のエラーの研究に進みます。

 
bool  SetIndexBuffer(
   int                    index,         // バッファインデックス
   double                 buffer[],      // 配列
   ENUM_INDEXBUFFER_TYPE  data_type      // 何を保存するか
   );

先日、ある人がμl4環境を作る賢い方法を提案した。

の配列を使ってμl4環境を作るという賢い方法を提案した人がいた。

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])

しかし、これらの配列は定数状態を持つため、使用するのは難しいだろう。

グローバル・バッファは

の助けを借りて宣言しなければならないからだ。

SetIndexBuffer

指定された指示バッファをグローバルに 宣言されたdouble 型の1次元動的配列に関連付けます。

ただし、double型のみであり、ボリュームや日付-時刻型の配列は通過しません。

残された唯一の方法は、mql4モジュール内でこれらの配列を開始することである。

これは実質的にインジケーターを書き換えるのと同じことなのだが......。

 
CoreWinTT:

いつ図書館にあるんですか?

もうありますよ。
 
空っぽだし、空っぽだった。
削除済み  
CoreWinTT:

そして、いつ図書館にあるのだろうか?

というように、少なくとも

開けば疑問が生じるからであり、上に書いた意味は?

とまた、少なくともすべての問題が解決されている関数を収集し、残りの部分のエラーの研究に進みます。

このテーマに関する解答は、昔から私設図書館にたくさんある。

私などは、IsTesting()などは最初から使っていますし、日付と時刻も昔からすべて解決しています(もちろん、他にも解決策はあります)......。

もう一つは、MT5自体にこのような「時代遅れのソリューション」が存在することです。