위대하고 끔찍한 MT4 영원히 (또는 전환 전략을 올바르게 개발하는 방법) - 페이지 24

 
Artyom Trishkin :
러시아어로? 스페인어? 영어로? 에 무슨?

단말기가 지원하는 모든 언어로 자연스럽게

형식은 중요하지 않습니다. 생성자가 언어를 매개변수로 받는 클래스 형태의 SB일 수 있습니다.

또는 GetTxtErrDescription_RU()로 끝나는 언어 인코딩이 있는 사용자 정의 함수 그룹일 수 있습니다.

또는 GetLastError()와 같은 일반 함수

욕망이있을 것입니다


좋아, 가자, 나는 모든 것을 가지고 있지만 내 계급은 보편적 복지를 돌볼 수 없으며 특별히 훈련 된 사람들이 사용성과 사용자 편의성을 다루도록합니다.

 

나는 당신의 위치가 두 배로 된 이유를 추측했습니다.))) CodeBase에 두 개의 라이브러리를 배치했기 때문에)))


 

GetTickCount()보다는; 나는 그것을 좋아하지 않는다. 그것은 전체 코드를 늦추지 않는다. Sleep과 달리, ping이 높으면 적어도 500ms를 고정 할 수 있습니다.

내 다중 문자에서 각 쌍에 대해 별도의 카운터가 OrderSend 후에 활성화되고 나머지 논리는 계속 작동합니다.

 void OnStart ()
  {
   MqlTradeRequest BuyRequest = { 0 };
   MqlTradeResult result = { 0 };
   BuyRequest.action = TRADE_ACTION_DEAL ;
   BuyRequest.type = ORDER_TYPE_BUY ;
   BuyRequest.symbol = _Symbol ;
   BuyRequest.volume = 0.1 ;
   BuyRequest.type_filling = GetFilling();
//---
   while ( 1 && ! IsStopped ())
     {
       static uint LastOnCalculate = GetTickCount ();
       if ( GetTickCount () - LastOnCalculate > 5 )
         //---
        {
         BuyRequest.price = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
         OrderSend (BuyRequest, result);
         LastOnCalculate = GetTickCount ();
         continue ;
        }
       if ( PositionGetTicket ( 0 ) > 0 && PositionsTotal () >= 10 )
        {
         Sleep ( 100 );
         Print ( PositionsTotal ());
         return ;
        }
     }
  }
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING GetFilling( const uint Type = ORDER_FILLING_FOK )
  {
   const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = ( ENUM_SYMBOL_TRADE_EXECUTION ):: SymbolInfoInteger ( _Symbol , SYMBOL_TRADE_EXEMODE );
   const int FillingMode = ( int ):: SymbolInfoInteger ( _Symbol , SYMBOL_FILLING_MODE );
   return ((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN ) || ((FillingMode & (Type + 1 )) != Type + 1 )) ?
          (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE ) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT )) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC ) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK )) :
          ( ENUM_ORDER_TYPE_FILLING )Type);
  }
//+------------------------------------------------------------------+
 
Fast235 :

GetTickCount()보다는; 나는 그것을 좋아하지 않는다. 그것은 전체 코드를 늦추지 않는다. Sleep과 달리, ping이 높으면 적어도 500ms를 고정 할 수 있습니다.

활성 주기이며 프로세서를 먹습니다. 그리고 터미널에 그런 Expert Advisors가 50명 있다면? 이 중 한 쌍에 8개, 머리핀에 8개 주문이 모두 발송됩니다.

 
traveller00 :

활성 주기이며 프로세서를 먹습니다. 그리고 터미널에 그런 Expert Advisors가 50명 있다면? 이 중 한 쌍에 8개, 머리핀에 8개 주문이 모두 발송됩니다.

그것은 0.5초 동안 활성화 되고 주문을 보낸 후의 모든 것입니다. 그런 다음 명령이 없으면 먼저 열려 있는 위치에 대한 확인이 있습니다.

내 코드를 최적화한 방법, 더 빠르게 작동하기 시작했고 각각 2개 조각을 열기 시작했습니다) 처음에는 수면이 도움이 되었지만 모든 것이 느려졌습니다. 저는 7자를 가지고 있습니다.
 
fxsaber :

아직 MT4 스타일을 직접 사용해 본 적은 없습니다. 이론적으로 작동해야 합니다. 아직 볼 방법이 없습니다.

공장. 두 가지 옵션(포지션 기대 유무)을 비교하는 것은 흥미로웠습니다.


OrderSend 이후의 포지션 기대와 함께.

 #include <MT4Orders.mqh>

#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

void OnStart ()
{
   while ( OrdersTotal () < 30 )
     OrderSend ( _Symbol , OP_BUY, 0.1 , Ask, 0 , 0 , 0 );      
    
   Print ( OrdersTotal ());
}


위치를 기다리지 않고 결과가 즉시 나타납니다.

 #include <fxsaber\TradesID\ByPass.mqh>
#include <MT4Orders.mqh>

#define Ask SymbolInfoDouble ( _Symbol , SYMBOL_ASK )

void OnStart ()
{
  BYPASS ByPass;
  
  MT4ORDERS::OrderSend_MaxPause = 0 ; // Запрет на ожидание позиции после OrderSend
  
   while ( OrdersTotal () < 30 )
     if (ByPass.Is())
      ByPass += OrderSend ( _Symbol , OP_BUY, 0.1 , Ask, 0 , 0 , 0 );      
    
   Print ( OrdersTotal ());
}


두 번째 옵션이 더 빠를 것이라고 확신했습니다. 동일한 실행 시간이 나타났습니다.


기다릴 때 ByPass.Is()는 740번까지 기다리지 않고 false를 반환하지 않았습니다. 일반적으로 목발이 작동하는 것 같습니다.

 
이것은 제시된 유일한 작동 솔루션인 것 같습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

위대하고 끔찍한 MT4 영원히 (또는 전환 전략을 올바르게 개발하는 방법)

이고르 마카누 , 2021.05.10 10:28

다음과 같이 작동하는 것 같습니다.

 #include <Trade\Trade.mqh>
void OnStart ()
{
   CTrade Trade;
   while ( PositionsTotal () < 30 )
   {
       if ( OrdersTotal () > 0 ) continue ;
       if (!Trade.Buy( 0.01 )) continue ;
       if ( OrdersTotal () == 0 && PositionsTotal () >= 30 ) return ;
   }
}

그러나 매우 천천히, 그리고 해결책은 그저 그렇습니다

그의 속도는 정상입니다. 동기화 부족 37회.

 
fxsaber :

그의 속도는 정상입니다. 동기화 부족 37회.

이제 fx에서 확인했습니다... n - 이 스크립트는 빠르게 각각 10개 주문을 5번 열었습니다. 마지막으로 빨랐을 때는 데모에서 10개 주문을 여는 데 10초가 걸렸고 마감 주문도 빠르지 않았습니다.

나는 주문 11143290에 대한 로그에서 그것을 긁었습니다.

0 11:19:31.444 거래 '20615687': 주문 번호 11143290 시장에서 0.1 / 0.1 EURUSD를 1580.643ms에 완료

0 11:19:33.621 거래 '20615687': 거래 #1865643 1.21460에 0.1 EURUSD 구매 완료(주문 #11143290 기준)

씨엘 0 11:19:33.622 거래 '20615687': 시장 매수 0.1 EURUSD

제이에프 0 11:19:33.679 거래 '20615687': 허용된 시장 구매 0.1 EURUSD

QO 0 11:19:33.679 거래 '20615687': 시장 매수 0.1 EURUSD 실행

KM 0 11:22:41.224 거래 '20615687': 시장에서 0.1 EURUSD 매도, #11143290 매수 0.1 EURUSD 1.21460

박사 0 11:22:41.280 거래 '20615687': 허용된 시장 매도 0.1 EURUSD, 종가 #11143290 매수 0.1 EURUSD 1.21460

KQ 0 11:22:41.282 거래 '20615687': 시장 매도 0.1 EURUSD, 종가 #11143290 매수 0.1 EURUSD 1.21460 실행

켜짐 0 11:22:43.824 거래 '20615687': 시장에서 0.1 EURUSD 매도, #11143290 매수 0.1 EURUSD 1.21460

~하다 2 11:22:43.880 거래 '20615687': 실패한 시장 매도 0.1 EURUSD, 종가 #11143290 0.1 EURUSD 1.21460 매수 [이 포지션을 청산하기 위한 주문이 이미 존재합니다]

제이엔 0 11:22:46.280 거래 '20615687': 시장에서 0.1 EURUSD 매도, #11143290 매수 0.1 EURUSD 1.21460

2 11:22:46.336 거래 '20615687': 실패한 시장 매도 0.1 EURUSD, 종가 #11143290 0.1 EURUSD 1.21460 매수 [이 포지션을 청산하기 위한 주문이 이미 존재합니다]

 
Igor Makanu :

이제 fx ... n에서 확인되었습니다.

이 서버를 확인해봐야겠습니다. 여기에서 제안하는 목발 을 확인하는 것이 좋을 것입니다. 누구에게 중요해 보입니다.

나는 잠시 후에 이 주제로 돌아가고 싶지 않습니다. 버그가 있으면 즉시 지적하는 것이 좋습니다.

 
fxsaber :

이 서버를 확인해봐야겠습니다. 여기에서 제안하는 목발 을 확인하는 것이 좋을 것입니다. 누구에게 중요해 보입니다.

나는 잠시 후에 이 주제로 돌아가고 싶지 않습니다. 버그가 있으면 즉시 지적하는 것이 좋습니다.

LAN에서 서버 삭제