여러 주문 문제

 

안녕하세요 여러분,

내 코드에 문제가 있습니다. 주문(구매 또는 판매)이 열리면 다른 사람들이 연속으로 들어옵니다.

내가 하려고 하는 것은;

마지막 주문이 매도인 경우 가격이 주문 Openprice에 약간의 핍(ReturnDist)을 더한 값보다 높을 때 매수 주문을 엽니다.

마지막 주문이 매수인 경우 가격이 Openprice에서 몇 핍을 뺀 값 아래로 떨어질 때 매도 주문 을 엽니다.

누군가 여기에 도움을 줄 수 있습니까?

미리 감사드립니다

루이스

파일:
 
luisneves :

안녕하세요 여러분,

내 코드에 문제가 있습니다. 주문(구매 또는 판매)이 열리면 다른 사람들이 연속으로 들어옵니다.

내가 하려고 하는 것은;

마지막 주문이 매도인 경우 가격이 주문 Openprice에 약간의 핍(ReturnDist)을 더한 값보다 높을 때 매수 주문을 엽니다.

마지막 주문이 매수인 경우 가격이 Openprice에서 몇 핍을 뺀 값 아래로 떨어질 때 매도 주문을 엽니다.

누군가 여기에 도움을 줄 수 있습니까?

미리 감사드립니다

루이스

제한할 계획은 무엇입니까?

OpenOpposite를 1로 초기화합니다.

 int     Ticket,total,OpenOpposite= 1 ,UseSlippage,i;

모든 틱 에서 OpenOppositeOrder()를 호출합니다.

   int start()
     {
       if ( OrdersTotal ()== 0 )GoToOpen();
       else GoToClose();      
       if (OpenOpposite> 0 )OpenOppositeOrder(); //<-- here 
       if ( OrdersTotal ()> 0 )OpPendingDel();
      
     }

OpenOpposite에 대한 다른 참조를 볼 수 없습니다.

OpenOppositeOrder의 for 루프는 내가 지금까지 본 것에서 어떤 제한도 받지 않습니다... 그래야 할까요?

코드에서 오류가 어디에 있다고 생각합니까?

 

안녕하세요 크로닌님

빠른 응답에 감사드립니다.

엉망진창에 미안하지만 내가 하려고 했던 것은 독립적인 작업 코드 블록을 갖는 것이었습니다.

그래서, 나는 당신이 표시한 줄과 void OpenOpposite()라고 표시된 상단 부분을 정리했고 이제 다음과 같은 몇 가지 오류가 발생합니다.

전역 범위에 대한 표현은 허용되지 않습니다.

시간을 많이 들이지 않는다면 여기에서 저를 도와주시겠습니까?

감사해요

루이스



 
luisneves :

안녕하세요 크로닌님

빠른 응답에 감사드립니다.

엉망진창에 미안하지만 내가 하려고 했던 것은 독립적인 작업 코드 블록을 갖는 것이었습니다.

그래서, 나는 당신이 표시한 줄과 void OpenOpposite()라고 표시된 상단 부분을 정리했고 이제 다음과 같은 몇 가지 오류가 발생합니다.

전역 범위에 대한 표현은 허용되지 않습니다.

시간을 많이 들이지 않는다면 여기에서 저를 도와주시겠습니까?

감사해요

루이스

나는 당신이 아무것도 청소해야한다고 말한 적이 없습니다. EA가 두 개 이상의 주문을 열지 못하도록 제한하려는 위치를 알고 싶었습니다.

이것을 시도하십시오 (나는 그것을 테스트하지 않았습니다).

시작 기능 을 다음으로 변경합니다(공개 시장 주문만 필터링해야 할 수도 있음 -> 전략에 따라 다름):

   int start()
     {
       if ( OrdersTotal ()== 0 ){GoToOpen();OpenOpposite= 0 ;} //<-- set OpenOpposite to 0 if no order is open (pending and market)
       else GoToClose();      
       if (OpenOpposite== 0 )OpenOppositeOrder();          //<-- only run OpenOpositeOrder, if OpenOpposite is 0.
       if ( OrdersTotal ()> 0 )OpPendingDel();      
     }

