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

 
Arkadii Zagorulko :

바로 MT5...

그들은 MT4에만 문제가 있다고 씁니다.

MT5로 갈아타기 위한 방해일지도...

 

누군가에게 도움이된다면 다음은 유효성 검사를 통과 한 방법입니다. 중단 및 주문 수정이 없는 Expert Advisor, 그러나 모든 시간대에 .

검증인이 오류 131(잘못된 로트)을 제공했으며 거래 작업이 없습니다. 이것은 나의 첫 번째 Expert Advisor이므로 가능한 한 많은 오류가 있을 수 있습니다.

먼저 트레이딩 기능 체크에 영어로 된 모든 코멘트를 추가했습니다. 즉, EA가 거래 중이 아니면 Print()에서 오류를 생성해야 합니다.

또한 여유 여백 확인을 추가하고 모든 ExpertRemove()를 제거했지만 도움이 되지 않았고 오류가 동일했습니다.

 void buy()
  {
   if (AccountFreeMarginCheck( Symbol (),OP_BUY,Lots)> 0 )
     {
       if ( OrderSend ( _Symbol ,OP_BUY,Lots,Ask,Slip,SLb, 0 ,comment,Magic, 0 ,Green)< 1 )
         Print ( " Buy ​​order error !" + IntegerToString ( _Period , 0 ) + " Error code = " + IntegerToString ( GetLastError (), 0 ));
     }
   else
       Print ( "Not enough money!" + " Error code = " + IntegerToString ( GetLastError (), 0 ));
       /// ExpertRemove();
   return ;   
  }

그런 다음 한 번에 여러 가지를 변경했는데 이 중 어느 것이 도움이 되었는지는 확실하지 않습니다.

어드바이저의 시작과 끝에서 오류를 재설정하고 모든 TF에 대한 따옴표의 가용성을 확인합니다.

 int OnInit ()
  {
     ResetLastError ();   

       for ( int cycle= 1 ; cycle<= 5 ; cycle++)
     {
       switch (cycle)
        {
         case 1 :
            TF = PERIOD_D1 ;
             break ;
         case 2 :
            TF = PERIOD_H4 ;
             break ;
         case 3 :
            TF = PERIOD_H1 ;
             break ;
         case 4 :
            TF = PERIOD_M15 ;
             break ;
         case 5 :
            TF = PERIOD_M5 ;
             break ;
        }
   if ( iTime ( _Symbol ,TF,Limit)< 1 )
     Print ( "Missing quotes! " + IntegerToString (TF, 0 ) + " Timeframe" + " Error = " + IntegerToString ( GetLastError (), 0 ));            
     }      
   return ( INIT_SUCCEEDED );
  }
//****************************
void OnDeinit ( const int reason)
  {  
   Alert ( "Error = " + IntegerToString ( GetLastError (), 0 ));
   ResetLastError ();
  }

단계가 (0.1), (0.01) 및 짝수(0.001)인 경우 모든 경우에 대해 로트 계산을 다시 수행합니다.

 double lotstep = MarketInfo( Symbol (),MODE_LOTSTEP);

   Lots = NormalizeDouble (AccountEquity()/ 10000 *Lot_for_10K, 3 );
   if (lotstep> 0.001 )
   Lots = ( MathRound (Lots/lotstep))*lotstep;    
   Lots = MathMax (Lots,MarketInfo( Symbol (),MODE_MINLOT));
   Lots = MathMin (Lots,MarketInfo( Symbol (),MODE_MAXLOT));

결국, 우리는 단 2일 만에 약 10번의 시도만으로 모든 것을 빠르게 고쳤다고 말할 수 있습니다.

 
"거래 작업이 없습니다"라는 실험을 단계별로 설명하겠습니다.

1. Market에서 이전 EA를 다시 컴파일하고 사이트에 업로드하려고 시도한 후 "거래 작업이 없습니다"라는 오류가 나타납니다.
test on EURUSD,H1
there are no trading operations
test on NZDUSD,H1
there are no trading operations
test on GBPUSDcheck,M30
there are no trading operations
test on XAUUSDcheck,Daily
there are no trading operations
2. 모든 시간 프레임에서 견적의 가용성을 확인했는데 오류가 나타나지 않았습니다(저는 0으로 나누기를 사용했습니다).
3. 그런 다음 거래 작업에 대한 볼륨을 확인하기 시작했는데 오류를 찾지 못했지만 여전히 "거래 작업이 없습니다".
4. 그런 다음 모든 OrderSend의 랏 수를 SYMBOL_VOLUME_MIN 으로 변경했습니다. - "거래 작업이 없습니다"
5. 유효성 검사기 테스터에 문제가 있는 것이 분명합니다. 그리고 OnInit()에서 여는 위치를 추가하려고 했습니다.
 double min_volume= SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MIN );
int ticket1=OpenPosition( NULL ,OP_SELL,min_volume, 0 , 0 ,magic);

그리고 이것이 내가 얻은 것입니다 (그런데 처음으로 유효성 검사기에서 자세히 보았습니다).

 2019.07 . 23 01 : 00 : 00   Tester: not enough money for sell 0.20 NZDUSD at 0.67567 sl: 0.00000 tp: 0.00000 [ 2019.07 . 23 01 : 00 ]
 2019.07 . 23 01 : 00 : 00   Tester: PrevBalance: 1.00 , PrevPL: 0.00 , PrevEquity 1.00 , PrevMargin: 0.00 , NewMargin: 135 , FreeMargin: - 134.14
 2019.07 . 23 01 : 00 : 00   Horizon_of_Infinity__1 NZDUSD,H1: OrderSend error 134
 2019.07 . 23 01 : 00 : 00   Tester: not enough money for sell 0.20 NZDUSD at 0.67567 sl: 0.00000 tp: 0.00000 [ 2019.07 . 23 01 : 00 ]
 2019.07 . 23 01 : 00 : 00   Tester: PrevBalance: 1.00 , PrevPL: 0.00 , PrevEquity 1.00 , PrevMargin: 0.00 , NewMargin: 135 , FreeMargin: - 134.14
 2019.07 . 23 01 : 00 : 00   Horizon_of_Infinity__1 NZDUSD,H1: OrderSend error 134
 2019.07 . 23 01 : 00 : 00   Tester: not enough money for sell 0.20 NZDUSD at 0.67567 sl: 0.00000 tp: 0.00000 [ 2019.07 . 23 01 : 00 ]
 2019.07 . 23 01 : 00 : 00   Tester: PrevBalance: 1.00 , PrevPL: 0.00 , PrevEquity 1.00 , PrevMargin: 0.00 , NewMargin: 135 , FreeMargin: - 134.14
 2019.07 . 23 01 : 00 : 00   Horizon_of_Infinity__1 NZDUSD,H1: OrderSend error 134
 2019.07 . 23 01 : 00 : 00   Tester: not enough money for sell 0.20 NZDUSD at 0.67567 sl: 0.00000 tp: 0.00000 [ 2019.07 . 23 01 : 00 ]
 2019.07 . 23 01 : 00 : 00   Tester: PrevBalance: 1.00 , PrevPL: 0.00 , PrevEquity 1.00 , PrevMargin: 0.00 , NewMargin: 135 , FreeMargin: - 134.14
 2019.07 . 23 01 : 00 : 00   Horizon_of_Infinity__1 NZDUSD,H1: OrderSend error 134
 2019.07 . 23 01 : 00 : 00   Tester: not enough money for sell 0.20 NZDUSD at 0.67567 sl: 0.00000 tp: 0.00000 [ 2019.07 . 23 01 : 00 ]
 2019.07 . 23 01 : 00 : 00   Tester: PrevBalance: 1.00 , PrevPL: 0.00 , PrevEquity 1.00 , PrevMargin: 0.00 , NewMargin: 135 , FreeMargin: - 134.14
 2019.07 . 23 01 : 00 : 00   Horizon_of_Infinity__1 NZDUSD,H1: OrderSend error 134


여기서 "거래 작업이 없습니다"라는 오류가 발생한 이유가 이미 명확합니다. 잔액이 1.00이면 분명히 0.20(SYMBOL_VOLUME_MIN)으로 주문을 열 수 없습니다. 그리고 코드의 잔액을 확인하면 작업에 대처할 수 있으며 그러한 주문을 허용하지 않으며 잔액 부족에 대해 저널에 인쇄됩니다 (검증기에는 표시되지 않음) .

검증인이 괜찮다고 생각하십니까?


검증인이 수정될 때까지 기다리겠습니다.

 
자유 여백은 나를 괴롭히지 않습니다. 그렇지 않으면 온두라스가 나를 고문합니다.
 
Алексей Тарабанов # :
자유 여백은 나를 괴롭히지 않습니다. 그렇지 않으면 온두라스가 나를 고문합니다.

어려운? 생각의 표현을 말하는 것입니다.

 
예, 테스트 매개변수에 대해 이야기하고 있습니다.
 
모든 메모리를 정리합니다.
 

그래도 기본적으로 입력 매개변수에 최대 위치에 제한이 있다는 문제를 발견했습니다.

 input double MaxLots= 0.1 ;
...
lots = MathMin (lots, MaxLots );

유효성 검사기의 SYMBOL_VOLUME_MIN 이 0.20인 경우 시작 위치를 건너뛰지 않았습니다. 검증인이 기본적으로 포지션의 최대 로트에 대해 이렇게 작은 제한 을 설정하는 것은 불가능합니다.