사용자 정의 기호. 오류, 버그, 질문, 제안.

 
주제가 상당히 광범위하기 때문에 별도의 토론에서 강조할 가치가 있다고 결정했습니다.
 

버그 01.

사용자 정의 기호 차트가 열려 있습니다. 예를 들어 모든 막대 및 눈금 기록 을 수동으로 삭제하면 차트 창이 업데이트되지 않고 고정됩니다.

빈 사용자 정의 문자와 마찬가지로 예상되는 동작입니다.

 

버그 02.

사용자 지정 기호 따옴표의 마지막 주를 제거해야 합니다. 삭제할 수는 있지만 ChartRedraw조차도 시각적 효과를주지 않습니다.

차트를 마우스로 스크롤해야만 정상으로 돌아옵니다. ChartRedraw로 시각화를 수정할 수 있습니까?


PS 나는 지금 그런 왜곡을하고 있습니다

     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에서 마지막 눈금을 설정하는 것이 필요합니다.

모든 것이 삭제 순서대로라면 위에서 설명한 규칙 때문에 마지막 눈금을 설정해도 아무 것도 나오지 않습니다.


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


소스 코드가 없으면 오류 메시지 가 단어로 남을 것임을 이해합니다. 도색을 하기 위해 부러진 만큼 오류를 보여주고 찾아내고 수정하는 가장 효과적인 방법이 아닐까 합니다.

 

어제야 합성 물질을 다루기 시작했는데 테스터에 말도 안되는 소리가 있습니다. 합성 물질은 테스터의 공식과 함께 작동합니까?

도움말에서 합성 공식을 만들었습니다. 괜찮은?

하나

테스트 결과는 다음과 같습니다.

2

어떤 종류의 넌센스, 모든 거래는 수익성이 있으며 그림에서조차 알 수 없으며 테스트가 끝나면 모두 닫히고 이익은 0입니다. 제가 뭔가 잘못하고 있는 것 같습니다. 무엇을 더 볼 수 있습니까? 로그를 첨부합니다.

파일:
20190224.log  9322 kb
 
Alexey Volchanskiy :

내가 뭔가 잘못하고 있는 것 같다. 무엇을 더 볼 수 있습니까?

스크린샷은 기호의 이익 통화 가 계정 통화와 일치하지 않음을 보여줍니다. 따라서 변환은 0을 제공합니다.

기본적으로 작동하도록 하려면 이름을 "EURUSD_ALEX1"과 같이 지정합니다.

 
사용자 정의 기호와 해당 설정이 있는 폴더를 알려주십시오. 터미널 및 소프트웨어에서 삭제해도 도움이 되지 않습니다.
 
pivomoe :
사용자 정의 기호와 해당 설정이 있는 폴더를 알려주십시오. 터미널 및 소프트웨어에서 삭제해도 도움이 되지 않습니다.

\MetaTrader5\Bases\Custom\

 

버그 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 :

스크린샷은 기호의 이익 통화 가 계정 통화와 일치하지 않음을 보여줍니다. 따라서 변환은 0을 제공합니다.

기본적으로 작동하도록 하려면 이름을 "EURUSD_ALEX1"과 같이 지정합니다.

감사합니다. 계정에 있는 그대로 호출했는데 작동했습니다. 질문 하나 더. 그리고 실제 거래에서 어떤 일이 발생합니까? 합성 주문은 실제 쌍의 주문 및 위치로 변환됩니다. 이 경우(공식 참조) EURUSD 및 USDCAD?

테스터의 로그에서만 합성을 볼 수 있습니다.

일

 
실생활의 사용자 지정 기호 는 거래가 아닌 정보 제공용일 뿐입니다. 테스터에서만 거래할 수 있습니다.