カスタムシンボル。エラー、バグ、質問、提案。 - ページ 18

 

バグ24。

プローブされたダニと輸入された ダニのデータベースが正しく共存していない。

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnInit()
{
  MathSrand((int)TimeLocal());
  EventSetMillisecondTimer(20); // С такой частотой будем пробрасывать тики
}

void OnTimer()
{
  static bool FirstRun = true;
  static const string Name = _Symbol + (string)MathRand();
    
  static MqlTick Ticks[];
  static int Pos = 0;
    
  if (FirstRun)
  {    
    if (CustomSymbolCreate(Name, NULL, _Symbol) && SymbolSelect(Name, true)) // Создали символ
      PRINT(CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, (ulong)D'2019.06.20' * 1000, 5)); // Взяли 5 тиков для проброса
      
    FirstRun = false;
  }
  else if (Pos < ArraySize(Ticks))
  {
    MqlTick Tick[1];
    
    Tick[0] = Ticks[Pos++];
    
    PRINT(CustomTicksAdd(Name, Tick)); // Пробросили тик.
    PRINT(CustomTicksReplace(Name, Tick[0].time_msc, Tick[0].time_msc, Tick)); // Заменили его же через импорт.
  }
  else
  {
    PRINT(CopyTicksRange(Name, Ticks)); // Взяли всю тиковую историю
    ArrayPrint(Ticks);                  // Распечатали ее.
    
    ExpertRemove();
  }
}


結果

CopyTicks(_Symbol,Ticks,COPY_TICKS_ALL,(ulong)D'2019.06.20'*1000,5) = 5
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CopyTicksRange(Name,Ticks) = 10
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.06.20 00:00:05 1.12255 1.12268 0.0000        0 1560988805004       6       0.00000
[1] 2019.06.20 00:00:07 1.12259 1.12268 0.0000        0 1560988807693       2       0.00000
[2] 2019.06.20 00:00:08 1.12259 1.12267 0.0000        0 1560988808627       4       0.00000
[3] 2019.06.20 00:00:09 1.12256 1.12267 0.0000        0 1560988809561       2       0.00000
[4] 2019.06.20 00:00:10 1.12255 1.12268 0.0000        0 1560988810083       6       0.00000
[5] 2019.06.20 00:00:05 1.12255 1.12268 0.0000        0 1560988805004       6       0.00000
[6] 2019.06.20 00:00:07 1.12259 1.12268 0.0000        0 1560988807693       6       0.00000
[7] 2019.06.20 00:00:08 1.12259 1.12267 0.0000        0 1560988808627       6       0.00000
[8] 2019.06.20 00:00:09 1.12256 1.12267 0.0000        0 1560988809561       6       0.00000
[9] 2019.06.20 00:00:10 1.12255 1.12268 0.0000        0 1560988810083       6       0.00000


続けて5匹のダニを再採取/輸入したが、履歴では10匹のダニが見つかっている。同時に5ティックが先に進み、その後、同じ5ティックが進む。すなわち、ティックデータベースのエントリーの時間さえも連続しないのです。

後半のティックのフラグが、前半と違うので注意してください。

 
Slava:

再現性がない。棒グラフを取り込むと、空のグラフがすぐに更新されます。

チャートを開けない場合はどうなりますか?バーをインポートした後にチャートを 開く

または、チャートを閉じてから開く。

または、チャートのコンテキストメニューから更新します。

リーディングクエスチョン )))

鉄格子を輸入して、窓を全部閉めました。

その後、シンボルを再度開き、Barsタブで私のシンボルを選択しました。

バーは表示させるべきですか?白紙です。

ロードボタン(カバーリング期間事前選択)を押しても、表示されない。

バージョン1970を試しましたが、同じ状況です。

チャートとプログラムを開いたり閉じたりしても、解決しない。

まだプログラミングには手をつけていません。

まあ、そうなんでしょうね...。


もし可能性があるなら、リモートで接続して、彼女が何を必要としているか、見てあげてください。

 

https://www.mql5.com/ru/forum/147666/page2#comment_3720399

誰かの役に立つかもしれない。
しかし、私には別の問題がありました
1.ファイル2019.hccに加え、ファイル1970.hccが生成されました。
削除したら、生き返ったようです。
2. oまたはhがl hの外側にある赤線があった。

1970がどこから来たのかは不明です。
そのような日付も、空白の行もなかった
キャンドルが多いかも、5万円以下で

それは見ることが可能ですが、どのようにグラフより目に見える振幅を広げるために?
オブジェクトを描画する際に、ローソク足の両端を正確に狙う必要があります。
プロパティの入力や値の設定を手動で行うのは面倒だ
グラフが最後にずれてしまい、巻き戻さなければならない。
最後の1小節にジャンプしないようにするにはどうすればよいのでしょうか?

