그리고 거기에 무엇이 잘못 되었습니까? 내가 OrderSendAsync()를 사용하고 있는지 어떻게 아나요? 예를 들어 거래 요청을 보낸 Expert Advisor의 스탬프를 확인하는 데 사용할 수 없습니까? 또는 예를 들어, 마지막 거래가 이루어진 포지션의 티켓을 확인하려면?
마지막으로, 이 이벤트를 사용하여 거래가 이루어진 가격을 확인할 수 있습니다(비록 이 이벤트에서 가격을 확인하는 것은 비동기 거래를 사용할 때만 의미가 있음에도 동의합니다).
그리고 거기에 무엇이 잘못 되었습니까? 내가 OrderSendAsync()를 사용하고 있는지 어떻게 아나요? 예를 들어 거래 요청을 보낸 Expert Advisor의 스탬프를 확인하는 데 사용할 수 없습니까? 또는 예를 들어, 마지막 거래가 이루어진 포지션의 티켓을 확인하려면?
마지막으로, 이 이벤트를 사용하여 거래가 이루어진 가격을 확인할 수 있습니다(비록 이 이벤트에서 가격을 확인하는 것은 비동기 거래를 사용할 때만 의미가 있음에도 동의합니다).
즉, 비동기 주문 전송을 사용하는 경우 코드가 올바른가요?
주제는
"OrderSend로 작업하는 방법"
이 기능(개발자가 생각한 대로)은 완전히 동기식이어야 합니다. 즉, 주문을 보내고 티켓을 받으면
그러면 모든 것이 순서대로 됩니다. 그러나 이제 이 기능이 제대로 작동하지 않으므로 주문 티켓을 받은 후
둘이 아니라 하나 :)
TRADE_TRANSACTION_REQUEST는 OrderSendAsymc를 사용 하여 주문 티켓을 얻을 때 필요합니다.
그리고 거기에 무엇이 잘못 되었습니까? 내가 OrderSendAsync()를 사용하고 있는지 어떻게 아나요?
예를 들어 거래 요청을 보낸 Expert Advisor의 스탬프를 확인하는 데 사용할 수 없습니까? 또는 예를 들어, 마지막 거래가 이루어진 포지션의 티켓을 확인하려면?
마지막으로, 이 이벤트를 사용하여 거래가 이루어진 가격을 확인할 수 있습니다(비록 이 이벤트에서 가격을 확인하는 것은 비동기 거래를 사용할 때만 의미가 있음에도 동의합니다).
즉, 비동기 주문 전송을 사용하는 경우 코드가 올바른가요?
그리고 거기에 무엇이 잘못 되었습니까? 내가 OrderSendAsync()를 사용하고 있는지 어떻게 아나요?
예를 들어 거래 요청을 보낸 Expert Advisor의 스탬프를 확인하는 데 사용할 수 없습니까? 또는 예를 들어, 마지막 거래가 이루어진 포지션의 티켓을 확인하려면?
마지막으로, 이 이벤트를 사용하여 거래가 이루어진 가격을 확인할 수 있습니다(비록 이 이벤트에서 가격을 확인하는 것은 비동기 거래를 사용할 때만 의미가 있음에도 동의합니다).
즉, 비동기 주문 전송을 사용하는 경우 코드가 올바른가요?
주제는
"OrderSend로 작업하는 방법"
이 기능(개발자가 생각한 대로)은 완전히 동기식이어야 합니다. 즉, 주문을 보내고 티켓을 받으면
그러면 모든 것이 순서대로 됩니다. 그러나 이제 이 기능이 제대로 작동하지 않으므로 주문 티켓을 받은 후
OnTradeTransaction 에서 모든 것이 정상이라는 확인을 받아야 합니다.
즉, 이 주문의 데이터는 터미널에서 완전히 동기화됩니다.
// Expert TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch (trans.type)
{
case TRADE_TRANSACTION_ORDER_UPDATE :
switch (trans.order_state)
{
case ORDER_STATE_PLACED :
if (order_ticket==trans.order)
{
Print ( __FUNCTION__ , " Order plased done. Ticket = " ,trans.order);
if (order_ticket> 0 )
{
if ( OrderSelect (order_ticket))
{
//Данные по ордеру синхронизированы
}
else
{
Print ( __FUNCTION__ , " Order not select! Ticket = " ,trans.order);
}
}
else
{
Print ( __FUNCTION__ , " Wrong order ticket = " ,trans.order);
}
}
break ;
}
break ;
}
}
주제는
"OrderSend로 작업하는 방법"
이 기능(개발자가 생각한 대로)은 완전히 동기식이어야 합니다. 즉, 주문을 보내고 티켓을 받으면
그러면 모든 것이 순서대로 됩니다. 그러나 이제 이 기능이 제대로 작동하지 않으므로 주문 티켓을 받은 후
OnTradeTransaction 에서 모든 것이 정상이라는 확인을 받아야 합니다.
즉, 이 주문의 데이터는 터미널에서 완전히 동기화됩니다.
// Expert TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch (trans.type)
{
case TRADE_TRANSACTION_ORDER_UPDATE :
switch (trans.order_state)
{
case ORDER_STATE_PLACED :
if (order_ticket==trans.order)
{
Print ( __FUNCTION__ , " Order plased done. Ticket = " ,trans.order);
if (order_ticket> 0 )
{
if ( OrderSelect (order_ticket))
{
//Данные по ордеру синхронизированы
}
else
{
Print ( __FUNCTION__ , " Order not select! Ticket = " ,trans.order);
}
}
else
{
Print ( __FUNCTION__ , " Wrong order ticket = " ,trans.order);
}
}
break ;
}
break ;
}
}
놀라운! 나도 알아 나는 비동기 주문 전송만 사용합니다. 또 다른 문제가 있습니다. 동일한 트랜잭션에 대한 REQUEST 이벤트(트랜잭션의 최종 합계의 의미에서)가 두 번 발생했습니다.
OrderSEndAsync 주문을 할 때 OnTradeTransaction 에서 메시지를 처리하는 방법을 잘 이해하지 못합니다.
이 Expert Advisor를 등록하고 작동 방식을 확인하십시오.
OrderSEndAsync 주문을 할 때 OnTradeTransaction 에서 메시지를 처리하는 방법을 잘 이해하지 못합니다.
이 Expert Advisor를 등록하고 작동 방식을 확인하십시오.
그래서 TradeTransactions를 올바르게 처리하는 방법을 묻습니다.
그래서 TradeTransactions를 올바르게 처리하는 방법을 묻습니다.
OrderSendAsync의 순서는 다음과 같습니다.
OrderSendAsync 명령으로 주문을 보낼 때 성공적으로 보내면 order_id 를 받습니다.
{
double price= SymbolInfoDouble ( Symbol (), SYMBOL_SESSION_PRICE_LIMIT_MAX );
MqlTradeRequest request={ 0 };
MqlTradeResult result={ 0 };
order_ticket= 0 ;
order_id= 0 ;
request.action = TRADE_ACTION_PENDING ;
request.magic = 9876543210 ;
request.symbol = Symbol ();
request.volume = 1 ;
request.price = price;
request.type= ORDER_TYPE_SELL_LIMIT ;
request.comment= "Async mode" ;
request.type_filling= ORDER_FILLING_RETURN ;
request.type_time= ORDER_TIME_DAY ;
if ( OrderSendAsync (request,result))
{
if ((result.retcode== TRADE_RETCODE_PLACED ) || (result.retcode== TRADE_RETCODE_DONE ))
{
if (result.request_id> 0 )
{
order_id=result.request_id;
Print ( __FUNCTION__ , " Order sent in async mode" );
return ( true );
}
else
{
Print ( __FUNCTION__ , " Error order sent in async mode! Retcode = " ,result.retcode);
}
}
else
{
Print ( __FUNCTION__ , " Error order sent in async mode! Retcode = " ,result.retcode);
}
}
else
{
Print ( __FUNCTION__ , " Order not sent in async mode." );
}
return ( false );
}
또한 다른 모든 데이터는 OnTradeTransaction 에서 수신됩니다.
1. 주문 티켓 받기
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch (trans.type)
{
case TRADE_TRANSACTION_REQUEST :
if ((order_id> 0 ) && (order_id==result.request_id))
{
order_id= 0 ;
order_ticket=result.order;
Print ( __FUNCTION__ , " Order get ticket done. Ticket = " ,result.order);
}
break ;
}
}
2. 시장가 주문 또는 지정가(보류가 아님) 주문, 즉 즉시 실행되는 주문을 사용하는 경우
또는 거부된 경우 TRADE_TRANSACTION_HISTORY_ADD를 모니터링해야 합니다.
이러한 주문은 기록에 추가됩니다.
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch (trans.type)
{
case TRADE_TRANSACTION_HISTORY_ADD :
if (order_ticket==trans.order)
{
//Берем данные из истории
}
break ;
}
}
3. 보류 주문(부분적으로 실행할 수 있음)을 사용하는 경우 모니터링해야 합니다.
스테이시스 3가지 이벤트 TRADE_TRANSACTION_ORDER_UPDATE, TRADE_TRANSACTION_HISTORY_ADD, TRADE_TRANSACTION_DEAL_ADD
TRADE_TRANSACTION_ORDER_UPDATE - 주문(수정)된 정보를 수신하는 데 사용
TRADE_TRANSACTION_DEAL_ADD - 거래가 이루어졌는지 확인
TRADE_TRANSACTION_HISTORY_ADD - 거래 시스템에 주문이 없습니다. 주문 데이터를 확인하세요.
그것이 바로 '지혜'다.
추가됨
OrderSendAsync와 OnTradeTransaction 의 조합은 완벽하게 작동 하며 FOREX(데모)에서도 확인했습니다.
및 FORTS(리얼)
추가됨
OrderSendAsync와 OnTradeTransaction 의 조합은 완벽하게 작동 하며 FOREX(데모)에서도 확인했습니다.
및 FORTS(리얼)
고맙습니다! 이제 OnTradeTransaction() 함수를 사용하는 방법을 알았습니다. 아니면 다른 비밀이 있습니까?
TradeTransaction() 이벤트가 손실될 수 있는 경우 어떻게 문제가 없을 수 있습니까?
고맙습니다! 이제 OnTradeTransaction() 함수를 사용하는 방법을 알았습니다. 아니면 다른 비밀이 있습니까?
TradeTransaction() 이벤트가 손실될 수 있는 경우 어떻게 문제가 없을 수 있습니까?
더 이상 비밀은 없습니다.
그것은 길을 잃을 수 있습니다 (그러나 4-5 개월 동안 3-4 번 발생하고 시장 활동이 활발할 때),
그래서 보험이 아프지 않을 것입니다.
다음은 주문을 확인하는 구체적인 예입니다.
터미널 로그:
2017.01.05 11:46:02.895 Trades 'xxxxx': accepted buy limit 1.00 PLT-6.17 at 952.3
2017.01.05 11:46:02.896 Trades 'xxxxx': buy limit 1.00 PLT-6.17 at 952.3 placed for execution in 1223.187 ms
전문가 로그:
주문은 2017.01.05 11:46:01.673 에 발송되었습니다.
1초 이상 서버에서 응답이 없어서 주문을 확인했습니다.
일반 모드에서 응답은 7-10ms 내에 옵니다.
" MT5에서 OrderSend 로 작업하는 방법 " 주제의 질문에 답하기
간단한 답이 있습니다
개발자가 버그를 수정할 때까지
ulong order_ticket; //Тикет ордера
//---
if ( OrderSend (request,result))
{
if (result.retcode== TRADE_RETCODE_DONE )
{
pre_ticket=result.order;
}
}
//----------------------------------------------------------------+
//| TradeTransaction function |
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction &trans,
const MqlTradeRequest &request,
const MqlTradeResult &result)
{
switch (trans.type)
{
case TRADE_TRANSACTION_ORDER_UPDATE :
if ((pre_ticket> 0 ) && (trans.order==pre_ticket))
{
switch (trans.order_state)
{
case ORDER_STATE_PLACED :
order_ticket = pre_ticket;
break ;
}
}
break ;
}
}
그리고 그들이 그것을 고칠 때
//---
if ( OrderSend (request,result))
{
if (result.retcode== TRADE_RETCODE_DONE )
{
order_ticket=result.order;
}
}