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

 
テーマがかなり広いので、別途議論をした方が良いと思いました。
 

バグ01。

カスタムキャラクターチャートを公開しました。例えば、手動ですべてのバーとティックの履歴を 削除した場合、チャートウィンドウは更新されずにハングアップします。

空のカスタムシンボルと同様に期待される動作です。

 

バグ02。

カスタムシンボルの 引用の最後の週を削除する必要があります。削除しても良いのですが、ChartRedrawでも視覚的な効果は得られません。

マウスでチャートをスクロールさせた場合のみ、正常に戻ります。ChartRedrawによる可視化を修正していただけないでしょうか。


ZZY とりあえず似たようなオーバードローをやってみる

    ChartSetInteger(0, CHART_SHIFT, !ChartGetInteger(0, CHART_SHIFT));
    Sleep(1000);
    ChartRedraw();
    
    ChartSetInteger(0, CHART_SHIFT, !ChartGetInteger(0, CHART_SHIFT));
 

バグ03。

TicksAddは、以下の保護機能を備えています。Market Watch よりも早いティックの場合は無視されます。


残念ながら、この機構はTicksDeleteやTicksReplaceと相互作用しません。

カスタムシンボルの履歴の最終日を削除し、削除後の最後のティックをMarket Watchに入れる必要があります。

削除がOKなら、最後のティックを公開しても、上に書いたルールにより、うまくいきません。


TicksAddルールを変更するか、TicksDelete/TicksReplaceがMarket Watchのティックを、その時間が現在の時間より短い場合、履歴の最後のティックに置き換えることを提案します。


再生問題

template <typename T>
T MyPrint( const T Value, const string Str, const bool DebugFlag = false ) { Print(Str + " = " + (string)Value); return(Value); }
#define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + (string)__LINE__ + ": " + #A)                    // Макрос для удобного и наглядного вывода значений

void OnStart()
{
  const string Name = "TEMP1235";                                                                   // Имя кастомного символа
  const string SymbOrig = "EURUSD";                                                                 // Имя оригинального символа

  MqlTick Ticks[];
  const int Size = _P(CopyTicksRange(SymbOrig, Ticks, COPY_TICKS_ALL, (long)D'2019.01.01' * 1000)); // Считали EURUSD-тики за 2019 год.
    
  if ((Size > 0) && _P(CustomSymbolCreate(Name, NULL, SymbOrig)) && _P(SymbolSelect(Name, true)))   // Создали символ на основе EURUSD.
  {            
    _P(CustomTicksReplace(Name, 0, LONG_MAX, Ticks));                                               // Поместили в него историю EURUSD.
    
    MqlTick AddTicks[1];                                                                            
    AddTicks[0] = Ticks[Size - 1];                                                                  // Последний тик в истории.
    
    _P(CustomTicksAdd(Name, AddTicks));                                                             // Последний тик добавили в Обзор рынка и еще раз в историю
    
    _P(CustomTicksDelete(Name, (long)D'2019.02.01' * 1000, LONG_MAX));                              // Удалили все тики, оставив только данные за январь 2019.
    _P(CopyTicks(Name, AddTicks, COPY_TICKS_ALL, 0, 1));                                            // Взяли последний тик из оставшейся истории.
    
    ArrayPrint(AddTicks);                                                                           // Посмотрели, что это, действительно, последний тик января.
    _P(CustomTicksAdd(Name, AddTicks));                                                             // Попробовали записать его в Обзор рынка - не получилось.
    
    _P(SymbolSelect(Name, false));                                                                  // Удалили символ из Обзора рынка.
    _P(CustomSymbolDelete(Name));                                                                   // Удалили символ.
  }
}


結果

void OnStart(), Line = 11: CopyTicksRange(SymbOrig,Ticks,COPY_TICKS_ALL,(long)D'2019.01.01'*1000) = 3316638
void OnStart(), Line = 13: CustomSymbolCreate(Name,NULL,SymbOrig) = true
void OnStart(), Line = 13: SymbolSelect(Name,true) = true
void OnStart(), Line = 15: CustomTicksReplace(Name,0,LONG_MAX,Ticks) = 3316638
void OnStart(), Line = 20: CustomTicksAdd(Name,AddTicks) = 1
void OnStart(), Line = 22: CustomTicksDelete(Name,(long)D'2019.02.01'*1000,LONG_MAX) = 1159087
void OnStart(), Line = 23: CopyTicks(Name,AddTicks,COPY_TICKS_ALL,0,1) = 1
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.01.31 23:59:58 1.14461 1.14486 0.0000        0 1548979198644       2       0.00000
void OnStart(), Line = 26: CustomTicksAdd(Name,AddTicks) = -1
void OnStart(), Line = 28: SymbolSelect(Name,false) = true
void OnStart(), Line = 29: CustomSymbolDelete(Name) = true


ソースコードがないとエラーメッセージが 文字で残ってしまうことは理解しています。なんてつまらないことを書いてしまいましたが、バグの表示、発見、修正には最も効果的な方法でしょう。

 

昨日から合成樹脂の整理を始めたばかりで、テスターには意味不明なものがあります。フォーミュラ付きのシンセティックはテスターで使えるのか?

ヘルプから合成、配合を作成。そうなんですか?

1

これがテストの結果です。

2

これはナンセンスです。イメージによるとイーブンであるはずがないすべてのトレードが利益を上げており、テスト終了時にはすべてのトレードがクローズされ、利益はゼロになっています。私が何か間違っているのでしょう。他に確認すべきことはありますか?ログを添付します。

ファイル:
20190224.log  9322 kb
 
Alexey Volchanskiy:

私が何か間違っているのでしょう。他に見るべきものはありますか?

スクリーンショットでは、シンボルの利益通貨が 口座通貨と同じでないことがわかります。したがって、変換するとゼロになる。

この機能を「すぐに」使えるようにするには、「EURUSD_ALEX1」のような名前を付けます。

 
カスタムシンボルとその設定は、どのフォルダーに保存されているか教えてください。ターミナルやソフトで探しても見つからない。
 
pivomoe:
カスタムシンボルとその設定は、どのフォルダーに保存されているか教えてください。ターミナルやソフトウェアで削除しても解決しない。

\MetaTrader5Bases

 

バグ 04.

特定のリプレイに関する別のバグ

template <typename T>
T MyPrint( const T Value, const string Str, const bool DebugFlag = false ) { Print(Str + " = " + (string)Value); return(Value); }
#define _P(A) MyPrint(A, __FUNCSIG__ ", Line = " + (string)__LINE__ + ": " + #A)                    // Макрос для удобного и наглядного вывода значений

void OnStart()
{
  const string Name = "TEMP8";                                                                      // Для каждого запуска нужно менять имя символа, чтобы увидеть проблему
  const string SymbOrig = "EURUSD";                                                                 // Имя оригинального символа

  MqlTick Ticks[];
  const int Size = _P(CopyTicksRange(SymbOrig, Ticks, COPY_TICKS_ALL, (long)D'2019.01.01' * 1000)); // Считали EURUSD-тики за 2019 год.
    
  if ((Size > 0) && _P(CustomSymbolCreate(Name, NULL, SymbOrig)) && _P(SymbolSelect(Name, true)))   // Создали символ на основе EURUSD.
  {            
    _P(CustomTicksReplace(Name, 0, LONG_MAX, Ticks));                                               // Поместили в него историю EURUSD.
    
    MqlTick AddTicks[1];                                                                            
    AddTicks[0] = Ticks[Size - 1];                                                                  // Последний тик в истории.
    
    _P(CustomTicksAdd(Name, AddTicks));                                                             // Последний тик добавили в Обзор рынка и еще раз в историю
    
    _P(CustomTicksDelete(Name, (long)D'2019.02.01' * 1000, LONG_MAX));                              // Удалили все тики, оставив только данные за январь 2019.
    _P(CopyTicks(Name, AddTicks, COPY_TICKS_ALL, 0, 1));                                            // Взяли последний тик из оставшейся истории.    
    ArrayPrint(AddTicks);                                                                           // Посмотрели, что это, действительно, последний тик января.

    const int NewSize = _P(CopyTicksRange(Name, Ticks));                                            // Запросили всю историю тиков кастомного символа
    
    _P(CopyTicks(Name, AddTicks, COPY_TICKS_ALL, 0, 1));                                            // Снова Взяли последний тик из истории.    
    ArrayPrint(AddTicks);                                                                           // Увидели, что последний тик изменился!
    
    _P(SymbolSelect(Name, false));                                                                  // Удалили символ из Обзора рынка.
    _P(CustomSymbolDelete(Name));                                                                   // Удалили символ.    
  }
} 


結果

void OnStart(), Line = 11: CopyTicksRange(SymbOrig,Ticks,COPY_TICKS_ALL,(long)D'2019.01.01'*1000) = 3316638
void OnStart(), Line = 13: CustomSymbolCreate(Name,NULL,SymbOrig) = true
void OnStart(), Line = 13: SymbolSelect(Name,true) = true
void OnStart(), Line = 15: CustomTicksReplace(Name,0,LONG_MAX,Ticks) = 3316638
void OnStart(), Line = 20: CustomTicksAdd(Name,AddTicks) = 1
void OnStart(), Line = 22: CustomTicksDelete(Name,(long)D'2019.02.01'*1000,LONG_MAX) = 1159087
void OnStart(), Line = 23: CopyTicks(Name,AddTicks,COPY_TICKS_ALL,0,1) = 1
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.01.31 23:59:58 1.14461 1.14486 0.0000        0 1548979198644       2       0.00000
void OnStart(), Line = 26: CopyTicksRange(Name,Ticks) = 2157552
void OnStart(), Line = 28: CopyTicks(Name,AddTicks,COPY_TICKS_ALL,0,1) = 1
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.02.22 23:57:59 1.13303 1.13316 0.0000        0 1550879879799       6       0.00000
void OnStart(), Line = 31: SymbolSelect(Name,false) = true
void OnStart(), Line = 32: CustomSymbolDelete(Name) = true


CopyTicksRangeに含まれるバグ -ティックの履歴が 変更されます!再現するためには、スクリプト内のカスタムシンボルの名前を常に変更する必要がありますので、ご注意ください。しかも、スクリプトで削除に成功しているにもかかわらず、である。記号を削除しても、まったく削除にならないことがわかった。

 
fxsaber:

スクリーンショットでは、シンボルの利益通貨が 口座通貨と同じでないことがわかります。したがって、変換するとゼロになる。

この機能を「すぐに」使えるようにするには、「EURUSD_ALEX1」のような名前を付けます。

ありがとうございます、そこがポイントでした。自分のアカウントにそのまま名前をつけたらうまくいきました。もうひとつ質問です。実際の取引ではどうなるのですか? 合成された注文は、実際のペア、この場合は(計算式を見て)EURUSDとUSDCADの注文とポジションに変換されるのですか?

テスターのログには合成しか表示されないのですが、どこで見ることができますか?

й

 
リアルでのカスタムシンボルは 情報提供のみを目的としており、取引には使用できません。テスターでのみ取引可能です。