インジケーターに関する雑多な質問 - ページ 3

 
whroeder1:

ビルド600以前(2014年 2月3日)はstart() しかなかった。今はOnTick (EA、)OnCalculate (インジケーター、)OnStart (スクリプト)があります。 インジケーターの話だったのを忘れてました。

新しいイベント処理関数の 使用を開始- 関数 - 言語の基礎 - MQL4 Reference.ルックバックを正しく 行う方法を参照してください。

そうなんです。今、私はあなたがはるかに明確に理解 し、そんなに多くに感謝 します。

そして、#20の コメントで、もう一つアイデアが 浮かびました。(一度、あなたがそれを私と共有し、今私は私の心の中にそれを保つ)

また、私は自分のインジケータのためにより良いコードを書こうと し、今私はコメント#18-@Marco vd Heijdenを学習 しようとします。

それから私は広く あなたのコメントを研究します。

もう一度ありがとうございます。

 
Marco vd Heijden:

インジケーターの代わりにエキスパートに入れることで、将来的に取引戦略を追加する際に簡単に使用することができます。

バーの問題については、バーの開始時刻を datetime変数に格納し、記録された時刻と実際の時刻を比較するだけで、新しいバーが発生するたびにそれがトリガーされます。

以下はその例です。

datetime M1,M5,M15,M30,H1,H4,D1,W1,MN1;

まず第一に、あなたの多くの明確なコメントの ための巨大な感謝

私はまだIndicatorに 滞在しています。しかし、1つの問題に 直面しました。"Strategy Tester "でテスト できないのです。MT4 'Not Responding'.

#1 - Marcoはそれがどこから来るのか、教えていただけますか?

#2 - 下のコードは正しいですか?

私が試したのは以下のコードです。

string _prefix = "_Preriod_M5 - " ;
string _vlineName_M5 ;
int _prd = PERIOD_M5 ;

int _prd_add = PeriodSeconds( _prd ) ;
datetime _dt_Prd_M5 ;

int _time_M5 ;
datetime _prdCvrt_M5 ;
datetime _timeCvrt_M5 ;

//---init
EventSetMillisecondTimer( 10 );
_CreateLines();

//---timer
if ( _dt_Prd_M5 != iTime( Symbol(), _prd, 0 ) )
{
    _dt_Prd_M5 = iTime( Symbol(), _prd, 0 );
    _CreateLines();
}

//---_CreateLines()
    //---
    int _dayCnt_M5 = 0;
    int _cnt_M5 = iBarShift( Symbol(), 0, iTime( Symbol(), PERIOD_M15, _dayCnt_M5 ) );
    for ( int i = 0; i < _cnt_M5; i++ )
    {
        //---time convert
        _time_M5     = Time[i];
        _prdCvrt_M5  = PeriodSeconds( _prd );
        _timeCvrt_M5 = _time_M5 - ( _time_M5 % _prdCvrt_M5 ) + _prdCvrt_M5;

        //---name
        _vlineName_M5 = _prefix + "PERIOD_M5 - " + TimeToStr( _timeCvrt_M5, TIME_DATE|TIME_MINUTES );

        //---
        if ( _Period < PERIOD_M30 )
        {
            {
                ObjectCreate( _vlineName_M5, OBJ_VLINE, 0, _timeCvrt_M5, 0 );
            }
        }
    }
    ObjectMove ( 0, _vlineName_M5, 0, _dt_Prd_M5, 0 );

私はそれに取り組むのを止めました、私はあなたのコメントの後に続けるでしょう。(実は、上記のコードを併用すると、他のインジケータが潰れてしまうのではないかと心配しています)

本当にありがとうございます。

 
MT4のstrategy testerでは タイマー機能が使えないので、tick機能に入れる必要があります。
 
Marco vd Heijden: MT4ストラテジーテスターで タイマー関数が動作しないのでtick関数に入れる必要がある。
バックテストではOnTimer()は実行されません(M.Ali) - MQL4フォーラム
MT4 Backtesterのチャートイベント(Migel) - MQL4 フォーラム
 
Marco vd Heijden:
MT4ストラテジーテスターでは、タイマー機能は動作しないので、tick関数に入れる必要があります。

ありがとうございます。

私は その問題がコードから来るのではないことを確かに知って います。

 
どうしてわかるんですか?
 

