Trailingstop EA가 작동하지 않습니다

 

안녕하세요 여러분. EA가 제대로 작동하지 않습니다. 10개의 다른 쌍/차트에서 동시에 실행하고 있습니다. 두 가지 문제가 있는 것 같습니다.

1. 대부분의 경우 Trailingstop을 트리거하지 않습니다. 그래도 작동하는 경우가 있습니다. 내 OrderSelect에 문제가 있다고 생각하지만 해결할 수 없습니다.

2. 때때로 오류 130 이 발생하지만 내 SL/TP가 어떻게 유효하지 않을 수 있는지 알 수 없습니다. 내가 인쇄하는 모든 값은 모든 쌍의 정지 수준보다 높습니다. 그리고 오류 130이 발생하더라도 실제로는 아무 문제가 없는 것처럼 순서를 수정하기도 합니다.

다음은 전체 EA입니다. 그것을 보시고 어떤 문제가 있는지 알려주시겠습니까?

 #property strict ;
extern string Label_TrailingStart= "Pip threshold to activate TrailingStop" ;
extern int TrailingStart= 11 ;
extern string Label_TrailingStop= "Pips trailing behind" ;
extern int TrailingStop= 5 ;
double stoplevel=(MarketInfo( Symbol (),MODE_STOPLEVEL))/ 10 ;
int TS=TrailingStart-TrailingStop- 1 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if (TS<stoplevel){
       MessageBox ( "Please note: Your inputs for TrailingStart and/or TrailingStop cannot" +
                 "\nbe less than the minimum levels required by your broker and the" +
                 "\nTrailingStart has been increased automatically to " + StringConcatenate (stoplevel+TrailingStop+ 1 )+ " Pips" );
     }
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip= Point * 10 ;
   if (TS<stoplevel) TrailingStart=( int )stoplevel+TrailingStop+ 1 ;
   
   Print ( "stoplevel = " ,stoplevel);
   Print ( "TrailingStart = " ,TrailingStart);
   Print ( "TrailingStop = " ,TrailingStop);
   Print ( "TS = " ,TS);
   
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
       if ( OrderSelect (i,SELECT_BY_POS)){
         if (OrderSymbol()!= Symbol ()) continue ;{
             if (OrderType()==OP_BUY){
               if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET)){
                   if (Bid-OrderOpenPrice()>TrailingStart*Pip){
                     if (OrderStopLoss()<Bid-TrailingStop*Pip){
                        RefreshRates();
                         if (!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Pip,OrderTakeProfit(),Blue))
                         Print ( "Buy = " , GetLastError ());
                         Print ( "Bid = " ,Bid);
                         Print ( "Bid-TrailingStop*Pip = " ,Bid-TrailingStop*Pip);
                         Print ( "TrailingStart*Pip = " ,TrailingStart*Pip);
                        }     
                    }  
                }     
            }  
             if (OrderType()==OP_SELL){
               if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET)){
                   if (OrderOpenPrice()-Ask>TrailingStart*Pip){
                     if (OrderStopLoss()>Ask+TrailingStop*Pip){
                        RefreshRates();
                         if (!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Pip,OrderTakeProfit(),Red))
                         Print ( "Sell = " , GetLastError ());
                         Print ( "Ask = " ,Ask);
                         Print ( "Ask+TrailingStop*Pip = " ,Ask+TrailingStop*Pip);
                         Print ( "TrailingStart*Pip = " ,TrailingStart*Pip);
                        }
                    }
                }  
            }
         }
      }   
   return ( 0 );
}
//+------------------------------------------------------------------+
 
  1. 누락된 괄호로 인해 정렬되지 않은 코드 블록이 여러 개 있습니다. 균형이 맞지만 "for"의 시작 부분과 "if" 블록의 일부와 같이 누락되었습니다.
  2. " if(OrderSymbol()!=Symbol()) continue;{ " 행은 매우 의심스럽고 코드 흐름이 어떻게 되어야 하는지 보기 어렵게 만듭니다. " if(OrderSymbol()==_Symbol) { "로 만드십시오. " Symbol() "대신에 " _Symbol "을 사용할 수도 있습니다.
  3. " Ask " 또는 " Bid "가 아닌 " OrderClosePrice() "를 사용하십시오.
  4. 비교를 수행할 때 괄호를 추가하여 읽기 쉽도록 하고 항목의 순서를 보장합니다. 예를 들어 " if(Bid-OrderOpenPrice()>TrailingStart*Pip) " 대신 " if( ( OrderClosePrice() - OrderOpenPrice() ) > ( TrailingStart * Pip ) ) "를 사용하십시오.
  5. 구매 및 판매 코드 블록을 둘 다 처리하는 단일 코드 블록으로 병합하십시오. 그러면 디버그할 코드가 줄어들고 나중에 읽고 수정하기가 더 쉬워집니다.

추신! 주의! 또한 주문에 매직 넘버를 사용하십시오!

추신! 또한 130 오류를 유발할 수 있는 미끄러짐도 고려해야 합니다. 최소 StopLevel만으로는 충분하지 않습니다. 현재 스프레드의 요소를 추가하는 것과 같은 가능한 슬리피지를 고려하여 약간 더 크게 만드십시오. 브로커에 의해 FreezeLevel이 있을 수도 있습니다!

 
FMIC :
  1. 누락된 괄호로 인해 정렬되지 않은 코드 블록이 여러 개 있습니다. 균형이 맞지만 "for"의 시작 부분과 "if" 블록의 일부와 같이 누락되었습니다.
  2. " if(OrderSymbol()!=Symbol()) continue;{ " 행은 매우 의심스럽고 코드 흐름이 어떻게 되어야 하는지 보기 어렵게 만듭니다.
    " if(OrderSymbol()==_Symbol) { "로 만드십시오. " Symbol() "대신에 " _Symbol "을 사용할 수도 있습니다.
  3. " Ask " 또는 " Bid "가 아닌 " OrderClosePrice() "를 사용하십시오.
  4. 비교를 수행할 때 괄호를 추가하여 읽기 쉽고 순서를 보장합니다.
    예를 들어 " if(Bid-OrderOpenPrice()>TrailingStart*Pip) " 대신 " if( ( OrderClosePrice() - OrderOpenPrice() ) > ( TrailingStart * Pip ) ) "를 사용하십시오.
  5. 구매 및 판매 코드 블록을 둘 다 처리하는 단일 코드 블록으로 병합하십시오. 그러면 디버그할 코드가 줄어들고 나중에 읽고 수정하기가 더 쉬워집니다.

추신! 주의! 또한 주문에 매직 넘버를 사용하십시오!

추신! 또한 130 오류를 유발할 수 있는 미끄러짐도 고려해야 합니다. 최소 StopLevel만으로는 충분하지 않습니다. 현재 스프레드의 요소를 추가하는 것과 같은 잠재적인 슬리피지를 고려하여 약간 더 크게 만드십시오. 브로커에 의해 FreezeLevel이 있을 수도 있습니다!

답장을 보내주시고 도와주셔서 정말 감사합니다. 몇 가지 질문/의견이 있습니다.

1. #1에서 내가 #4에서 제안한 대로 괄호()를 추가할 것을 제안했습니다. 그러나 "for"의 시작 부분에 괄호()를 추가하는 방법을 모르겠습니다. 이것을 설명해 주시겠습니까, 아니면 중괄호 {}를 말씀하신 건가요?

2. 나는 그것을 _Symbol로 변경했지만 내 지식을 향상시키기 위해 Symbol()보다 _Symbol을 사용하는 이점/장점이 무엇인지 설명할 수 있는지 궁금합니다.

3. 모든 Ask와 Bids를 OrderClosePrice()로 변경했습니다. 그러나 이것의 이점/장점이 무엇인지 설명해 주시겠습니까?

4. 나는 이것을했다

5. 어떻게 하면 이것을 더 단순화할 수 있는지 보려고 노력할 것입니다.

6. 수동으로 거래를 입력하기 때문에 MagicNumbers를 사용할 수 없는 것으로 알고 있습니다. 사실이 아닙니까?

7. 미끄러짐을 어떻게 또는 어디에서 설명할 수 있는지 모르겠습니다. 이것을 추가하는 위치 또는 방법을 알려주시겠습니까? OrderModify의 경우 다음 매개변수만 허용합니다.

 bool   OrderModify(
   int         ticket,       // ticket
   double      price,       // price
   double      stoploss,     // stop loss
   double      takeprofit,   // take profit
   datetime    expiration,   // expiration
   color       arrow_color   // color
   );

8. 내 코드에서 이미 최소 스톱레벨에 1핍(10포인트)을 추가했는데, 이는 대부분의 경우 스프레드를 설명해야 합니다.

9. 모든 쌍에 대해 Freezelevel을 인쇄했는데 모두 0.0이므로 문제가 되지 않는 것 같습니다.

10. 여전히 오류 130 과 오류 1이 발생하지만 EA가 작동하면 주문을 수정하고 닫습니다. 따라서 이러한 결과에 따라 주문이 동시에 수정됨에 따라 오류가 발생합니다. 마치 시간제 문제인 것처럼:

2016.04.15 13:11:06.183 Trailing_v18 USDCAD,M15: #50202284 수정 1.28477에서 0.01 USDCAD 구매 sl: 1.28598 tp: 0.00000 확인

2016.04.15 13:11:05.860 Trailing_v18 USDCAD,M15: 매수 = 130

2016.04.15 13:10:58.939 Trailing_v18 USDCAD,M15: #50202284 수정 1.28477에서 0.01 USDCAD 구매 sl: 1.28597 tp: 0.00000 확인

2016.04.15 13:10:57.835 Trailing_v18 USDCAD,M15: 수정 #50202284 1.28477에서 0.01 USDCAD 구매 sl: 1.28596 tp: 0.00000 확인

2016.04.15 13:10:56.974 Trailing_v18 USDCAD,M15: 매수 = 130

2016.04.15 13:10:56.531 Trailing_v18 USDCAD,M15: 매수 = 130

2016.04.15 13:10:56.263 Trailing_v18 USDCAD,M15: #50202284 수정 1.28477에서 0.01 USDCAD 구매 sl: 1.28590 tp: 0.00000 확인

2016.04.15 13:10:54.318 Trailing_v18 USDCAD,M15: 수정 #50202284 1.28477에서 0.01 USDCAD 구매 sl: 1.28582 tp: 0.00000 확인

2016.04.15 13:10:53.175 Trailing_v18 USDCAD,M15: 수정 #50202284 1.28477에서 0.01 USDCAD 구매 sl: 1.28581 tp: 0.00000 확인

2016.04.15 13:10:52.879 Trailing_v18 USDCAD,M15: 수정 #50202284 1.28477에서 0.01 USDCAD 구매 sl: 1.28577 tp: 0.00000 확인

2016.04.15 13:10:51.810 Trailing_v18 USDCAD,M15: 매수 = 130

2016.04.15 13:10:51.085 Trailing_v18 USDCAD,M15: 수정 #50202284 1.28477에서 0.01 USDCAD 구매 sl: 1.28575 tp: 0.00000 확인

2016.04.15 13:10:50.744 Trailing_v18 USDCAD,M15: 매수 = 130

2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: 매수 = 1

2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: 수정 #50202284 1.28477에서 0.01 USDCAD 구매 sl: 1.28571 tp: 0.00000 확인

다음은 Trailingstop이 stoplevel보다 분명히 높지만(10핍/100포인트) 여전히 오류 130을 생성하는 또 다른 예입니다.

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: 구매 오류 = 130

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TS = 20

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStop = 5

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStart = 25

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: 정지 수준 = 10.0



 

