여러 주문 문제 - 페이지 2

 

안녕하세요 랩터입니다.

테스터에서는 TrailingStop이 닫힐 때 모든 주문이 닫히지만 데모에서는 TrailingStop을 통해 마감된 주문만 닫히고 열려 있는 모든 주문은 계속 열려 있습니다.

조언의 논리 위에 다음 코드를 사용하는 것은 다음과 같습니다.

"마지막 주문의 조건이 무엇인지 찾으십시오. 마감된 경우 코드를 수행하여 남아 있는 모든 미결 주문을 마감하기 시작하십시오."

왜 이런 일이 발생하는지 단서가 있습니까?

친애하는

루이스

 int OrdType, GLError;
   double OrderClosed;
   RefreshRates();
   
     for ( int Closed = OrdersTotal ()- 1 ;Closed >= 0 ; Closed--) 
       if ( OrderSelect (Closed,SELECT_BY_POS,MODE_HISTORY)
        && OrderMagicNumber()== MagicNumber
        && OrderSymbol()== Symbol ())
        { //29
        OrderClosed = OrderCloseTime();
         if (OrderClosed!= 0 )
           { //30                                  
   for ( int OrderPos = OrdersTotal ()- 1 ; OrderPos >= 0 ; OrderPos--)       
       if ( OrderSelect (OrderPos, SELECT_BY_POS, MODE_TRADES)
         && OrderMagicNumber()== MagicNumber 
         && OrderSymbol()== Symbol ())                                       
         { //31
         OrdType = OrderType();
         if (OrdType == OP_BUY || OrdType==OP_SELL)
           { //32
           if (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))
               GLError = GetLastError ();
           } //32                                         
          } //31
       } //30
     } //29 
    
   if (GLError > 0 ) Print ( "Error Closing/Deleting Order, error # " , GLError, " for ticket: " , OrderTicket());           
   return ( 0 );
  } //0 
 
luisneves :

안녕하세요 랩터입니다.

테스터에서는 TrailingStop이 닫힐 때 모든 주문이 닫히지만 데모에서는 TrailingStop을 통해 마감된 주문만 닫히고 열려 있는 모든 주문은 계속 열려 있습니다.

조언의 논리 위에 다음 코드를 사용하는 것은 다음과 같습니다.

"마지막 주문의 조건이 무엇인지 찾으십시오. 마감된 경우 코드를 수행하여 남아 있는 모든 미결 주문을 마감하기 시작하십시오."

왜 이런 일이 발생하는지 단서가 있습니까?

너는 이것을 못해 . . .

     for ( int Closed = OrdersTotal ()- 1 ;Closed >= 0 ; Closed--)     // OrdersTotal is the total of open orders
       if ( OrderSelect (Closed,SELECT_BY_POS,MODE_HISTORY)         //  this is looping through the closed orders

. . . 닫힌 주문을 반복하기 위한 루프 시작 조건으로 열린 주문 의 수를 사용하는 것은 의미가 없습니다 . OrderssHistoryTotal() 을 사용하려고 했습니까? 그러나 닫힌 주문의 OrderCloseTime()은 절대 == 0이 아닙니다.

 
luisneves :

.....

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

.....

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

나는 당신이 초기 주제를 약간 변경했고 아마도 첫 번째 문제가 끝까지 논의되었음을 이해합니다(저에게는 괜찮습니다)
당신이 여전히 초기 문제에 대한 후속 조치를 원한다면, 당신이 찾고 있는 것을 정말로 이해하지 못하기 때문에 당신은 그것을 조금 다르게 설명해야 합니다.

내가 조정한 첫 번째 스니펫은 코드가 여러 주문을 여는 것을 방지합니다. 당신은 그것에 만족하지 않는 것 같았고, 그래서 당신은 그것을 제거했지만(또는 그냥 추가하지 않았지만) BuyTicket과 SellTicket을 사용하여 비슷한 일을 했습니다.
그럼 제3의 주문을 말씀하시는 건가요... 이런 걸 찾으시나요?

매수 -> 매도 -> 매수 -> 매도 -> 매수
하지만 방지
매수 -> 매수 -> 매도 -> 매수 -> 매수

즉, 마지막으로 열린 주문이 매수 주문 이면 다음 주문은 매도여야 하고 그 반대도 마찬가지입니까?

또는 귀하의 EA가 열어야 하는 최대 주문량은 얼마입니까? 2,1 매도이고 반대 주문의 조건이 충족되면 매수이지만 매수 트리거에서 다시 반등하면 더 이상 매도가 아닌가요?
이것이 사실이라면 초기 코드에 추가한 OpenOpposite 카운터의 문제는 무엇이었습니까?

편집하다:

내가 상상할 수 있는 세 번째 옵션은 첫 번째 반대 주문이 중단된 경우 다른 반대 주문을 열고 싶습니까?
그래서 다음과 같이:

매수 -> 매도 -> 매도가 중단된 경우 -> 매도 -> 매도가 중단된 경우 -> 매도

 
kronin :

나는 당신이 초기 주제를 약간 변경했고 아마도 첫 번째 문제가 끝까지 논의되었음을 이해합니다(저에게는 괜찮습니다)
당신이 여전히 초기 문제에 대한 후속 조치를 원하면, 당신이 찾고 있는 것을 정말로 이해하지 못하기 때문에 당신은 그것을 조금 다르게 설명해야 합니다.

내가 조정한 첫 번째 스니펫은 코드가 여러 주문을 여는 것을 방지합니다. 당신은 그것에 만족하지 않는 것 같아서 제거(또는 그냥 추가하지 않음)했지만 BuyTicket 및 SellTicket을 사용하여 비슷한 작업을 수행했습니다.
그럼 3차 주문을 말씀하시는 건가요... 이런 걸 찾으시나요?

매수 -> 매도 -> 매수 -> 매도 -> 매수
하지만 방지
매수 -> 매수 -> 매도 -> 매수 -> 매수

즉, 마지막으로 열린 주문이 매수 주문이면 다음 주문은 매도여야 하고 그 반대도 마찬가지입니까?

또는 EA가 열어야 하는 최대 주문량은 얼마입니까? 2, 1 매도이고 반대 주문 조건이 충족되면 매수이지만 매수 트리거에서 다시 반등하면 더 이상 매도가 아닌 건가요?
이것이 사실이라면 초기 코드에 추가한 OpenOpposite 카운터의 문제는 무엇이었습니까?

편집하다:

내가 상상할 수 있는 세 번째 옵션은 첫 번째 반대 주문이 중단된 경우 다른 반대 주문을 열고 싶습니까?
그래서 다음과 같이:

매수 -> 매도 -> 매도가 중단된 경우 -> 매도 -> 매도가 중단된 경우 -> 매도


안녕하세요 크로닌님

이 문제에서 저를 지원할 시간을 미리 준비하십시오.

전략은 이 논리를 준수합니다.

열린 첫 번째 주문이 매수이고 TrailingStop을 통해 마감되는 것처럼 보이지만 Bid가 OrderOpenPrice (ReturnDistance) 아래로 약간의 핍을 낮추면 매도가 열리고 TrailingStop을 통해 닫히는 것처럼 보입니다. Ask가 OrderOpenPrice 위의 몇 핍을 위로 튕기면 구매가 열립니다. 이 탁구 프로세스는 TrailingStop을 통해 마지막으로 열린 주문이 닫히거나 최대 주문 설정인 7(외부에서 조정할 수 있음)에 도달하면 종료됩니다.

여러 개 열림의 문제는 가격이 OrderOpenPrice를 교차하여 오르락내리락할 때 발생합니다. 그래서 우리가 매수를 한다면 다음 주문은 매도가 될 수 있습니다.

이전 도움과 관련하여 아마도 내 문제가 무엇인지 잘 설명하지 못했을 것입니다. 제공된 모든 도움은 나에게 가장 큰 가치가 있습니다.

친애하는

루이스

 

Luis, 나는 당신의 코드에 꽤 많은 시간을 할애했지만 솔직히 당신이 원하는 것을 하는지 잘 모르겠습니다.

참조 부착. 완료/변경하고, 테스트하고, 이해하고.... 최소한 당신이 찾고 있는 것과 유사하거나 완벽하게 작동하고 있다고 말해주십시오. 아직 전략에 대해 확신이 서지 않습니다.
아직 새 기능 을 추가하지 마십시오(마팅게일을 다시 추가하지 마십시오). 코드는 충분히 크고 안정적으로 실행하려면 아직 해야 할 일이 많습니다.
코드가 훨씬 더 명확하게 배열되지 않았다고 말해야 합니다. 실행 중인 부품을 변경하고 싶지 않았습니다(더 나은 오류 처리가 필요하더라도). 부분에 댓글을 달고 부분을 옮겼지만 여전히 거기에 있습니다 ...


즐거운 시간 보내세요...

 
kronin :

Luis, 나는 당신의 코드에 꽤 많은 시간을 할애했지만 솔직히 당신이 원하는 것을 하는지 잘 모르겠습니다.

참조 부착. 완료/변경하고, 테스트하고, 이해하고.... 최소한 당신이 찾고 있는 것과 유사하거나 완벽하게 작동하고 있다고 말해주십시오. 아직 전략에 대해 확신이 서지 않습니다.
아직 새 기능을 추가하지 마십시오(마팅게일을 다시 추가하지 마십시오). 코드는 충분히 크고 안정적으로 실행하려면 아직 해야 할 일이 많습니다.
코드가 훨씬 더 명확하게 배열되지 않았다고 말해야 합니다. 실행 중인 부품을 변경하고 싶지 않았습니다(더 나은 오류 처리가 필요하더라도). 부분에 댓글을 달고 부분을 옮겼지만 여전히 거기에 있습니다 ...


즐거운 시간 보내세요...


안녕하세요 크로닌님

최선을 다하기 전에 내 문제를 지원하는 데 시간을 할애해 주셔서 감사합니다.

나는 당신이 전략을 이해하기 위해 최선을 다했다고 생각하지만 일부 사항은 제대로 응답하지 않습니다(물론 이 문제에 대한 이해 부족으로 인해).

나는 당신의 조언을 사기 위해 약간의 수정을 가했지만 올바르게 수행되었는지 확실하지 않습니다.

두 가지 문제;

1 - TrailingStop을 통해 거래가 마감되면 남아 있는 모든 미결 주문이 마감되어야 합니다. TakeProfit에서 주문을 마감해서는 안 됩니다. 그래서 CloseAll 함수를 실행하기 위해 마지막 주문의 닫기를 사용하여 그렇게 하려고 생각했습니다(일부 어리석은 일이 그것을 시도하기 위해 옵니다...). 마지막 마감 티켓을 사용하여 미결 주문 마감을 실행하고 있지만 TrailingStop을 통해 거래가 마감될 때 그런 일이 발생하는지 이해할 수 없습니다...

2 - 적어도 테스터에서는 "핑퐁"이 작동하지 않습니다.

첨부 파일은 제가 이해한 범위 내에서 수정한 파일입니다.

인내심과 시간을 내주셔서 미리 감사드립니다. (자세한 내용은 비공개 메시지 )

친애하는

루이스

 

알겠습니다. TP 대신 SL의 모든 주문을 마감하도록 알고리즘을 변경했습니다. (변경 사항은 '<'를 '>'로 대체했습니다. 위치를 찾아야 합니다.)

탁구는 저에게 효과적이며 Visual Mode의 테스터에서만 실행되도록 했습니다. 그러나 모든 주문이 거의 동시에 열리지 않도록 입력 매개변수를 조정했습니다. 기본 매개변수를 확인해야 할 수도 있습니다.

초기 순서(나는 print() 문을 변경했습니다)로 시작한 다음 반대 순서를 수행합니다.

EURUSD,M1: 1.43310 ok에서 0.01 EURUSD 매수 오픈 #1
EURUSD,M1: 최초 매수 주문 1위
EURUSD,M1: 수정 #1 매수 0.01 EURUSD 1.43310 sl: 1.42810 tp: 1.43510 확인
EURUSD,M1: 1.43200 ok에서 0.01 EURUSD를 오픈 #2 매도
EURUSD,M1: 반대 매도 주문 # 2
EURUSD,M1: #2 수정 0.01 EURUSD에서 1.43200 sl: 1.43700 tp: 1.43000 확인
EURUSD,M1: 1.43300 ok에서 0.01 EURUSD 매수 오픈 #3
EURUSD,M1: 반대 매수 주문 # 3
EURUSD,M1: 수정 #3 매수 0.01 EURUSD 1.43300 sl: 1.42800 tp: 1.43500 확인

주문을 열 때 OpenOppositeOrder()에 반환을 추가했습니다. 설정과 함께 매수 주문과 매도 주문을 동시에 열 수 있었습니다. MaxOrder에 대한 이 리드는 신뢰할 수 없습니다.
아마도 더 나은 접근 방식은 2개의 기능으로 분할하거나 매도 주문 또는 매수 주문에 대해서만 실행되도록 함수에 매개변수를 제공하는 것입니다.

btw. 업로드한 코드가 거래되지 않았습니다! '잘못된 LotSize'로 인해 모든 거래가 실패했습니다....

 

안녕하세요 크로닌님

저를 지원하는 데 시간을 할애해 주셔서 감사합니다.

" 업로드한 코드가 거래되지 않았습니다! '잘못된 LotSize'로 인해 모든 거래가 실패했습니다...." 문제와 관련하여 MM 코드를 파일 끝으로 이동한 후 발생한 문제입니다. MM()을 사용하여 함수 를 호출했습니다. 코드 시작 부분에서 이러한 종류의 작업이 작동하지 않는 것 같지만 보낸 마지막 코드가 작동하고 MM() 함수가 여전히 같은 위치에 있고 작동 중이므로 여기에서 길을 잃습니다....

같은 틱에서 시작하는 주문에 대해;

EA가 차트에 진입하면 가격이 그 순간의 가격보다 높거나 낮아야 합니다. 즉, 가격이 오르거나 내릴 때 OpenDistance 구매(또는 판매) 주문이 발생합니다. 여기에서 다음 개장은 OrderOpenPrice에서 ReturnDistance를 뺀 가격에서 가격이 하강할 때(마지막 주문이 구매인 경우) 발생할 수 있습니다. 판매가 마지막 주문인 경우에도 동일한 논리입니다. 아마도 이 논리에서 벗어난 질서의 개방을 피하기 위해 한계가 있어야 할 것입니다.

친애하는

루이스

 
//mine
LotSize = (RiskAmount / StopLoss) / TickValue;               //Phil: LotSize is defined in global scope

//yours
double LotSize = (RiskAmount / StopLoss) / TickValue;


전역 범위에서 LotSize를 정의하고 0으로 초기화했습니다. void MM() 함수 에서 해당 함수에서만 유효한 LotSize를 계산합니다. 초기화만 제거했으므로 전역 범위의 변수가 업데이트됩니다.

이 값들 각각에 대해 설명을 해주시겠습니까?

 extern double StopLoss       =   50 ;
extern double TakeProfit     =   20 ;
extern double TrailingStop   =   2 ;
extern int     MinimumProfit  =   3 ;
extern int     Slippage       =   3 ;
extern double OpenDistance   =   2 ;
extern double ReturnDist     =   1 ;
extern double MinStop        =   1 ;

EA를 운영하려는 Symbol의 스프레드는 얼마입니까?

그러나 모든 주문이 거의 동시에 열리지 않도록 입력 매개변수를 조정했습니다. 기본 매개변수를 확인해야 할 수도 있습니다.

동일한 작업을 시도하고 테스터에서 시각적 모드로 실행합니다.

 
kronin :


전역 범위에서 LotSize를 정의하고 0으로 초기화했습니다. void MM() 함수에서 해당 함수에서만 유효한 LotSize를 계산합니다. 초기화만 제거했으므로 전역 범위의 변수가 업데이트됩니다.

이 값들 각각에 대해 설명을 해주시겠습니까?

EA를 운영하려는 Symbol의 스프레드는 얼마입니까?

그러나 모든 주문이 거의 동시에 열리지 않도록 입력 매개변수를 조정했습니다. 기본 매개변수를 확인해야 할 수도 있습니다.

동일한 작업을 시도하고 테스터에서 시각적 모드로 실행합니다.


안녕하세요 크로닌님

예, 배울 것이 많습니다....이제 글로벌에 있어야 하는 함수 외부에서 액세스할 값이 필요할 때 이해하십시오.

EA도 5자리 브로커에서 실행해야 하므로 외부에 있는 값에 10을 곱합니다. 이 코드 블록을 사용하여 자동으로 가져오지만 WHRoeder에서 금속과 호환되지 않는 조언을 얻습니다.

 int init () // Adjust for 4 or 5 digits.
   {
   if ( Digits == 2 || Digits == 4 ) <------- not compatible with metals
      {
      pt = Point ;
      RealSlippage = Slippage;
      }    
   if ( Digits == 3 || Digits == 5 ) 
      {
      pt = Point * 10 ;
      RealSlippage = Slippage * 10 ;
      }

쌍의 스프레드는 가변적일 수 있습니다. 그렇기 때문에 Stop Level 에서 벗어나기 위해 코드를 사용하고 있습니다.

이 문제와 관련하여 " 하지만 모든 주문이 거의 동시에 열리지 않도록 입력 매개변수를 조정했습니다. 기본 매개변수를 확인해야 할 수도 있습니다."

내가 볼 수 있는 한(그렇지 않다면 죄송합니다...), OpenDistance는 2핍으로 유지되고 ReturnDistance는 이제 2핍으로 유지됩니다. 내가 지금 보고 있는 것은 주문이 열리지만 2핍 차이가 아니라는 것입니다. 이것은 ECN 브로커(IC Markets)의 플랫폼에서 테스터로 실행됩니다. 이것이 중요할 수 있습니까?

실제로 주문이 동시에 열리지는 않지만 Open Distance와 ReturnDist가 주문을 열 때까지의 올바른 거리를 고려하지 않는 것 같습니다.

코드에 다음이 있습니다.

OTLastTick=OTCurrentTick;                       //shift OrderTotal
  OTCurrentTick= OrdersTotal ();                   //reinit OrderTotal
   if (OTCurrentTick> 0 )Trail();                     //Trail
   if (OTLastTick>= 2                                //if OrderTotal has changed
     &&OTCurrentTick<OTLastTick
     &&OTCurrentTick> 0 ){CloseAllOnSL(); return ;}   //Check order closed on SL level
   if (OTCurrentTick>=MaxOrders) return ;             //Dont open more orders. Trail and return.
                                                 //Actually we have nothing more to do.
                                                 //Only call opposite if the initial order of the serie is open
   if (OTCurrentTick> 0 )OpenOppositeOrder(); //<--------------------- include this line to call function (not sure if this the right method to do it...)
  MM();                 //<--------------------- include this line to call function (not sure if this the right method to do it...)
                        
   if (OTCurrentTick== 0 ){ //init serie
     BuyAllowed= true ;
     SellAllowed= true ; 

OpenOppositeOrder 함수를 호출하기 위해 굵게 표시된 줄을 포함했는데 여기에서 이것이 맞는지 확실하지 않습니다. 다른 쪽은 현재 틱과 2핍 이전에 발생한 마지막 틱(OpenDistance)을 비교한 위치를 볼 수 없습니다.

내 문제로 당신을 지루하게 했다면 죄송합니다.

친애하는

루이스