EA 코드 2 문제(SL 관리자) - 페이지 3

 

여기 이 링크는 이 단계에서 내 위에 있는 '방법'이지만 내 문제를 해결하기 위해 멋진 라이브러리 파일을 만드는 방법을 볼 수 있습니다... https://www.mql5.com/en/articles/1390 . 나는 티켓 배열 atm을 만드는 것이 약간 긴장되고 지금은 해결할 수 있기를 바랍니다.

수정 섹션에 도달하기 전에 모든 작업을 올바르게 수행했습니다. 티켓으로 올바르게 선택하고 수정 블록으로 전달... 그 부분이 훌륭합니다.

'이 수정 섹션에 문제가 있는 경우'가 표시되지 않거나 '다음 주문을 받기 위해 이 섹션을 통과해야 하기 때문에' 문제가 발생한 것입니다.

나는 그것을 수정 블록으로 보내고 마법 번호와 기호의 모든 주문을 수정할 수 있기를 바랐습니다. 그래서 나는 약간의 참 또는 거짓 스위치를 시도했습니다.

'다음 주문을 선택하기 위해' 각 틱을 이 섹션을 통과해야 하는 경우 문제가 발생할 수 있습니다.

수정해야 하는 티켓의 이름을 수동으로 지정할 수는 있지만 이것이 문제라고 생각하지 않습니다. 올바르게 가져오고 모든 틱을 순환하기 때문에 나는 왜 그런지 아는 바보입니다...

이것은 또 다른 선택이 될까요?

 for ( int i = 1 ; i <= OrdersTotal () ; i ++ )
     { 
      if ( OrderSelect ( i - 1 , SELECT_BY_POS )
       executedpreviously = true;
       while ( true )
         {
         modify section is ok...   
          }
        executedpreviously = false;
      }
//or would I declare this back to false elsewhere... 
//I am just not sure if it needs to run here each tick to grab the next order

계속;, return() 또는 중단; 어딘가에 유용?

 

아, 이전 예제 중 하나에서 오류를 보았습니다...

 if ( OrderType () == OP_SELL && OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 

제 생각에는 다음과 같아야 합니다.

 bool IfGap_SELLLevel_00AlreadyExe = FALSE; //(this time up in declared varibales before program start)


     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderType () == OP_SELL && OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01 && IfGap_SELLLevel_00AlreadyExe == FALSE)
        { 
             double Level_00_SL = Bid + Stoploss_Level_00*PipValue* Point ;
             if (Stoploss_Level_00 == 0 ) Level_00_SL = 0 ;
             double Level_00_TP = Bid - Takeprofit_Level_00*PipValue* Point ;
             if (Takeprofit_Level_00 == 0 ) Level_00_TP = 0 ;
             bool ret00 = OrderModify ( OrderTicket (), OrderOpenPrice (), Level_00_SL, Level_00_TP, 0 , Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = TRUE;
             if (ret00 == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
            break;  (EDIT: going to try this break in the morning, pls let me know if I am off track totally anyway)
         }
    }

그것은 그 섹션에서 그것을 격리해야합니다 ... 오전 5시이므로 아직 테스트하지 않았습니다 ... (시간을 잃었습니다. 일광 절약 시간제 하하)

이 섹션으로 한 방향으로 전달하면 최신 주문으로 모든 틱마다 스팸 주문이 수정됩니다. 다른 방법으로 전달하면 주문이 제대로 스크롤되지만 여전히 모든 틱에서 주문 캐시가 수정됩니다. ..

주문을 5,4,3,2,1 뒤로 스크롤하거나 1,2,3,4,5 앞으로 스크롤할 수 있지만 스팸을 보내지 않고 모든 주문을 수정할 수 있는 방법이 생각나지 않습니다.

1) 통과하는 모든 주문을 수정하기 위해 한 번 통과해야 합니까... 또는 2) 새 주문을 선택해야 할 때마다 통과해야 하나요?

나는 여전히 그것이 전부라는 것을 배우고 있습니다. 아무도 나를 올바른 방향으로 인도할 수 없다면, 나는 휴식과 끝과 함께 위의 이 줄을 시도하고 그것이 끝나는지 볼 것입니다.... 그것은 단순해야 합니다.

 
IfGap_SELLLevel_00AlreadyExe == FALSE)  this may still compile, but truly speaking, this a "mis-spelt" boolean syntax.

당신은 어떤 오류도하지 않았습니다. 첫 번째는 GOOD...

 if ( OrderType () == OP_SELL && OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe ) <--- this is GOOD to go..


이 모든 것을 올바르게 읽었다면 이전에 꽤 유사한 prb가 있었을 것입니다. "Bid/Ask가 x Pips를 이동하면 최소 MODE_STOP 수준으로 stop/limit 주문 수정"을 만들려고 했습니다.

당신의 경우도 비슷합니까?

 
diostar :

당신은 어떤 실수도하지 않았습니다. 첫 번째는 GOOD...


이 모든 것을 올바르게 읽었다면 이전에 꽤 유사한 prb가 있었을 것입니다. "Bid/Ask가 x Pips를 이동하면 최소 MODE_STOP 수준으로 stop/limit 주문 수정"을 만들려고 했습니다.

당신의 경우도 비슷합니까?



감사합니다 Diostar, 나는 Pending Orders로 일종의 힙을 만들려고 노력하고 있습니다. 그런 다음 다음 성공적인 Pending Order에 도달하면 이전 중지를 불러옵니다.

로 노력하겠습니다! 다시 ... 시도할 조합이 너무 많습니다 ... 그리고 FALSE 대신 부울 값에 대해 "false"를 사용해야 합니다... 예, 여전히 컴파일되고 제대로 작동하지만 동일한 문제가 있습니다. 그 초안을 다시 찾아 "false"로 시도할 수 있습니다. 해당 예 2에서는 주문을 스크롤하지 않고 모든 눈금 을 수정하므로 이 변수를 변경하여 다시 시도합니다.

수정 블록에 전달하고 순서를 앞뒤로 회전하도록 할 수 있지만 모든 틱이 수정되고 수정 후 true 또는 false 필터를 넣으면 캐시의 첫 번째 순서만 수정됩니다... .

나에게 이것은 EA가 다음 주문을 얻기 위해 매 틱마다 이 블록에 도착해야 한다는 것을 암시합니다(이 블록에 언제 도착하는지, 여기에서 봉인하고 주문을 통해 회전하게 할 수 있는지 확실하지 않았습니다. 한번)...

참 또는 거짓 질문이 통과하지 못하기 때문에 이것은 나에게 문제를 제시합니다.

주문 캐시를 만들고 이를 통해 선택하는 방법을 배운다면 여전히 같은 문제가 있을 것이라고 생각합니다. 모든 조합이 발생했지만 동시에 발생하지는 않았습니다. 한 번 수정한 다음 계속 진행하도록 했으나 첫 번째 주문만 받고 중지되었습니다... 그래서 각 주문 티켓이 실제로 지정된 스위치와 함께 사용해야 하는지 궁금합니다... 내 오류 메시지를 보고하는 내 bool OrderTicket(), Pending_OrderTicket_XX 선언도 엉망... 간단한 것이어야 합니다.

이 문제를 어떻게 해결했습니까?

 
void IfGap_SELLLevel_00()
{
     if ( OrderSelect (FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES)) 
    {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01)
        {
             if ((Gap_Level_00 < 0 && ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_00*PipValue* Point ))
             || (Gap_Level_00 > 0 && ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_00*PipValue* Point )))
            {
                SellOrderModifyLevel_00();
            }
        }
    }
    
    
}

void SellOrderModifyLevel_00()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderType () == OP_SELL && OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
             double Level_00_SL = Bid + Stoploss_Level_00*PipValue* Point ;
             if (Stoploss_Level_00 == 0 ) Level_00_SL = 0 ;
             double Level_00_TP = Bid - Takeprofit_Level_00*PipValue* Point ;
             if (Takeprofit_Level_00 == 0 ) Level_00_TP = 0 ;
             OrderModify ( OrderTicket (), OrderOpenPrice (), Level_00_SL, Level_00_TP, 0 , Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}


전역 변수에서 선언하는 방법에 관계없이 ...

bool IfGap_SELLLevel_00AlreadyExe;

.. 한 번 수정하는 것 같지만 주문 중 하나만 주문을 스크롤하는 방식으로 마지막 주문을 가정합니다.

혹시나 해서 티켓팅 전에 ret00도 꺼냈는데...

적어도 모든 틱은 아니지만 첫 번째 공식에 대한 조건이 true일 때 여전히 내 주문을 스크롤하는 경우 이 예를 사용할 수 있습니다(그러나 가장 성공적인 시도처럼 스크롤한 후 모든 틱에서 '스패밍 수정'이 확인되는 것은 아닙니다. ..)

이 시도도 작동하지 않았습니다.

 **sent here first from that other decision, but for Pending Order 5 instead of FirstSell 00 etc...

void SellOrderModifyLevel_05()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_TICKET))
    {
         if ( OrderType () == OP_SELL && OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
             double Level_05_SL = Bid + Stoploss_Level_05*PipValue* Point ;
             if (Stoploss_Level_05 == 0 ) Level_05_SL = 0 ;
             double Level_05_TP = Bid - Takeprofit_Level_05*PipValue* Point ;
             if (Takeprofit_Level_05 == 0 ) Level_05_TP = 0 ;
             OrderModify (FirstRunSell_ticket_00, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
             OrderModify (SellPendingOrderTicket_01, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
             OrderModify (SellPendingOrderTicket_02, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
             OrderModify (SellPendingOrderTicket_03, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
             OrderModify (SellPendingOrderTicket_04, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
             OrderModify (SellPendingOrderTicket_05, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}

나는 어쨌든 내가하려고하는 것을 더 명확하게 보여줍니다. 위의 일이 효과가 있기를 바랍니다. 그렇다면 완료되었을 것입니다 ...

어쨌든 내가 올바른 길을 가고 있기를 바랍니다. 이전의 예 1이 잘못된 이유를 여전히 이해하지 못합니다. 어리석은 일은 내가 원하는 것을 정확하게 수행하지만 모든 틱은 ... 프로그래밍 할 때 작동하도록 할 수도 없습니다. 주문에, 그래서 나는 완전히 다시 길을 잃었다..

어떤 포인터?


편집: 나는 정말로 지쳐가고 있지만, 이것에 대해 생각했습니다. 그러나 시간이 부족하여 나중에 시도해야 할 것입니다...

 void IfGap_SELLLevel_05()
{
     if ( OrderSelect (SellPendingOrderTicket_05,SELECT_BY_TICKET,MODE_TRADES)) 
    {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe)
        {
             if ((Gap_Level_05 < 0 && ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_05*PipValue* Point ))
             || (Gap_Level_05 > 0 && ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_05*PipValue* Point )))
            
             {
               for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
               if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
                     {
                     if ( OrderType () == OP_SELL && OrderSymbol () == Symbol () && OrderMagicNumber () == SELL_Magic01) 
                      { 
                       double Level_05_SL = Bid + Stoploss_Level_05*PipValue* Point ;
                       if (Stoploss_Level_05 == 0 ) Level_05_SL = 0 ;
                       double Level_05_TP = Bid - Takeprofit_Level_05*PipValue* Point ;
                       if (Takeprofit_Level_05 == 0 ) Level_05_TP = 0 ;
                       OrderModify (FirstRunSell_ticket_00, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
                       OrderModify (SellPendingOrderTicket_01, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
                       OrderModify (SellPendingOrderTicket_02, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
                       OrderModify (SellPendingOrderTicket_03, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
                       OrderModify (SellPendingOrderTicket_04, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
                       OrderModify (SellPendingOrderTicket_05, OrderOpenPrice (), Level_05_SL, Level_05_TP, 0 , Modify_Order_Colour);
                       IfGap_SELLLevel_00AlreadyExe = true;
            
                      }
                }
           }
       }
    
    
}
 

분수를 다루고 있습니까?

 
diostar :

분수를 다루고 있습니까?


제 생각에는 SL과 TP 값을 두 배로 늘려서 SL과 TP를 설정하는 가격이 할당되도록 한 것 같습니다. 내가 여기에서 이것을 하는 것이 틀리지 않았기를 바랍니다.

그 블록에 도달하려면 MT4가 필요합니다. 그런 다음 잊어버려요.... MT4에는 표현이 너무 복잡할 것 같은 느낌이 들지만 계속 시도할 것입니다...

 
Funky :


제 생각에는 SL과 TP 값을 두 배로 늘려서 SL과 TP를 설정하는 가격이 할당되도록 한 것 같습니다. 내가 여기에서 이것을 하는 것이 틀리지 않았기를 바랍니다.

그 블록에 도달하려면 MT4가 필요합니다. 그런 다음 잊어버려요.... MT4에는 표현이 너무 복잡할 것 같은 느낌이 들지만 계속 시도할 것입니다...

아니요, 제 말은 4/5 자리 숫자를 다루고 있다는 것입니다. 0.0001 또는 0.00001 포인트입니까?
 
diostar :
아니요, 제 말은 4/5 자리 숫자를 다루고 있다는 것입니다. 0.0001 또는 0.00001 포인트입니까?


아 5자리.. 예전에 이거 쓰는데...

 extern bool IsFiveDigitBroker = true;
extern bool DoDetectBrokerDigits = true;
double PipValue=1;
int NDigits = 4; 
// ----

int init()
{
    NDigits = Digits;
}

// ----
init start()

int start()
{
   OnEveryTick();
}
void OnEveryTick()
{
    if (DoDetectBrokerDigits == false && IsFiveDigitBroker) PipValue = 10;
    if (DoDetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;



    //then I go on to check the IfGaps on every tick...

    IfGap_SELLLevel_00();
    IfGap_SELLLevel_01();
    IfGap_SELLLevel_02();
    IfGap_SELLLevel_03();
    IfGap_SELLLevel_04();
    IfGap_SELLLevel_05();

 }



그리고 나는 더 일찍 생각하고 있었는데, 이 Detect Digits를 나의 첫 번째 라이브러리 삽입물로 돌리려고 할 수도 있습니다. 헤헤, 하지만 한 번에 한 단계씩, 먼저 크롤링하는 법을 배워야 합니다, 헤헤.

닫기 또는 아무것도 오류 메시지 130 가격이 표시되지 않습니다.

마지막 페이지에는 예제 1이 작동하고 있고 다른 유사한 예제가 많이 있습니다. 틱당 한 번 수정하도록 할 수 있기를 바랍니다...

한 번에 이전 SELL 주문 을 모두 받으려고 하는 대신 각 주문에 대해 새 상자를 만들어야 하는지 궁금합니다. 예, 모든 시도에서 모든 이전 SELL을 순환하는 방법을 정말 잃어버렸습니다. 한 번 수정합니다.


 && ( OrderStopLoss () < Stoploss_Level_00)

대신에

!IfGap_SELLLevel_00AlreadyExe

당신은 내가 생각하게 만든 이전 Diostart를 제안했습니다...

!IfGap_SELLLevel_00AlreadyEx 아이디어가 작동하지 않는지 궁금합니다(해당 블록을 잠그기 전에 모든 주문을 가져오고 동일한 패스를 통해 수정하지 않을 경우). 이전에 귀하의 아이디어를 사용했는지 궁금합니다. 거기에 이런 질문을 넣으십시오 ... 작동하면 다시 팝업하겠습니다.

내가 잘못된 길을 가고 있다면 알려주세요. 건배 ;)

 
Funky :


아 5자리..이거 예전에 쓰는데...



그리고 나는 더 일찍 생각하고 있었는데, 이 Detect Digits를 나의 첫 번째 라이브러리 삽입물로 돌리려고 할 수도 있습니다. 헤헤, 하지만 한 번에 한 단계씩, 먼저 크롤링하는 법을 배워야 합니다, 헤헤. <-- 현명한 움직임. 크롤링 중입니다. 도서관을 이용하면 결국 걷게 될 것입니다.

닫기 또는 아무것도 오류 메시지 130 가격이 표시되지 않습니다.

마지막 페이지에는 예제 1이 작동하고 있고 다른 유사한 예제가 많이 있습니다. 틱당 한 번만 수정할 수 있기를 바랍니다... <--- 아래 참조

이전의 모든 SELL 주문을 한 번에 모두 받으려고 하는 대신 각 주문에 대해 새 상자를 만들어야 하는지 궁금합니다... 예, 모든 시도에서 모든 이전 SELL을 순환하는 방법을 정말 잃어버렸습니다. 한 번 수정합니다. <--- 아래 참조


이것이 도움이 될 수 있기를 바랍니다.

처음에 내 기호는 4자리였고 모든 후행 스탑, 스탑/리밋 오더 수정은 예상대로 진행되었습니다. 그런 다음 중개인은 분수로 가기로 결정했습니다. 필요한 변경을 하고 내 핍이 -3.4, -4.5, 0.1, 4.6, 7.3 등으로 가는 것을 보았습니다. 나는 이것이 괜찮다고 생각했지만 실제로는 그렇지 않았습니다. 1, 틱 2, 틱 3이 순차적으로 발생합니다.

1) 7.3>한도 후 주문 수정... 브로커가 1번의 슬리피지를 채움...

2) 7.5>한도 후 주문이 수정됩니다....브로커는 0 슬립을 채웁니다...

3) 7.1>한도 후 주문이 수정됩니다...브로커가 2개의 슬리피지를 채웁니다...

그래서 결국 3틱 모두에 대해 내 주문이 3번 수정됩니다. 이것을 깨닫고 MathRound()를 사용 하여 가장 가까운 정수로 반올림하여 1,2,3이 됩니다.

1) mathround(7.3) =7 >limit, NOT TRUE, 수정되지 않음

2) mathround(7.5)=8 >limit, TRUE, 순서가 수정됨

3) mathround(7.1)=7>limit, NOT TRUE, 수정되지 않음

사실 저는 여전히 위의 사항을 개선하는 방법에 대해 연구하고 있습니다. 지금까지는 제대로 작동하고 있지만 제 생각보다 더 나은 방법이 있을 것이라고 생각합니다.

사유: