가상 머신의 MT4? - 페이지 5

 
DayTrader :

예, 그 자체로는 좋지만 적어도 내 브로커(그리고 더 많은 브로커)가 MT5를 제공할 때까지 내 모든 코드를 다시 작성할 생각조차 하지 않을 것입니다.

그 동안 나는 W7/64에서 +4배의 속도 증가와 틱 건너뛰기의 10배 증가로 작업을 완료할 것입니다.... 결합하면 속도가 약 40배 증가 합니다.

코드는 틱을 건너뛰지만 중요한 정보가 손실될 수 있는 방식으로 그렇게 합니다.

다음과 같은 코드를 사용하십시오.

 bool SkipTick(){
   static datetime curr= 0 ;
   static double askHi= 0 ;
   static double askLo= 0 ;
   static double bidHi= 0 ;
   static double bidLo= 0 ;
   if (curr!=Time[ 0 ]){
      curr=Time[ 0 ];
      askHi=Ask;
      askLo=Ask;
      bidHi=Bid;
      bidLo=Bid;
       return (false);
   } else {
       if (Ask>askHi || Ask<askLo){
         askHi= MathMax (Ask,askHi);
         askLo= MathMin (Ask,askLo);
         return (false);
      }
       if (Bid>bidHi || Bid<bidLo){
         bidHi= MathMax (Bid,bidHi);
         bidLo= MathMin (Bid,bidLo);
         return (false);
      }
   }
   return (true);
}

중요한 정보를 잃지 않고 틱을 건너뛸 수 있습니다.

모든 바 오프닝과 새로운 최고점 및 최저점은 건너뛰지 않습니다.

 
좋은 생각!
 
zzuegg :

코드는 틱을 건너뛰지만 중요한 정보가 손실될 수 있는 방식으로 그렇게 합니다.

다음과 같은 코드를 사용하십시오.

중요한 정보를 잃지 않고 틱을 건너뛸 수 있습니다.

모든 바 오프닝과 새로운 최고점 및 최저점은 건너뛰지 않습니다.


이것이 동등할지 모르겠습니다. 그러나 mt4로 데이터를 가져오는 동안 볼륨 정보를 제거할 수 있습니다. 기본적으로 최소 OHLC 또는 4-Ticks를 사용하므로 백 테스트 속도를 높이는 데 도움이 됩니다.

그 라인을 따라 M1 데이터 가져오기 중에 볼륨을 100으로 입력하려고 시도한 사람이 있습니까? 제 생각에는 이것이 작동한다면 Tick-Data에 대한 실행 가능한 대안이어야 한다는 것입니다. 테스트 해볼려고 했는데 해보지 못했어요 :)

 
zzuegg :
모든 바 오프닝과 새로운 최고점 및 최저점은 건너뛰지 않습니다.
또는 전략 테스터의 속도 향상을 참조하십시오. - MQL4 forum
 

내 중개인은 이제 라이브 계정에서 MT5를 활성화하여 덜 학술적으로 만듭니다. 나는 어젯밤에 첫 번째 MQL5 지표(스프레드를 표시하기 위해)를 작성했고 오늘 저녁에 이 스레드의 첫 번째 페이지에서 속도 테스트 EA를 변환하려고 했습니다. 여기있어 ...

 // MQL5 code

const int SECONDSPERHOUR= 3600 ;

input int stops = 250 ;

double lots= 0.0 ;

//+-------------------------------------------------------------------------------------------+
int OnInit (){
    lots = SymbolInfoDouble ( Symbol (), SYMBOL_VOLUME_MIN );
     return ( 0 );
}
//+-------------------------------------------------------------------------------------------+
void OnDeinit ( const int reason){ 
}
//+-------------------------------------------------------------------------------------------+
void OnTick (){
     static long lastHour= 0 ;
    
     datetime now= TimeCurrent ();
     long hourNow = SECONDSPERHOUR *((( long )now) / SECONDSPERHOUR); 
    
     if ( lastHour== hourNow )
         return ;
    
    lastHour= hourNow;
    
     MqlTick lastTick;
     SymbolInfoTick ( _Symbol ,lastTick);
    
     MqlTradeResult result={ 0 };
    
     MqlTradeRequest requestA={ 0 };
    requestA.action= TRADE_ACTION_DEAL ;
    requestA.symbol= Symbol ();
    requestA.type = ORDER_TYPE_BUY ;
    requestA.volume= lots;                  
    requestA.sl=     NormalizeDouble ( lastTick.ask - stops* _Point , _Digits );
    requestA.tp=     NormalizeDouble ( lastTick.ask + stops* _Point , _Digits );

     OrderSend (requestA,result);
     if ( result.retcode != TRADE_RETCODE_DONE )
         Print ( "BUY order failed: " + IntegerToString (result.retcode));
    
     SymbolInfoTick ( _Symbol ,lastTick);
      
     MqlTradeRequest requestB={ 0 };
    requestB.action= TRADE_ACTION_DEAL ;
    requestB.symbol= Symbol ();
    requestB.type = ORDER_TYPE_SELL ;

    requestB.volume= lots;                  
    requestB.sl=     NormalizeDouble ( lastTick.bid + stops* _Point , _Digits );
    requestB.tp=     NormalizeDouble ( lastTick.bid - stops* _Point , _Digits );
    
     OrderSend (requestB,result);
     if ( result.retcode != TRADE_RETCODE_DONE )
         Print ( "SELL order failed: " + IntegerToString (result.retcode));
    
     return ;
}

이제 아이디어는 같은 거래를 하는 전략 테스터 의 속도를 비교하는 것이었습니다. 물론 MQL5의 가장 근본적인 변화는 잊어버렸습니다. 헤지할 수 없습니다. 사실 모양에 따라 심볼당 하나의 포지션만 열 수 있습니다. 즉, MAGIC_NUMBERS로 구분된 다중 전략이 불가능해 보입니다.

내 테스트 EA는 시간이 얼마나 걸리는지 확인하기 위해 매시간 거래를 하기 때문에 비참하게 실패했습니다. 이런 식으로 유사 비교를 수행하는 것은 불가능합니다 :-(