EA 코드 2 문제(SL 관리자)

 

여보세요,

MQL을 배우는 동안 도움을 주셔서 다시 한 번 감사드립니다.

여기 내 다음 문제가 있습니다.... 저는 이 문제에 매우 가깝습니다.... 원하는 모든 작업을 수행하고 있습니다... 그러나 GAP가 이 기준을 초과하는 경우 EVERYTICK에서 SL을 수정하는 것입니다. 한 번만 실행하는 것보다 ...

이것은 매우 간단한 코드이며 이 단계에서 해결할 수 없는 매우 간단한 문제이며 어떤 도움이 나의 학습에 도움이 될 것입니다..

이것은 단지 BUY SIDE atm이지만 나중에 OP_SELL 측에 대한 IFGAP에 대한 허용치를 작성했습니다.


이 EA의 기능은 다음과 같습니다.

1. 존재하지 않는 경우 구매 거래를 시작합니다.

2. TP 레벨 1에서 SL을 위로 이동합니다. TP 레벨 2에서 SL을 다시 이동합니다. TP 레벨 3에서 지난번에 다시 SL을 위로 이동합니다. 정말 심플하고 좋네요..


내가 겪고있는 멍청한 문제는 다음과 같습니다.

1. GAP 이상인 경우 내 OrderModify EVERYTICK를 실행합니다... 논리를 변경하는 방법을 생각할 수 없지만 일단 표시되면 미래에 대해 알게 될 것입니다 ...


미리 감사드립니다.

모두들 안부 인사와 행복한 핍스.


 int start()
{
     if ( Bars < 10 )
    {
         Comment ( "Not enough bars" );
         return ( 0 );
    }
     if (Terminated == true)
    {
         Comment ( "EA Terminated." );
         return ( 0 );
    }
    
    OnEveryTick();
    
}

void OnEveryTick()
{
     if (DetectBrokerDigits == false && FiveDigitBroker) PipValue = 10 ;
     if (DetectBrokerDigits && (NDigits == 3 || NDigits == 5 )) PipValue = 10 ;
    
    IfGap_Level_1();
    IfGap_Level_2();
    IfGap_Level_3();
    IfBUYOrderDoesNotExist();
    
}

void IfGap_Level_1()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)
        {
             if ((Gap_Level_1 < 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () < Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_1*PipValue* Point ))) ||
            ((Gap_Level_1 > 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () > Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_1*PipValue* Point )))))
            {
                BuyOrderModifyLevel_1();
                
            }
        }
    }
     else
     Print ( "OrderSelect() error - " , ErrorDescription( GetLastError ()));
    
}

void BuyOrderModifyLevel_1()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderType () == OP_BUY && OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)
        {
             double price = Ask;
             if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice ();
            }
             bool ret = OrderModify ( OrderTicket (), OrderOpenPrice (), price - BuyStoploss_Level_1*PipValue* Point , price + BuyTakeprofit_Level_1*PipValue* Point , 0 , Modify_Order_Colour);
             if (ret == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
        }
    }
    
}

void IfGap_Level_2()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == 1 )
        {
             if ((Gap_Level_2 < 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () < Gap_Level_2*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_2*PipValue* Point ))) ||
            ((Gap_Level_2 > 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () > Gap_Level_2*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_2*PipValue* Point )))))
            {
                BuyOrderModifyLevel_2();
                
            }
        }
    }
     else
     Print ( "OrderSelect() error - " , ErrorDescription( GetLastError ()));
    
}

void BuyOrderModifyLevel_2()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderType () == OP_BUY && OrderSymbol () == Symbol () && OrderMagicNumber () == 1 )
        {
             double price = Ask;
             if (true == false)
            {
                price = OrderOpenPrice ();
            }
             bool ret = OrderModify ( OrderTicket (), OrderOpenPrice (), price - BuyStoploss_Level_2*PipValue* Point , price + BuyTakeprofit_Level_2*PipValue* Point , 0 , White );
             if (ret == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
        }
    }
    
}

void IfGap_Level_3()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == 1 )
        {
             if ((Gap_Level_3 < 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () < Gap_Level_3*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_3*PipValue* Point ))) ||
            ((Gap_Level_3 > 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () > Gap_Level_3*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_3*PipValue* Point )))))
            {
                BuyOrderModifyLevel_3();
                
            }
        }
    }
     else
     Print ( "OrderSelect() error - " , ErrorDescription( GetLastError ()));
    
}

void BuyOrderModifyLevel_3()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderType () == OP_BUY && OrderSymbol () == Symbol () && OrderMagicNumber () == 1 )
        {
             double price = Ask;
             if (true == false)
            {
                price = OrderOpenPrice ();
            }
             bool ret = OrderModify ( OrderTicket (), OrderOpenPrice (), price - BuyStoploss_Level_3*PipValue* Point , price + BuyTakeprofit_Level_3*PipValue* Point , 0 , White );
             if (ret == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
        }
    }
    
}

void IfBUYOrderDoesNotExist()
{
     bool exists = false;
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderType () == InitialOrderType && OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)
        {
            exists = true;
        }
    }
     else
    {
         Print ( "OrderSelect() error - " , ErrorDescription( GetLastError ()));
    }
    
     if (exists == false)
    {
        Initial_BuyOrder();
        
    }
}

void Initial_BuyOrder()
{
     double SL = Ask - InitialBuyStoploss*PipValue* Point ;
     if (BuyStoploss_Level_3 == 0 ) SL = 0 ;
     double TP = Ask + Initial_Takeprofit*PipValue* Point ;
     if (Initial_Takeprofit == 0 ) TP = 0 ;
     int ticket = - 1 ;
     if (true)
    ticket = OrderSend ( Symbol (), OP_BUY, InitialBuyLots, Ask, 4 , 0 , 0 , "My Expert" , BUY_Magic, 0 , Blue );
     else
    ticket = OrderSend ( Symbol (), OP_BUY, InitialBuyLots, Ask, 4 , SL, TP, "My Expert" , BUY_Magic, 0 , Blue );
     if (ticket > - 1 )
    {
         if (true)
        {
             OrderSelect (ticket, SELECT_BY_TICKET);
             bool ret = OrderModify ( OrderTicket (), OrderOpenPrice (), SL, TP, 0 , Blue );
             if (ret == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
        }
            
    }
     else
    {
         Print ( "OrderSend() error - " , ErrorDescription( GetLastError ()));
    }
}



int deinit()
{
     if (ClearAllObjects) ObjectsDeleteAll ();
    
    
}

 
Funky :

내가 겪고있는 멍청한 문제는 다음과 같습니다.

1. GAP 이상인 경우 내 OrderModify EVERYTICK를 실행합니다... 논리를 변경하는 방법을 생각할 수 없지만 일단 표시되면 미래에 대해 알 수 있습니다.

매 틱마다 실행하지 않으려면 언제 실행하시겠습니까? 모든 틱을 한 번만 의미합니까? 그렇게 하려면 SL 및 TP가 이미 조정되었는지 확인하십시오. . .

다른 의견 하나 . . . IfGap_Level_1() 은 모든 열린 주문을 반복하여 Symbol 및 Magic number와 일치하는 주문을 찾은 다음 해당 주문이 일정 금액만큼 수익을 내고 있는지 확인합니다. . . BuyOrderModifyLevel_1() 을 호출하는 경우 이 함수 는 모든 열린 주문을 반복하여 Symbol 및 Magic 번호와 일치하고 Buy 인 주문을 찾습니다 . . 여기에 약간의 반복이 보이나요? IfGap_Level_1() 에서 BuyOrderModifyLevel_1() 로 티켓 번호를 전달하지 않으 시겠습니까?

 
Funky :

여보세요,

MQL을 배우는 동안 도움을 주셔서 다시 한 번 감사드립니다.

여기 내 다음 문제가 있습니다.... 저는 이 문제에 매우 가깝습니다.... 원하는 모든 작업을 수행하고 있습니다... 그러나 GAP가 이 기준을 초과하는 경우 EVERYTICK에서 SL을 수정하는 것입니다. 한 번만 실행하는 것보다 ...

이것은 매우 간단한 코드이며 이 단계에서 해결할 수 없는 매우 간단한 문제이며 어떤 도움이 나의 학습에 도움이 될 것입니다..

이것은 단지 BUY SIDE atm이지만 나중에 OP_SELL 측에 대한 IFGAP에 대한 허용치를 작성했습니다.


이 EA의 기능은 다음과 같습니다.

1. 존재하지 않는 경우 구매 거래를 시작합니다.

2. TP 레벨 1에서 SL을 위로 이동합니다. TP 레벨 2에서 SL을 다시 이동합니다. TP 레벨 3에서 지난번에 다시 SL을 위로 이동합니다. 정말 심플하고 좋네요..


내가 겪고있는 멍청한 문제는 다음과 같습니다.

1. GAP 이상인 경우 내 OrderModify EVERYTICK를 실행합니다... 논리를 변경하는 방법을 생각할 수 없지만 일단 표시되면 미래에 대해 알게 될 것입니다...


미리 감사드립니다.

모두들 안부 인사와 행복한 핍스.


당신은 NOOB가 아닙니다. 함수 를 작성한 다음 호출할 수 있는 우아한 능력으로 판단하면 당신이 했던 방식입니다. 함수 호출(논리의 깊이 등)이 아마도 1-2개의 함수로 단순화될 수 있다는 것을 스스로 확인할 수 있어야 합니다.

대신에:

 OrderOpenPrice () 

귀하의 상태에서:

 if ((Gap_Level_1 < 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () < Gap_Level_1*PipValue* Point ) ||

OrderStopLoss() 사용을 고려/시도했습니까?

 
RaptorUK :

매 틱마다 실행하지 않으려면 언제 실행하시겠습니까? 모든 틱을 한 번만 의미합니까? 그렇게 하려면 SL 및 TP가 이미 조정되었는지 확인하십시오. . .

다른 의견 하나 . . . IfGap_Level_1() 은 모든 열린 주문을 반복하여 Symbol 및 Magic number와 일치하는 주문을 찾은 다음 해당 주문이 일정 금액만큼 수익을 내고 있는지 확인합니다. . . BuyOrderModifyLevel_1() 을 호출하는 경우 이 함수 는 모든 열린 주문을 반복하여 Symbol 및 Magic 번호와 일치하고 Buy 인 주문을 찾습니다 . . 여기에 약간의 반복이 보이나요? IfGap_Level_1() 에서 BuyOrderModifyLevel_1() 로 티켓 번호를 전달하지 않으 시겠습니까?

다시 한 번 Raptor님 안녕하세요. 시간 내주셔서 다시 한 번 감사드립니다. 내가 그것을 표현하는 방식으로, 그것은 혼란스럽게 들립니다. 이 모든 구성 요소를 제대로 결합하는 데 문제가 있는 것 같습니다. 현재 내가 겪고 있는 주요 문제는 ' 매 틱마다 주문을 수정하는 것입니다'라는 것입니다. 그러나 이제 귀하의 의견에 따라 다른 문제도 볼 수 있습니다. 말씀하신 부분의 마지막 부분으로, 제가 이해한다면 자체 {}가 아니라 Gap에 도달했는지 확인한 후 {} 내부 IfGap_Level_1 내부에 BuyOrderModify 코드를 삽입하시겠습니까? 아래 예에서처럼?


 void OverGap1_soModify()
{
     for ( int i= OrdersTotal ()- 1 ; i >= 0 ; i--)
     if ( OrderSelect (i, SELECT_BY_POS, MODE_TRADES))
    {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)
        {
             if ((Gap_Level_1 < 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () < Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_1*PipValue* Point ))) ||
            ((Gap_Level_1 > 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () > Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_1*PipValue* Point )))))
               {
                 double price = Ask;
                 if (UseAskLineorNot == false)
                {
                 price = OrderOpenPrice ();
                 }
             bool ret = OrderModify ( OrderTicket (), OrderOpenPrice (), price - BuyStoploss_Level_1*PipValue* Point , price + BuyTakeprofit_Level_1*PipValue* Point , 0 , Modify_Order_Colour);
             if (ret == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
                
            }
        }
    }
     else
     Print ( "OrderSelect() error - " , ErrorDescription( GetLastError ()));
    
}