OpenOppositeOrder() 함수에 OpenOpposite 카운터를 추가합니다.

         if (OrderSymbol() == Symbol ()&& OrderMagicNumber() == MagicNumber)
            {
            Op = OrderType();

             if (Op == OP_BUY  && Ask < (OrderOpenPrice()- ReturnDist*pt))
               {                
               Ticket = OrderSend ( Symbol (), OP_SELL, mlots, SellPrice, UseSlippage, 0 , 0 , "Sell Order" , MagicNumber, 0 , Red);
               if (Ticket > 0 ) 
                  {
                   Print ( "Opposite Sell order placed # " , Ticket);
                  AddLimitsSell();
                   OpenOpposite++;
                  }
               else
                  {
                   Print ( "Order Send failed, error # " , GetLastError ());
                  }
               }
               
             if (Op == OP_SELL && Bid > (OrderOpenPrice()+ ReturnDist*pt))
               {               
               Ticket = OrderSend ( Symbol (), OP_BUY, mlots, BuyPrice, UseSlippage, 0 , 0 , "Buy Order" , MagicNumber, 0 , Green);
               if (Ticket > 0 )
                  {
                   Print ( "Opposite Buy order placed # " , Ticket);
                  AddLimitsBuy();
                   OpenOpposite++;
                  }
               else
                  {  
                   Print ( "Order Send failed, error # " , GetLastError ());
                  }   
               }
            }

이렇게 하면 여러 주문이 연속으로 열리는 문제가 해결됩니다. EA가 둘 이상의 (반대) 주문을 열도록 제한합니다.

 
luisneves :

안녕하세요 여러분,

내 코드에 문제가 있습니다. 주문(구매 또는 판매)이 열리면 다른 사람들이 연속으로 들어옵니다.

같은 코드 조각에 대해 두 번째 스레드가 필요한 이유는 무엇입니까?

랩터영국 :

당신의 코드를 보면 당신이 하려는 일을 따라가기가 매우 어렵다는 것을 알았습니다. 도움이 될 코멘트가 거의 없습니다. 당신의 start() 함수는 당신이 각 틱에서 무엇을 하려고 하는지 보여주지 않습니다, 당신은 일관성이 없습니다 들여쓰기 레이아웃.


이 스레드에서: https://www.mql5.com/en/forum/142629 페이지 3

 
RaptorUK :

당신의 코드를 보면 당신이 하려는 일을 따라가기가 매우 어렵다는 것을 알았습니다. 도움이 될 코멘트가 거의 없습니다. 당신의 start() 함수는 당신이 각 틱에서 무엇을 하려고 하는지 보여주지 않습니다, 당신은 일관성이 없습니다 들여쓰기 레이아웃.

동의합니다. 코드가 읽기 쉽지 않기 때문에 다중 주문 문제 외에 다른 것은 확인하지 않았습니다. 코드의 일부를 다른 사람이 작성한 다른 코드에서 복사하여 붙여넣은 것처럼 보입니다. 고유한(일관된) 스타일로 고유한 기능 을 작성하는 것이 좋습니다.

 
kronin :

나는 당신이 아무것도 청소해야한다고 말한 적이 없습니다. EA가 두 개 이상의 주문을 열지 못하도록 제한하려는 위치를 알고 싶었습니다.

이것을 시도하십시오 (나는 그것을 테스트하지 않았습니다).

시작 기능을 다음으로 변경합니다(공개 시장 주문만 필터링해야 할 수도 있음 -> 전략에 따라 다름):

OpenOppositeOrder() 함수에 OpenOpposite 카운터를 추가합니다.

이렇게 하면 여러 주문이 연속으로 열리는 문제가 해결됩니다. EA가 둘 이상의 (반대) 주문을 열도록 제한합니다.


안녕하세요 크로닌님

제 문제에 대한 신속한 답변에 감사드립니다. 내가 얻으려고하는 것은 이와 같은 주문을 여는 조건입니다.

처음에는 지표를 통해 열리는 것이 매수(물론 매도일 수 있음)이고 그 다음에는 매수 주문이 개설됩니다. 가격이 매수 주문에서 시작 가격보다 낮은 수준으로 떨어지면 매도 주문이 열리지만, 가격이 다시 상승하면 새로운 공개 매수가 발생하지 않아야 합니다. 여기서 새로운 매수 주문은 가격이 매도 주문에서 반등할 때만 발생해야 합니다. 매도 주문이 가장 먼저 발생하는 경우에도 마찬가지입니다.
다음 코드를 첨부하여 가져오려고 했지만 작동하지 않습니다. 여기에서 작동하는 것은 열리는 첫 번째 주문이 매수이고 예상대로 매도 주문이 열리지만 여기에서는 다른 주문이 열리지 않는다는 것입니다...

나는 이 두 개의 코드 블록을 가지고 있고 첫 번째 블록은 예상되는 일을 하고 있는 것 같습니다. 지표에 의해 정의된 조건이 있는 경우 매수 또는 매도 주문을 엽니다. 주문 티켓 이 수신되면 주문 제한을 보내기 위해 주문 수정이 이루어집니다.

