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

 

こんにちは、Anton!

アドバイスにしたがって(LoadServerData() は SeriesInfoInteger( a_symbol, PERIOD_M1,SERIES_SERVER_FIRSTDATE) を呼び出します。

つまり、「期間に関係なく、サーバー上のシンボルによる履歴の最初の日付」と読み取ります。

このリクエスト自体は、実際には履歴リクエストとはみなされない、つまりキャッシュが構築されることはない。

は、シンボルデータのアンロードを妨げない。SERIES_FIRSTDATEを要求するか、時系列のバーの数を要求するかは意味があることです。),

シンボルデータのアンロードを防ぐために、インジケーターに新しい関数を追加しました。

//+------------------------------------------------------------------+
// Custom indicator Book Event function                              |
//+------------------------------------------------------------------+
void OnBookEvent( const string &symbol )
{
  if ( ( ( symbol == _Symbol ) || ( symbol == sec_symbol ) ) && ( !IsStopped() ) )
  {
    GetBars( sec_symbol, time_frame );
  }  
}

//+------------------------------------------------------------------+
// Custom indicator Check timer function                             |
//+------------------------------------------------------------------+
bool CheckTimer( const uint start_value, const uint per_value )
{
  uint end_value = GetTickCount();
  
  if ( end_value < start_value )
  {
    if ( ( start_value - end_value ) >= per_value ) return( true );
  } 
  else
  {
    if ( ( end_value - start_value ) >= per_value ) return( true );
  }
  return( false );
}
//+------------------------------------------------------------------+
//| Custom indicator Get local data function                         |
//+------------------------------------------------------------------+
int GetLocalData( const string a_symbol, ENUM_TIMEFRAMES a_period )
{
  long first_date;
  int fail_cnt = 0;
//---  
  while ( ( fail_cnt < 3 ) && !IsStopped() )
  {
    first_date = long( SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_TERMINAL_FIRSTDATE ) );
//---    
    if ( first_date > 0 )
    {
      int f_cnt = 0;
      datetime times[1];
      long a_bars = 0;
//---  
      while ( ( f_cnt < 5 ) && !IsStopped() )
      {
        if ( bool( SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_BARS_COUNT, a_bars ) ) )
        {
          if ( a_bars > 0 )
          {
            if ( bool( SeriesInfoInteger( a_symbol, a_period, SERIES_BARS_COUNT, a_bars ) ) )
              if ( a_bars > 0 ) return( int( a_bars ) );
          }
        }
        else
        {
//--- force timeseries build
          CopyTime( a_symbol, a_period, 0, 1, times );
          uint start_tick = GetTickCount();
//---        
          while ( !CheckTimer( start_tick, 5 ) )
          {
            f_cnt--;
            f_cnt++;
          }  
        }
        f_cnt++;
      } 
  //    Print( "GetLocalData: Таймсерия не построена!" );
    }
    else
    {
      uint start_tick = GetTickCount();
//---        
      while ( !CheckTimer( start_tick, 5 ) )
      {
        fail_cnt--;
        fail_cnt++;
      }
    }
//---   
    fail_cnt++;
  }
//  Print( "GetLocalData: Нет данных в терминале!" );
  return( 0 );
}
//+------------------------------------------------------------------+
//| Custom indicator Get server data function                        |
//+------------------------------------------------------------------+
int LoadServerData( const string a_symbol, ENUM_TIMEFRAMES period )
{
  int fail_cnt = 0;
//---
  while ( ( fail_cnt < 5 ) && !IsStopped() )
  {   
    long first_date = long( SeriesInfoInteger( a_symbol, PERIOD_M1, SERIES_SERVER_FIRSTDATE ) );
//---
    if ( first_date > 0 )
    {
      if ( SymbolIsSynchronized( a_symbol ) )
      {
  //      Print( "LoadServerData: Первая дата на сервере есть. Пробуем получить локальные данные..." );
        return( GetLocalData( a_symbol, period ) );
      }  
    }
    else
    {
      uint start_tick = GetTickCount();
//---        
      while ( !CheckTimer( start_tick, 10 ) )
      {
        fail_cnt--;
        fail_cnt++;
      }
    }    
    fail_cnt++;
  }
 // Print( "LoadServerData: Первой даты на сервере нет!" );
  return( 0 );  
}
//+------------------------------------------------------------------+
//| Custom indicator Get bars function                               |
//+------------------------------------------------------------------+
int GetBars( string symbol, ENUM_TIMEFRAMES period )
{
  if ( !IsStopped() )
  {
    int a_bars = Bars( symbol, period );
//---
    if ( a_bars > 0 )
    {
      return( a_bars ); 
    }
    else
    {
  //    Print( "GetBars: Бары не получены проверяем синхронизации..." );
//---Check symbol is synchronized  
      if ( SymbolIsSynchronized( symbol ) )
      {
    //    Print( "GetBars: Символ сихронизирован. Проверяем таймсерию..." );
//---Check series is synchronized
        if ( bool( SeriesInfoInteger( symbol, period, SERIES_SYNCHRONIZED ) ) )
        {
     //     Print( "GetBars: Серия синхронизирована. Пробуем получить бары..." );
          a_bars = Bars( symbol, period );  
//---           
          if ( a_bars > 0 )
          {
            return( a_bars );
          }
          else
          {
            return( GetLocalData( symbol, period ) );
          }  
        }
        else
        {
      //    Print( "GetBars: Серия не сихронизирована. Пробуем получить данные из терминала..." );
          return( GetLocalData( symbol, period ) );
        }    
      }  
      else
      {
    //    Print( "GetBars: Символ не синхронизирован. Пробуем получить данные с сервера..." );
        return( LoadServerData( symbol, period ) );
      }  
    }   
  }  
  return( 0 );
}

BR-8.15とBR-9.15のキャラクターでは、OnBookEvent()関数がかなりの頻度でトリガーされます。

が、結果は同じです。

2015.07.23 20:48:13.449 Spread (BR-8.15,M1)     OnCalculate: Не получены бары по символу BR-9.15
2015.07.23 20:48:13.449 Spread (BR-8.15,M1)     OnCalculate: Не получены бары по символу BR-9.15
2015.07.23 20:48:13.449 Spread (BR-8.15,M1)     OnCalculate: Не получены бары по символу BR-9.15
2015.07.23 20:48:13.449 Spread (BR-8.15,M1)     OnCalculate: Не получены бары по символу BR-9.15
2015.07.23 20:48:13.449 Spread (BR-8.15,M1)     OnCalculate: Не получены бары по символу BR-9.15

で、何が問題なんだ?

なぜバーズが無理なのか?

 
Михаил:

BR-8.15とBR-9.15のキャラクターでOnBookEvent()関数がかなりの頻度でトリガーされます。

が、結果は同じです。

で、何が問題なんだ?

なぜバーズが無理なのか?

よくあること」という頻度では、自信が持てない。デバッグ用にGetBars()関数からのログ出力を追加した方が良い。

もし、それを理解したいのであれば、servicedkでリクエストを開いて ください。本格的なコード例を添付していただければ、問題の再現を試みます。

 
Anton:

よくあること」という頻度では、自信が持てない。デバッグ用にGetBars()からのログ出力を追加した方が良い。

もし、解決したいという気持ちがあるのなら、サービスデスクでリクエストを開いてみて ください。本格的なコード例を添付して、問題を再現してみましょう。

オッケーです。リクエスト:エラーMetaTrader 5 クライアントオープン開始:2015.07.24 18:28、#1267768

P/S「かなり頻繁に」は、流動性の高い2つの商品で1分間に10~100回のOnBookEvent()トリガーです。

 

万歳!

サポートチーム2015.07.29 16:29

問題を再現した。実際、定期的なクエリを行っても、シンボルデータがメモリからアンロードされることがあった。エラーは修正されます。

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

 
Михаил:

Michael さんは、他のシンボルからシリーズを取得する際のこの問題を克服することができましたか?私のインジケーターは他のシンボルと常に同期がとれなくなり、戦うのにうんざりしています。


今、デモサーバーでは、2015年6月22日のBuild 1159を配布しています。そして、その中で多通貨の指標も 恐ろしく機能する。何度か期間を切り替えたり、インジケーターを再起動したりしないと、正しく表示されません。そして、しばらくすると再びシリーズデータを取得しなくなる。いつもログに書き込んでいます。

Данные символа "Si-12.15" не синхронизированы с торговым сервером.

開発者の 皆様へ。

データが同期されて いるかどうかをチェックするのではなく、直接同期を行い、このデータをメモリからアンロードしないような関数を作ることはできないのでしょうか?

アルゴリズムの最適化という意味でも、省資源は良いことだと思います。しかし、なぜメモリからデータをオフロードすることにそこまでこだわらなければならないのでしょうか?

こんな面倒なシリーズ同期をするくらいなら、PCのメモリを1〜2GB追加で買った方がマシだ。

OnInit()で一度 呼ばれ、必要なシンボルのデータをロードし、インジケータが動作している限りアンロードされないような関数を作ってください。

最初のデート、バーの数、サーバーのことなど、ユーザーが考えるのではなく、端末がデータを用意し、その更新を監視する必要があります。

SynchronizeSymbol("RTS-12.15");
SynchronizeSymbol("BR-10.15");
SynchronizeSymbol("Si-12.15");
 
demonsn:

Michael さんは、他のシンボルからシリーズを取得する際のこの問題を克服することができましたか?私のインジケーターは他のシンボルと常に同期がとれなくなり、戦うのにうんざりしています。


今、デモサーバーでは、2015年6月22日のBild 1159を発行しています。そしてその中で、多通貨のインジケーターも 恐ろしく機能する。何度か期間を切り替えたり、インジケーターを再起動したりしないと、正しく表示されません。そして、しばらくすると再びシリーズデータを取得しなくなる。いつもログに書き込んでいます。

開発者の 皆様へ。

データが同期されて いるかどうかをチェックするのではなく、直接同期を行い、このデータをメモリからアンロードしないような関数を作ることはできないのでしょうか?

アルゴリズムの最適化という意味でも、省資源は良いことだと思います。しかし、なぜメモリからデータをオフロードすることにそこまでこだわらなければならないのでしょうか?

こんな面倒なシリーズ同期をするくらいなら、PCのメモリを1〜2GB追加で買った方がマシだ。

OnInit()で一度 呼ばれ、必要なシンボルのデータをロードし、インジケータが動作するまで再度アンロードされないような関数を作成します。

最初のデート、バーの数、サーバーのことなど、ユーザーが考えるのではなく、端末がデータを用意し、その更新を監視する必要があります。

こんにちは。

開発者からは、新しいビルドで修正するとの回答がありました。

発売時期は未定です。

 
約束されたものを手に入れるには3年かかる)
 

フォルツァ関数OrderCheck()とOrderCalcMargin()が、取引に必要なGOを誤って決定し、結果としてFALSEを返してしまうことがある、という問題が発生しました。

RTS-12.15(SYMBOL_MARGIN_INITIAL)の必要GOが12,500 なので、この機能には143,105 ルーブルも必要です

同時に、すべてを手動で完璧に開くことができます。

どうやって電話するのですか?

MqlTradeRequest MtRequest = {0}; 

MqlTradeRequest.action = TRADE_ACTION_DEAL;
MqlTradeRequest.magic  = 0;
MqlTradeRequest.order  = 0;
MqlTradeRequest.symbol = "RTS-12.15";
MqlTradeRequest.volume = 1.00;
MqlTradeRequest.price  = 86470;
MqlTradeRequest.stoplimit = 0;
MqlTradeRequest.sl = 0;
MqlTradeRequest.tp = 0;
MqlTradeRequest.deviation = 50;
MqlTradeRequest.type = ORDER_TYPE_SELL;
MqlTradeRequest.type_filling = ORDER_FILLING_FOK;
MqlTradeRequest.type_time = gtc;
MqlTradeRequest.expiration = 0;
MqlTradeRequest.comment = NULL;

MqlTradeCheckResult MtCheckResult = {0};

OrderCheck(MtRequest,MtCheckResult);

Получаю в ответ False и такую структуру:

MqlTradeCheckResult.retcode:      10019 (There is not enough money to complete the request)
MqlTradeCheckResult.balance:      132727.37
MqlTradeCheckResult.equity:       130772.91
MqlTradeCheckResult.profit:       0.00
MqlTradeCheckResult.margin:       143104.55
MqlTradeCheckResult.margin_free: -12331.64
MqlTradeCheckResult.margin_level: 91.38
MqlTradeCheckResult.comment:      No money

 

この方法で試してみてください。

  MqlTradeRequest MtRequest = {0}; 
  MqlTradeCheckResult MtCheckResult = {0};
//---
  MtRequest.action = TRADE_ACTION_DEAL;
  MtRequest.magic  = 7777777777;
  MtRequest.symbol = "RTS-12.15";
  MtRequest.volume = 1.00;
  MtRequest.price  = 86470;
  MtRequest.type = ORDER_TYPE_SELL;
  MtRequest.type_filling = ORDER_FILLING_FOK;
  MtRequest.type_time = ORDER_TIME_DAY;
//---
 if ( OrderCheck( MtRequest, MtCheckResult ) )
 {
   Print( "retcode = ", MtCheckResult.retcode );
   Print( "balance = ", MtCheckResult.balance );
   Print( "equity = ",  MtCheckResult.equity );
   Print( "profit = ", MtCheckResult.profit );
   Print( "margin = ", MtCheckResult.margin );
   Print( "margin_free = ", MtCheckResult.margin_free  );
   Print( "margin_level = ", MtCheckResult.margin_level );
 }

これが私の結果です。

2015.10.22 15:38:39.520 LastPrice (RTS-12.15,M1)        margin_level = 979.8676728569379
2015.10.22 15:38:39.334 LastPrice (RTS-12.15,M1)        margin_free = 112198.35
2015.10.22 15:38:39.151 LastPrice (RTS-12.15,M1)        margin = 12751.73
2015.10.22 15:38:38.973 LastPrice (RTS-12.15,M1)        profit = 0.0
2015.10.22 15:38:38.797 LastPrice (RTS-12.15,M1)        equity = 124950.08
2015.10.22 15:38:38.623 LastPrice (RTS-12.15,M1)        balance = 124950.08
2015.10.22 15:38:38.397 LastPrice (RTS-12.15,M1)        retcode = 0
 
ありがとうございます。並行チェックとして、お客様のオプションを追加しました。あとはタイミングをつかむだけです。