거래 중 거래 - 페이지 8

 
Igor Zakharov :

"일반" 로봇에서는 내가 설명한 경우를 전혀 눈치채지 못했습니다. 그러나 하나는 보안 시스템을 만들라는 요청을 받았습니다. 조건은 포지션이 항상 잠겨 있다는 것이었습니다(실제 포지션이든 보류 중인 주문 이든), 즉, 매수 매수는 매도 매수와 같습니다. 이 사례를 통해 상위 5위 안에 드는 주문/포지션/거래를 계산하는 뉘앙스를 알게 되었습니다.

차이점은 제가 스스로 설명했듯이:) 브로커로부터 응답을 받은 네 명은 먼저 "테이블"을 열린 주문 및 기록과 동기화한 다음 사용자에게 브로커의 응답을 알려줍니다. 5개는 즉시 이 답변을 우리에게 브로드캐스트하고 병렬로 "테이블"을 편집합니다(모든 mql 프로그램은 이 "테이블"에서 데이터를 읽습니다). 밀리세컨드 타이머를 포착하는 것은 바로 이 순간입니다. 그러나 테스터에서 이것을 실행하지 않는 이유는 무엇입니까?

결론부터 말하자면...

아니, 상황이 악화되고 있습니다.

잠시 동안 보류(또는 시장)에서 역사적(실행 또는 취소)으로 변환되는 순간의 주문은 터미널에서 완전히 사라집니다. 보류 중(또는 "시작된" 시장)이나 역사적 시장이 아닙니다.

즉, 실행이 아니라 이 두 테이블을 동기화하는 것입니다. 서버에서 응답이 오면("주문이 실행되었으며 이러한 트랜잭션이 생성되었습니다") 한 테이블에서 삭제되고 다른 테이블에 입력되지 않습니다.

 
Andrey Khatimlianskii :

아니, 상황이 악화되고 있습니다.

잠시 동안 보류(또는 시장)에서 역사적(실행 또는 취소)으로 변환되는 순간의 주문은 터미널에서 완전히 사라집니다. 보류 중(또는 "시작된" 시장)이나 역사적 시장이 아닙니다.

즉, 실행이 아니라 이 두 테이블을 동기화하는 것입니다. 서버에서 응답이 오면("주문이 실행되었으며 이러한 트랜잭션이 생성되었습니다") 한 테이블에서 삭제되고 다른 테이블에 입력되지 않습니다.

이것은 확인하는 것이 흥미롭습니다. Igor Makanu 가 문제로 저를 흥미롭게 했습니다. https://www.mql5.com/en/forum/6343/page1097#comment_12518742

무릎에서 첫 번째 근사치로 제작되었습니다. 그런 다음 OnOrder 및 OnOrderTransaction의 작동과 터미널의 거래 환경 상태에 대한 통계를 수집하고 너무 게으르지 않다면 데모 테스트를 통해 다른 계정/브로커의 상태를 확인할 수 있습니다.

그러면 분석이 가능할 것입니다. 지금까지 다음과 같은 가정이 이루어졌습니다. 1. 부분 실행이 확인되지 않고 계정의 실행 기능이 확인되지 않았습니다. 시장 주문을 보냈고, 오픈 포지션을 기억하고, 거래가 이 포지션을 닫을 때까지 대기합니다. 로그를 작성하고 반대 방향으로 다시 엽니다. 2. 이상적으로는 OnOrderTransaction에서 특정 트랜잭션을 포착하는 것이지만, 지금까지는 이 작업을 수행했습니다. 두 이벤트 모두에서 모든 것을 동일하게 확인합니다.

당연히 코드는 최적이 아닙니다. 위의 게시물에 설명된 것처럼 모든 것이 좋지 않은 경우 주문-위치 손실이 있는 위치를 이미 알고 있습니다.

 //+------------------------------------------------------------------+
//|                                                 Test_Makalu2.mq5 |
//|                                           Copyright 2019, Allex@ |
//|                                                 alex-all@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, Allex@"
#property link        "alex-all@mail.ru"
#property version    "1.00"
#include <Expert\Expert.mqh>
//--- input parameters
input int       TP=20 0 ;
input int       SL=20 0 ;
input double    Lot= 0.01 ;
input string    File;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class CExpertTest : public CExpert
  {
public :
   int                type;
   ulong              order;
   ulong              deal;
   ulong              position;
   bool               send;
   bool               placed;
   bool               opened;
   bool               history;
   datetime           last_history;

                     CExpertTest() {order= 0 ;};
                    ~CExpertTest() {};
   bool               Buy( double volume, double price, double sl, double tp, const string comment= "" ) { return m_trade.Buy(volume, price, sl, tp,  comment);};
   bool               Sell( double volume, double price, double sl, double tp, const string comment= "" ) { return m_trade.Sell(volume, price, sl, tp,  comment);};
   bool               CheckOrder( ulong order)
     {
       ulong state;
       if ( OrderSelect (order))
        {
         if ( OrderGetInteger ( ORDER_STATE )== ORDER_STATE_FILLED )
            position= OrderGetInteger ( ORDER_POSITION_ID );
        }
       else
         if ( HistoryOrderSelect (order))
           {
             if ( HistoryOrderGetInteger (order, ORDER_STATE ,state)&& state== ORDER_STATE_FILLED )
               position= HistoryOrderGetInteger (order, ORDER_POSITION_ID );
           }
         else
           {
             return false ;
           }
       return true ;

     }
   virtual bool       Processing( void )
     {
       double price;
       if (order== 0 )
        {
         last_history= TimeCurrent ();
         price=m_symbol.Ask();
         if (Buy(Lot,price,m_symbol.NormalizePrice(price-SL*m_symbol. Point ()),m_symbol.NormalizePrice(price+TP*m_symbol. Point ())))
             if (m_trade.ResultRetcode()== TRADE_RETCODE_DONE )
              {
               //ulong deal2;
               deal=m_trade.ResultDeal();
               order=m_trade.ResultOrder();
               if (order!= 0 && CheckOrder(order))
                   return true ;
              }
        }
       return false ;
     }
   void                OnTrade ()
     {
       if (order== 0 || !CheckOrder(order))
         return ;
       HistorySelect (last_history, TimeCurrent ());
       for ( int i= HistoryDealsTotal ()- 1 ; i>= 0 ; i--)
        {
         ulong ticket= HistoryDealGetTicket (i);
         ulong ordticket= HistoryDealGetInteger (ticket, DEAL_ORDER );
         ulong pos= HistoryDealGetInteger (ticket, DEAL_POSITION_ID );
         if (pos==position || ordticket==order || ticket==deal)
           {
             int entry= HistoryDealGetInteger (ticket, DEAL_ENTRY );
             ulong type= HistoryDealGetInteger (ticket, DEAL_TYPE );
             if (pos==position && entry== DEAL_ENTRY_OUT )
              {
               Refresh();
               double price;
               double sl;
               double tp;
               bool result= false ;
               datetime dt= TimeCurrent ();
               if (type== DEAL_TYPE_SELL )
                 {
                  price=m_symbol.Bid();
                  sl=m_symbol.NormalizePrice(price+SL*m_symbol. Point ());
                  tp=m_symbol.NormalizePrice(price-TP*m_symbol. Point ());
                  result=Sell(Lot,price,sl,tp);
                 }
               if (type== DEAL_TYPE_BUY )
                 {
                  price=m_symbol.Ask();
                  sl=m_symbol.NormalizePrice(price-SL*m_symbol. Point ());
                  tp=m_symbol.NormalizePrice(price+TP*m_symbol. Point ());
                  result=Buy(Lot,price,sl,tp);
                 }
               if (result && m_trade.ResultRetcode()== TRADE_RETCODE_DONE )
                 {
                  deal=m_trade.ResultDeal();
                  order=m_trade.ResultOrder();
                   if (order!= 0 && CheckOrder(order))
                     last_history=dt;
                 }
              }
           }
        }
     }
  };
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
CExpertTest Expert;
//---
int OnInit ()
  {
   if (!Expert.Init( Symbol (), Period (), Point ()))
       return INIT_FAILED ;
   Expert.OnTradeProcess( true );
   return ( INIT_SUCCEEDED );
  }
//---
void OnTick ()
  {
   Expert. OnTick ();
  }
//+------------------------------------------------------------------+
void OnTrade ()
  {
   Expert. OnTrade ();
  }
//+------------------------------------------------------------------+
void OnTradeTransaction ( const MqlTradeTransaction & trans,
                         const MqlTradeRequest & request,
                         const MqlTradeResult & result)
  {
   Expert. OnTrade ();
  }
Вопросы от начинающих MQL5 MT5 MetaTrader 5
Вопросы от начинающих MQL5 MT5 MetaTrader 5
  • 2019.07.21
  • www.mql5.com
Подскажите пожалуйста, такой показатель тестера в жизни реален? И хороший это или плохой результат за год с депо 3000...
 
Aleksey Mavrin :

이것은 확인하는 것이 흥미롭습니다. Igor Makanu 가 문제로 저를 흥미롭게 했습니다. https://www.mql5.com/ru/forum/6343/page1097#comment_12518742

토론 https://www.mql5.com/ru/forum/6343/page1098#comment_12519819 에 솔루션이 있었지만 토론의 일부가 손실되었습니다(((
 
솔루션은 MT4Orders 스레드에 있습니다. 하지만 모든 갈퀴는 스스로 느껴야 합니다.)
 
Aleksey Mavrin :

무릎에서 첫 번째 근사치로 제작되었습니다.

이 데모는 보는 것이 좋습니다. ForexTimeFXTM-Demo01

 
Igor Zakharov :

"일반" 로봇에서는 내가 설명한 경우를 전혀 눈치채지 못했습니다.

이가 거래 라이브러리는 다양한 데모 계정에 대한 스트레스 테스트를 통해 확인할 수 있고 확인해야 합니다. 모든 것을 차질 없이 통과해야 합니다.

