FORTS 助けてください - ページ 6

 
Serj_Che:
なぜOnInitで行ったことをOnCalculateで繰り返すのですか?そんな呪文があるんですか(笑)

単純なコピー&ペーストのマジックです))

よし、ポピュラーに説明しよう。イニテで一度、データのレディネスを確認するだけでは不十分です。非同期でデータを生成するため(メイン処理が遅くならないように)、initでのチェック時にデータエラーが発生する可能性があります(様々な要因に依存します)。

したがって、calculate で check and (or only) して、必要なデータがすべて揃うまでメインの計算を開始しない、つまりtick ごと に ready まで check する必要があるのです。

 
Dima_S:

単純なコピー&ペーストのマジックです))

よし、ポピュラーに説明しよう。イニテで一度、データのレディネスを確認するだけでは不十分です。データは非同期で生成されるため(メイン処理が遅くならないように)、initでのチェック時に、データエラーが発生する可能性は十分にあります(様々な要因に依存します)。

そのため、チェックは計算中に行い(あるいは計算中にのみ)、必要なデータがすべて揃うまでメインの計算を開始しない、つまり、毎ティックで準備が整うまでチェックする必要があるのです。

それこそ、インジケーターのOnInit関数が クソだったり、開発者が仕事してなかったり。

コピー&ペーストは素晴らしいことです、自分もやってます )) 。

 

怒鳴っても、チュクチを呼んでも、問題は解決しない!

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//
bool is_failed = false;
datetime start_time;
datetime end_time;
int mix_bars, rts_bars, si_bars;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
    start_time = StringToTime( "2015.03.17" );
    end_time = TimeCurrent();
//--- indicator buffers mapping
  mix_bars = GetBars( "MIX-6.15" , PERIOD_CURRENT, start_time, end_time ); 
  if ( mix_bars < 1 )
  {
    is_failed = true;
    Print( "Init failed. MIX-6.15 ");
  }
  rts_bars = GetBars( "RTS-6.15" , PERIOD_CURRENT, start_time, end_time ); 
  if ( rts_bars < 1 )
  {
    is_failed = true;
    Print( "Init failed. RTS-6.15 ");
  }
  si_bars = GetBars( "Si-6.15" , PERIOD_CURRENT, start_time, end_time ); 
  if ( si_bars < 1 )
  {
    is_failed = true;
    Print( "Init failed. Si-6.15 ");
  }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator Get bars function                               |
//+------------------------------------------------------------------+
int GetBars( string symbol, ENUM_TIMEFRAMES period, const datetime start_date, const datetime end_date )
{
  if ( !SymbolInfoInteger( symbol, SYMBOL_SELECT ) )
  {
    ResetLastError();
//---    
    if ( GetLastError() != ERR_MARKET_UNKNOWN_SYMBOL )
    {
      SymbolSelect( symbol, true );
    }
    else
    {
      Print( "GetBars: Неизвестный символ - ", symbol );
      return( 0 );
    }    
  }
//---  
  if ( MQL5InfoInteger( MQL5_PROGRAM_TYPE ) == PROGRAM_INDICATOR && Period() == period && Symbol() == symbol )
  {
    Print( "GetBars: Не пройдена проверка типа программы!" );
    return( 0 );
  }  
//---
  if ( SymbolIsSynchronized( symbol ) )
  {
    return( Bars( symbol, period, start_date, end_date ) );
  }
  else
  {
    long first_date = 0;
    datetime times[1];
//---    
    if ( SeriesInfoInteger( symbol, PERIOD_M1, SERIES_TERMINAL_FIRSTDATE, first_date ) )
    {
      if ( first_date > 0 )
      {
//--- force timeseries build
        CopyTime( symbol, period, datetime( first_date ) + PeriodSeconds( period ), 1, times );
//--- check date
        if ( SeriesInfoInteger( symbol, period, SERIES_FIRSTDATE, first_date ) )
//---        
        if ( first_date > 0 && first_date <= long( start_date ) )
        {
          return( Bars( symbol, period, start_date, end_date ) );
        } 
      }
    }
    Print( "Необходима загрузка истории с сервера!");
  }       
//---  
  return( 0 );
}  
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   if ( is_failed )
   {
     Print( "Sorry! Get Bars failed." );
   }
   else Print( "Bingo! We done.");
//--- return value of prev_calculated for next call
   return(rates_total);
  }

履歴のダウンロードはまだ書いていないのですが、データはターミナルに入っていて、初回は出てこないんです

2015.03.26 20:49:01.641 Test (MIX-6.15,M1)      Необходима загрузка истории с сервера!
2015.03.26 20:49:01.641 Test (MIX-6.15,M1)      Init failed. RTS-6.15 
2015.03.26 20:49:01.641 Test (MIX-6.15,M1)      Необходима загрузка истории с сервера!
2015.03.26 20:49:01.641 Test (MIX-6.15,M1)      Init failed. Si-6.15 
2015.03.26 20:49:01.641 Test (MIX-6.15,M1)      Sorry! Get Bars failed.
 
Serj_Che:

なるほど、面白い!

インジケータは自分のスレッドで、EAは自分のスレッドで作業します。もちろん、単芯石であれば別ですが。

全てはドキュメントに書かれている通りです。:)

テスト用のインジケータとEAをスケッチして、その結果を動画にしました。

1) まず、OnTick 機能を 20 秒間実行したチャートに Expert Advisor をプロットします。

その結果、チャートは動作を継続し、すべてをあるべき姿で表示することができます。チャートも期待通りに動作します。

2) 次に、OnCalculate 機能を持つインジケータを20秒間チャートに適用します。

その結果、チャットがハングアップしてしまいます。同時に、同じシンボルで期間の異なる次のチャットウィンドウも中断されます。ガラスは本来の性能を発揮し続けます。機能が働いた後は、すべてが元に戻ります。

3) ビデオにはありませんが、一方のチャットでインジケータを投げ(60秒に設定)、もう一方のチャットでエキスパートを投げると、もう一方のチャットのインジケータが不具合を起こすまでエキスパートが動き出しません

動画を別途添付しました - 私のブラウザでは遅いです。

 
MigVRN:

すべてがドキュメントに書かれているとおりになるのです。:)

インジケータとExpert Advisorをスケッチし、ビデオで確認。

1) まず、20秒間動作するOnTick関数を内蔵しているExpert Advisorのチャートにキャストしてみました。

その結果、チャートは動作を継続し、すべてをあるべき姿で表示することができます。チャートも期待通りに動作します。

2) 次に、OnCalculate 機能を持つインジケータを20秒間チャートに適用します。

その結果、チャットがハングアップしてしまいます。同時に、同じシンボルで期間の異なる次のチャットも停止されます。ガラスは本来の性能を発揮し続けます。機能が働いた後は、すべてが元通りになります。

3) ビデオにはありませんが、1つのチャットでインジケータ(60秒設定)、もう1つのチャットでEAをキャストすると、別のチャットでインジケータが誤動作するまでEAが動作し始めません。

動画を別途添付 - 私のブラウザは遅いです。

ありがとうございます、動画が見れないので調べてみます。

 

インジケータから作業する際に、取引環境からデータを取得しようとする場合、OnInit()でクエリを設定しようともしないでください。OnCalculate()でクエリを作成し、レスポンスを確認します。他のシンボルや他のタイムフレームからデータを受信する場合、OnCalculateでも、最初の時間からデータを受信することに成功しないことがほぼ確実です。そのため、値の戻りを確認する必要があります。値が得られない場合は、OnCalculate()で次のティックでのデータ取得を試みる。


また、servicedeskからのレスポンス、つまり提供されたコードを見るのもすでに興味深いです。

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

FORTSヘルプ

alexvd, 2015.03.26 15:48

あなたはservisdeskからソースコードを渡されました。最後のコードをTest()関数に入れてみてください。

すでにスポーツ的な興味 - 著者は自分のコードを書き続け、servicedeskのコードを無視する?

 
barabashkakvn:

インジケータから作業する際に、取引環境からデータを取得しようとする場合、OnInit()でクエリを設定しようともしないでください。OnCalculate()でクエリを作成し、レスポンスを確認します。他のシンボルや他のタイムフレームからデータを受信する場合、OnCalculateでも、最初の時間からデータを受信することに成功しないことがほぼ確実です。そのため、値が返ってくるかどうかを確認する必要があるのです。値を受信しなかった場合は、OnCalculate()で次のティックでのデータ受信を試みます。

+++ といった具合に。すなわち、データがなければ-戻る。
 
MigVRN:
+++ といった具合に、最後まですなわち、データがない場合は、リターンする。
何を照会したいかによります。また、何回クエリを発行するかは、コード作成者の好みに完全に依存する。
 
barabashkakvn:
何を問い合わせるかによります。また、何回クエリを発行するかは、コード作成者の好みに完全に依存します。

あなたは、次のことを理解しています。

端末にデータがある場合は、関数

SeriesInfoInteger( symbol, PERIOD_M1, SERIES_TERMINAL_FIRSTDATE, first_date )

はFALSEを返してはいけないのでしょうか?

P/S SDコードも初回から使えない!

 

ONCE AGAIN

ヘルプから

SeriesInfoInteger

履歴データの状態に関する情報を返す。この機能には、2つのバリエーションがあります。

2つ目のバリエーション。

bool  SeriesInfoInteger(
   string                     symbol_name,     // имя символа
   ENUM_TIMEFRAMES            timeframe,       // период
   ENUM_SERIES_INFO_INTEGER   prop_id,         // идентификатор свойства
   long&                      long_var         // переменная для получения информации
   );

series_terminal_firstdate。

期間に関係なく、クライアント端末のシンボルに従って履歴の最初の日付

時分

この関数は、端末にデータがある場合に false を返してはいけません!!!!

どこからかけてもOK!