코드에서 BuyTicket 및 SellTicket을 사용하여 여러 주문이 열리지 않도록 하고 있지만 올바른 방법이 아닌 것 같습니다...

 // Buy Order Condition to Open

   if (Volume[ 0 ] > volume_previous + OpenDistance*pt && BuyTicket == 0 )                       
          { //5  
           while (IsTradeContextBusy()) Sleep ( 10 );
          RefreshRates();       
                       
     BuyTicket= OrderSend ( Symbol (),OP_BUY,LotSize,Ask,RealSlippage, 0 , 0 , "Buy Order" ,MagicNumber, 0 ,Green);
     if (BuyTicket > - 1 )
        { //6
         Print ( "Opposite Buy order placed # " ,BuyTicket);
         AddLimitsBuy();        
         } //6
       else
         { //7 
         Print ( "Order Send failed, error # " , GetLastError ());
         } //7 
         
       return ( 0 );
      } //5
   //-----------------------------------------------------------------------------+      
  
   // Sell Order Condition to Open

   if (Volume[ 0 ] < volume_previous - OpenDistance*pt && SellTicket == 0 )                   
     { //8                                 
           while (IsTradeContextBusy()) Sleep ( 10 );
          RefreshRates();       
                                                
          SellTicket= OrderSend ( Symbol (),OP_SELL,LotSize,Bid,RealSlippage, 0 , 0 , "Sell Order" ,MagicNumber, 0 ,Red);
           if (SellTicket > - 1 )
                  { //9
         Print ( "Opposite Sell order placed # " , SellTicket);
        AddLimitsSell();       
        } //9
     else
        { //10
         Print ( "Order Send failed, error # " , GetLastError ());
        } //10      
     return ( 0 );
     } //8                       


다음 코드는 미결 주문을 식별하고 구매 기호, 매직 번호 및 주문 유형을 필터링합니다. 풀에서 마지막 오픈 주문을 감지하고 오픈 조건(마지막 주문이 매수인 것을 고려)이고 매도 티켓이 존재하지 않는다는 것을 확인하면 매도 주문이 오픈됩니다. 마지막 주문이 매도인 경우에도 마찬가지입니다. 그리고 여기 코드가 작동합니다.

문제는 세 번째 주문을 여는 조건 등이 올 때 발생합니다. 그럼에도 불구하고 여기에 여는 조건이 있으며 코드는 두 번째 열기를 잘 처리합니다. 왜 코드가 여기에서 작동하지 않습니까?

 int Op;  
   
   for ( int Counter = OrdersTotal ()- 1 ; Counter >= 0 ; Counter--)
      { //14
       if ( OrderSelect (Counter,SELECT_BY_POS,MODE_TRADES))  
         { //15
         if (OrderSymbol() == Symbol ()&& OrderMagicNumber() == MagicNumber)
            { //16
            Op = OrderType();

             if (Op == OP_BUY && Bid < OrderOpenPrice() - (ReturnDist*pt) && SellTicket == 0 )
               { //17               
               SellTicket = OrderSend ( Symbol (), OP_SELL, MLots, Bid, RealSlippage, 0 , 0 , "Sell Order" , MagicNumber, 0 , Red);
               if (SellTicket > - 1 ) 
                  { //18
                   Print ( "Opposite Sell order placed # " , SellTicket);
                  AddLimitsSell();
                  } //18
               else
                  { //19
                   Print ( "Order Send failed, error # " , GetLastError () );
                  } //19
                } //17
                           
             if (Op == OP_SELL && Ask > OrderOpenPrice() + (ReturnDist*pt)&& BuyTicket == 0 )
               { //20             
               BuyTicket = OrderSend ( Symbol (), OP_BUY, MLots, Ask, RealSlippage, 0 , 0 , "Buy Order" , MagicNumber, 0 , Green);
               if (BuyTicket > - 1 )
                  { //21
                   Print ( "Opposite Buy order placed # " , BuyTicket);
                  AddLimitsBuy();
                  } //21
               else
                  { //22  
                   Print ( "Order Send failed, error # " , GetLastError ());
                  } //22   
               } //20
            } //16
         } //15    
      } //14

내가 설명하려는 내용을 확인해야 하는 경우를 대비하여 전체 코드가 첨부되어 있습니다.

여전히 다른 문제를 해결하고 일부 코드가 이상하게 보일 수 있다는 점에 유의하십시오. 이것은 아직 입찰가와 마이너스 거리를 기반으로 주문을 여는 방법을 배우기 때문에 주문을 여는 데 사용하는 방법의 경우입니다.

여기에서 저를 도와주시면 정말 감사하겠습니다.


친애하는
루이스

파일:
 
Volume[0]이 무엇을 제공하는지 아십니까? 그것에 포인트 값 을 추가하는 것이 어떤 의미가 있습니까?
 

안녕하세요 랩터님

당신 말이 맞아!

나는 여전히 내가 필요한 것을 얻기 위해 여러 가지 방법을 배우고 시도하고 때로는 어리석은 일이 일어납니다.

