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

 
diostar :

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

처음에 내 기호는 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, 수정되지 않음

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


굉장한 Diostar, 그것은 저에게 실제로 매우 유용한 정보입니다. 특히 제가 강조한 부분입니다.

따라서 문제를 해결하면 내가 기대할 수 있는 최선은 다음과 같습니다.

내 조건이 갭 00, 01, 02 등에서 충족될 때마다 내가 바랄 수 있는 최선은 각 헤이의 1,2,3(각각) 스크롤입니다. 따라서 간격 03에서 모든 주문이 수정될 때까지 내 주문 02,01,00, 01,00,02, 00,02,01을 수정합니까? 같은 것을 앞으로 스크롤하지만 순서가 다른 경우 ...

실제로 이런 일이 일어나면 괜찮을 것 같은데.. 하지만 나중에 너와 같은 것을 발견하고 조이고 싶지만 한 번에 한 다리씩 해결해 나가고 있어 기쁘다.. 그래도 선견지명 감사합니다!!

아직 그 공식을 시도하려고합니다 ...

 
그 공식도 잘 맞았습니다. Diostar의 지원 덕분에 오랫동안 코드를 배우면서 꼬리를 쫓고 있었습니다. 감사합니다.
 

여느 때처럼 야, 나중에 생각해보면 다른 해결책이.....

내 학습을 위해 아래 블록이 이전에 내 문제에 대한 대체 해결 방법으로 작동 했습니까?


 //---------------------------old attempt where it spammed modifies--------------------------------------
//---------------------------I got around this problem another way before-------------------------------
void ModifySellBlock()
{
     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_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);
             if (ret00 == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
        }
    }
    
}

//-----------------------------however I am wondering now that I have fixed it------------------
//------------------------------would this of worked below?-------------------------------------

void ModifySellBlock()
{
     int orderstotal = OrdersTotal ();
     int orders = 0 ;
     int ordticket[ 30 ][ 2 ];
     for ( int i = 0 ; i < orderstotal; i++)
    {
         OrderSelect (i, SELECT_BY_POS, MODE_TRADES);
         if ( OrderType () != OP_SELL || OrderSymbol () != Symbol () || OrderMagicNumber () != 1 )
        {
             continue ;
        }
        ordticket[orders][ 0 ] = OrderOpenTime ();
        ordticket[orders][ 1 ] = OrderTicket ();
        orders++;
    }
     if (orders > 1 )
    {
         ArrayResize (ordticket,orders);
         ArraySort (ordticket);
    }
     for (i = 0 ; i < orders; i++)
    {
         if ( OrderSelect (ordticket[i][ 1 ], SELECT_BY_TICKET) == true)
        {
             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);
             if (ret00 == false)
             Print ( "OrderModify() error - " , ErrorDescription( GetLastError ()));
        }
    }
    
}

//--------------------------any problems with this block?----------------------------------------------
 
 
//-----------------------------however I am wondering now that I have fixed it------------------
//------------------------------would this of worked below?-------------------------------------

void ModifySellBlock()
{
    int orderstotal = OrdersTotal();
    int orders = 0;
    int ordticket[30][2];<-----then, arrayinitialize
    
    for (int i = 0; i < orderstotal; i++)
    {
        OrderSelect(i, SELECT_BY_POS, MODE_TRADES);<-----if(orderselect...

        if (OrderType() != OP_SELL || OrderSymbol() != Symbol() || OrderMagicNumber() != 1)
        {
            continue;
        }
        ordticket[orders][0] = OrderOpenTime();
        ordticket[orders][1] = OrderTicket();
        orders++;
    }
    if (orders > 1)<----orders >0
    {
        ArrayResize(ordticket,orders);
        ArraySort(ordticket);
    }
    for (i = 0; i < orders; i++)
    {
        if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET) == true)<---if (OrderSelect(ordticket[i][1], SELECT_BY_TICKET)

        {
            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;      
         
            can consider if(SL>0 || TP>0){
          
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}
 
diostar :


디오스타와 함께해주셔서 감사합니다. 당시에는 이런 아이디어조차 낼 수 있는 지식이 없었습니다. 지금도 ARRAYS를 만드는 방법을 배우는 중이므로 몇 가지 코드에서 다시 개조했습니다...

나는 솔직히 모든 주문을 선택하고 한 번만 수정하는 코드 섹션을 만드는 것이 얼마나 어려운지 믿을 수 없습니다... 데이터 흐름이 여기로 전송된다면 EVERYTICK...

시간을 내어 추가해 주셔서 감사합니다. 시도해 보겠습니다... 디오스타님, 저도 전에 말씀하신 내용을 보고 있는 것 같습니다. 예지력에 감사드립니다. 그래서 제 코드가 아님을 알았습니다.... 그렇습니다. 수정 사항(* #내가 진행 중인 주문)을 스크롤하는 것을 참조하세요. 그리고 슬리피지가 들어오는 것을 알 수 있습니다... 문제가 해결되면 계속 알려 드리겠습니다. 아마도 위의 코드를 정직하게 시작하는 것입니다. 다시 한 번 감사합니다. ;)

 
Funky :


디오스타와 함께해주셔서 감사합니다. 당시에는 이런 아이디어조차 낼 수 있는 지식이 없었습니다. 지금도 ARRAYS를 만드는 방법을 배우는 중이므로 몇 가지 코드에서 다시 개조했습니다...

나는 솔직히 모든 주문을 선택하고 한 번만 수정하는 코드 섹션을 만드는 것이 얼마나 어려운지 믿을 수 없습니다... 데이터 흐름이 여기로 전송된다면 EVERYTICK...

시간을 내어 추가해 주셔서 감사합니다. 시도해 보겠습니다... 디오스타님, 저도 전에 말씀하신 내용을 보고 있는 것 같습니다. 예지력에 감사드립니다. 그래서 제 코드가 아님을 알았습니다.... 그렇습니다. 수정 사항(* #내가 진행 중인 주문)을 스크롤하는 것을 참조하세요. 그리고 슬리피지(slippage)가 들어오는 것을 알 수 있습니다... 문제가 생기면 계속 알려 드리겠습니다. 아마도 위의 코드를 정직하게 시작하는 것으로 시작하겠습니다. 다시 한 번 감사합니다. ;)

천만에요. 슬리피지는 스프레드와 마찬가지로 모든 수정 가격, sl, tp에서 결과를 인용하지 않습니다. 그러나 나는 항상 슬리피지 제로로 send()를 주문합니다. 1,2점을 얻는 것이 좋을 수도 있지만 지금까지는 너무 좋습니다.