특정 브로커의 라이브 계정에 대한 다중 주문 입력 문제

 

MQL5 사용자 여러분.

현재 EA에서 여러 주문 실행 문제를 겪고 있지만 특정 브로커에만 해당됩니다.

내 EA는 전략 테스터에서 완벽하게 작동합니다. 또한 라이브 거래 모드에서 다른 브로커와도 작동합니다.

특정 중개인을 통해 내 EA는 종종 같은 크기의 주문 10개를 동시에 주문합니다.

브로커와 단말 간의 통신으로 인해 문제가 발생한 것으로 보입니다.

아래는 현재 코드이며 현재 코드는 주문이 실행되면 10번 확인합니다.

주문이 전송된 직후 EA가 retcode==10009 또는 retcode==10008을 수신하면 루프가 중지되고 1개의 주문만 열립니다. 이것은 이상적인 경우이며 잘 작동하는 시나리오입니다.

그러나 터미널이 주문을 보낸 직후에 retcode==10009 또는 retcode==10008을 받지 못한 경우 동일한 크기의 10개 주문을 열 수 있습니다. 다른 사람들도 같은 문제를 겪고 있다고 들었습니다.

이 다중 주문 입력 문제를 어떻게 멈출 수 있습니까?

어떤 제안이라도 정말 감사하겠습니다.

감사합니다.

   for(int i=0;i<10;i++)
   {
     
      volume=NormalizeDouble(volume, lotDigit);
      if(volume<=0.0) break;
     
     
      if(Type==POSITION_TYPE_SELL)
      {
         request.type=ORDER_TYPE_SELL;
         request.price=SymbolInfoDouble(mSymbol,SYMBOL_BID);
        
         if(TP!=0) takeprofit = request.price-TP*mPoint;
         if(SL!=0) stoploss = request.price+SL*mPoint;
      }
     
     
      if(Type==POSITION_TYPE_BUY)
      {
         request.type=ORDER_TYPE_BUY;
         request.price=SymbolInfoDouble(mSymbol,SYMBOL_ASK);
        
         if(TP!=0) takeprofit = request.price+TP*mPoint;
         if(SL!=0) stoploss = request.price-SL*mPoint;
      }
     
     
      request.action = TRADE_ACTION_DEAL;
      request.symbol = mSymbol;
      request.volume = MathMin(volume,SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_MAX));
      request.sl = stoploss;
      request.tp = takeprofit;
      request.deviation=SymbolInfoInteger(mSymbol,SYMBOL_SPREAD);
     

     
      request.type_filling=ORDER_FILLING_FOK;
      request.comment=DoubleToString(Money,2)+"$";
     
      if(!OrderCheck(request,check))
      {
         if(check.margin_level<100) volume-=SymbolInfoDouble(mSymbol,SYMBOL_VOLUME_STEP);
         Print("OrderCheck Code: ",check.retcode);
         continue;
      }
     
     
      if(!OrderSend(request,result) || result.deal==0 )
      {
         Print("OrderSend Code: ",result.retcode);
         if(result.retcode==TRADE_RETCODE_TRADE_DISABLED) break;
         if(result.retcode==TRADE_RETCODE_MARKET_CLOSED) break;
         if(result.retcode==TRADE_RETCODE_NO_MONEY) break;
         if(result.retcode==TRADE_RETCODE_TOO_MANY_REQUESTS) Sleep(5000);
         if(result.retcode==TRADE_RETCODE_FROZEN) break;
         if(result.retcode==TRADE_RETCODE_CONNECTION) Sleep(15000);
         if(result.retcode==TRADE_RETCODE_LIMIT_VOLUME) break;
        
      }
      else if(result.retcode==10009 || result.retcode==10008)
      {
          Print("OrderSend Code: ",result.retcode);
          volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.
         
          if(Type == POSITION_TYPE_BUY) {mBuyPositionCnt = mBuyPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          if(Type == POSITION_TYPE_SELL) {mSellPositionCnt = mSellPositionCnt + 1.0; cntLotCalculation = cntLotCalculation + 1;}
          break;
      }
     
     

      Sleep(1000);
   }
  

 

 
FinanceEngineer :

MQL5 사용자 여러분.

현재 EA에서 여러 주문 실행 문제를 겪고 있지만 특정 브로커에만 해당됩니다.

내 EA는 전략 테스터에서 완벽하게 작동합니다. 또한 라이브 거래 모드에서 다른 브로커와도 작동합니다.

특정 중개인을 통해 내 EA는 종종 같은 크기의 주문 10개를 동시에 주문합니다.

브로커와 단말 간의 통신으로 인해 문제가 발생한 것으로 보입니다.

아래는 현재 코드이며 현재 코드는 주문이 실행되면 10번 확인합니다.

주문이 전송된 직후 EA가 retcode==10009 또는 retcode==10008을 수신하면 루프가 중지되고 1개의 주문만 열립니다. 이것은 이상적인 경우이며 잘 작동하는 시나리오입니다.

그러나 터미널이 주문을 보낸 직후에 retcode==10009 또는 retcode==10008을 받지 못한 경우 동일한 크기의 10개 주문을 열 수 있습니다 . 다른 사람들도 같은 문제를 겪고 있다고 들었습니다.

이 다중 주문 입력 문제를 어떻게 멈출 수 있습니까?

어떤 제안이라도 정말 감사하겠습니다.

감사합니다.

10개의 주문을 열었을 때 어떤 코드를 받으셨나요?

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼


코드를 게시할 때 SRC 버튼 을 사용하십시오. 고맙습니다.




 
angevoyageur :

10개의 주문을 열었을 때 어떤 코드를 받으셨나요?

여보세요

각 주문에 대해 retcode==10008을 받았습니다. 10번 반복했습니다. 감사합니다.


 


   for ( int i= 0 ;i< 10 ;i++)
   {
      
      volume= NormalizeDouble (volume, lotDigit);
       if (volume<= 0.0 ) break ;
      
      
       if (Type== POSITION_TYPE_SELL )
      {
         request.type= ORDER_TYPE_SELL ;
         request.price= SymbolInfoDouble (mSymbol, SYMBOL_BID );
         
         if (TP!= 0 ) takeprofit = request.price-TP*mPoint;
         if (SL!= 0 ) stoploss = request.price+SL*mPoint;
      }
      
      
       if (Type== POSITION_TYPE_BUY )
      {
         request.type= ORDER_TYPE_BUY ;
         request.price= SymbolInfoDouble (mSymbol, SYMBOL_ASK );
         
         if (TP!= 0 ) takeprofit = request.price+TP*mPoint;
         if (SL!= 0 ) stoploss = request.price-SL*mPoint;
      }
      
      
      request.action = TRADE_ACTION_DEAL ;
      request.symbol = mSymbol;
      request.volume = MathMin (volume, SymbolInfoDouble (mSymbol, SYMBOL_VOLUME_MAX ));
      request.sl = stoploss;
      request.tp = takeprofit;
      request.deviation= SymbolInfoInteger (mSymbol, SYMBOL_SPREAD );
      

      
      request.type_filling= ORDER_FILLING_FOK ;
      request.comment= DoubleToString (Money, 2 )+ "$" ;
      
       if (! OrderCheck (request,check))
      {
         if (check.margin_level< 100 ) volume-= SymbolInfoDouble (mSymbol, SYMBOL_VOLUME_STEP );
         Print ( "OrderCheck Code: " ,check.retcode);
         continue ;
      }
      
      
       if (! OrderSend (request,result) || result.deal== 0 )
      {
         Print ( "OrderSend Code: " ,result.retcode);
         if (result.retcode== TRADE_RETCODE_TRADE_DISABLED ) break ;
         if (result.retcode== TRADE_RETCODE_MARKET_CLOSED ) break ;
         if (result.retcode== TRADE_RETCODE_NO_MONEY ) break ;
         if (result.retcode== TRADE_RETCODE_TOO_MANY_REQUESTS ) Sleep ( 5000 );
         if (result.retcode== TRADE_RETCODE_FROZEN ) break ;
         if (result.retcode== TRADE_RETCODE_CONNECTION ) Sleep ( 15000 );
         if (result.retcode== TRADE_RETCODE_LIMIT_VOLUME ) break ;
         
      }
       else if (result.retcode== 10009 || result.retcode== 10008 )
      { 
           Print ( "OrderSend Code: " ,result.retcode);
          volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.
          
           if (Type == POSITION_TYPE_BUY ) {mBuyPositionCnt = mBuyPositionCnt + 1.0 ; cntLotCalculation = cntLotCalculation + 1 ;}
           if (Type == POSITION_TYPE_SELL ) {mSellPositionCnt = mSellPositionCnt + 1.0 ; cntLotCalculation = cntLotCalculation + 1 ;}
           break ;
      }
      
      

       Sleep ( 1000 );
   }
   

 
 
