잘못된 요청 - 방금 시작했는데 이해할 수 없습니다... - 페이지 8

 
papaklass :

나에게 그것은 기능을 통해서만 정확하게 구현됩니다.


이해했다. 코드에서 MK와 같은 방식으로 - OrderCheckOrderSend 사이에는 사용자가 처리하는 오류 계층이 있습니다.

 
papaklass :

나에게 그것은 기능을 통해서만 정확하게 구현됩니다.

OrderCheck는 암시적으로 그리고 반드시 OrderSend 내부에서 확인됩니다.

따라서 주문이 잘못 채워지면 응답은 서버로 전송되지 않고 즉시 반환됩니다.

 
papaklass :

매뉴얼이 이에 대해 무엇이라고 말하는지 봅시다.

첫 번째 선택: 이 기능은 수표에 대한 단어가 아니라 거래 작업을 수행 하기 위한 것임을 알 수 있습니다.

글쎄, 내가 수표가 있다고 말하면 그것은 사실입니다.

단 하나의 애플리케이션도 엄격한 검사 없이 터미널을 떠나지 않습니다.

두 번째 선택: 서버에서 검사가 수행되고 서버로 보내기 전에 요청을 확인하기 위해 개발자는 OrderCheck() 함수를 사용하는 것이 좋습니다. 그리고 다시, OrderSend() 함수가 어떤 종류의 검사를 수행한다는 단어는 없습니다.

특히 거래자가 주문이 올바르게 채워졌는지 미리 확인하고 적절한 조치를 취할 수 있는 기회를 가질 것을 권장합니다.

원하는 사람 - 미리 확인할 수 있습니다. 원하지 않는 경우 어쨌든 그를 확인하고 유사한 답변을 반환합니다.

요청을 보내기 전에 확인하는 것에 대해 언급된 유일한 곳은 "구조의 기본 확인(포인터 확인)에 성공한 경우 ...."입니다. 그러나 오류 요청 구조의 포인터를 확인하는 것과 필드 값을 확인하는 것은 같은 것이 아닙니다. 그리고 OrderCheck() 함수를 사용하라는 개발자의 권장 사항은 OrderSend()가 서버에 요청을 보내기 전에 실제 오류 검사를 수행하지 않는다는 간접적인 증거입니다. 그렇지 않으면 왜 "버터 오일"을 수행합니까? 먼저 OrderSend() 검사를 수행한 다음 OrderCheck()를 사용하여 동일한 검사를 다시 수행해야 합니까?

따라서 디렉토리에서 확인이 서버에서만 독점적으로 수행된다는 확실한 대답이 이어집니다!

아무도 서버에 대한 잘못된 요청 또는 과도한 요청 흐름을 놓치지 않을 것입니다.

이를 이해하려면 기본 논리로 충분합니다. 문서를 확장해 보겠습니다.

 
sergeev :

당신은 그것을 가지고 있지 않습니다. 모든 오류는 비즈니스 로직에 의해 처리됩니다.

나는 가지고있다. 비즈니스 로직은 비즈니스 로직과 관련된 이벤트(예: 주문 실패)를 처리하지만 나머지 모든(예: 서버 응답 지연)은 범용 템플릿에 의해 처리되며 이를 기반으로 모든 Expert Advisor를 절대적으로 구현할 수 있습니다. .

그러나 MT5는 반환 코드 + 비동기 처리 측면에서 훨씬 더 어렵습니다.

이것은 내가 이전에 비슷하게 썼듯이 우리가 이야기하고 있는 것이며 이 문제에 대한 정보는 없습니다. 그리고 MK는 지금까지 수년 동안 그 제공에서 스스로를 분리하기 위해 가능한 모든 방법을 시도했습니다. 나는 이것에 대해 썼습니다. 제품은 배수로 이어지는 순간이 있는 딜러에게 유익합니다. MQ의 경우 이는 매출 증대 요인입니다. 아아, 우리는 동지가 아닌 경쟁자(우리와 MQ)가 있는 시장에 있습니다.

당신은 래퍼에서 불가능한 것을 요구하고 있습니다. 표준 라이브러리는 비즈니스 로직이 아닙니다. 이것은 터미널의 기능을 "오버"하는 래퍼입니다. 사탕 충전물 위에 래퍼입니다.

그렇다면 그러한 구조적 디자인에는 의미가 거의 없습니다.

그러나 래퍼는 당신이 보증인이기 때문에 아무것도 보장할 수 없습니다. 당신의 비즈니스 논리. 충전재. :)

인쇄 기능과 마찬가지로 디스크 여유 공간을 보장할 수 없습니다. 그리고 로깅 오류. 이렇게 하려면 다른 기능의 오류 처리를 사용해야 하며 해당 기능은 경우에 따라 다릅니다.

올바른 래퍼라도 모든 것을 보장할 수는 없지만 많은 관련 기능이 보장할 수 있습니다.

-Alexey- , 특정 단점에 대해 이야기하고 수정하고 싶은 특정 단점을 밝힙니다.

이미 특정 항목에 대해 반복해서 썼습니다. MQ가 기성품 솔루션을 제공할 수 없다면 최소한 오류 및 반환 코드 처리에 대한 지침을 만들도록 하십시오. 가능한 모든 방법으로 잠금 해제됩니다. 4에 대한 문서에서 이것은 부분적으로 존재했습니다(예: 이런 경우 30초 대기). 부분적으로 사용자는 경험에서 문서화되지 않은 상황의 처리를 결정했습니다. 5에 대한 것은 없습니다. 그렇다면 아무도 그것을 사용하지 않을 것입니다.

글쎄요, 막 생성된 거래 인프라가 기본적으로 이것을 허용하지 않기 때문에 MQ가 이런 식으로 대답한다면, 제가 뭐라고 말할 수 있습니까? 다른 잼이 엄청나게 많다는 점을 감안할 때 이것은 전체 MT5 프로젝트의 완전한 실패입니다.

원하는 경우 각 반환 코드를 살펴보고 가능한 주요 상황을 확인할 수 있습니다.

나는 당신과 같은 MQL5의 경험이 있는 사람과 이것을 하고 싶습니다. 시간과 필요성이 있을 때까지 기다리십시오. 많은 계획에서 훨씬 더 편리한 4개가 더 있지만 하나님께 감사드립니다.

 

-Alexey- :

기성 솔루션, 최소한 오류 및 반환 코드 처리에 대한 가이드


어떤 코드가 처리 문제를 일으키나요?


코드

식별자

설명

10004

TRADE_RETCODE_REQUOTE

인용하다

10006

TRADE_RETCODE_REJECT

요청 거부됨

10007

TRADE_RETCODE_CANCEL

거래자가 요청을 취소했습니다.

10008

TRADE_RETCODE_PLACED

주문 완료

10009

TRADE_RETCODE_DONE

신청 완료

10010

TRADE_RETCODE_DONE_PARTIAL

신청이 부분적으로 완료됨

10011

TRADE_RETCODE_ERROR

요청 처리 오류

10012

TRADE_RETCODE_TIMEOUT

시간 초과로 인해 취소된 요청

10013

TRADE_RETCODE_INVALID

잘못된 요청

10014

TRADE_RETCODE_INVALID_VOLUME

요청의 잘못된 볼륨

10015

TRADE_RETCODE_INVALID_PRICE

요청에 잘못된 가격

10016

TRADE_RETCODE_INVALID_STOPS

요청에서 잘못된 중지

10017

TRADE_RETCODE_TRADE_DISABLED

거래 금지

10018

TRADE_RETCODE_MARKET_CLOSED

시장이 닫혀있다

10019

TRADE_RETCODE_NO_MONEY

요청을 이행하기에 자금이 충분하지 않습니다

10020

TRADE_RETCODE_PRICE_CHANGED

가격이 변경되었습니다

10021

TRADE_RETCODE_PRICE_OFF

요청을 처리할 따옴표가 없습니다.

10022

TRADE_RETCODE_INVALID_EXPIRATION

요청에 잘못된 주문 만료 날짜가 있습니다.

10023

TRADE_RETCODE_ORDER_CHANGED

주문 상태가 변경되었습니다

10024

TRADE_RETCODE_TOO_MANY_REQUESTS

너무 잦은 요청

10025

TRADE_RETCODE_NO_CHANGES

요청에 변경 사항이 없습니다.

10026

TRADE_RETCODE_SERVER_DISABLES_AT

서버에서 자동 거래를 금지합니다.

10027

TRADE_RETCODE_CLIENT_DISABLES_AT

클라이언트 단말기에서 자동 거래를 금지합니다.

10028

TRADE_RETCODE_LOCKED

처리를 위해 차단된 요청

10029

TRADE_RETCODE_FROZEN