업데이트한 최신 코드를 제공하십시오. 그렇지 않으면 최근 변경 사항이 올바른지 확인하기 위해 귀하가 변경한 사항에 대해 언급할 수 없습니다.

  1. 죄송합니다. 저는 중괄호를 의미했습니다. 이를 수정해야 합니다. 그렇지 않으면 계속 실패합니다. 이것은 모든 포인트 중에서 가장 중요합니다.
  2. a) 이 요점은 주로 "_Symbol"에 관한 것이 아니라 "!=" 및 "continue"에 관한 것입니다.
    b) "_Symbol"은 변수이기 때문에 더 빨리 실행되는 반면, "Symbol()"은 더 느린 함수 호출로 실행됩니다.
  3. OrderClosePrice() 는 주문의 현재 종가입니다. 아직 열려 있으면 주문 유형 에 따라 자동으로 입찰 또는 매도를 보고합니다. 이 기능에 대한 문서를 읽으십시오.
  4. 확인! 변경한 코드를 살펴보겠습니다.
  5. 확인! 변경한 코드를 살펴보겠습니다.
  6. 예, 수동 거래의 경우 매직 번호는 0입니다. 그러나 코드에서 매직 번호를 "extern" 또는 "input"으로 정의하고 기본값으로 "0"을 할당한 다음 코드에서 해당 변수를 사용합니다. 그렇게 하면 다른 상황에서 EA를 쉽게 사용하거나 다른 EA에서 코드를 재사용할 수 있습니다.
  7. 나는 미끄러짐을 설명하는 방법을 설명했다. "TrailStop > ( StopLevel + ( CurrentSpread * Factor ) )" 여기서 Factor가 최소 "1.0"(이상적으로는 "1.5" 또는 "2.0", 과도한 미끄러짐으로 인해 여전히 오류 130이 발생하는 경우 더 큰 값)인지 확인하십시오. .
  8. 10포인트가 스프레드를 설명한다고 보장할 수는 없습니다. 스프레드는 Symbol에 따라 다르며 항상 변하기 때문에 특히 뉴스 이벤트가 진행되는 동안이나 업무 외 시간과 같이 유동성이 낮은 경우에는 더욱 그렇습니다.
  9. 확인! "FreezeLevel"을 사용하지 않는 것은 문제가 없지만 다른 브로커(있을 수 있음)와 함께 사용할 경우에 대비하여 코드에서 계속 처리할 것을 제안합니다. EA는 여전히 작동합니다.
  10. 분석할 수 있도록 변경 사항이 있는 새 코드를 제공합니다.
 
FMIC :

업데이트한 최신 코드를 제공하십시오. 그렇지 않으면 최근 변경 사항이 올바른지 확인하기 위해 귀하가 변경한 사항에 대해 언급할 수 없습니다.

  1. 죄송합니다. 저는 중괄호를 의미했습니다. 이를 수정해야 합니다. 그렇지 않으면 계속 실패합니다. 이것은 모든 포인트 중에서 가장 중요합니다.
  2. a) 이 요점은 주로 "_Symbol"에 관한 것이 아니라 "!=" 및 "continue"에 관한 것입니다.
    b) "_Symbol"은 변수이기 때문에 더 빨리 실행되는 반면, "Symbol()"은 더 느린 함수 호출로 실행됩니다.
  3. OrderClosePrice() 는 주문의 현재 종가입니다. 여전히 열려 있는 경우 주문 유형에 따라 자동으로 입찰 또는 매도를 보고합니다. 이 기능에 대한 문서를 읽으십시오.
  4. 확인! 변경한 코드를 살펴보겠습니다.
  5. 확인! 변경한 코드를 살펴보겠습니다.
  6. 예, 수동 거래의 경우 매직 번호는 0입니다. 그러나 코드에서 매직 번호를 "extern" 또는 "input"으로 정의하고 기본값으로 "0"을 할당한 다음 코드에서 해당 변수를 사용합니다. 그렇게 하면 다른 상황에서 EA를 쉽게 사용하거나 다른 EA에서 코드를 재사용할 수 있습니다.
  7. 나는 미끄러짐을 설명하는 방법을 설명했다. "TrailStop > ( StopLevel + ( CurrentSpread * Factor ) )" 여기서 Factor가 최소 "1.0"(이상적으로는 "1.5" 또는 "2.0", 과도한 미끄러짐으로 인해 여전히 오류 130이 발생하는 경우 더 큰 값)인지 확인하십시오. .
  8. 10포인트가 스프레드를 설명한다고 보장할 수는 없습니다. 스프레드는 Symbol에 따라 다르며 항상 변하기 때문에 특히 뉴스 이벤트가 진행되는 동안이나 업무 외 시간과 같이 유동성이 낮은 경우에는 더욱 그렇습니다.
  9. 확인! "FreezeLevel"을 사용하지 않는 것은 문제가 없지만 다른 브로커(있을 수 있음)와 함께 사용할 경우에 대비하여 코드에서 계속 처리할 것을 제안합니다. EA는 여전히 작동합니다.
  10. 분석할 수 있도록 변경 사항이 있는 새 코드를 제공합니다.


매우 감사합니다. 위의 모든 조언과 제안을 살펴보겠습니다. 그 동안 여기에 최신 코드가 있습니다. 또한이 줄에서 실수를 발견했다고 생각합니다.

 #property strict ;
extern string Label_TrailingStart= "Pip threshold to activate TrailingStop" ;
extern int TrailingStart= 12 ;
extern int TrailingStop= 5 ;
double stoplevel=(MarketInfo( Symbol (),MODE_STOPLEVEL))/ 10 ;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if (TS<stoplevel){
       MessageBox ( "Please note: Your inputs for TrailingStart and/or TrailingStop cannot" +
                 "\nbe less than the minimum levels required by your broker and the" +
                 "\nTrailingStart has been increased automatically to " + StringConcatenate (stoplevel+TrailingStop+ 2 )+ " Pips" );
     } 
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip= Point * 10 ;
   int ticket= 0 ;
   if (TS<stoplevel) TrailingStart=( int )stoplevel+TrailingStop+ 2 ;
   
   /*Print("stoplevel = ",stoplevel);
   Print("TrailingStart = ",TrailingStart);
   Print("TrailingStop = ",TrailingStop);
   Print("TS = ",TS);
   Print("Buy error = ",GetLastError());
                        Print("OrderOpenPrice = ",OrderOpenPrice());
                        Print("OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip = ",
                        OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip);
                        Print("OrderClosePrice-TrailingStop*Pip = ",OrderClosePrice()-TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);
                        Print("TrailingStop*Pip = ",TrailingStop*Pip);
                        Print("OrderClosePrice = ",OrderClosePrice());
                        Print("OrderStopLoss = ",OrderStopLoss());
                        Print("OrderSymbol = ",OrderSymbol());
                        Print("OrdersTotal = ",OrdersTotal());
                        Print("OrderSelect = ",OrderSelect(OrderTicket(),SELECT_BY_TICKET));
                        Print("ticket = ",ticket);
                        Print("OrderTicket = ",OrderTicket());
                        Print("Selectbyticket = ",SELECT_BY_TICKET);
                        Print("Selectbypos = ",SELECT_BY_POS);
                        Print("Ask = ",Ask);
                        Print("OrderModify = ",OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip),
                        OrderTakeProfit(),Blue));*/
   
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
       if ( OrderSelect (i,SELECT_BY_POS)){
      ticket++;
         if (OrderSymbol()== _Symbol ){
             if (OrderType()==OP_BUY){
               if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET)){
                   if ((OrderClosePrice()-OrderOpenPrice())>(TrailingStart*Pip)){
                     if (TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){
                        RefreshRates();
                         if (!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip),OrderTakeProfit(),Blue))
                         Print ( "Buy error = " , GetLastError ());
                        }     
                    }  
                }     
            }  
             if (OrderType()==OP_SELL){
               if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET)){
                   if ((OrderOpenPrice()-OrderClosePrice())>(TrailingStart*Pip)){
                     if (TrailingStop>OrderClosePrice()+(TrailingStop*Pip)){
                        RefreshRates();
                         if (!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()+(TrailingStop*Pip),OrderTakeProfit(),Red))
                         Print ( "Sell error = " , GetLastError ());
                         /*Print("Ask = ",Ask);
                        Print("Ask+TrailingStop*Pip = ",Ask+TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);*/
                        }
                    }
                }  
            }
         }
      }   
   return ( 0 );
}
//+------------------------------------------------------------------+

내가 만든 다소 중요한 변경 사항은 아래의 첫 번째 줄을 두 번째 줄로 변경한 것입니다. 왜냐하면 stoploss에 대해 0보다 높은 값이 있어야 한다고 생각하기 때문입니다. 사실인가요?

 if (OrderStopLoss()<OrderClosePrice()-(TrailingStop*Pip)){
 if (TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){
 

다음 코드 예제는 코드에 대한 가능한 솔루션/대안 역할을 합니다. 그러나 코드는 테스트 또는 디버깅되지 않았으므로(컴파일만) "의사" 코드로만 사용하십시오.

 #property strict

extern double
   dblTrailStartPips = 11.0 ,   // Trailing Start (Pips)
   dblTrailStopPips  = 5.0 ,   // Trailing Stop (Pips)
   dblPipMultiplier  = 10.0 ,   // Pips to Points Multiplier
   dblSpreadFactor   = 2.0 ;   // Spread Factor for Slippage Compensation
   
extern int
   intMagicNumber    = 0 ;     // Magic Number (0 for Manual Orders)
   
double
   dblTickSizeDelta,           // Size of a Tick (Delta)
   dblStopLevelDelta,         // Market Stop Level (Delta)
   dblTrailStartDelta,         // Trailing Start (Delta)
   dblTrailStopDelta;         // Trailing Stop (Delta)

// Initialisation
int OnInit ()
{
   dblTickSizeDelta   = MarketInfo( _Symbol , MODE_TICKSIZE );
   dblStopLevelDelta  = MarketInfo( _Symbol , MODE_STOPLEVEL ) * _Point ;
   dblTrailStartDelta = dblTrailStartPips * dblPipMultiplier  * _Point ;
   dblTrailStopDelta  = dblTrailStopPips  * dblPipMultiplier  * _Point ;
   
   return ( INIT_SUCCEEDED );
}

// Process Tick Event
void OnTick ()
{
   double
      dblSpreadDelta  = Ask - Bid,
      dblMinStopDelta = dblStopLevelDelta + ( dblSpreadDelta * dblSpreadFactor ),
      dblTrailDelta   = ( dblTrailStopDelta > dblMinStopDelta ) ? dblTrailStopDelta : dblMinStopDelta;
   
   for ( int i = OrdersTotal () - 1 ; i >= 0 ; i-- )
   {
       if ( OrderSelect ( i, SELECT_BY_POS, MODE_TRADES ) )
      {
         if ( ( OrderSymbol() == _Symbol ) && ( OrderMagicNumber() == intMagicNumber ) )
         {
             int intDirection = 0 ;
             switch ( OrderType() )
            {
               case OP_BUY:  intDirection = + 1 ; break ;
               case OP_SELL: intDirection = - 1 ; break ;
               default :                         continue ;
            }
            
             double
               dblOpenPrice  = OrderOpenPrice(),
               dblCloseDelta = ( OrderClosePrice() - dblOpenPrice ) * intDirection;
               
             if ( dblCloseDelta > dblTrailStartDelta )
            {
               double
                  dblStopLossPrice = OrderStopLoss(),
                  dblStopLossDelta = ( dblStopLossPrice  - dblOpenPrice ) * intDirection,
                  dblTrailingDelta = dblCloseDelta - dblTrailDelta;
               
               if ( ( dblTrailingDelta > dblStopLossDelta ) || ( dblStopLossPrice == 0 ) )
               {
                   double dblStopLoss = round ( ( dblOpenPrice + ( dblTrailingDelta * intDirection ) ) / dblTickSizeDelta ) * dblTickSizeDelta;
                   if ( dblStopLoss != dblStopLossPrice )
                  {
                     if ( !OrderModify( OrderTicket(), dblOpenPrice, dblStopLoss, OrderTakeProfit(), OrderExpiration() ) )
                     {
                         Print ( "Order Modification Failed with Error: " , GetLastError () );
                     }
                  }
               }
            }
         }
      }
   }
}
 

이 Trader3000을 사용해 보세요

이 코드를 당신이 이미 가지고 있는 것과 비교해보세요... 그것은 매우 유사하고 저는 그것을 몇 년 동안 사용해 왔으며 폭탄처럼 작동합니다...

 //+------------------------------+
//| TRAILING STOP Function       |
//+------------------------------+
void Trailing_Stop_Function()
{
bool Ticket_TS_Long;
   for ( int iTS_Long = OrdersTotal () - 1 ; iTS_Long >= 0 ; iTS_Long --)  
   {
      
       if ( OrderSelect (iTS_Long,SELECT_BY_POS,MODE_TRADES) == true
      && OrderSymbol() == Symbol ()
      && OrderType() == OP_BUY
      && OrderMagicNumber() == MagicNumberLong
      && Trailing_Stop_In_Pips > 0
      && Bid - OrderOpenPrice() > Trail_After_Pips_Profit*PipMultiplier
      && OrderStopLoss() < Bid - (Trailing_Stop_In_Pips*PipMultiplier))
      {
      Ticket_TS_Long = (OrderModify(OrderTicket(),OrderOpenPrice(),Bid - (Trailing_Stop_In_Pips*PipMultiplier), NULL , 0 ,Green));
         if (Ticket_TS_Long != true )
         {
         Print ( "TS-Order Modify Error " , GetLastError ());
         }
      }
    } 
bool Ticket_TS_Short;
   for ( int iTS_Short = OrdersTotal () - 1 ; iTS_Short >= 0 ; iTS_Short --)  
   {
      
   if ( OrderSelect (iTS_Short,SELECT_BY_POS,MODE_TRADES) == true
      && OrderSymbol() == Symbol ()
      && OrderType() == OP_SELL
      && OrderMagicNumber() == MagicNumberShort
      && Trailing_Stop_In_Pips > 0
      && OrderOpenPrice() - Ask > Trail_After_Pips_Profit*PipMultiplier
      && OrderStopLoss() > Ask + (Trailing_Stop_In_Pips*PipMultiplier))
      {
      Ticket_TS_Short = (OrderModify(OrderTicket(),OrderOpenPrice(),Ask + (Trailing_Stop_In_Pips*PipMultiplier), NULL , 0 ,Green));
         if (Ticket_TS_Short != true )
         {
         Print ( "TS-Order Modify Error " , GetLastError ());
         }
      }
   }
}

Trail_After_Pips_Profit은 사용자가 채우는 외부 이중 변수입니다.

PipMultiplier는 통화 소수점 을 계산하는 간단한 함수입니다 ...

MagicNumbers를 사용하지 않는 경우 해당 기준을 삭제하십시오....

이것은 ... 또는 오히려 모든 차트의 주문을 "추적해야"합니다.....

나는 수정을 받고 있지만 그것은 나를 위해 작동합니다 ....

 //+------------------------------------------+
//| Check for 5 Digits - Pipmultiplier       |
//+------------------------------------------+
   
   if ( Digits == 5 || Digits == 3 ) 
   {
   PipMultiplier = 10 * Point ;
   }
   else if ( Digits == 2 ) 
   {
   PipMultiplier = 100 * Point ;
   }
   
   else
   {
   PipMultiplier = Point ;
   }
   

나는 당신의 도움에 깊은 인상을 받았습니다. FMIC....좋습니다.

 

Mike.T :

나는 당신의 도움에 깊은 인상을 받았습니다. FMIC....좋습니다.

고맙습니다!

몇개의 충고; "Ask" 또는 "Bid"를 사용하지 마십시오. 대신 "OrderClosePrice()"를 사용하십시오. 매수 또는 매도 주문 과 상관없이 실시간 가치입니다.
 

@Mike.T: PipMulytiplier 코드에 문제가 있는 것 같습니다.

 else if ( Digits == 2 ) 
{
   PipMultiplier = 100 * Point ;
}

그것은 옳지 않은 것 같습니다! 2자리 기호에 대해 100을 곱하는 이유는 무엇입니까? 전혀 곱하지 않아야합니다! 4자리 기호와 동일한 조건이어야 합니다.

다음은 예입니다. USD/JPY의 가격이 108.65에서 108.77로 이동하는 경우; 그것은 1200핍이 아니라 12핍 증가입니다!
 
FMIC :

고맙습니다!

몇개의 충고; "Ask" 또는 "Bid"를 사용하지 마십시오. 대신 "OrderClosePrice()"를 사용하십시오. 매수 또는 매도 주문과 상관없이 실시간 가치입니다.

감사합니다... 몰랐습니다.... 그래서... (이 스레드를 가로채지 않고)... Bid 또는 Ask 대신 OrderClosePrice()를 사용해야 합니다...?
 
Mike.T :
감사합니다... 몰랐습니다.... 그래서... (이 스레드를 가로채지 않고)... Bid 또는 Ask 대신 OrderClosePrice()를 사용해야 합니까...?
예! 언급한 이유(문서 참조)와 내 예에서 설명한 것처럼 구매 및 판매 논리를 하나의 코드 블록으로 병합할 수 있습니다.
사유: