" 이러한 거래가 터미널에 도착하는 순서는 보장되지 않으므로 다른 거래가 도착한 후 일부 거래 거래가 도착하기를 기다리는 거래 알고리즘을 구축할 수 없습니다. " https://www.mql5.com/ ko/docs/event_handlers/ontradetransaction
그리고 경험상 TRADE_TRANSACTION_ORDER_DELETE , TRADE_TRANSACTION_DEAL_ADD , TRADE_TRANSACTION_HISTORY_ADD 거래는 어떤 순서로든 올 수 있습니다.
따라서 히스토리에 아직 거래 및 주문이 없지만 더 이상 주문이 없는 상황이 발생합니다. 또는 그 반대의 경우에도 여전히 주문이 있지만 이미 거래가 있습니다. 그것은 명령이 현재와 역사 모두에 있는 상황일 뿐이며 거의 불가능합니다.
나는 사건을 잡지 않고 새로운 진드기에 전체 그림을 봅니다.
제이랜덤 트레이더 :
사실, 그것이 그가 CTrade 클래스 사용을 거부한 이유입니다. 그는 이 모든 갈퀴를 밟습니다.
투쟁 방식 - 각 고문은 자신의 명령 목록을 유지 관리하고 상태를 모니터링합니다. 포함 "비표준"은 "주문이 전송되었지만 아직 활성 주문에 나타나지 않았습니다"(여기서 두 배로 늘릴 수 있음), "주문이 삭제되었지만 내역에 나타나지 않음"을 나타냅니다. 동시에, 네팅 중에 하나의 심볼에 대해 동시에 작업하는 데 도움이 됩니다.
최근까지 나는 누락 된 주문을 확인하는 범용 목발을 사용했습니다. 하지만 어느 순간 실패하기 시작했다.
// Демонстрация открытия дубля позиции в MT5.#include <Trade\Trade.mqh>
voidOnStart ()
{
CTrade Trade;
while (! IsStopped () && ( PositionsTotal () <= 1 )) // Закончим, когда появится более одной позиции.if ( PositionsTotal () == 1 )
Trade.PositionClose( PositionGetTicket ( 0 )); // Если есть позиция - закрываем.elseif (! OrdersTotal ())
Trade.Buy( 0.01 ); // Если нет позиции и ордера - открываем позицию.
}
빈 데모 계정에서 이 코드를 실행하고 몇 초 안에 두 자리가 열리는 것을 확인하십시오.
MT4의 동일한 논리는 다음과 같습니다.
voidOnStart ()
{
while (! IsStopped () && ( OrdersTotal () <= 1 )) // Закончим, когда появится более одной позиции.if ( OrderSelect ( 0 , SELECT_BY_POS))
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0 ) // Если есть позиция - закрываем.elseOrderSend ( _Symbol , OP_BUY, 0.01 , Ask, 0 , 0 , 0 ) // Если нет позиции и ордера - открываем позицию.
}
MT4의 그러한 코드는 이중 위치를 일으키지 않을 것이 분명합니다. 하지만 MT5에는 없습니다.
예, 그리고 저도 같은 이야기를 하고 있습니다. 실제로 두 개의 위치가 있을 때 스크립트는 위치 중 하나를 닫을 수 있지만 PositionsTotal()은 1을 반환합니다. 그런 다음 닫은 후 루프 종료 조건이 충족됩니다. 즉, PositionsTotal()은 2를 반환합니다.
다음은 문서에서 가져온 것입니다.
" 이러한 거래가 터미널에 도착하는 순서는 보장되지 않으므로 다른 거래가 도착한 후 일부 거래 거래가 도착하기를 기다리는 거래 알고리즘을 구축할 수 없습니다. " https://www.mql5.com/ ko/docs/event_handlers/ontradetransaction
그리고 경험상 TRADE_TRANSACTION_ORDER_DELETE , TRADE_TRANSACTION_DEAL_ADD , TRADE_TRANSACTION_HISTORY_ADD 거래는 어떤 순서로든 올 수 있습니다.
따라서 히스토리에 아직 거래 및 주문이 없지만 더 이상 주문이 없는 상황이 발생합니다. 또는 그 반대의 경우에도 여전히 주문이 있지만 이미 거래가 있습니다. 그것은 명령이 현재와 역사 모두에 있는 상황일 뿐이며 거의 불가능합니다.
나는 사건을 잡지 않고 새로운 진드기에 전체 그림을 봅니다.
사실, 그것이 그가 CTrade 클래스 사용을 거부한 이유입니다. 그는 이 모든 갈퀴를 밟습니다.
투쟁 방식 - 각 고문은 자신의 명령 목록을 유지 관리하고 상태를 모니터링합니다. 포함 "비표준"은 "주문이 전송되었지만 아직 활성 주문에 나타나지 않았습니다"(여기서 두 배로 늘릴 수 있음), "주문이 삭제되었지만 내역에 나타나지 않음"을 나타냅니다. 동시에, 네팅 중에 하나의 심볼에 대해 동시에 작업하는 데 도움이 됩니다.
최근까지 나는 누락 된 주문을 확인하는 범용 목발을 사용했습니다. 하지만 어느 순간 실패하기 시작했다.
고문에게 또 다른 개인 목발을 추가하여 이제 그는 자신의 명령을 별도로 모니터링합니다.
목발이 너무...
목발이 너무...
나는 그 문제를 연구하고 있다. 나는 심지어 다음과 같이 실행합니다. 시장 주문의 OrderSend가 true인 후 PositionsTotal = 0, OrdersTotal = 0, 과거 테이블은 변경되지 않습니다.
IsSynchronized()를 작성할 수 있었던 것 같습니다. 코드가 무겁습니다. 포스팅 방법은 아직 결정하지 않았습니다.
빈 데모 계정에서 이 코드를 실행하고 몇 초 안에 두 자리가 열리는 것을 확인하십시오.
MT4의 동일한 논리는 다음과 같습니다.
MT4의 그러한 코드는 이중 위치를 일으키지 않을 것이 분명합니다. 하지만 MT5에는 없습니다.
빈 데모 계정에서 이 코드를 실행하고 몇 초 안에 두 자리가 열리는 것을 확인하십시오.
MT4의 동일한 논리는 다음과 같습니다.
MT4의 그러한 코드는 이중 위치를 일으키지 않을 것이 분명합니다. 하지만 MT5에는 없습니다.
드디어! 방금 이것을 발견 했습니까? 이 문제는 터미널 자체만큼이나 오래되었습니다. 그러나 마침내 터미널 사용자는 10년 후에 그것을 알아차렸습니다.
거래 행동을 스스로 수행할 때 문제는 간단한 방법으로 해결할 수 있습니다. 행동이 수행된 후 잠시 동안 Sleep() 을 삽입하십시오. 그러나 EA에서 손절매/이익실현 및 시장폐쇄를 사용하는 경우 이러한 문제에 직면할 위험이 있으며 이 경우 해결 방법이 없습니다.
드디어! 방금 이것을 발견 했습니까? 이 문제는 터미널 자체만큼이나 오래되었습니다. 그러나 마침내 터미널 사용자는 10년 후에 그것을 알아차렸습니다.
이 문제는 오랫동안 논의되었습니다. 거의 모든 사람이 가지고 있습니다. 처음으로 코드를 안정적으로 재생합니다.
거래 행동을 스스로 수행할 때 문제는 간단한 방법으로 해결할 수 있습니다. 행동이 수행된 후 잠시 동안 Sleep() 을 삽입하십시오. 그러나 EA에서 손절매/이익실현 및 시장 폐쇄를 사용하는 경우 이 문제에 부딪힐 위험이 있으며 이 경우에는 해결책이 없습니다.
솔루션을 찾았습니다.
빈 데모 계정에서 이 코드를 실행하고 몇 초 안에 두 자리가 열리는 것을 확인하십시오.
기이한. 재생할 수 없습니다. MQ의 데모에서 확인, 빌드 2900, EURUSD, 스프레드 제로. 5분정도 기다렸다.
MQ 서버가 아닌 실제 DC/브로커의 특정 서버를 사용해야 하는 경우가 있습니까?
기이한. 재생할 수 없습니다. MQ의 데모에서 확인, 빌드 2900, EURUSD, 스프레드 제로. 5분정도 기다렸다.
MQ 서버가 아닌 실제 DC/브로커의 특정 서버를 사용해야 하는 경우가 있습니까?
ForexTimeFXTM-Demo01
ForexTimeFXTM-Demo01
예, 이제 스크립트가 중지됩니다. 그러나 입장은 여전히 같다. 두 번째는 분명히 닫을 시간이 있습니까?
예, 이제 스크립트가 중지됩니다. 그러나 입장은 여전히 같다. 두 번째는 분명히 닫을 시간이 있습니까?
항상 2개가 남습니다. 하나가 남아 있다면 이것은 더 큰 버그입니다.
항상 2개가 남습니다. 하나가 남아 있다면 이것은 더 큰 버그입니다.
예, 그리고 저도 같은 이야기를 하고 있습니다. 실제로 두 개의 위치가 있을 때 스크립트는 위치 중 하나를 닫을 수 있지만 PositionsTotal()은 1을 반환합니다. 그런 다음 닫은 후 루프 종료 조건이 충족됩니다. 즉, PositionsTotal()은 2를 반환합니다.