Тестер не работает
Тестер не работает
  • 2013.11.04
  • www.mql5.com
2013.11.03 17:25:58 TestGenerator: no history data 'EURUSD1' Вот такое сообщение появляется в журнале после нажатия кнопки "Старт"...
 

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

バグ、バグ、質問

スタニスラフ・コロツキー さん 2019.08.22 17:34

カスタムキャラクターで以下のような問題が発生した方はいらっしゃいますか?CustomRatesUpdate関数は正常な引用符を渡しますが、実際にはチャートとデータウィンドウが何か変になります(この場合、in closeとlowの値が渡された値の100倍になっています)。

また、並行してCustomTicksAddでシングルティックをログと同じ終値の値でエミュレートしています(CustomRatesUpdateの直前)、つまり、引用符の縮小値がどこから来ているのかが不明です。

UPDです。

私はUSDCADで "逆 "の状況を得ました - 書き込み後に相場が10倍になりました。これは私が取得しているログです。

2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1)                  [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) [0] 2019.08.23 00:02:00 1.32987 1.32987 1.32980 1.32987           457       48             0
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) Retry: 1 0
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1)                  [time]  [open]   [high]   [low]  [close] [tick_volume] [spread] [real_volume]
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) [0] 2019.08.23 00:02:00 1.32980 13.29730 1.32980 13.29730           457       52             0

最初のArrayPrintはCustomRatesUpdateで書き込んだもの、2番目のArrayPrintは書き込み直後の直近のバーからCopyRatesを使って読み込んだものです。まず、違いはオープンの下一桁ですが、それ以上にハイとクローズが10倍になっています。

PS.ティックではすべてOKです。

 

Stanislav Korotky:

PS.ダニに異常はない。

バグ22。

 
fxsaber:

バグ22。

最新のビルドでは修正されているのでしょうか?

 

4022エラーとは何ですか?カスタム文字にバーを書き込もうとすると何かと面倒です。でも、コードから判断すると、汎用的なものですね。

最初はこれでした。

KI      0       16:24:20.957    RenkoCharts (XAUUSD,M1) Alert: Error on writing custom record: 3082, err: 4401
HS      0       16:24:20.957    RenkoCharts (XAUUSD,M1) Failed to add:
LE      0       16:24:20.957    RenkoCharts (XAUUSD,M1)                  [time]   [open]   [high]    [low]  [close] [tick_volume] [spread] [real_volume]
KG      0       16:24:20.957    RenkoCharts (XAUUSD,M1) [0] 2019.08.28 00:06:00 1542.500 1542.500 1542.400 1542.400            15      170             0
GF      0       16:24:20.957    RenkoCharts (XAUUSD,M1) Last known 10 M1:
JN      0       16:24:20.973    RenkoCharts (XAUUSD,M1)                  [time]   [open]   [high]    [low]  [close]       [tick_volume] [spread]       [real_volume]
JJ      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [0] 2019.08.28 00:00:00 1543.100 1543.100 1543.000 1543.000                   4      180                   0
DE      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [1] 2019.08.28 00:01:00 1543.000 1543.000 1542.900 1542.900                   2      180                   0
EP      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [2] 2019.08.28 00:02:00 1542.900 1542.900 1542.800 1542.800                   1      180                   0
ES      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [3] 2019.08.28 00:03:00 1542.800 1542.800 1542.700 1542.700                   1      180                   0
EN      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [4] 2019.08.28 00:04:00 1542.700 1542.700 1542.600 1542.600                   1      180                   0
QH      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [5] 2019.08.28 00:05:00 1542.600 1542.700 1542.500 1542.500                  30      170                   0
RE      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [6] 1970.01.01 00:00:00   +0.000   +0.000   +0.000   +0.000          5365435195        1 1827299883397152768
FF      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [7] 2106.02.07 06:28:16    0.078   +0.000   +0.000   +0.000 4597373804417646592        1                9481
KR      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [8] 1970.01.01 00:00:00   +0.000   +0.000   +0.000   +0.000           136454688        1 1827300776750350336
KL      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [9] 0000.00.00 00:00:00   +0.000    2.150   +0.000   +0.000 1287860306076237824        0          4294967300
CH      0       16:24:20.973    RenkoCharts (XAUUSD,M1) Timeout before retry...

CustomRatesUpdateを 呼び出すと4401。次に、CopyRatesでカスタムシンボルの過去10バーを読みます(ベースにはいくつかの無意味なものを見ることができます)。その後、タイムアウトを経て、再び1小節の書き込みを何度か試み、4022が表示されるまで。そして、EAが異常終了し、その後、勝手に再起動した。

 

問題はこれだ。

カスタムシンボルでストップとフリーズのレベルを動的に変更する必要があります。

テスト用EAには以下のようなコードがあります。

//+------------------------------------------------------------------+
//| Globals                                                          |
//+------------------------------------------------------------------+
string symbol_name="EURUSD_1";
string symbol_path="";
string symbol_origin="EURUSD";
long stop_lvl=20;
long freeze_lvl=30;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 1) create
   if(!::SymbolInfoInteger(symbol_name,SYMBOL_CUSTOM))
     {
      ResetLastError();
      if(!::CustomSymbolCreate(symbol_name,symbol_path,symbol_origin))
        {
         PrintFormat("Error code: %d",GetLastError());
         return INIT_FAILED;
        }
     }
//--- 2) set levels
   ResetLastError();
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
//---
   return INIT_SUCCEEDED;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 1) stop level
   stop_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   if(stop_lvl==20)
      stop_lvl=30;
   else
      stop_lvl=20;
   ResetLastError();
   if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code while setting a new value for the stop level: %d",
                  GetLastError());
      return;
     }
//--- 2) freeze level
   freeze_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL);
   if(freeze_lvl==30)
      freeze_lvl=40;
   else
      freeze_lvl=30;
   if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code while setting a new value for the freeze level: %d",
                  GetLastError());
      return;
     }
  }
//+------------------------------------------------------------------+

通常のデバッグモードでは、OnTick()ハンドラ本体のみでエラーになります。エラーのコードは0です。

2019.09.09 23:25:05.010 TestingLevels (EURUSD,M1)       Error code while setting a new value for the stop level: 0


ヒストリーのデバッグモードで、初期化中にエラーが発生します。このようなエラーになります。

2019.09.09 23:29:43.005 2019.09.02 00:00:00   Error code: 4014

すなわち、システム関数の呼び出しが禁止されているのです。

err_function_not_allowed

4014

システム関数の呼び出しを許可していない


一般的に、EAがカスタムシンボルで動作しているときに、ストップレベリングとフリーレベリングの値を変更することは可能でしょうか?

 
Denis Kirichenko:

問題はこれだ。

カスタムシンボルでストップとフリーズのレベルを動的に変更する必要があります。

テスト用EAには以下のようなコードがあります。

通常のデバッグモードでは、OnTick()ハンドラ本体のみでエラーになります。エラーのコードは0です。


ヒストリーのデバッグモードで、初期化中にエラーが発生します。このようなエラーになります。

すなわち、システム関数の呼び出しが禁止されているのです。

err_function_not_allowed

4014

システム関数の呼び出しを許可していない


一般的に、EAがカスタムシンボルで動作しているときに、ストップレブやフリーズレブの値を変更することは可能でしょうか?

そして、なぜOnTick()の行で

if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))

и

if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))

キャラクタプロパティの変更に成功した場合、エラー処理ブロックの本体に入るか?(「!」マークがない)

 
Artyom Trishkin:

なぜOnTick()内の行は

и

文字プロパティの変更に成功した場合、エラー処理ブロックボディを入力するか?(「!」の記号がない)。

Artyomさん、ありがとうございます私の見落とし。

更新版です。

//+------------------------------------------------------------------+
//| Globals                                                          |
//+------------------------------------------------------------------+
string symbol_name="EURUSD_1";
string symbol_path="";
string symbol_origin="EURUSD";
long stop_lvl=20;
long freeze_lvl=30;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 1) create
   if(!::SymbolInfoInteger(symbol_name,SYMBOL_CUSTOM))
     {
      ResetLastError();
      if(!::CustomSymbolCreate(symbol_name,symbol_path,symbol_origin))
        {
         PrintFormat("Error code: %d",GetLastError());
         return INIT_FAILED;
        }
     }
//--- 2) set levels
   ResetLastError();
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
//---
   return INIT_SUCCEEDED;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 1) stop level
   stop_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   if(stop_lvl==20)
      stop_lvl=30;
   else
      stop_lvl=20;
   ResetLastError();
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code while setting a new value for the stop level: %d",
                  GetLastError());
      return;
     }
//--- 2) freeze level
   freeze_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL);
   if(freeze_lvl==30)
      freeze_lvl=40;
   else
      freeze_lvl=30;
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code while setting a new value for the freeze level: %d",
                  GetLastError());
      return;
     }
  }
//+------------------------------------------------------------------+

これで通常のデバッグモードで すべてが動作するようになりました。しかし、テスターではそうはいきません。そこに書き続けるのです。

2019.09.10 07:16:49.867 2019.09.03 00:00:00   Error code: 4014