실수로 고통받는 거래가 없습니다. - 페이지 5

 
Alexey Viktorov :

재컴파일해서가 아니라 테스트가 다른 날짜에서 시작되었기 때문에 통과합니다. 그리고 그런 버그를 발견했는데 이미 있었던 것을 미끄러지면 테스트가 일어나지 않지만 이전 테스트 결과가 즉시 발행됩니다. 따라서 그러한 목발에 속지 마십시오. 제대로 해보세요. 누락된 것이 있거나 매개변수가 유효하지 않은 경우 인쇄를 통해 보고하면 모든 것이 정상입니다.

이제 그것이 다른 날짜와만 관련이 있었다면 내 수표에서 이것을 드러냈을 것입니다(막대 부족 등). 그러나 날짜는 문제가 아닙니다. 자동 검증이 발견한 오류를 재현하는 것이 불가능하다면 같은 것을 미루고 구매자와의 복수가 문제 영역(있는 경우)을 찾을 수 있기를 바라는 것이 더 쉽습니다. 이 유효성 검사 구현은 오류를 찾을 위치에 대한 완전한 이해를 제공하지 않습니다. 그리고 Print 는 이미 도처에 제 깊숙이 박혀 있습니다.

알렉세이 빅토로프 :

그리고 그런 버그를 발견했는데 이미 있었던 것을 미끄러지면 테스트가 일어나지 않지만 이전 테스트 결과가 즉시 발행됩니다.

그리고 이전 테스트 결과를 얻지 않으려면 무언가를 변경해야 합니다. 최소한 빈 줄을 추가해야 합니다(이는 "다시 컴파일"을 의미함).

 
Roman Gergert :

나는 마침내 그것을 알아 냈습니다. 아마도 그것은 누군가에게 도움이 될 것입니다. 일반적으로 올빼미에서 MM이 켜져있을 때만 최소 로트를 확인했고 하드 코어에서는 로트 = 0.01이 설정되었으므로 유효성 검사기에서 보증금은 각각 $ 1 (나는이 정보 중 하나에서이 정보를 찾았습니다) , 그는 거래에 0.001 (또는 그 정도)을 많이 사용하고, 나는 항상 한 곳에서 많은 0.01을 가지고 있었기 때문에 그에 따라 그는 자금이 충분하지 않고 로봇이 거래하지 않음)

정확히, 검증인인 Roman은 $1 보증금으로 테스트 중입니다.

EA에는 많은 정규화 기능이 있습니다. 0을 반환하면 거래는 열려고 시도조차 하지 않습니다.

       if ((Auto() && (b== 0 || (b> 0 && BuyPriceMin-Ask>(b== 1 ?iPointOrderStep_1:iPointOrderStep_2)* Point ()))) || buy) {
         BuyLot=buy && LotFromPanel()> 0 ? LotFromPanel() : BuyLot;
         double norm_lot= NormalizeLots( _Symbol ,BuyLot);
         if (norm_lot> 0.0 ) {  
             int ticket= OrderSend ( Symbol (),OP_BUY,norm_lot, NormalizeDouble (Ask, _Digits ), 30 , 0 , 0 ,
                        "NZT- 48 ",iMagicNumber, 0 , clrGreen );
             if (ticket> 0 ) {
                 ObjectSetInteger ( 0 ,"V_5_buy", OBJPROP_STATE , false );
                buy= false ;
            }
             else   
               Print ("Order Send error #", GetLastError ());
         } else Print ("Not enough money for the minimum lot");   
      }

그러나 로트 정규화 EA의 이 기능이 개봉을 위해 로트 0.2를 어떻게 보내는지는 분명하지 않습니다.

 //+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots( string symbol, double lot, bool is_margin= true ) {
   if (lot<= 0 ) return ( 0.0 );
   RefreshRates();
   double min= SymbolInfoDouble (symbol, SYMBOL_VOLUME_MIN );
   double max= SymbolInfoDouble (symbol, SYMBOL_VOLUME_MAX );
   double step= SymbolInfoDouble (symbol, SYMBOL_VOLUME_STEP ); 
   double free = AccountFreeMargin()* 0.95 ;
   double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot= MathRound (_lot/step)*step;
   if (is_margin && _lot* margin >free)  _lot= 0.0 ;
   return (_lot);
}

결국, lot 0.2가 확인되고 로그로 판단하면 여백이 645이면 표현식의 이 부분이 true 를 제공해야 합니다.

 if (is_margin && _lot*margin>free )  _lot= 0.0 ;     // 0.2*645>0.95

그리고 함수는 0.0을 보내지만 0.2는 보내지 않습니다. 값 0.2는 다음 경우에만 보낼 수 있습니다.

MarketInfo(symbol,MODE_MARGINREQUIRED);

0 또는 무시할 수 있는 값을 반환했습니다. 이 유효성 검사기가 어떻게 작동하는지 전혀 이해하지 못합니다.

친애하는 MQL 개발자 여러분 , 마른 3줄 유효성 검사 오류 보고서 대신 프로그램 테스트 로그를 보내주십시오. 겸손한 프로그래머인 우리가 코드 오류를 이해하고 수정하는 것이 훨씬 더 쉬울 것입니다. 아카이브를 메일로 보낼 수 있습니다. 아마도 방법을 알아낼 것입니다)))

추신 재미있는 상황. 5일차에는 테스터와 실생활에서 완벽하게 작동하는 어드바이저를 시장에 내놓으려고 합니다.
 
Andrey Kaunov :

정확히, 검증인인 Roman은 $1 보증금으로 테스트 중입니다.

EA에는 많은 정규화 기능이 있습니다. 0을 반환하면 거래는 열려고 시도조차 하지 않습니다.

그러나 로트 정규화 EA의 이 기능이 개봉을 위해 로트 0.2를 어떻게 보내는지는 분명하지 않습니다.

결국, lot 0.2가 확인되고 로그로 판단하면 여백이 645이면 표현식의 이 부분이 true 를 제공해야 합니다.

그리고 함수는 0.0을 보내지만 0.2는 보내지 않습니다. 값 0.2는 다음 경우에만 보낼 수 있습니다.

0 또는 무시할 수 있는 값을 반환했습니다. 이 유효성 검사기가 어떻게 작동하는지 전혀 이해하지 못합니다.

친애하는 MQL 개발자 여러분 , 마른 3줄 유효성 검사 오류 보고서 대신 프로그램 테스트 로그를 보내주십시오. 겸손한 프로그래머인 우리가 코드 오류를 이해하고 수정하는 것이 훨씬 더 쉬울 것입니다. 아카이브를 메일로 보낼 수 있습니다. 아마도 방법을 알아낼 것입니다)))

추신 재미있는 상황. 5일차에는 테스터와 실생활에서 완벽하게 작동하는 어드바이저를 시장에 내놓으려고 합니다.

그 과정에서 시장과는 다른 레버리지를 가질 수 있습니다. 아마도 1:500

코드에서 한 줄만 교체하여 로트 계산을 1x100의 활용으로 가져오십시오.

여백 = AccountLeverage()*MarketInfo( 기호 ,MODE_MARGINREQUIRED)/100.0;

글쎄요, 시장의 최소 랏은 제 생각에 0.1입니다....
 

당신은 자신의 제한된 세계에 살고 있습니다. 일반적인 세계에서 최소 로트는 0.01과 매우 다를 수 있습니다.

조리법 : "어떤 검사를 통과해야 ..."기사를 읽고 다시 읽으십시오.

거래 주문 을 보내기 전에 통과 여부, 충분한 증거금이 있는지 여부를 확인해야합니다 ...


일반적으로 유효성 검사기는 여전히 주요 작업인 마켓에서 미완성 코드를 제거하는 작업에 대처하고 있습니다.

 
Renat Akhtyamov :

그 과정에서 시장과는 다른 레버리지를 갖게 됩니다. 아마도 1:500

코드에서 한 줄만 교체하여 로트 계산을 1x100의 활용으로 가져오십시오.

여백 = AccountLeverage()*MarketInfo(기호,MODE_MARGINREQUIRED)/100.0;

Renat, 조언 감사합니다. 시도해 보겠습니다.

블라디미르 카르푸토프 :

당신은 자신의 제한된 세계에 살고 있습니다. 평범한 세계에서 최소 로트는 0.01과 매우 다를 수 있습니다.

조리법 : "어떤 검사를 통과해야 ..."기사를 읽고 다시 읽으십시오.

거래 주문 을 보내기 전에 통과 여부, 충분한 증거금이 있는지 여부를 확인해야합니다 ...


일반적으로 유효성 검사기는 여전히 주요 작업인 마켓에서 미완성 코드를 제거하는 작업에 대처하고 있습니다.

블라디미르, 당신은 문제를 건설적으로 이해할 수 있습니까?! 마진과 물건에 대해 로트를 확인하지 않습니까? 나에게 "어떤 수표는 통과해야 ..."라는 기사는 이미 성경과 같습니다. 위에 게시된 코드 조각. 완전한 규정 준수를 위해 기사의 권장 사항에 따라 코드를 변경했습니다.

 //+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots( string symbol, double lot, int direction, bool is_margin= true ) {
   if (lot<= 0 ) return ( 0.0 );
   RefreshRates();
   double min= SymbolInfoDouble (symbol, SYMBOL_VOLUME_MIN );
   double max= SymbolInfoDouble (symbol, SYMBOL_VOLUME_MAX );
   double step= SymbolInfoDouble (symbol, SYMBOL_VOLUME_STEP ); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot= MathRound (_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError ();
   if (is_margin && ( AccountFreeMarginCheck( Symbol (),direction,_lot)<= 0 || GetLastError ()== 134 )) _lot= 0.0 ;
   return (_lot);
}

하지만 여전히 "거래 없음"이 표시됩니다.

음, 함수가 항상 로트 0.0을 보내서 거래 시작을 막는다면 최소 로트를 보내도록 변경합니다.

 //+------------------------------------------------------------------+
//| Функция нормализации лота                                        |
//+------------------------------------------------------------------+
double NormalizeLots( string symbol, double lot, int direction, bool is_margin= true ) {
   if (lot<= 0 ) return ( 0.0 );
   RefreshRates();
   double min= SymbolInfoDouble (symbol, SYMBOL_VOLUME_MIN );
   double max= SymbolInfoDouble (symbol, SYMBOL_VOLUME_MAX );
   double step= SymbolInfoDouble (symbol, SYMBOL_VOLUME_STEP ); 
   //double free = AccountFreeMargin()*0.95;
   //double margin = MarketInfo(symbol,MODE_MARGINREQUIRED);
   double _lot=lot<min?min:(lot>max?max:lot);
          _lot= MathRound (_lot/step)*step;
   //if(is_margin && _lot*margin>free)  _lot=0.0;
   ResetLastError ();
   if (is_margin && (AccountFreeMarginCheck( Symbol (),direction,_lot)<= 0 || GetLastError ()== 134 )) _lot= min ;
   return (_lot);
}

그리고 거래가 여전히 진행 중이라는 이야기를 들었습니다(아래 스크린샷 참조). 그러나 최소 제비는 물론 매우 이상하지만 오게 하십시오. 하지만 거래가 있습니다!

이 상황에서 검증인은 매우 이상하게 행동하여 $1 보증금으로 최소 0.2 랏을 만듭니다.


당연히 이 접근 방식을 사용하면 거래가 없을 것입니다! 그리고 이것은 완벽하게 적절한 코드입니다. 그건 그렇고 테스트를 위해 지표 등의 모든 조건을 제거했습니다. 어드바이저 출시 직후 거래가 시작됩니다.

블라디미르 카르푸토프 :

...

일반적으로 유효성 검사기는 여전히 주요 작업인 마켓에서 미완성 코드를 제거하는 작업에 대처하고 있습니다.

그럼 검증인이 하는 일은?! 프로그래머의 두뇌를 날려 버리기 위해 지금까지 본 것뿐입니다!

유효성 검사기에서 무언가를 변경하도록 요청하는 것이 아닙니다. 테스트 로그만 볼 수 있습니다. 그러면 어떤 매개 변수가 어떤 예금에 대해 통과했는지 명확해질 것입니다. 결국 인쇄물은 최소한 코드에서 오류가 있는 위치를 추적하고 신속하게 수정할 수 있습니다. 일주일 내내 하늘을 손가락으로 가리키지 않고 오류를 현지화하기 위해 노력하십시오. 우리는 서로 반대하지 않습니다! 이해합니다. 함께 무언가를 얻으려고 합니다.

 
Andrey Kaunov :

... 우리는 서로 반대하지 않습니다! 이해합니다. 함께 무언가를 얻으려고 합니다.

Andrey, 주말에 한 번 중단된 서버를 만났습니다.

즉, 그는 어리석게도 MarketInfo를 먹지 않았습니다(...)

겨우 이겼다

따라서 시장이 삼킬 수 없다는 것을 이해한다면 검증인이 맹세하지 않도록 하는 방법에 대해 생각하는 것만 남아 있습니다.

예를 들어, 나는 어떤 어깨를 묻습니까?

그것은 0(제로)

코드를 추가합니다. 0이면 100입니다.

논리가 명확하면 모든 것이 잘되고 행운을 빕니다!

 

알겠습니다, 레나트, 감사합니다.

나는 이미 많은 목발을 세웠지만 어떤 곳에서는 솔직히 난관에 봉착했습니다. 그리고 결국 적절한 코드가 적절한 검사를 통과하는 것이 바람직할 것입니다. 또한 테스트 로그가 없는 상태에서 문제를 찾는 것은 불가능하지 않지만 매우 노동 집약적입니다.

검증인이 업그레이드하는 것이 좋을 것입니다. 저만 비슷한 문제를 겪고 있는 것이 아닙니다.

 
Andrey Kaunov :

알겠습니다, 레나트, 감사합니다.

나는 이미 많은 목발을 세웠지만 어떤 곳에서는 솔직히 난관에 봉착했습니다. 그리고 결국 적절한 코드가 적절한 검사를 통과하는 것이 바람직할 것입니다. 또한 테스트 로그가 없는 상태에서 문제를 찾는 것은 불가능하지 않지만 매우 노동 집약적입니다.

검증인이 업그레이드하는 것이 좋을 것입니다. 저만 비슷한 문제를 겪고 있는 것이 아닙니다.

예, 이 문제가 발생한 유일한 사람은 아닙니다. 다음 분기에서 다른 문제가 발생했습니다. 이미 두 사람이 있습니다.

또한 하루에 얼마나 많은 Expert Advisor가 시장에 아무 문제 없이 게시되는지 보세요. 이것을 "전문성 수준"이라고 합니다.

 

Vitaly, 당신과 다른 "전문가"가 처음으로 검증을 통과했다면 박수를 보낼 수 밖에 없습니다. 그러나 비슷한 문제에 대해 두 가지 지점이 있지만 그 이상은 아닙니다. 또한 모든 사람이 쓰는 것은 아니고 일부는 읽기만 합니다. 참고로 상담사는 제 것이 아닙니다. 나는 클라이언트를 위한 시장을 위해 그것을 준비하고 있다. 그러나 이것은 위의 문제를 제거하지 않습니다. 내 게시물을주의 깊게 읽으면 "전문가"로서 문제에 대한 해결책을 제안 할 수 있습니다. "당신은 멍청하지만 나는 똑똑합니다"와 같은 게시물을 배치하십시오. 많은 지식이 필요하지 않습니다.

여기에 또 다른 문제가 있습니다. 왜, OnTick() 시작 부분에 최소 랏으로 5분 안에 5개의 거래를 무조건 순차적으로 열면 유효성 검사기가 나에게 " 거래 작업 없음 "을 제공합니다.

 void OnTick () { 
   static int test_ticket[ 2 ]={ 0 , 0 };
   if (test_ticket[ 1 ]< 5 && test_ticket[ 0 ]== 0 ) {
      test_ticket[ 0 ]= OrderSend ( _Symbol ,OP_BUY, SymbolInfoDouble ( _Symbol , SYMBOL_VOLUME_MIN ), NormalizeDouble (Ask, _Digits ), 30 , 0.0 , 0.0 , "NZT-48_test" , 33333 , 0 , clrNONE );
       if (test_ticket[ 0 ]> 0 ) test_ticket[ 1 ]++;
   }   
   if ( OrderSelect (test_ticket[ 0 ],SELECT_BY_TICKET))
       if (OrderCloseTime()== 0 && OrderOpenTime()+ 300 < TimeCurrent ())
         if (OrderClose(test_ticket[ 0 ], NormalizeDouble (OrderLots(), 2 ), NormalizeDouble (Bid, _Digits ), 30 , clrNONE )) {
             printf ( "Test order closed, ticket #%d" ,test_ticket[ 0 ]);
            test_ticket[ 0 ]= 0 ;
         }   
...
}
 
Andrey Kaunov :

Vitaly, 당신과 다른 "전문가"가 처음으로 검증을 통과했다면 박수를 보낼 수 밖에 없습니다. 그러나 비슷한 문제에 대해 두 가지 지점이 있지만 그 이상은 아닙니다. 또한 모든 사람이 쓰는 것은 아니고 일부는 읽기만 합니다. 참고로 상담사는 제 것이 아닙니다. 나는 클라이언트를 위한 시장을 위해 그것을 준비하고 있다. 그러나 이것은 위의 문제를 제거하지 않습니다. 내 게시물을주의 깊게 읽으면 "전문가"로서 문제에 대한 해결책을 제안 할 수 있습니다. "당신은 멍청하지만 나는 똑똑합니다"와 같은 게시물을 배치하십시오. 많은 지식이 필요하지 않습니다.

여기에 또 다른 문제가 있습니다. 왜, OnTick() 시작 부분에 최소 랏으로 5분 안에 5개의 거래를 무조건 순차적으로 열면 유효성 검사기가 나에게 " 거래 작업 없음 "을 제공합니다.

먼저 여기에 유효성 검사기의 전체 응답을 입력합니다.

그리고 왜 당신이 생각해낸 원칙에 따라 검증인이 티켓을 할당하도록 결정했나요?

5개의 거래를 열려면 열린 거래의 수를 계산해야 하며 티켓에 대해 걱정할 필요가 없습니다.