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

 
JRandomTrader :

다음은 문서에서 가져온 것입니다.

" 이러한 거래가 터미널에 도착하는 순서는 보장되지 않으므로 다른 거래가 도착한 후 일부 거래 거래가 도착하기를 기다리는 거래 알고리즘을 구축할 수 없습니다. " https://www.mql5.com/ ko/docs/event_handlers/ontradetransaction

그리고 경험상 TRADE_TRANSACTION_ORDER_DELETE , TRADE_TRANSACTION_DEAL_ADD , TRADE_TRANSACTION_HISTORY_ADD 거래는 어떤 순서로든 올 수 있습니다.

따라서 히스토리에 아직 거래 및 주문이 없지만 더 이상 주문이 없는 상황이 발생합니다. 또는 그 반대의 경우에도 여전히 주문이 있지만 이미 거래가 있습니다. 그것은 명령이 현재와 역사 모두에 있는 상황일 뿐이며 거의 불가능합니다.

나는 사건을 잡지 않고 새로운 진드기에 전체 그림을 봅니다.


제이랜덤 트레이더 :

사실, 그것이 그가 CTrade 클래스 사용을 거부한 이유입니다. 그는 이 모든 갈퀴를 밟습니다.

투쟁 방식 - 각 고문은 자신의 명령 목록을 유지 관리하고 상태를 모니터링합니다. 포함 "비표준"은 "주문이 전송되었지만 아직 활성 주문에 나타나지 않았습니다"(여기서 두 배로 늘릴 수 있음), "주문이 삭제되었지만 내역에 나타나지 않음"을 나타냅니다. 동시에, 네팅 중에 하나의 심볼에 대해 동시에 작업하는 데 도움이 됩니다.

최근까지 나는 누락 된 주문을 확인하는 범용 목발을 사용했습니다. 하지만 어느 순간 실패하기 시작했다.

고문에게 또 다른 개인 목발을 추가하여 이제 그는 자신의 명령을 별도로 모니터링합니다.

목발이 너무...

 
Andrey Khatimlianskii :

목발이 너무...

나는 그 문제를 연구하고 있다. 나는 심지어 다음과 같이 실행합니다. 시장 주문의 OrderSend가 true인 후 PositionsTotal = 0, OrdersTotal = 0, 과거 테이블은 변경되지 않습니다.

IsSynchronized()를 작성할 수 있었던 것 같습니다. 코드가 무겁습니다. 포스팅 방법은 아직 결정하지 않았습니다.

 
// Демонстрация открытия дубля позиции в 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 ); // Если нет позиции и ордера - открываем позицию.
}

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


MT4의 동일한 논리는 다음과 같습니다.

 void OnStart ()
{
   while (! IsStopped () && ( OrdersTotal () <= 1 )) // Закончим, когда появится более одной позиции.
     if ( OrderSelect ( 0 , SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0 ) // Если есть позиция - закрываем.
     else
       OrderSend ( _Symbol , OP_BUY, 0.01 , Ask, 0 , 0 , 0 ) // Если нет позиции и ордера - открываем позицию.
}

MT4의 그러한 코드는 이중 위치를 일으키지 않을 것이 분명합니다. 하지만 MT5에는 없습니다.

 
fxsaber :

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


MT4의 동일한 논리는 다음과 같습니다.

MT4의 그러한 코드는 이중 위치를 일으키지 않을 것이 분명합니다. 하지만 MT5에는 없습니다.

드디어! 방금 이것을 발견 했습니까? 이 문제는 터미널 자체만큼이나 오래되었습니다. 그러나 마침내 터미널 사용자는 10년 후에 그것을 알아차렸습니다.

거래 행동을 스스로 수행할 때 문제는 간단한 방법으로 해결할 수 있습니다. 행동이 수행된 후 잠시 동안 Sleep() 을 삽입하십시오. 그러나 EA에서 손절매/이익실현 및 시장폐쇄를 사용하는 경우 이러한 문제에 직면할 위험이 있으며 이 경우 해결 방법이 없습니다.

 
Dmitry Fedoseev :

드디어! 방금 이것을 발견 했습니까? 이 문제는 터미널 자체만큼이나 오래되었습니다. 그러나 마침내 터미널 사용자는 10년 후에 그것을 알아차렸습니다.

이 문제는 오랫동안 논의되었습니다. 거의 모든 사람이 가지고 있습니다. 처음으로 코드를 안정적으로 재생합니다.

거래 행동을 스스로 수행할 때 문제는 간단한 방법으로 해결할 수 있습니다. 행동이 수행된 후 잠시 동안 Sleep() 을 삽입하십시오. 그러나 EA에서 손절매/이익실현 및 시장 폐쇄를 사용하는 경우 이 문제에 부딪힐 위험이 있으며 이 경우에는 해결책이 없습니다.

솔루션을 찾았습니다.

 
fxsaber :

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

기이한. 재생할 수 없습니다. MQ의 데모에서 확인, 빌드 2900, EURUSD, 스프레드 제로. 5분정도 기다렸다.

MQ 서버가 아닌 실제 DC/브로커의 특정 서버를 사용해야 하는 경우가 있습니까?

 
Ihor Herasko :

기이한. 재생할 수 없습니다. MQ의 데모에서 확인, 빌드 2900, EURUSD, 스프레드 제로. 5분정도 기다렸다.

MQ 서버가 아닌 실제 DC/브로커의 특정 서버를 사용해야 하는 경우가 있습니까?

ForexTimeFXTM-Demo01

 
fxsaber :

ForexTimeFXTM-Demo01

예, 이제 스크립트가 중지됩니다. 그러나 입장은 여전히 같다. 두 번째는 분명히 닫을 시간이 있습니까?

 
Ihor Herasko :

예, 이제 스크립트가 중지됩니다. 그러나 입장은 여전히 같다. 두 번째는 분명히 닫을 시간이 있습니까?

항상 2개가 남습니다. 하나가 남아 있다면 이것은 더 큰 버그입니다.

  1. PositionsTotal = 1 - 마감 주문을 보냅니다.
  2. 그 후, PositionsTotal = 2이고 p.1의 주문이 마감됩니다.
 
fxsaber :

항상 2개가 남습니다. 하나가 남아 있다면 이것은 더 큰 버그입니다.

  1. PositionsTotal = 1 - 마감 주문을 보냅니다.
  2. 그 후, PositionsTotal = 2이고 p.1의 주문이 마감됩니다.

예, 그리고 저도 같은 이야기를 하고 있습니다. 실제로 두 개의 위치가 있을 때 스크립트는 위치 중 하나를 닫을 수 있지만 PositionsTotal()은 1을 반환합니다. 그런 다음 닫은 후 루프 종료 조건이 충족됩니다. 즉, PositionsTotal()은 2를 반환합니다.