글쎄, 이것이 일어나려면 저자는 MT5 농담에 개인적으로 익숙해 져야합니다. 내 연습에서는 이것으로도 충분하지 않다는 것이 밝혀졌습니다.

서버를 거래하라는 끔찍한 스팸에 의해 밝혀지지 않은 매우 구체적인 것들이 있습니다. 피드백 덕분에 개발자 자신도 인식하지 못하는 매우 이상한 동작을 찾을 수 있었습니다.

 
Igor Makanu :
토론 https://www.mql5.com/ru/forum/6343/page1098#comment_12519819 에 솔루션이 있었지만 토론의 일부가 손실되었습니다(((
안드레이 카팀리안스키 :
솔루션은 MT4Orders 스레드에 있습니다. 하지만 모든 갈퀴는 스스로 느껴야 합니다.)

예, 갈퀴는 항상 흥미롭습니다. 그런 다음 전문가가 어떻게했는지보십시오. fxsaber 솔루션은 간결하다는 점에서 독창적이지만 그 솔루션에서 나는 한 가지 점에서 매복을 봅니다. 매뉴얼에 따르면 포지션 티켓은 일반적으로 열린 주문의 티켓이지만 항상 그런 것은 아닙니다.

내 결정에서 나는 이것부터 진행했다.

fxsaber
fxsaber
  • www.mql5.com
Опубликовал пост "Out-Of-Sample" - где расположить, справа или слева? Когда-то в паблике столкнулся с мнением, что OOS должен располагаться только справа. Т.е. расположение его слева от интервала Оптимизации - ошибка. Я с этим был категорически не согласен, т.к. не видел разницы. Теперь вижу. Ошибался, был не прав... Опубликовал пост...
 
fxsaber :

이가 거래 라이브러리는 다양한 데모 계정에 대한 스트레스 테스트를 통해 확인할 수 있고 확인해야 합니다. 모든 것을 차질 없이 통과해야 합니다.

내가 설명한 로봇에서는 브로커가 아니라 타이머였다. 테스트용으로 200ms를 사용했는데 돌려주니 상대방이 5ms로 설정해줬습니다. 거의 모든 계정에서 작동할 때마다 5시에.

중요한지는 모르겠지만 timeBeginPeriod(1) 와인이 사용되었습니다. 표준 20ms 미만에서 모든 일이 발생했습니다.

 
Aleksey Mavrin :

포지션 티켓 일반적으로 개설된 주문의 티켓이지만 항상 그런 것은 아닙니다.

잘 기억나지는 않지만 항상 기억합니다.

 
fxsaber :

잘 기억나지는 않지만 항상 기억합니다.

예, 당신이 옳습니다. 왜냐하면 이 경우 수명 내내 일정한 위치 식별자에 대해 이야기하고 있습니다. 롤오버 및 네팅 중에 변경되는 포지션 티켓과 혼동했습니다.

이해가 안 가네요 - 포지션이 부분적으로 마감되었을 때 - 티켓은 chtoli를 포지션에 영향을 미친 마지막 주문의 티켓으로 변경하지 않습니까?

거래를 사용하는 것은 중복됩니다. 제 코드를 검토하겠습니다. 감사합니다. 내가 포럼에 올라간 것은 당연합니다)

현재 목록에도 없고 과거 목록에도 없는 "분실된 주문"에 대한 질문에: 이것은 버그가 아닌 것 같습니다. 작업의 기능을 주의 깊게 살펴봐야 합니다.

바인딩 터미널-서버 MT-Market (즉석 실행의 경우 시장이 사라짐). 제 생각에는 봐요-단말기가 시장가 주문을 보내고 동기 기능의 경우 서버에서 대기하고 응답을 받는데,

오류가 아닌 경우 대답은 TRADE_RETCODE_DONE(즉석 재인용의 경우 지금까지는 시장 유형 실행)일 수 있습니다. 이는 본질적으로 서버가 주문을 시장 및 자체로 더 보냈다는 것을 의미합니다.

답변을 기다리고 있습니다. 현재 주문 상태는 내가 틀리지 않고 해당 티켓을 알고 있는 경우 ORDER_STATE_STARTED 입니다. 주문이 실행되면 서버가 OnTradeTransaction을 터미널에 보내고 주문 상태가 ORDER_STATE_FILLLED로 변경되고 거래가 알려지게 됩니다.

그리고 위치. 이 순간에만 단말기는 주문을 이력에 기록합니다. 이전에는 그가 이것을 하지 않기 때문입니다. 그에게 무슨 일이 일어 났는지 확실하지 않습니다. 그는 이미 서버의 기본 응답을 제공했습니다.

ECN 네트워크 또는 다른 곳에서 주문이 실행되고 두 목록에 없는 시간입니다. 저것들. 시장가 주문의 경우 일반적으로 내역에만 나타납니다(즉석 실행 중 재호가의 경우는 확실하지 않음).

공개 목록에 없을 것입니다. 그리고 보류 중일 때 작동하면 이미 시장가 주문이 되었기 때문에 열린 목록에서 제거되고 마켓 서버가 응답하기를 기다렸다가 히스토리에 기록됩니다.

내 말이 맞아?