FinanceEngineer :

여보세요

각 주문에 대해 retcode==10008을 받았습니다. 10번 반복했습니다. 감사합니다.

여기에 휴식이 있으므로 동일한 루프에서 반복하지 않습니다.

       else if (result.retcode== 10009 || result.retcode== 10008 )
      { 
           Print ( "OrderSend Code: " ,result.retcode);
          volume-=result.volume; //If order was successful then reduce volume to 0.0, then the loop will be terminated.
          
           if (Type == POSITION_TYPE_BUY ) {mBuyPositionCnt = mBuyPositionCnt + 1.0 ; cntLotCalculation = cntLotCalculation + 1 ;}
           if (Type == POSITION_TYPE_SELL ) {mSellPositionCnt = mSellPositionCnt + 1.0 ; cntLotCalculation = cntLotCalculation + 1 ;}
           break ;
      }

확인을 위해 전문가 로그를 게시할 수 있습니까?

이 루프 전에 PositionSelect(Symbol()) ?

 
angevoyageur :

여기에 휴식이 있으므로 동일한 루프에서 반복하지 않습니다.

확인을 위해 전문가 로그를 게시할 수 있습니까?

이 루프 전에 PositionSelect(Symbol()) ?

물론이죠. 다음은 전문가 로그입니다.

PF 0 00:00:02.348 EA_v (EURJPY,H1) 주문보내기 코드: 10008
CE 0 00:00:03.520 EA_v (EURJPY,H1) 주문보내기 코드: 10008
0 00:00:04.692 EA_v (EURJPY,H1) 주문 보내기 코드: 10008
플로리다 0 00:00:05.864 EA_v (EURJPY,H1) 주문보내기 코드: 10008
고등학교 0 00:00:07.020 EA_v (EURJPY,H1) 주문 보내기 코드: 10008
PF 0 00:00:08.177 EA_v (EURJPY,H1) 주문보내기 코드: 10008
QJ 0 00:00:09.348 EA_v (EURJPY,H1) 주문보내기 코드: 10008
0 00:00:10.489 EA_v (EURJPY,H1) 주문 보내기 코드: 10008
HL 0 00:00:11.630 EA_v (EURJPY,H1) 주문보내기 코드: 10008

QS 0 00:00:12.786 EA_v (EURJPY,H1) 주문보내기 코드: 10008

또한 당신의 추측이 맞습니다. 이 코드 이전에 PositionSelect(Symbol())를 사용하여 현재 위치의 볼륨을 확인 했습니다.

감사합니다.

 
FinanceEngineer :

물론이죠. 다음은 전문가 로그입니다.

PF 0 00:00:02.348 EA_v (EURJPY,H1) 주문보내기 코드: 10008
CE 0 00:00:03.520 EA_v (EURJPY,H1) 주문보내기 코드: 10008
0 00:00:04.692 EA_v (EURJPY,H1) 주문 보내기 코드: 10008
플로리다 0 00:00:05.864 EA_v (EURJPY,H1) 주문보내기 코드: 10008
고등학교 0 00:00:07.020 EA_v (EURJPY,H1) 주문 보내기 코드: 10008
PF 0 00:00:08.177 EA_v (EURJPY,H1) 주문보내기 코드: 10008
QJ 0 00:00:09.348 EA_v (EURJPY,H1) 주문보내기 코드: 10008
0 00:00:10.489 EA_v (EURJPY,H1) 주문보내기 코드: 10008
HL 0 00:00:11.630 EA_v (EURJPY,H1) 주문보내기 코드: 10008

QS 0 00:00:12.786 EA_v (EURJPY,H1) 주문 보내기 코드: 10008

또한 당신의 추측이 맞습니다. 이 코드 이전에 PositionSelect(Symbol())를 사용하여 현재 위치의 볼륨을 확인했습니다.

감사합니다.

좋아, 그래서 우리가 일부 주제에서 이야기하는 것과 같은 문제입니다. PositionSelect()는 터미널의 로컬 데이터베이스에서 업데이트되고 틱은 너무 빨리 와서 업데이트되지 않습니다. Sleep()은 신뢰할 수 있는 방법이 아니므로 새 주문을 보내기 전에 포지션이 열려 있는지 확인하는 해결 방법을 찾아야 합니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

내 EA가 이중 항목을 수행합니다.

도슈르 , 2013.12.21 03:21

나는 같은 문제가 있었고 xxxx를 사용하는 사람을 기억합니다.

나는 그 스레드를 찾을 수 없었습니다. 누군가 나를 도울 수 있다면 그것은 큰 감사가 될 것입니다 ...


 
angevoyageur :

좋아, 그래서 우리가 일부 주제에서 이야기하는 것과 같은 문제입니다. PositionSelect()는 터미널의 로컬 데이터베이스에서 업데이트되고 틱은 너무 빨리 와서 업데이트되지 않습니다. Sleep()은 신뢰할 수 있는 방법이 아니므로 새 주문을 보내기 전에 포지션이 열려 있는지 확인하는 해결 방법을 찾아야 합니다.

알겠어요. 정말 고마워. PositionSelect()가 작동하지 않으면 PositionsTotal() 을 사용하여 순서를 제한하는 것은 어떻습니까? PositionsTotal()은 브로커의 데이터베이스에서 업데이트됩니까?

 
FinanceEngineer :

알겠어요. 정말 고마워. PositionSelect()가 작동하지 않으면 PositionsTotal() 을 사용하여 순서를 제한하는 것은 어떻습니까? PositionsTotal()은 브로커의 데이터베이스에서 업데이트됩니까?

나는 그렇게 생각하지 않지만 당신이 그것을 시도하고 우리에게 알려주십시오.
 
angevoyageur :
나는 그렇게 생각하지 않지만 당신이 그것을 시도하고 우리에게 알려주십시오.
물론 내가 할 것이다. 문안 인사.
 

안녕

누구든지 이 문제에 대한 효과적인 해결책을 찾았습니까?

적절한 검사를 받았을 때 여러 주문을 실행 하는 것은 답답합니다.

모든 거래 실행이 원격 브로커 서버에서 발생할 때 PositionSelect가 로컬 데이터베이스에서 업데이트되도록 하는 것은 의미가 없습니다.

이 문제는 향후 빌드 릴리스에서 해결되어야 한다고 생각합니다.

솔루션을 게시하십시오.

고맙습니다,

 
BlindMist :

주문을 실행 하는 것은 답답합니다.

모든 거래 실행이 원격 브로커 서버에서 발생할 때 PositionSelect가 로컬 데이터베이스에서 업데이트되도록 하는 것은 의미가 없습니다.

이 문제는 향후 빌드 릴리스에서 해결되어야 한다고 생각합니다.

솔루션을 게시하십시오.

고맙습니다,

BlindMist님 , 계정이 브로커 서버와 동기화되었는지 확인하기 위해 로컬 데이터베이스를 확인하는 것이 좋습니다.

이 문제를 해결하려면 제안된 게시물 을 살펴보십시오.