오류, 버그, 질문 - 페이지 737

 
-Alexey- :
왜 "시작" 버튼을 누르면 테스터가 초기 입금 수준이 아니라 마지막 테스트가 종료된 수준에서 테스트합니다. 4-ke에서는 그런 문제가 없습니다. 초기 보증금 수준에서 테스트를 시작 하는 방법은 무엇입니까?

귀하가 설명하는 상황을 재현할 수 없습니다.

자세한 내용을 알아보자

 
stringo :

귀하가 설명하는 상황을 재현할 수 없습니다.

자세한 내용을 알아보자

나는 포물선 정지와 함께 중간에 Expert Advisor 에서 생성합니다. 시가로 테스트를 진행하고 "취소"를 클릭합니다. 두 번째로 실행합니다. 설명 된 상황이 나타납니다 (동시에 잔액 및 자본 그래프는 새로 그려지지 않지만 계속됩니다). 마스터가 아닌 전문가가 있으면 모든 것이 정상입니다.
Мастер MQL5: Создание эксперта без программирования
Мастер MQL5: Создание эксперта без программирования
  • 2010.12.15
  • MetaQuotes Software Corp.
  • www.mql5.com
Вы хотите быстро проверить торговую идею, не тратя времени на программирование? Выберите в "Мастере MQL5" нужный тип торговых сигналов, подключите модули сопровождения позиций и управления капиталом - на этом вся работа закончена. Создайте свои реализации модулей или закажите их через сервис "Работа" - и комбинируйте новые модули с уже существующими.
 

이것은 버그인 것 같습니다.

다중 통화 테스트 모드에서 두 개의 도구에 새 막대 가 나타날 때까지 기다리면 테스터가 잘못 작동합니다.

몇 가지 설명입니다. isNewBar 함수에서 기본 기호에 새 막대가 나타나면 루프에서 새 막대가 다른 금융 상품에 나타날 때까지 기다립니다.

코드를 첨부합니다.

 //в тестере баг в режиме мультивалютного тестирования
//позиция открывается если на двух инструментах появился новый бар 
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\PositionInfo.mqh>
//--- input parameters
input int       Per= 10 ; //период средней 
input string    Instrum1= "EURUSD" ; //первый инструмент
input string    Instrum2= "GBPUSD" ; //второй инструмент
//-------------------------------------------------------
CTrade   trade; //торговые функции
COrderInfo orderinfo; //информация об ордере
CPositionInfo  posinfo; //информация о позиции
int hiMA ; //хэндл индикатора 
int OnInit ()
  {
      hiMA= iMA ( _Symbol , _Period ,Per, 0 , MODE_SMA , PRICE_OPEN ) ;
       if (hiMA < INVALID_HANDLE ) return (- 1 ) ;
       return ( 0 );
  }
//====================================================================
void OnDeinit ( const int reason)
  {
   IndicatorRelease (hiMA) ;
  }
//=====================================================================
void OnTick ()
  {
       if (!isNewBar(Instrum2)) return    ;
       //Print("  Это новый бар  ");
       double    Ma[ 1 ] ; //показания индикатора 
       CopyBuffer (hiMA, 0 , 0 , 1 ,Ma) ;
       MqlTick price; // будет использоваться для получения текущих/последних котировок цены
       bool possel=posinfo.Select(Instrum1) ;
       SymbolInfoTick (Instrum1,price) ;
       if (possel && price.bid > Ma[ 0 ] && posinfo.PositionType() == POSITION_TYPE_SELL )
         { //цена выше средней закрываем короткую позу
            trade.PositionClose(Instrum1) ; return ;
         }
       if ( !possel && price.bid > Ma[ 0 ])
         { //цена выше средней нет поз открываем длинную позу 
            trade.Buy( 0.1 ,Instrum1, 0 , 0 , 0 , NULL ) ; return ;
         }
       if ( possel && price.ask < Ma[ 0 ] && posinfo.PositionType() == POSITION_TYPE_BUY )
         { //цена ниже средней закрываем длинную позу
            trade.PositionClose(Instrum1) ; return ;
         } 
       if (!possel && price.ask < Ma[ 0 ])
         { // цена ниже средней нет поз открываем короткую позу
            trade.Sell( 0.1 ,Instrum1, 0 , 0 , 0 , NULL ) ;
         }
       return ;
  }
//=======================================================================
bool isNewBar( string other_symbol)
  { //возвращает труе если новый бар на двух инструментах
   static datetime last_bar_time= 0 ;
   int cntsleep ;
   if (last_bar_time== 0 )
     { //--- это первый вызов, запишем время открытия и выйдем
      last_bar_time=( datetime ) SeriesInfoInteger ( _Symbol , Period (), SERIES_LASTBAR_DATE );
       return ( false );
     }
   datetime curr_time=( datetime ) SeriesInfoInteger ( Symbol (), Period (), SERIES_LASTBAR_DATE );
   if (curr_time!=last_bar_time)
     { //время открытия не совпадает это новый бар 
      last_bar_time=curr_time;
      cntsleep= 0 ;
       while (!(curr_time == ( datetime ) SeriesInfoInteger (other_symbol, Period (), SERIES_LASTBAR_DATE )))
         { // ждем появления нового бара на втором инструменте   
             Sleep ( 5000 ); 
             if (cntsleep > 10 ) return ( false ) ; // недождались 
            cntsleep++ ;
         }
       return ( true ) ;
     }
     return ( false ) ;
  }
Обработчик события "новый бар"
Обработчик события "новый бар"
  • 2010.10.04
  • Konstantin Gruzdev
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 
ivandurak :

버그인 것 같습니다.

다중 통화 테스트 모드에서 두 개의 도구에 새 막대 가 나타날 때까지 기다리면 테스터가 잘못 작동합니다.


버그로 정확히 무엇을 보고 있는지 구체적으로 설명해주십시오. 테스트에 대한 세부 정보, 얻은 결과 또는 예상 결과를 제공하지 않았습니다.

또한 MetaTrader 5 Testing Basics 기사에 주의를 기울이고 싶습니다. 틱 생성 메커니즘과 기본 개념에 대한 설명이 포함되어 있습니다.

 
Rosh :

버그로 정확히 무엇을 보고 있는지 구체적으로 설명해주십시오. 테스트에 대한 세부 정보, 얻은 결과 또는 예상 결과를 제공하지 않았습니다.

또한 MetaTrader 5 Testing Basics 기사에 주의를 기울이고 싶습니다. 틱 생성 메커니즘과 기본 개념에 대한 설명이 포함되어 있습니다.

모든 것이 간단합니다.

최적화를 위해 EA를 실행하고 다음 결과를 확인합니다.

예를 들어 4번째 패스를 선택하고 어드바이저를 시작하고 모든 트랜잭션에서 정상 작동을 얻습니다. 여기 보고서가 있습니다.

느낌이 있습니다. 다중 통화 최적화 모드의 테스터는 거래가 열린 바에서 열리지 않은 경우 거래를 바에 연결할 수 없습니다.

isNewBar 함수에서 주기를 주석 처리하면 논리적으로 다른 악기에 새 막대가 나타날 때까지 기다리지 않고 모든 것이 작동합니다. 터미널 버전 5 빌드 642.

거기에서 기사, 코드를 읽고 오류가 표시되지 않습니다. 나 자신을 알고 있지만, 나는 가서 다시 읽을 것입니다.

즐거운 휴일 보내세요.

 
-Alexey- :
나는 포물선 정지와 함께 중간에 Expert Advisor 에서 생성합니다. 시가로 테스트를 진행하고 "취소"를 클릭합니다. 두 번째로 실행합니다. 설명 된 상황이 나타납니다 (동시에 잔액 및 자본 그래프가 새로 그려지지 않고 계속됩니다). 마스터가 아닌 전문가가 있으면 모든 것이 정상입니다.

서비스 데스크에서 요청을 작성하십시오.

  • 빌드 번호
  • 시스템 및 Windows 버전의 비트 수.
  • EA 코드 첨부
  • 어드바이저의 설정 및 입력 매개변수
 

다음은 코드입니다. trpar2=false 일 때 입력 매개변수가 int grusdchf=100이 되도록 어떻게 만들 수 있습니까? 입력 int grusjpy=100; 최적화되지 않음

 //------------------------------------------------------------
input bool   trpar1= true ; //разрешение торговли по EURUDSD
input int    greurusd= 100 ; //сетка для EURUSD
input int    grgbpusd= 100 ; //сетка для GBPUSD
//------------------------------------------------------------
input bool   trpar2= true ; //
input int    grusdchf= 100 ; //
input int    grusdjpy= 100 ; //
//------------------------------------------------------------
input bool   trpar3= true ; //
input int    graudjpy= 100 ; //
input int    grchfjpy= 100 ; //
 
ivandurak :

다음은 코드입니다. trpar2=false 일 때 입력 매개변수가 int grusdchf=100이 되도록 만드는 방법; 입력 int grusjpy=100; 최적화되지 않음

테스터에서 이러한 매개변수 반대편의 확인란을 선택하지 마십시오. 또는 질문을 명확히 하십시오. 그렇지 않으면 모호함이 보입니다. :)

 

문제:

객체에 대한 포인터 배열을 함수에 전달해야 합니다. 물론 (배열) 참조.

어떤 구문을 사용할 것인가?

 void MyFunc(MyClass &*MayClassPointersArray[]);  / не компилируется.
void MyFunc(MyClass *&MayClassPointersArray[]);  / компилируется, но сомневаюсь что смысл правильный

나는 그것을 의심합니까? 아니면 다른 것이 필요합니까?

 
ivandurak :

다음은 코드입니다. trpar2=false 일 때 입력 매개변수가 int grusdchf=100이 되도록 어떻게 만들 수 있습니까? 입력 int grusjpy=100; 최적화되지 않음

 input bool trpar2= true ;
input int grusdchf= 100 ;
input int grusdjpy= 100 ;

if (trpair2== false )   // если false то всегда 100
  {
   x_grusdchf= 100 ;
   x_grusdjpy= 100 ;
  }
 else                  // если true то значения с перебора 
  {
   x_grusdchf=grusdchf;
   x_grusdjpy=grusdjpy;
  }
그런 필요에 직면하여 비뚤어지고 잔인하지만 정확한 결과가 나온다. 세 가지 입력 모두에 체크박스가 활성화되어 있고, 거짓일 경우 차단된다.