개체를 사용하여 입찰 수준에 놓고 해당 위치에서 주문을 여는 것이 더 나은 것 같습니다. 주요 문제 중 하나는 미결제 주문이 마감되지 않은 상태에서 신규 오픈을 제한하는 방법입니다.

나는 배울 것이 많고 실수로 시도하는 것이 이것이 실제로 어떻게 실행되는지 더 잘 이해하는 방법이라는 것을 알고 있습니다. 책과 문서의 정보를 이해하기 위해 최선을 다하는 동안 때때로 길을 잃고 다른 사람들의 도움을 받으려고 합니다. 여기 포르투갈에서는 이 주제에 대한 수업료를 받기가 매우 어렵기 때문에 도움과 조언을 얻기 위해 모두 다른 사람들의 선의, 인내 및 주장에 의존합니다. 그 도움이 도착하면 이해하기 위해 최선을 다하지만 때때로 나는 그것에 대처할 수 없습니다.

어쨌든 볼륨이 그런 종류의 지표를 얻는 방법이 아니라는 것을 보여 주셔서 감사합니다.

친애하는

루이스

 
luisneves :

안녕하세요 랩터님

당신 말이 맞아!

나는 여전히 내가 필요한 것을 얻기 위해 여러 가지 방법을 배우고 시도하고 때로는 어리석은 일이 일어납니다.

또한 배우려고 노력하고 노력하고 있다는 점에 감사드립니다. 아마도 먼저 더 간단한 EA를 만들고 필요한 작업을 수행하는 방법을 이해하고 몇 가지를 시도하고 Print 문을 추가하는 방법을 이해할 때까지 작업해야 할 것입니다. 무슨 일이 일어나는지 보고, 이런 식으로 배우고 이해하게 될 것이며, 더 많이 알게 되면 EA에 더 많은 것을 추가할 수 있습니다. 코드를 작성하기 전에 EA에서 수행할 작업에 대한 명확한 아이디어가 있어야 합니다. 한 번에 너무 많은 기능 을 사용하면 명확한 사고 프로세스가 더 쉬워지지 않습니다.

도움이 될 또 다른 한 가지는 작업을 다른 EA와 함께 재사용할 수 있는 모듈로 나눈 다음 해당 모듈을 사용자 정의 함수로 코딩할 수 있습니다. 그런 다음 스크립트 또는 테스트할 간단한 EA의 일부로 자체적으로 작동하고 견고한지 확인하십시오. . . 그러면 EA가 작동한다는 사실을 알고 안심하고 해당 기능을 사용할 수 있습니다.
 

안녕하세요 RaptorUK입니다.

솔직한 답변 감사합니다. 나는 이미 작업을 중단하려고 시도하고 다른 종류의 문제가 나타나기 시작합니다. 그래서 모든 것을 통합하기 시작합니다(그리고 다른 문제가 시작됩니다....)

나는 이미 다른 EA를 시도하고 잘 작동했지만 이제 지표(표준 것들)를 사용하지 않고 이 접근 방식을 사용하면 일이 복잡해집니다.

문제는 지금 완전히 길을 잃었다는 것입니다. 나는 이론상으로 코드 작업이 틱 단위로 작동해야 하는 방식을 보고 여러 개 열림을 피하기 위해 제한을 얻으려고 하면 상황이 더 나빠진다고 생각합니다.

이제 제대로 작동하는 일부 코드 블록이 있고 성능을 개선하기 위해 약간의 주의가 필요한 다른 블록과 작동하지 않는 다른 블록(2개)이 있습니다. 여기에서 어떻게 나가야 할지 모르겠습니다...그만큼 간단하고 저는 그것을 다루는 방법을 알고 있는 사람들의 도움으로 완전히 피고인입니다. 당신은 m개의 문제에 더 많은 시간을 할애한 사람 중 하나이지만, 그럼에도 불구하고 나는 여전히 몇 가지 문제에 대처하지 못합니다. 내가 모든 mql 코드를 배우고 과거에 얻은 많은 이론과 경험을 바탕으로 작성하기 시작했다면 아마도 나는 여기에 없었을 것입니다.

EA(첨부)를 본 다음 내가 찾고 있는 것을 가져와야 하지만 그 부분에서 성공하지 못한 코드 부분에서 작동하는 방식을 이해하려고 했습니다. 내가 본 것은 가격 플러스 마이너스 거리를 기반으로 오프닝을 얻기 위해 코드를 사용한다는 것입니다. 여기에서 내가 이것을 얻으려고 할 때 한계가 있는 문제가 발생하고 아무 것도 ... 순전히 작동하도록 할 수 없습니다... 그런 다음 대체 명령이 이론적으로 작동하지 않는 이유를 알 수 없습니다(적어도 내가 본 방식). 순수한 불명예.......

어쨌든 이것은 제한된 사람의 말일뿐입니다 ...

친애하는

루이스

파일: