경고: 전문가가 보낸 MT4 터미널 복제 명령 - 페이지 5

 

안녕 친구들:

이전에 답변을 드리지 못해 죄송합니다. Metaquotes로부터 알림을 받지 않았기 때문에 귀하의 게시물을 인지하지 못했습니다. RaptorUK가 권장한 대로 나는 실제로 틱을 열었지만 그들은 전혀 대답하지 않았습니다. 필요할 때 JamesMadden 과 동일한 작업을 수행합니다. 그냥 주문을 종료하고 스프레드를 느슨하게 합니다. 그렇게 위험하지 않다면 그냥 두겠습니다! (내 EA가 수익성이 있다면 장기적으로 느슨한 것보다 더 많은 승리를 거둘 것입니다.) 그러나 물론 저는 버그가 마음에 들지 않습니다.

이제 빌드 600에 새로운 문제가 생겼습니다. 누군가 알고 있다면 어떻게 대답할 수 있는지 알고 싶습니다. :)

PD: 이 게시물이 업데이트될 때 이 웹 애플리케이션에서 이메일을 보내도록 하려면 어떻게 해야 합니까? 나는 이미 주제를 구독하고 있습니다.

 
Ricardo1 :

안녕 친구들:

이전에 답변을 드리지 못해 죄송합니다. Metaquotes로부터 알림을 받지 않았기 때문에 귀하의 게시물을 인지하지 못했습니다. RaptorUK가 권장한 대로 나는 실제로 틱을 열었지만 그들은 전혀 대답하지 않았습니다. 필요할 때 JamesMadden 과 동일한 작업을 수행합니다. 주문을 종료하고 스프레드를 느슨하게 합니다. 그렇게 위험하지 않다면 그냥 두겠습니다! (내 EA가 수익성이 있다면 장기적으로 느슨한 것보다 더 많은 승리를 거둘 것입니다.) 그러나 물론 저는 버그가 마음에 들지 않습니다.

이제 빌드 600에 새로운 문제가 생겼습니다. 누군가 알고 있다면 어떻게 대답할 수 있는지 알고 싶습니다. :)

당신이 알게되면 나에게 알려주십시오. . . 나는 2013년 3월부터 회신이 없는 공개 티켓을 가지고 있습니다. 내가 제안할 수 있는 것은 뉴스나 답장을 요청할 때마다 새로운 댓글을 계속 추가하는 것뿐입니다.


PD: 이 게시물이 업데이트될 때 이 웹 애플리케이션에서 이메일을 보내도록 하려면 어떻게 해야 합니까? 나는 이미 주제를 구독하고 있습니다.

이메일 알림이 몇 년 동안 작동하지 않았습니다. . . 서비스 데스크에 보고 할 수 있습니다.
 
RaptorUK :
당신이 알게되면 나에게 알려주십시오. . . 나는 2013년 3월부터 회신이 없는 공개 티켓을 가지고 있습니다. 내가 제안할 수 있는 것은 뉴스나 답장을 요청할 때마다 새로운 댓글을 계속 추가하는 것뿐입니다.

이메일 알림이 몇 년 동안 작동하지 않았습니다. . . 서비스 데스크에 보고할 수 있습니다.



안녕,

정확히 이 문제를 검색하기 때문에 이 주제를 찾았습니다. 나는 전에 문제를 눈치채지 못했지만 오늘 나에게 일어났습니다.

앞에서 언급한 것처럼 거래를 기록하는 전문가 로그와 상관없이 EA 또는 개인이 수행한 모든 거래를 기록하는 MetaTrader 저널이 있습니다. 오늘 내 포트폴리오에서 불과 몇 초 전에 이루어진 거래의 사본인 거래를 찾았지만 두 번째 거래는 전문가 로그나 MetaTrader 저널에 나타나지 않았습니다.

브로커에게 들어오는 요청 로그를 실행된 거래와 비교하도록 요청했지만 로그를 보관하지 않거나 조사하고 싶지 않을 것 같습니다.

EA가 2개의 주문을 했다면 저널에서 둘 다 볼 것으로 예상됩니다. 어떤 이유로 데스크탑 응용 프로그램이 요청을 복제하더라도 서버가 응답하고 두 번째 거래를 기록할 것으로 예상합니다. 거래가 클라이언트가 아닌 서버에서 실행되는 것으로 보입니다.

문제를 발견한 것은 이번이 처음이며 문제를 재현할 방법을 찾을 수 없습니다. 내가 지금 작업하고 있는 금액은 매우 적기 때문에 가치는 중요하지 않지만 MetaTrader의 실행 가능성에 대한 우려를 불러일으킵니다.

한동안 떠돌던 주제에 내 생각을 빌려야겠다고 생각했습니다.

편집하다:

더 확인하고 다른 사례를 찾았습니다. 주문은 이미 손절매 로 마감되었으므로 눈치채지 못했습니다. 두 경우 모두 EA는 예상 주문을 했습니다. 이는 팬텀 주문에 해당하는 로그인 메시지가 표시된 직후 저널에 표시됩니다.

팬텀 오더가 발생했다고 생각하는 사람이 있으면 저널에서 로그인 메시지를 확인하십시오. 중요할 수 있습니다.

 

이 성가신 문제의 영향을 받는 사람은 나뿐만이 아닌 것 같습니다. Spikedog과 마찬가지로 내 EA가 시장 주문을 요청하여 밀리초 내에서 동일한 로트 크기의 또 다른 중복 항목이 발생했습니다. 중복 주문 로그는 저널에 표시되었지만 전문가 탭에는 표시되지 않았습니다. 그 이후로 OrderSend() 바로 전에 동일한 바(열린 바에서만 거래) 내에서 이중 거래를 필터링하여 이 문제를 방지하기 위해 코드를 약간 수정했습니다.

이렇게 중복 거래 문제가 발생한 것은 처음입니다. 그 이후로 3명의 중개인과 500개 이상의 거래를 열었고 지금까지 문제가 없었습니다. Btw, 후속 거래는 다시 잘 작동합니다.

중복 문제가 발생할 때 OrderSend()를 처리하는 코드가 첨부되어 있습니다. 내 EA가 중복 주문의 원인인지 알 수 없습니다. 내가 지금 생각할 수있는 유일한 가능한 이유는 아마도 매우 드문 경우 일 것입니다. 서버가 내 OrderSend를 처리했지만 어떻게 든 "-1"을 반환하고 내 EA는 첫 번째를 requote 로 처리하는 또 다른 요청을 진행합니다. 제 추측일 뿐입니다.


             bool Buy_Ticket = false ;
             while (Buy_Ticket== false ){     //Loop to solve Requote issues
               for ( int BT_count= 0 ; BT_count < RequoteTries; BT_count++){
                   if (! IsTradeAllowed ()) Sleep (RequoteTries_WaitingTime);
                   RefreshRates ();

                   int B_Spread = MarketInfo ( Symbol (), MODE_SPREAD );   //TO CAPTURE EXACT SPREAD UPON BUY ORDER FOR SL
                  Buy_Ticket = OrderSend ( Symbol (), 0 ,order_lotsize, Ask ,Slippage, 0 , 0 ,EntryCode_comment,Magic, 0 ,Blue) > 0 ;

               
                   if (Buy_Ticket== true ){     //Modify to give SL & TP if new buy order executed
                     for ( int buyMod= 0 ; buyMod < OrdersTotal (); buyMod++){
                         if ( OrderSelect (buyMod, SELECT_BY_POS , MODE_TRADES )){
                           if (( OrderSymbol ()!= Symbol ()) || ( OrderType ()!= OP_BUY )) continue ;
                           if (( OrderStopLoss ()== 0 ) && ( OrderTakeProfit ()== 0 )){
                               double B_SL = NormalizeDouble (( OrderOpenPrice ()-((B_Spread* Point )+stoploss)), Digits );
                               double B_TP = NormalizeDouble (( OrderOpenPrice ()+takeprofit), Digits );

                               bool buy_ModSL_succeed = false ;
                               while (buy_ModSL_succeed== false ){     //Loop to solve SL+TP modify Requote issues   
                                 for ( int buyMod_count= 0 ; buyMod_count < RequoteTries; buyMod_count++){
                                     if (! IsTradeAllowed ()) Sleep ( 5000 );
                                     RefreshRates ();                                 
                                     if ( OrderModify ( OrderTicket (), OrderOpenPrice (), B_SL, B_TP, 0 , Red)== false ) continue ;
                                    buy_ModSL_succeed = true ;
                                     Print (entrycode_txt, " initiated Long trade successfully modified SL & TP." );
                                     break ;                        
                                 }   //End FOR loop for requote handling
                                 if (buy_ModSL_succeed == false ){
                                    getError = GetLastError();
                                     Alert ( "Error: " ,getError, " in Buy order#:" , OrderTicket (), " modify for SL:" ,B_SL, " & TP:" ,B_TP, " after " ,RequoteTries, " attempts." );
                                     break ;
                                 }
                              }   //End WHILE loop for SL+TP modify requote handling
                           }   //End IF statement to select new orders without SL & TP
                        }   //End IF orderselect
                     }   //End FOR loop to modify new orders without SL & TP 
                  }   //End IF statement when buy order accepted & need SL+TP modify

                   if (Buy_Ticket== false ) continue ;
                   else break ;
               }   //----------------------------//End FOR loop to carry out ordersend for buy trade when requote
               if (Buy_Ticket== false ) break ;     //Exit WHILE loop to handle Requote issues, fail to buy
            }   //-------------------------------//End WHILE loop to solve Requote issues
 
BigFisherman :

내 EA가 중복 주문의 원인인지 알 수 없습니다.

코드에서 이 오류와 연결되었을 수 있습니다. 수정하고 다시 테스트해야 합니다. . .

                  Buy_Ticket = OrderSend ( Symbol (), 0 ,order_lotsize, Ask ,Slippage, 0 , 0 ,EntryCode_comment,Magic, 0 ,Blue) > 0 ;

               
                   if (Buy_Ticket== true ){     //Modify to give SL & TP if new buy order executed

OrderSend()bool 이 아닌 int 를 반환하므로 반환 값이 "true"인지 확인하는 것은 올바르지 않습니다.

 

@빅피셔맨

BTW 귀하의 코드에 무슨 일이 일어나고 있습니까?

 if (Buy_Ticket== true ){     //Modify to give SL & TP if new buy order executed
 if (Buy_Ticket== false ) continue ;

다시 한번 ?

 else break ;
 
RaptorUK :

코드에서 이 오류와 연결되었을 수 있습니다. 수정하고 다시 테스트해야 합니다. . .

OrderSend()bool 이 아닌 int 를 반환하므로 반환 값이 "true"인지 확인하는 것은 올바르지 않습니다.


제안에 대해 raptoruk에게 감사드립니다. 당신이 맞습니다 :)
 
BigFisherman :

제안에 대해 raptoruk에게 감사드립니다. 나는 그것을 알고 있다. 그러나 제시된 코드가 약간 혼란스럽긴 하지만 유효하기 때문에 이것이 중복 거래의 원인이라고 생각하지 않습니다.
코드는 어떻게 유효합니까? OrderSend()가 작동하면 0보다 큰 값이 반환됩니다. 즉 티켓 번호가 반환되고 실패하면 -1이 반환되며 true 또는 false를 테스트하는 것입니다. . . 코드를 수정하고 불확실성을 제거 하십시오.
 
RaptorUK :
코드는 어떻게 유효합니까? OrderSend()가 작동하면 0보다 큰 값이 반환됩니다. 즉 티켓 번호가 반환되고 실패하면 -1이 표시되며 true 또는 false를 테스트합니다. . . 코드를 수정하고 불확실성을 제거하십시오.



다시 한번 감사합니다.

건배!

 
RaptorUK :
코드는 어떻게 유효합니까? OrderSend()가 작동하면 0보다 큰 값이 반환됩니다. 즉 티켓 번호가 반환되고 실패하면 -1이 반환되며 true 또는 false를 테스트하는 것입니다. . . 코드를 수정하고 불확실성을 제거하십시오.


안녕하세요 RaptorUK입니다.



이 스레드의 주제에 관한 질문은 아니지만 이전 게시물을 예로 들어 mql4 코딩에 대한 이해를 높이고 나 같은 다른 초보자에게도 도움이 되었으면 합니다. 새 스레드, 이것을 삭제하고 알려주세요).

Buy_Ticket을 int가 아닌 bool로 선언하는 초기 방법에 대해 처음에는 약간 혼란스러워서 이에 대한 추가 테스트를 수행했습니다. bool로 OrderSend()를 읽는 원래 방식에 동의하지만(혼란스러운) 좋은 코딩 방법은 아니지만 테스트 결과 유효합니다. 읽기 쉽게 하기 위해 다음을 코딩했습니다. 조언을 부탁드리며 시간 내주셔서 감사합니다.


추신: 조언한 대로 OrderSend()를 int로 읽도록 이미 EA를 수정했습니다.



 //+------------------------------------------------------------------+
//|                                                    Test_Bool.mq4 |
//|                                     Copyright 2014, BigFisherman |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, BigFisherman"

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---
   
//---
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
{
//---
   
   for ( int SimRun= 0 ; SimRun< 3 ; SimRun++){
       bool Buy_Ticket = 0 ;
       int Ordersend = 0 ;             //AS AN EXAMPLE TO SIMULATE OrderSend() RETURNED CODE

       switch (SimRun)
      {
         case 0 : break ;             //FOR Ordersend==0
         case 1 :
         {
            Ordersend = 1 ;           //SIMULATE SUCCESSFUL ORDERSEND() RETURNING TICKET NO. > 0
             break ;
         }
         case 2 :
         {
            Ordersend = - 1 ;         //SIMULATE FAILED ORDERSEND() RETURNING "-1"
             break ;
         }
      }
      
      
       // (MY ORIGINAL WAY OF CODING)   Buy_Ticket = OrderSend(Symbol(),0,order_lotsize,Ask,Slippage,0,0,EntryCode_comment,Magic,0,Blue) > 0;
      Buy_Ticket = Ordersend > 0 ;   //SIMPLIFIED CODE FOR EASIER READING
      
      
       if (Buy_Ticket== true ){
         Print ( "** Buy_Ticket returns true  **  SimRun: " +SimRun+ "  Ordersend: " +Ordersend+ "  Buy_Ticket: " +Buy_Ticket);
      }
       else {                         //if (Buy_Ticket==false)
         Print ( "** Buy_Ticket returns false **  SimRun: " +SimRun+ "  Ordersend: " +Ordersend+ "  Buy_Ticket: " +Buy_Ticket);
      }
   }
   return ( 0 );
}
//+------------------------------------------------------------------+


신문

2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns false **  SimRun: 0  Ordersend: 0  Buy_Ticket: 0
2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns true  **  SimRun: 1  Ordersend: 1  Buy_Ticket: 1
2014.03.30 12:57:31.223 2014.03.25 23:30  Test_Bool AUDJPY,M30: ** Buy_Ticket returns false **  SimRun: 2  Ordersend: -1  Buy_Ticket: 0
사유: