ライブラリ: Symbol - ページ 9

 
Stanislav Korotky:

そして、興味深い疑問が生じた - 同じ問題は、スタックで観察されていない - つまり、スタック 内の価格がチャートと異なるように?

あるユーザーは、BookEventベースのインデューサーとチャートが同期していないと私に文句を言ってきました。

スタックはMarket Watchに対応していなければなりません。したがって、スタックはチャートと異なる可能性があります。

 
fxsaber:

その結果、テスターではターミナルで見たものを元のシンボルで再現することはできません。

これがターミナルで表示されるものです。

ディールは「空中」で行われます。インジケータは森に行く。ティック履歴の 区分のみ。

 

おそらく、新しいビルド2515が何か間違っているのだろう。

これがそのスクリプトだ:

#property copyright "IgorM"
#property link      "https://www.mql5.com/ja/users/igorm"
#property version   "1.00"
#property script_show_inputs

input int      History        = 1 e5;
input double   Weierstrass_A  = 0.33;
input double   Weierstrass_B  = 1.5;
input int      Weierstrass_N  = 10;
input double   Weierstrass_Koeff = 0.45;

#include <fxsaber\Symbol.mqh> // https://www.mql5.com/ja/code/18855
//+------------------------------------------------------------------+
//| スクリプト番組開始機能|
//+------------------------------------------------------------------+
void OnStart()
{
   const SYMBOL SymbDB("W" + _Symbol);
   datetime dt_end = TimeCurrent();
   if(!SymbDB.IsExist()) // シンボルが作成されていない場合は、終了する。
   {
      Alert("Error create Weierstrass func, symbol = ", "W" + _Symbol);
      return;
   }
   SymbDB.Off();
   SymbDB.CloneProperties(); // プロパティをコピー
   if(CustomRatesDelete(SymbDB.Name, 0, dt_end) == -1)
   {
      Alert("Error CustomRatesDelete , GetLastError = ", GetLastError());
      return;
   }
// 正規化のための係数を求める
   int fw_MAX = INT_MIN, fw_MIN = INT_MAX;
   for(int i = 4 * History; i >= 0; i--)
   {
      int wtmp = FuncWeierstrass(Weierstrass_A, Weierstrass_B, Weierstrass_N, i);
      if(wtmp > fw_MAX) fw_MAX = wtmp;
      if(wtmp < fw_MIN) fw_MIN = wtmp;
   }
   const int fw_knorm = fw_MAX - fw_MIN;

// 目盛りを記録してチャートを作成する
   MqlTick ticks[];
   ArrayResize(ticks, History * 4);
   for(int i = 4 * History - 1; i >= 0; i--)
   {
      int wtmp = FuncWeierstrass(Weierstrass_A, Weierstrass_B, Weierstrass_N, i);
      ticks[i].last = ticks[i].bid = ticks[i].ask = NormalizeDouble(1.0 + Weierstrass_Koeff * (2.0 * (wtmp - fw_MIN) / fw_knorm - 1), _Digits);
      ticks[i].bid -= _Point;
      ticks[i].time_msc = ticks[i].time = dt_end--;
      ticks[i].time_msc *= 1000;
      ticks[i].volume = 1;
      ticks[i].volume_real = 1.0;
      ticks[i].flags = TICK_FLAG_ASK | TICK_FLAG_BID;
   }
   CustomTicksAdd(SymbDB.Name, ticks);
   if(SymbDB.On()) // マーケット・ウォッチに含まれるもの
      ChartOpen(SymbDB.Name, PERIOD_M1); // 新しいシンボル・チャートを開く
}
//+------------------------------------------------------------------+
int FuncWeierstrass(const double Wa, const double Wb, const int WN, const int cnt)
{
   int result = 0;
   for(int i = 0; i <= WN; i++)
   {
      result += (int)(MathPow(Wb, i) * MathCos(MathPow(Wa, i) * M_PI * cnt));
   }
   return(result);
}
//+------------------------------------------------------------------+


すべてうまくいきますが、一度しか動きません。

再起動すると "Waiting for update "という黒い画面になり、カスタムシンボルを手で削除 すると治ります。


何が正しく動作していないのでしょうか?

 
Igor Makanu:

何が正しく動作していないのか? ライブラリか、ターミナルの新しいビルドか?

わからない。TicksAddは使っていない。

 
fxsaber:

私は知らない。TicksAddは使っていない。

私はそれがわかったと思う。

CustomTicksAdd(SymbDB.Name, ticks);

に置き換えた。

CustomTicksReplace(SymbDB.Name,0,TimeCurrent()*1000,ticks);

スクリプトを再起動すると、正常に動作するようになりました。ただ、マーケット概要ウィンドウにAsk/Bidシンボルの値が表示されませんが、致命的ではありません。



UPD:

しかし、CustomTicksAddは、シンボルがマーケット・オーバービューに追加されたときに正しく機能します。

if(SymbDB.On()) // マーケット・ウォッチに含まれるもの
   {
      CustomTicksAdd(SymbDB.Name, ticks);
      ChartOpen(SymbDB.Name, PERIOD_M1); // 新しいシンボル・チャートを開く
   }
 

MTで不快なバグに遭遇しました。何らかの理由でSYMBOL_TRADE_TICK_SIZEが 設定されないのです。デバッグによると、正しい値がプロパティに書き込まれます(例えば、EURUSDの場合、0.00001)が、シンボルを作成した後、0が格納されます。

これを修正した人はいますか?MTのバグなのでしょうか、それともシンボル・ライブラリの特異性なのでしょうか?

 
Stanislav Korotky:

MTで不快なバグに遭遇しました。何らかの理由でSYMBOL_TRADE_TICK_SIZEが 設定されないのです。デバッグによると、正しい値がプロパティに書き込まれています(例えば、EURUSDの場合は0.00001)が、シンボルを作成した後は0が格納されています。

これを修正した人はいますか?MTのバグなのでしょうか、それともシンボルライブラリの特異性なのでしょうか?

それとも、プロパティをポーリングした後に「0」が表示されるのでしょうか?

 
Stanislav Korotky:

MTで不快なバグに遭遇しました。何らかの理由でSYMBOL_TRADE_TICK_SIZEが 設定されないのです。デバッグによると、正しい値がプロパティに書き込まれています(例えば、EURUSDの場合は0.00001)が、シンボルを作成した後は0が格納されています。

これを修正した人はいますか?MTのバグなのでしょうか、それともシンボルライブラリの特異性なのでしょうか?

おそらく、フィールドを設定する順序によると思います。私はこのようにしています。

    this.SetProperty(SYMBOL_DIGITS, this.Ticks.GetDigits());

    this.SetProperty(SYMBOL_TRADE_CONTRACT_SIZE, 1 e5); // https://www.mql5.com/ru/forum/330333#comment_14608694
    this.SetProperty(SYMBOL_TRADE_TICK_VALUE, 1);

    this.SetProperty(SYMBOL_TRADE_TICK_SIZE, this.GetProperty(SYMBOL_POINT));
 
fxsaber:

おそらく、フィールドの割り当ての順番によると思う。私はこうしている。

私はClonePropertiesコールを使用しており、このような行があります(現在公開されているバージョンでは):

...
    CLONE(SYMBOL_TRADE_CONTRACT_SIZE) &&
    CLONE(SYMBOL_TRADE_FACE_VALUE) &&
    CLONE(SYMBOL_TRADE_LIQUIDITY_RATE) &&
    CLONE(SYMBOL_TRADE_TICK_SIZE) &&
    CLONE(SYMBOL_TRADE_TICK_VALUE) &&
...

ここでは、順序は少し異なりますが、正しい値が契約と他のプロパティに転送されます。

 

ClonePropertiesを呼び出した後、こんなくだらないことを書いた:

    Symb.CloneProperties(_Symbol);
    if(SymbolInfoDouble(_SymbolName, SYMBOL_TRADE_TICK_SIZE) == 0)
    {
      CustomSymbolSetDouble(_SymbolName, SYMBOL_TRADE_TICK_SIZE, SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE));
    }

これが通常の適用方法である。しかし、これはある種の松葉杖である。