Marco vd Heijden:

以下はその一例です。

datetime  M5;

//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetMillisecondTimer(250);

//--- create some things

   CreateLines(); // Function that creates time lines

//--- load open times
   M5=iTime(Symbol(),PERIOD_M5,0);

//--- set timelines

   ObjectMove(0,"Time-M5",0,M5,0);

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   if(M5!=iTime(Symbol(),PERIOD_M5,0))
     {
      M5=iTime(Symbol(),PERIOD_M5,0);  // overwrite old value with new value  
      //Alert("New Bar on M5! ",TimeToString(M5,TIME_SECONDS));
      // do something...
      //ObjectMove(0,"Time-M5",0,M5,0);
     }
  }
//+------------------------------------------------------------------+

ありがとうございました。

このコメントは私に多くの ことを教えて くれました。

そのコードは、私が前のコメントで投稿したものと同じように動作しているようです。

しかし、私はそのコード(それはPeriod_M5のために動作しているもの)がクロック12:00で動作 しない必要があります(それは多分13:00、14:00です...)と 下のコードは 'OBJ_VLINEの過去の時間を 無視して(それは私にとって良いです)現在クロック12:00 中に下のコードは私に追加の現在の時間の VLINEを示していますが、私はそれを望んでいない。

if ( TimeHour( _timeCvrt_M5 ) != 12 )
{
    ObjectCreate( _vlineName_M5, OBJ_VLINE, 0, _timeCvrt_M5, 0 );
}   //---if Close

私は私の問題を 解決するために何かを試してみ ましたが、それは正しく動作しませんでした

また、私はスクリーンショットを 追加しました。


私は本当にその問題を解決する必要があります私を助けてください。

事前に大きな感謝を。

ファイル:
 
Marco vd Heijden:
どうしてわかるのでしょうか?

接続が切れて しまったので、接続が切れた 状態で「Strategy Tester」を使ってみたところ、私には完璧に機能 しました。

ウィリアム さんや皆さんの コメントを読んで、確信に 変わりました。

それだけではダメなのでしょうか、すみません

 
if ( TimeHour( _timeCvrt_M5 ) != 12 )
{
    ObjectCreate( _vlineName_M5, OBJ_VLINE, 0, _timeCvrt_M5, 0 );
}   //---if Close

この例では、12:00を除くすべての時間に行が表示されます。これは、!= differ then 12ステートメントで除外しているので、==が12と等しい場合は行が表示されません。

 
Marco vd Heijden:

この例では、12:00を除くすべての時間で行が表示されます。

素晴らしい だ、ありがとう:))

それはシンプルですが、私はそれを気にしない。シンプルいいじゃない ですか。

(実はこのインジケータでは'=='を使っているのですが、本当は'OnTimer'に注目しました)

//--- 2回目の編集...

これはこれでいいのですが、時刻が00:00になると、また現在時刻の VLINEが追加で表示されます。

if (
     TimeHour( _timeCvrt_M5 ) == 1  ||
     TimeHour( _timeCvrt_M5 ) == 2  ||
     TimeHour( _timeCvrt_M5 ) == 3  ||

     TimeHour( _timeCvrt_M5 ) == 5  ||
     TimeHour( _timeCvrt_M5 ) == 6  ||
     TimeHour( _timeCvrt_M5 ) == 7  ||

     TimeHour( _timeCvrt_M5 ) == 9  ||
     TimeHour( _timeCvrt_M5 ) == 10 ||
     TimeHour( _timeCvrt_M5 ) == 11 ||

     TimeHour( _timeCvrt_M5 ) == 13 ||
     TimeHour( _timeCvrt_M5 ) == 14 ||
     TimeHour( _timeCvrt_M5 ) == 15 ||

     TimeHour( _timeCvrt_M5 ) == 17 ||
     TimeHour( _timeCvrt_M5 ) == 18 ||
     TimeHour( _timeCvrt_M5 ) == 19 ||

     TimeHour( _timeCvrt_M5 ) == 21 ||
     TimeHour( _timeCvrt_M5 ) == 22 ||
     TimeHour( _timeCvrt_M5 ) == 23
)

(私は研究されたので、私は数回このコメントを更新 しました。)

よろしくお願いします。