그리고 알다시피, 저는 이제 그 상자가 형태를 취하고 있는 방식으로 다른 EA와 dejavue 같은 느낌을 받고 있습니다(여기 https://forum.mql4.com/42870 - 다른 목적을 가진 다른 EA이므로 의도하지 않은 유사성) , 그러나 이것은 두 가지 기능을 함께 포함하는 것과 같이 내가 배워야 할 동일한 영역을 가리키고 있습니다. 포럼을 중복으로 채우려고 하지 않았다고 약속합니다)...

따라서 같은 지점에 있는 IFNEWORDEREXIST = TRUE 변수가 다른 문제를 해결할 수 있는지 우연한 기회에 물어봐도 될까요? ModeTrades에서 이루어진 마지막 공개 거래가 항상 IfGap_Level_X와 비교되는 거래가 되기를 원합니다.


위의 상자가 올바르지 않은 경우 {} 안에 갇혀 있는 동안 EVERYTICK에서 발생하는 OrderModify로 해당 오류를 수정하고 최신 주문 선택 문제를 처리하면 IfGap_Level_3이 만족되는 동안 다음 드라마에 직면하게 될 것입니다. IfGap_Level_2 및 IfGap_Level_1도 마찬가지입니다.

나는 일종의 EA가 SL 관리자 역할을 하기를 원하며 (초기 단일 구매 주문에도 불구하고) 여러 거래를 관리하는 데 사용할 것입니다. 첫 번째 구매는 확인을 위해 백테스트를 하기 위한 것이었습니다. 이 코드는 다음과 같습니다.

Order's Pips가 IfGap_Level_1에 도달하면 BuyOrderModifyLevel_1로 이동한 다음 기존 주문을 수정하고 코드의 이 부분을 잊어버리기를 원합니다.

IfOrder의 Pips가 IfGap_Level_2에 도달하면 BuyOrderModifyLevel_2로 이동한 다음 기존 주문을 수정하고 코드의 이 부분을 잊어버리기를 원합니다.

Order's Pips가 IfGap_Level_3에 도달하면 BuyOrderModifyLevel_3으로 이동한 다음 기존 주문을 수정하고 코드의 이 부분을 잊어버리고 싶습니다.

너무 멀리 있지 않기를 바랍니다. 처음에는 간단하게 느껴졌습니다.

"중단"을 삽입할 수 있기를 바랐습니다. 또는 각 블록의 끝에 무언가를 입력하고 이 코드를 사용하여 ...
디오스타 :

당신은 NOOB가 아닙니다. 함수를 작성한 다음 호출할 수 있는 우아한 능력으로 판단하면 당신이 했던 방식입니다. 함수 호출(논리의 깊이 등)이 아마도 1-2개의 함수로 단순화될 수 있다는 것을 스스로 확인할 수 있어야 합니다.

대신에:

귀하의 상태에서:

OrderStopLoss() 사용을 고려/시도했습니까?

아 감사합니다 diostar님, 댓글에 너무 친절하십니다. 기본적인 스크립트는 잘 쓰는 편인데 그 정도 수준은 아니어서 지금은 다 합치면 머리가 아프다. 격려해 주셔서 감사합니다. 포럼과 모든 것이 프로그램 문법/구문보다는 이해가 됩니다.

코드를 1-2개의 기능으로 압축하여 말씀하신 내용이 정확할 수 있다고 생각합니다.

경험이 있었다면 IFGAP과 MODIFY ORDER를 한 블록에 포함했을 것입니다. 당신과 Raptor가 모두 제안하는 것처럼 보이지만 이 단계에서는 안전하게 플레이하고 있었습니다. 어레이 또는 스위치에 TP가 있고 이전 TP=oldTP+TPincrement_Level을 설정하고 약 10줄의 코드로 한 블록에 모두 포함할 수 있습니다... 결국 저는 맨 마지막 If Gap & ModifyOrder {}에서 이 작업을 수행할 것입니다. SL 증분이 프로그래밍 가능한 간격으로 증가하도록 하지만 처음 몇 개는 시장 상황에 따라 수동으로 설정하도록 남겨두고 싶습니다...

수식에서 OrderStopLoss() 사용을 고려하지 않았습니다. 나는 처음 몇 번의 움직임에 대해 SL을 약간 변경할 것이므로 OrderOpenPrice와 개장 이후 증가한 Pips를 기반으로 하는 것을 정말로 원합니다. EA를 잘 설명하지 못했습니다. 죄송합니다. 시간 내주셔서 감사합니다. 대단히 감사합니다.

 
Funky :

다시 한 번 Raptor님 안녕하세요. 시간 내주셔서 다시 한 번 감사드립니다. 제가 표현하자면 혼란스럽습니다. 이 모든 구성 요소를 제대로 결합하는 데 문제가 있는 것 같습니다. 현재 내가 겪고 있는 주요 문제는 '모든 틱에서 주문을 수정하는 것'이지만, 이제 귀하의 의견을 듣고 다른 문제도 볼 수 있습니다. 말씀하신 부분의 마지막 부분으로, 제가 이해한다면 자체 {}가 아니라 Gap에 도달했는지 확인한 후 {} 내부 IfGap_Level_1 내부에 BuyOrderModify 코드를 삽입하시겠습니까? 아래 예에서처럼?

당신은 그렇게 할 수 있지만 그것은 실제로 내가 의미한 것이 아닙니다. . .

이것이 의미가 있는지 살펴보십시오. . .

          ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_1*PipValue* Point )))))
            {
                BuyOrderModifyLevel_1( OrderTicket () );     //  <-----  pass the ticket number to the function
                
            }
