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

削除済み  

私は、double MarketInfo(文字列 symbol,int type)を、入力パラメータの指定に従って、異なるタイプのデータを 返す関数のセットとして移行することを提案する。


例えば、以下のような関数である:

int MarketInfoInt(string symbol,int type);

string MarketInfoStr(string symbol,int type)....

REFERENCESと関数の結果について開発者に連絡したことがあるが、拒否された(残念)。


PS

これを前提にすると、現時点での最善の解決策は、必要な関数をすべて含むMarketInfo ライブラリになると思います。

ちなみに、これは私が自分のライブラリで行ったことと同じです :)

 
Interesting:

私の考えでは、マイグレーション環境でTFを扱うには2つの機能が必要だ:

1.秒数をTFに変換する -ENUM_TIMEFRAMES SecondToPeriod (int Value)とする;

2.2.期間を秒に変換する -int PeriodToSecond(ENUM_TIMEFRAMES Value)とする。


これは、私のマイグレーション・モジュールの一番最初のところで成功しました(DLLオプションもあります)。


追記

MQL4への準拠を最大化するため、私自身はピリオドの非標準をすべて削除しました。



機能は便利で良いのですが、実行が......。

私ならこうします

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void FixTF(int &tf)
  {
   switch(tf)
     {
      case 0: tf = 0;break;
      case 1: tf = PERIOD_M1;break;
      case 5: tf = PERIOD_M5;break;
      case 15: tf = PERIOD_M15;break;
      case 30: tf = PERIOD_M30;break;
      case 60: tf = PERIOD_H1;break;
      case 240: tf= PERIOD_H4;break;
      case 1440: tf=PERIOD_D1;break;
      case 10080: tf = PERIOD_W1;break;
      case 43200: tf = PERIOD_MN1;break;
      default: tf=0;break;
     }
  }
//+------------------------------------------------------------------+



すべての関数で、配列のサイズを定義する必要がある。

を定義する必要がある。

 
CoreWinTT:

機能は優れていて有用だが、実行は......異端だ。

あなたの仕事は?

どこがブレイクだ!!! 悲哀のプログラマーたちよ!


breakよりreturnの方が悪いのか?
 
申し訳ない。
 
CoreWinTT:

すべての関数で、配列のサイズを

必ずしもそうではないので、「時系列とインジケータへのアクセス」を参照してください:

時系列とインジケータへのアクセス:時系列とインジケータを扱う関数」を参照。時系列が通常の配列と異なる点は、時系列要素のインデックス付けが配列の最後から最初(最新のデータから最も古いデータ)に行われる点です。コピー関数は、値の受け手である配列の必要なサイズを個別に割り当てるからです

この ルールには重要な例外があります。例えば、Expert Advisors でOnTick() を呼び出すたびに、またはインジケータでOnCalculate() を呼び出すたびに、時系列とインジケータの値のコピーを頻繁に実行する必要がある場合、この場合は静的分散配列を 使用することをお勧めします

 

私の経験では、やらないよりはやったほうがいい。

そうしないとデータ・アクセス・エラーが発生する。

特にグローバル配列では。


第一に、指定されたサイズの配列ではインデックス付けが静的であり、反転配列のような危険な瞬間がないからである。

第二に、配列のためのスペースがより控えめに割り当てられる。

そして第三に、配列へのアクセスエラーが発生する確率が何倍にも減る。

だから、これらの関数には、単に配列のサイズを決定する関数が必要なのだと思う。

 
CoreWinTT:

この機能は便利でいいのだが、実行が......。

私ならこうする

記事を修正しました:

  • TFMigrate()関数を元の形に戻した。
  • セクション18の関数を変更
 
リファレンス・マニュアルにiMAOnArray(...)関数を追加。
 
iMAOnArray関数を修正。MODE_SMAモードでの計算時間を大幅に短縮。
削除済み  

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

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);
  }