주문 또는 위치가 동결됨

10030

TRADE_RETCODE_INVALID_FILL

잔액 별로 지원되지 않는 주문 실행 유형 이 지정되었습니다.

10031

TRADE_RETCODE_CONNECTION

거래 서버에 연결되지 않음

10032

TRADE_RETCODE_ONLY_REAL

실제 계정에 대해서만 작업이 허용됩니다.

10033

TRADE_RETCODE_LIMIT_ORDERS

보류 중인 주문 수의 한도에 도달했습니다.

10034

TRADE_RETCODE_LIMIT_VOLUME

이 기호에 대한 주문 및 위치의 한도에 도달했습니다.


업데이트: 2012.11.14
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 

예를 들면 10004입니다. 무엇을 해야 하는지 어디에 쓰여 있습니까? 그리고 네 번째 문서에는 최소한 다음과 같은 내용이 있었습니다.

Можно без задержки обновить данные при помощи функции RefreshRates и повторить попытку. Если ошибка не исчезает, необходимо прекратить все попытки торговых операций и изменить логику программы.

 
sergeev :

어떤 코드가 처리 문제를 일으키나요?

10006 (어떤 이유로 거부되었으며 다른 코드에 표시되지 않은 다른 이유는 무엇입니까?)

10011, 10013, 10028

 
A100 :

10006 (어떤 이유로 거부되었으며 다른 코드에 표시되지 않은 다른 이유는 무엇입니까?)

10011, 10013, 10028

나는 그 질문을 지지한다. MQ, 당신에게 친절한 요청. 이 4가지 코드에 대해 가능한 한 자세히 설명하십시오.
 

동료들은 이미 진실을 찾는 데 지쳤습니다. 주제가 제가 필요한 내용과 비슷해서 도움을 청하면서 여기에 글을 씁니다!

나는 즉시 실행 으로 주문을 하고, 모든 틱이 멈추는 동안 가격을 확인하고 가능하면 추적합니다. 그런데 어떤 이유에서인지 항상 10013 오류가 반환됩니다.나는 가능한 모든 포럼을 검색하고 초기 주문의 거의 모든 라인을 추가했습니다(설명에 이러한 유형의 작업에는 symbol, action, sl 및 tp만 있으면 충분하다고 나와 있지만. 도움이 되지 않습니다! 코드는 다음과 같습니다.

 // проверяем условие на открытую сделку
if (f_IsDealOpened()> 0 )
{  
   // здесь надо написать условия для коррекции ордеров
 MqlTradeRequest chrequest={ 0 };
     if ( 1 ) //(is_Str2)
   {
     PositionSelect ( NULL );
     if ( PositionGetInteger ( POSITION_TYPE )== 0 )
    {
        chrequest.symbol= PositionGetSymbol ( 0 );
        chrequest.order= PositionGetInteger ( POSITION_IDENTIFIER );
        chrequest.volume= PositionGetDouble ( POSITION_VOLUME );
        chrequest.action= TRADE_ACTION_SLTP ;
        chrequest.sl = latest_price.bid - TrailingStop;
        chrequest.tp = PositionGetDouble ( POSITION_TP );

     }
     else
     {
        chrequest.symbol= PositionGetSymbol ( 0 );
        chrequest.order= PositionGetInteger ( POSITION_IDENTIFIER );
        chrequest.volume= PositionGetDouble ( POSITION_VOLUME );
        chrequest.action= TRADE_ACTION_SLTP ;
        chrequest.sl = latest_price.ask + TrailingStop;
        chrequest.tp = PositionGetDouble ( POSITION_TP );
         Alert ( PositionSelect ( NULL ));
     
     }    
    }
     MqlTradeResult chresult;
     if ( OrderSend (chrequest,chresult)== 0 ) 
         {
             Alert ( "Ошибка расчета функции OrderSend!" );
             return ;
         }    
         // анализируем код возврата торгового сервера
         if (mresult.retcode== 10009 || mresult.retcode== 10008 ) //запрос выполнен или ордер успешно помещен
           {
             Alert ( "Ордер по изменению SL успешно помещен, тикет ордера #: " ,mresult.order, "!!" );
            open_order_ticket = mresult.order;
            open_order_price = mresult.price;
             return ;
           }
         else
           {
             Alert ( "Запрос на измнение ордера не выполнен - код ошибки: " , GetLastError ());
             return ;
           }
   
   
   return ;
}