.
.
.


void BuyOrderModifyLevel_1( int Ticket)
{
     if ( OrderSelect ( Ticket , SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice ();
       }
       bool ret = OrderModify ( Ticket , OrderOpenPrice (), price - BuyStoploss_Level_1*PipValue* Point , price + BuyTakeprofit_Level_1*PipValue* Point , 0 , Modify_Order_Colour);
       if (ret == false)
       Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
     
    }
    
}

내가 언급한 또 다른 사항은 SL 및 TP가 무엇인지 확인 하여 주문이 이미 수정되었는지 확인하는 것입니다. 즉, 마지막 틱에서 이미 주문을 수정했다면 이 틱에서 다시 수행하지 마십시오. . . . 그게 당신이 하려고 했던거야?

 
RaptorUK :

당신은 그렇게 할 수 있지만 그것은 실제로 내가 의미한 것이 아닙니다. . .

이것이 의미가 있는지 살펴보십시오. . .

내가 언급한 또 다른 사항은 SL 및 TP가 무엇인지 확인하여 주문이 이미 수정되었는지 확인하는 것입니다. 즉, 마지막 틱에서 이미 주문을 수정했다면 이 틱에서 다시 수행하지 마십시오. . . . 그게 당신이 하려고 했던거야?


이것은 내 학습을위한 훌륭한 내용입니다 ... 처음에 함수 이름 뒤에 (OrderTicket())을 넣을 수 있다는 것을 깨닫지 못했습니다. 그래서 그것은 내 최근 미결 주문의 티켓 번호를 나타냅니다. 멋지네요. 이것은 내가 atm에 빠져 있는 것에 대한 매우 편리한 팁입니다. 감사합니다.

( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_1*PipValue* Point )))))
            {
                BuyOrderModifyLevel_1( OrderTicket () );     //  <-----  pass the ticket number to the function
                
            }

그리고 여기 당신이 가변 티켓을 만든 것을 볼 수 있습니다. 실제로 코드의 이 부분에서 변수를 선언할 수 있다는 것을 몰랐습니다. 위의 마지막 부분에서 값이 주어졌기 때문에 이것이 가능합니까? 나는 그것이 어떻게 작동하는지 이해하고, 내 '특정하지 않은' OrderTicket() 대신 이 마지막 거래의 주문 티켓 번호를 여기에서 사용합니다. 말이 되는군요. 나에게는 OrderSelect(i++.. 등)보다 훨씬 더 정확할 것입니다.

 void BuyOrderModifyLevel_1( int Ticket)
{
     if ( OrderSelect (Ticket, SELECT_BY_TICKET, MODE_TRADES))
    {
       double price = Ask;
       if (UseAskLineorNot == false)
       {
          price = OrderOpenPrice ();
       }
       bool ret = OrderModify (Ticket, OrderOpenPrice (), price - BuyStoploss_Level_1*PipValue* Point , price + BuyTakeprofit_Level_1*PipValue* Point , 0 , Modify_Order_Colour);
       if (ret == false)
       Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
     
    }
    
}


여기가 거의 오전 1시이므로 내일 자세히 살펴보겠습니다. 시간 내주셔서 감사합니다.... "BuyModify{} 대신 "If_Gap_Levels{}"에 이 논리를 삽입해야 할 것 같습니다. " 차단하다. 너무 명확하게 설명하지 않았습니다. 죄송합니다. 이 팁이 GAP에 대한 최신 티켓을 확인한 다음 해당 OP_BUY 및 BUY_Magic 등으로 모든 이전 주문을 수정하는 데 도움이 될 것이라고 생각합니다.

내가 언급한 또 다른 사항은 SL 및 TP가 무엇인지 확인하여 주문이 이미 수정되었는지 확인하는 것입니다. 즉, 마지막 틱에서 이미 주문을 수정했다면 이 틱에서 다시 수행하지 마십시오. . . . 그게 당신이 하려고 했던거야?

예, 이것은 정확히 내가 실제로 붙어있는 곳입니다 ... 이것을 지정하는 방법을 잘 모르겠습니다 ... NeedsModifying = false의 bool 값을 만든 다음 IfGap 기준이 충족되면 True로 변환합니까? 구문이 아니라 논리를 생각할 수 있지만 마지막 EA에서 마지막 문장을 제안할 수 있는 방법까지 귀하의 팁에서 배웠습니다. 랩터에게 다시 한 번 감사드립니다.

 
Funky :

이것은 내 학습을위한 훌륭한 내용입니다 ... 처음에 함수 이름 뒤에 (OrderTicket())을 넣을 수 있다는 것을 깨닫지 못했습니다. 그러면 갭 기준을 충족하는 내 티켓이 해당 기능 BuyOrderModifyLevel_1에 기인합니까? 이것은 내가 atm에 빠져 있는 것에 대한 매우 편리한 팁입니다. 감사합니다.

그리고 여기 당신이 가변 티켓을 만든 것을 볼 수 있습니다. 실제로 코드의 이 부분에서 변수를 선언할 수 있다는 것을 몰랐습니다. 위의 마지막 부분에서 값이 주어졌기 때문에 이것이 가능합니까? 나는 그것이 어떻게 작동하는지 이해하고, 내 '특정하지 않은' OrderTicket() 대신 이 마지막 거래의 주문 티켓 번호를 여기에서 사용합니다. 말이 되는군요. 나에게는 OrderSelect(i++.. 등)보다 훨씬 정확할 것입니다.

함수 정의의 일부입니다. . . OrderModify( https://docs.mql4.com/trading/OrderModify )와 같은 표준 함수와 마찬가지로 OrderModify는 함수이며 최소 5개의 변수를 이 함수에 전달하고 6번째는 선택 사항입니다. 당신은 당신의 자신의 Functions로 똑같은 일을 할 수 있습니다. . .

물론이죠. 밤.

 
RaptorUK :

함수 정의의 일부입니다. . . OrderModify( https://docs.mql4.com/trading/OrderModify )와 같은 표준 함수와 마찬가지로 OrderModify는 함수이며 최소 5개의 변수를 이 함수에 전달하고 6번째는 선택 사항입니다. 당신은 당신의 자신의 Functions로 똑같은 일을 할 수 있습니다. . .

물론이죠. 밤.


고마워 Raptor.... 아 내가 그 게시물의 마지막 문장을 편집하는 동안 나를 붙잡았어.

그 .doc을 다시 상기시켜 주셔서 감사합니다... OrderMofidy에서 특정 .doc을 여러 번 읽었다는 것은 웃기는 일입니다... 예전에는 그 설명서가 나에게 중국어로 보였지만, 진행하면서 더 고급 팁이 나타납니다. 밖으로. 나는 지금 그것을 다시 읽을 것이고, 당신이 나를 위해 언급한 기능이 일광처럼 분명할 것이라고 장담합니다. 그러나 그것을 찾을 수 있도록 지적해 주셔서 감사합니다.

--글을 쓰시는 동안 무의식적으로 마지막 부분을 편집했기 때문에 위에서 복사했습니다....

내가 언급한 또 다른 사항은 SL 및 TP가 무엇인지 확인하여 주문이 이미 수정되었는지 확인하는 것입니다. 즉, 마지막 틱에서 이미 주문을 수정했다면 이 틱에서 다시 수행하지 마십시오. . . . 그게 당신이 하려고 했던거야?

예, 이것은 정확히 내가 실제로 붙어있는 곳입니다 ... 이것을 지정하는 방법을 잘 모르겠습니다 ... NeedsModifying = false의 bool 값을 만든 다음 IfGap 기준이 충족되면 True로 변환합니까? 구문이 아니라 논리를 생각할 수 있지만 마지막 EA에서 마지막 문장을 제안할 수 있는 방법까지 귀하의 팁에서 배웠습니다. 랩터에게 다시 한 번 감사드립니다.

Downunder의 G'night.

 
RaptorUK :

함수 정의의 일부입니다. . . OrderModify( https://docs.mql4.com/trading/OrderModify )와 같은 표준 함수와 마찬가지로 OrderModify는 함수이며 최소 5개의 변수를 이 함수에 전달하고 6번째는 선택 사항입니다. 당신은 당신의 자신의 Functions로 똑같은 일을 할 수 있습니다. . .

물론이죠. 밤.


안녕하세요 랩터님

나는 당신이 나에게 보여준 아이디어를 사용하여 일을 조금 더 발전시켰습니다. 나는 당신의 코드가 내 문제를 해결해 줄 것이라는 것을 깨달았지만, 일단 주문이 내 두 번째 TP 수준에 도달하면 관리하기 어려울 것입니다..

나는 OrderSelect i++를 삭제하고 해당 방정식에서 나만의 티켓을 선택할 수 있다는 것을 몰랐습니다. 그래서 여러 거래에 대한 모든 문제를 해결할 것이기 때문에 이것을 시도했습니다... 이것이 효과가 있을까요?

누군가 이 코드가 작동하는지 확인할 수 있다면 기쁠 것입니다... 다시 한 번 지원에 감사드립니다 ;)

 void BuyPendingOrder_1()
{
     int expire = TimeCurrent () + 60 * 0 ;
     double price = NormalizeDouble (Ask, NDigits) + PriceOffset_1*PipValue* Point ;
     double SL = price - BuyStoploss_1*PipValue* Point ;
     if (BuyStoploss_1 == 0 ) SL = 0 ;
     double TP = price + BuyTakeprofit_1*PipValue* Point ;
     if (BuyTakeprofit_1 == 0 ) TP = 0 ;
     if ( 0 == 0 ) expire = 0 ;
     int PendingOrderTicket_1 = OrderSend ( Symbol (), OP_BUYSTOP, BuyLots_1, price, 4 , SL, TP, "EA_Pending_Order1" , BUY_Magic, expire, Blue );
     ///--^^^----^^^ allocate this ticket number to PendingOrderTicket_1 above
    if (PendingOrderTicket_1 == - 1 )
    {
         Print ( "OrderSend() error - " , ErrorDescription( GetLastError ()));
    }
    
}

void IfGap_Level_1()
{
     if ( OrderSelect (PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1
     {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)
        {
             if ((Gap_Level_1 < 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () < Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_1*PipValue* Point ))) ||
            ((Gap_Level_1 > 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () > Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_1*PipValue* Point )))))
            {
                BuyOrderModifyLevel_1; ///--<<<----if PendingOrderTicket_1 is over Gap_Level_1, then proceed to BuyOrderMoidfyLevel_1 section etc
                
            }
        }
    }
     else
     Print ( "OrderSelect() error - " , ErrorDescription( GetLastError ()));
    
}

void BuyOrderModifyLevel_1() 
{
     if ( OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)  ///--<<<----select all trades of that pair and magic
    {
        
             double price = Ask;
             if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice ();
            }
             bool ret = OrderModify ( OrderTicket (), OrderOpenPrice (), price - BuyStoploss_Level_1*PipValue* Point , price + BuyTakeprofit_Level_1*PipValue* Point , 0 , Modify_Order_Colour);
             ///--^^^^^^---- modify all trades of that pair and magic if it made it this far
            if (ret == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
            
    }
    
}
 

당신이 제안한 일을 하는 데 문제가 있습니다. . . .

EA가 실행 중이라고 상상해보십시오. . . . 그런 다음 MT4는 정전, MT4 충돌, PC 재부팅 필요 등 어떤 이유로든 중단됩니다. . . PendingOrderTicket_1 에 대한 올바른 값이 더 이상 없기 때문에 코드가 중단된 위치에서 선택할 수 없습니다.

 
RaptorUK :

당신이 제안한 일을 하는 데 문제가 있습니다. . . .

EA가 실행 중이라고 상상해보십시오. . . . 그런 다음 MT4는 정전, MT4 충돌, PC 재부팅 필요 등 어떤 이유로든 중단됩니다. . . PendingOrderTicket_1 에 대한 올바른 값이 더 이상 없기 때문에 코드가 중단된 위치에서 선택할 수 없습니다.


안녕하세요 랩터님, 다시 한번 감사드립니다.

위 코드의 유일한 문제인가요??? 최악의 경우 PendingOrderTicket_1이 수정되지 않고 SL에서 닫힐 것이라고 생각합니다.

OrderSelect 기능 을 사용한 방법은 괜찮습니까?

  if ( OrderSelect (PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES)) ///--<<<---- select ticket number from PendingOrderTicket_1

내가 가질 것이라고 생각하는 가장 큰 문제는 OrderTicket_1이 첫 번째 Gap_Level1을 넘을 때 이 기준이 충족되는 모든 순서를 계속 수정한다는 것입니다.

그렇습니까? 그렇다면 아래 코드로 해결될까요?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void BuyOrderModifyLevel_1()
{
if ( OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)
      {
        
             double price = Ask;
             if (UseAskLineorNot == false)
            {
                price = OrderOpenPrice ();
            }
             bool ret = OrderModify ( OrderTicket (), OrderOpenPrice (), price - BuyStoploss_Level_1*PipValue* Point , price + BuyTakeprofit_Level_1*PipValue* Point , 0 , Modify_Order_Colour);
            HasBeenExecuted = false ;
            if (ret == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
            {
            HasBeenExecuted = true ;
            }
     }    
   
}


아니면 CheckGapLevel_1로 이 작업을 수행하여 한 번만 확인하도록 하시겠습니까? 그리고 그렇다면 아래에서 제대로 했을까요???? "휴식"을 넣어야 하는 곳이 있습니까?

bool HasBeenExecuted = false;
/// (further up in declared variables^^^)

void IfGap_Level_1()
{
     if ( OrderSelect (PendingOrderTicket_1,SELECT_BY_POS,MODE_TRADES))
    {
         if ( OrderSymbol () == Symbol () && OrderMagicNumber () == BUY_Magic)
        {
             if ((Gap_Level_1 < 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () < Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid < Gap_Level_1*PipValue* Point ))) ||
            ((Gap_Level_1 > 0 && (( OrderType () == OP_BUY && Ask - OrderOpenPrice () > Gap_Level_1*PipValue* Point ) ||
            ( OrderType () == OP_SELL && OrderOpenPrice () - Bid > Gap_Level_1*PipValue* Point )))))
            HasBeenExecuted = false ;
            {
            HasBeenExecuted = true ;                
            BuyOrderModifyLevel_1;
               
            }
        }
    }
     else
     Print ( "OrderSelect() error - " , ErrorDescription( GetLastError ()));
    
}

다시 한번 감사합니다 ;)