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

 
Andrey Khatimlianskii :

혀로 빻는 것은 가방을 굴리는 것이 아닙니다. 그들은 취하고 가르칠 것입니다. 제발.

문제가 있으며 이는 이 브로커에서만 나타나는 것이 아닙니다.
문제는 특정 주문이 실행될 때까지 기다려야 하는 것이 아니라(다른 평면에서) 주문이 실행되는 순간 모든 목록(오픈, 마감, 거래, 포지션)에서 일시적으로 사라집니다. .

물론 다른 목발로 지지할 수 있습니다. 그러나 나는 인간적인 해결책을 원합니다. 그 너머로 fxsaber는 공개적으로 일하며 지나가는 사람들의 짖는 소리를 듣습니다.

개인적으로 문서의 그러한 단어를 탐구하기에 충분하기를 바랍니다.

OnTradeTransaction() 핸들러를 사용하여 Expert Advisor가 거래 거래를 처리하는 동안 터미널은 새로 들어오는 거래 거래를 계속 처리합니다. 따라서 거래 계정의 상태는 OnTradeTransaction() 작업 중에 이미 변경될 수 있습니다. 예를 들어, MQL5 프로그램이 새로운 주문을 추가하는 이벤트를 처리하는 동안 실행되어 열린 주문 목록에서 제거되고 히스토리로 이동할 수 있습니다. 앞으로 프로그램은 이러한 모든 이벤트에 대해 공지할 것입니다.
이는 OnTradeTransaction() 이벤트 핸들러뿐만 아니라 OrderSend()가 전송된 후 코드의 모든 부분에도 적용됩니다. 거래가 완료될 때까지 기다립니다. 다른 옵션은 없고 그럴 가능성도 거의 없습니다... mql4에서 모든 것이 왜 그렇게 단순한지 생각해 보세요. 예, 이러한 기대는 당신의 눈에서 멀리 떨어져 있기 때문입니다. 그리고 MQL5에서는 어떤 이유로 모든 점검과 기대를 목발로 간주합니다. 왜???
 
Alexey Viktorov :

개인적으로 문서의 그러한 단어를 탐구하기에 충분하기를 바랍니다.

이는 OnTradeTransaction() 이벤트 핸들러뿐만 아니라 OrderSend()가 전송된 후 코드의 모든 부분에도 적용됩니다. 거래가 완료될 때까지 기다리세요. 다른 옵션은 없고 그럴 가능성도 거의 없습니다... mql4에서 모든 것이 왜 그렇게 단순한지 생각해 보세요. 예, 이러한 기대는 당신의 눈에서 멀리 떨어져 있기 때문입니다. 그리고 MQL5에서는 어떤 이유로 모든 점검과 기대를 목발로 간주합니다. 왜???

알렉스, 당신은 주제에서 벗어났습니다. 죄송합니다. 모든 것을 다시 설명할 시간이나 의향이 없습니다.

 

다음과 같이 시도했습니다.

 void OnTrade ()
{
   HistorySelect ( TimeCurrent (), 0 );
   if ( PositionsTotal () >= 10 ) return ;
   MqlTradeResult result;
   BuyRequest.price = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
   OrderSend (BuyRequest, result);
}

정확히 10개의 위치가 열릴 때까지 코드를 5번 실행했습니다.

 
Igor Makanu :

다음과 같이 시도했습니다.

정확히 10개의 위치가 열릴 때까지 코드를 5번 실행했습니다.

입력 HistorySelect 설정에 버그가 있는 것 같습니다.

 
fxsaber :

입력HistorySelect 설정에 버그가 있는 것 같습니다.

서버에 도달하고 동기화하는 아이디어

스크립트로 다시 작성:

 //+------------------------------------------------------------------+
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();
   datetime t_start = TimeCurrent ();
   while ( PositionsTotal () < 10 )
   {
      BuyRequest.price = SymbolInfoDouble ( _Symbol , SYMBOL_ASK );
       if (! HistorySelect ( TimeCurrent (), t_start) || ! OrderSend (BuyRequest, result)) continue ;
       if ( PositionsTotal () >= 10 ) 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);
}
//+------------------------------------------------------------------+

여러 번 실행, 10개 위치 열기, 스크립트의 현재 시작 시간 추가

 
Igor Makanu :

서버에 도달하고 동기화하는 아이디어

스크립트로 다시 작성:

여러 번 실행, 10개 위치 열기, 스크립트의 현재 시작 시간 추가

그러한 변화는 무엇을 보여줄 것인가?

 #include <fxsaber\Benchmark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

       if (! _B( HistorySelect ( TimeCurrent (), t_start) , 1 ) || ! OrderSend (BuyRequest, result)) continue ;
 
fxsaber :

그러한 변화는 무엇을 보여줄 것인가?


2021.05.09 21:35:06.210 tst (ETHUSD,H1) Benchmark.mqh: TimeAvg[GetMicrosecondsCount()] = 0mcs.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) Benchmark.mqh가 켜져 있습니다.

2021.05.09 21:35:06.211 tst (ETHUSD,H1) 경고: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 20mcs.

2021.05.09 21:35:06.308 tst (ETHUSD,H1) 경고: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 6 mcs.

2021.05.09 21:35:06.404 tst (ETHUSD,H1) 경고: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.

2021.05.09 21:35:06.501 tst (ETHUSD,H1) 경고: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 13 mcs.

2021.05.09 21:35:06.597 tst (ETHUSD,H1) 경고: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 10 mcs.

2021.05.09 21:35:06.694 tst (ETHUSD,H1) 경고: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.

2021.05.09 21:35:06.792 tst (ETHUSD,H1) 경고: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.

2021.05.09 21:35:06.888 tst (ETHUSD,H1) 경고: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 3 mcs.

2021.05.09 21:35:06.989 tst (ETHUSD,H1) 경고: Bench_Stack = 0, 1 <= Time[tst.mq5 16 in OnStart: HistorySelect(TimeCurrent(),t_start)] = 4 mcs.

아직까지 10개의 위치가 있으며 아직 두 배로 증가하지 않았습니다.
 
Igor Makanu :

아직 10개의 위치가 있고 아직 두 배로 증가하지 않았습니다.

HistorySelect의 실행 시간을 보면 트레이드 서버에서 아무 것도 요청하지 않는다는 것이 분명합니다.


여러 버전.

  1. 너는 운이 좋은거야.
  2. 이 분기는 새 터미널 빌드에서 조용한 변경을 일으켰습니다. 이전 항목에 백로그가 있는지 확인하기 쉽습니다.
  3. From >= To일 때HistorySelect 의 비표준 동작.
  4. 무역 서버. 이름?


여기에서 이중을 제거하기 위해 동일한 방법을 시도하십시오.

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

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

fxsaber , 2021.05.05 02:04

 // Демонстрация открытия дубля позиции в MT5.

#include <Trade\Trade.mqh>

void OnStart ()
{
  CTrade Trade;
  
   while (! IsStopped () && ( PositionsTotal () <= 1 )) // Закончим, когда появится более одной позиции.
     if ( PositionsTotal () == 1 )
      Trade.PositionClose( PositionGetTicket ( 0 )); // Если есть позиция - закрываем.
     else if (! OrdersTotal ())
      Trade.Buy( 0.01 ); // Если нет позиции и ордера - открываем позицию.
}

빈 데모 계정에서 이 코드를 실행하고 몇 초 안에 두 자리가 열리는 것을 확인하십시오.

 

여기 내가 우연히 갔어, 그것을 읽으십시오 - 일종의 수치심입니다!

아무도 믿을 수 없다!
 
fxsaber :

HistorySelect의 실행 시간을 보면 트레이드 서버에서 아무 것도 요청하지 않는다는 것이 분명합니다.


여러 버전.

  1. 너는 운이 좋은거야.
  2. 이 분기는 새 터미널 빌드에서 조용한 변경을 일으켰습니다. 이전 항목에 백로그가 있는지 확인하기 쉽습니다.
  3. From >= To일 때HistorySelect 의 비표준 동작.
  4. 무역 서버. 이름?


여기에서 이중을 제거하기 위해 동일한 방법을 시도하십시오.

1. 아아, 우리 사업에서 당신은 그것 없이는 생존하지 못할 것입니다))

2. 며칠 전에 어떤 빌드(베타가 아님)가 최신인지, 침묵하며, 최신이 아닌 것으로 결정했습니다. 랩톱과 PC에서 빌드와 관련된 내용을 이해할 수 있을 것입니다. 몇 달 동안 터미널을 다루지 않았으므로 팔로우하지 않습니다. 이제 PC 빌드 2903에서

3. 나는 통과, 당신은이 연회를 담당하고 있습니다. 개발자는 침묵합니다. 내 가정은 ... 하늘을 향한 손가락입니다. 문제는 네트워크 지연과 여러 소켓에 있다고 생각합니까? 터미널에는 동기화가 없으며 하나의 가격 소켓, 다른 OrderSend, 다른 곳은 OnTrade() ..... 그래서 패킷은 어디에서 어디로 날아갑니다.

4. 이제 roboforex + 100Mbit 광학(ETTH), 이전에는 노트북에 나쁜 모바일 인터넷과 fhopen이 있었습니다.


나는 그것을 시도했다 - 스크립트는 2 분 동안 타작했고, 항상 한 위치에, 복식은 없었고, 나는 스크립트를 손으로 제거했습니다.