Trailingstop EA가 작동하지 않습니다 - 페이지 3

 
FMIC : 몇 가지 조언; "Ask" 또는 "Bid"를 사용하지 마십시오. 대신 "OrderClosePrice()"를 사용하십시오. 매수 또는 매도 주문과 상관없이 실시간 가치입니다.
실시간이 아닙니다.
  1. AskBid 를 사용하면 지연 후, 즉 여러 서버 호출 사이, 절전 또는 긴 계산 후 RefreshRates() 가 필요합니다.
  2. OrderClosePrice 를 사용하면 OrderSelect 로만 업데이트됩니다 . 따라서 Sleep 또는 긴 계산 후에(또는 OnTick 호출 간에 선택된 순서를 유지한 후) 다시 선택해야 합니다.
     OrderSelect (OrderTicket(), SELECT_BY_TICKET); // Refresh OrderClosePrice
 
WHRoeder :
실시간이 아닙니다.
  1. AskBid 를 사용하면 지연 후, 즉 여러 서버 호출 사이, 절전 또는 긴 계산 후 RefreshRates() 가 필요합니다.
  2. OrderClosePrice 를 사용하면 OrderSelect 로만 업데이트됩니다 . 따라서 Sleep 또는 긴 계산 후에(또는 OnTick 호출 간에 선택된 순서를 유지한 후) 다시 선택해야 합니다.

정보를 주셔서 감사합니다. "OrderClosePrice()"가 버퍼링되었음을 알지 못했습니다. 그래서 "OrderClosePrice()"도 "Ask"/"Bid"도 이상적인 실시간 솔루션이 아니라고 생각합니다.

그러나 "OrderSelect()"가 만들어진 후 "Ask"/"Bid"를 사용하는 것보다 "OrderClosePrice()"가 더 나은 전체 솔루션이라는 데 동의하십니까?

그리고 실시간 솔루션의 경우 실제로 필요한 경우 대안으로 대체할 수 있습니다.

  • "OrderSelect()"로 주문 재선택(편집: 지적했더라도 초기 게시물에 이것을 나열하는 것을 잊었습니다)
  • "요청"/"입찰"이 있는 "RefreshRate()"
  • "MODE_ASK"/"MODE_BID"가 있는 "MarketInfo()"(이전 MQL4 스타일)
  • "SYMBOL_ASK"/"SYMBOL_BID"가 있는 "SymbolInfoDouble()"(새로운 스타일 MQL4+ 및 MQL5)
  • "SymbolInfoTick()"(어쨌든 대부분의 EA에서 이미 사용하고 있음)
 
FMIC : 그러나 "OrderSelect()"가 만들어진 후 "Ask"/"Bid"를 사용하는 것보다 "OrderClosePrice()"가 더 나은 전체 솔루션이라는 데 동의하십니까?
물론.
 

왜 바퀴를 다시 발명하려고 합니까?

여기 를 보세요. 필요한 모든 것을 찾을 수 있습니다.

소스 코드 수정을 시작하지 않는 경우.

 

지금까지 모두의 도움에 감사드립니다. 이제 오류 130 문제를 해결했다고 생각하지만, 내 OrderSelect 함수 에 심각한 문제가 있습니다. 이 기능이 가끔 일부 주문만 수정하는 이유일 가능성이 큽니다. 아래는 제가 인쇄한 목록입니다. OrderTicket #이 완전히 잘못되었습니다. 그 티켓 번호는 내가 EURAUD에 대해 개설한 거래에 속합니다. 모든 결과를 포함하지는 않았지만 실제로 OrderTicket 번호가 거래 터미널의 쌍과 일치하지 않는 여러 쌍이 있습니다.

누군가 보시고 OrderSelect에 무엇이 문제인지 알려주시겠습니까? 고맙습니다

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: ticket = 0 나는 그 티켓이 OrdersTotal과 같은 값을 인쇄해야 한다고 생각하므로 내 카운터가 작동하지 않는 것 같습니다.

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: OrderSelect = true

2016.04.18 16:04:38.602 Trailing_v19 EURUSD,M15: 주문 합계 = 11

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbypos = 0

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: Selectbyticket = 1

2016.04.18 16:04:38.202 Trailing_v19 EURUSD,M15: 주문 티켓 = 50213357

 extern int TrailingStart= 12 ;
extern int TrailingStop= 5 ;
double stoplevel=(MarketInfo( Symbol (),MODE_STOPLEVEL))/ 10 ;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip= Point * 10 ;
   int ticket= 0 ;
   if (TS<stoplevel) TrailingStart=( int )stoplevel+TrailingStop+ 2 ;
   
   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);                     
                        
   { for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--){ //I added more curly brackets{}
       if ( OrderSelect (i,SELECT_BY_POS)){
      ticket++;{
         if (OrderSymbol()== _Symbol ){
             if (OrderType()==OP_BUY){
               if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET)){
                   if ((Bid-OrderOpenPrice())>(TrailingStart*Pip)){ //For now, I have changed back to Bid and Ask and will include OrderClosePrice() later on.
                     if (TrailingStop*Pip<Bid-(TrailingStop*Pip)){ //I have added TrailingStop*Pip before the '<'
                         if (OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue)) //I removed the !
                         return ( 0 ); //I replaced the Getlasterrror with a return value
                        RefreshRates();
                        }     
                    }  
                }     
            }  
             if (OrderType()==OP_SELL){
               if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET)){
                   if ((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if (TrailingStop*Pip>Ask+(TrailingStop*Pip)){
                         if (OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                         return ( 0 );
                        RefreshRates();
                       }
                    }
                }  
            }
         }
      } 
   }
}  
   return ( 0 );
}
//+------------------------------------------------------------------+



 

안녕하세요 여러분. 모든 도움을 주셔서 감사합니다. 오류를 찾았고 문제가 해결되었습니다. Stoploss를 사용하지 않기 때문에 OrderStopLoss()의 값은 항상 0입니다. 0은 항상 Bid-TrailingStop*Pip보다 작기 때문에 구매 주문을 수정할 때 문제가 되지 않습니다. 그러나 매도 주문 0은 Ask+Trailingstop*Pip보다 클 수 없습니다. 그래서 이 줄에 or(|| OrderStopLoss()) 를 추가해야 했습니다.

 if (OrderType()==OP_SELL){
               if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET)){
                   if ((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if (OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()== 0 ) { //Added OrderStopLoss()==0
                         if (OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
 
Trader3000 : 그 티켓 번호는 내가 EURAUD에 대해 개설한 거래에 속합니다.
OrderSelect 루프에 필터링이 없습니다. Symbol 다른 통화가 다른 별도 차트에 추가될 때 Ordersymbol과 같지 않습니다. - MQL4 포럼
 
WHRoeder :
Trader3000 : 그 티켓 번호는 내가 EURAUD에 대해 개설한 거래에 속합니다.
OrderSelect 루프에 필터링이 없습니다. Symbol 다른 통화가 다른 별도 차트에 추가될 때 Ordersymbol과 같지 않습니다. - MQL4 포럼

도움을 주셔서 대단히 감사합니다. 예, 일부 차트에서만 작동하기 때문에 OrderSelect에는 확실히 문제가 있습니다. 다른 문제는 거래가 수동으로 이루어지기 때문에 MagicNumber를 포함할 수 없다는 것입니다. 관련성이 있다고 생각되는 코드 부분을 사용했지만 컴파일할 수 없습니다. 다음 오류가 표시됩니다.

'MySelect' - 전역 범위에서만 함수를 선언할 수 있습니다. 후행_v26.mq4 31 13

31번째 줄은 다음과 같습니다.

 bool     MySelect( int iWhat, int eSelect, int ePool=MODE_TRADES){

전체 EA는 다음과 같습니다.

 #property strict ;
extern int TrailingStart= 10 ;
extern int TrailingStop= 5 ;
double stoplevel=(MarketInfo( Symbol (),MODE_STOPLEVEL))/ 10 ;
int TS=TrailingStart-TrailingStop;
bool     MySelect( int iWhat, int eSelect, int ePool=MODE_TRADES);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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)+ " pips" );
     } 
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip= Point * 10 ;
   if (TS<stoplevel) TrailingStart=( int )stoplevel+TrailingStop;
           
     bool     MySelect( int iWhat, int eSelect, int ePool=MODE_TRADES){
     if (! OrderSelect (iWhat, eSelect, ePool))     return ( false );
     if (OrderSymbol()      != _Symbol )           return ( false );
     if (ePool != MODE_HISTORY)                   return ( true );
     return (OrderType() <= OP_SELL);
}
     for ( int i = OrdersTotal ()- 1 ; i >= 0 ; i--)
     if (MySelect(i, SELECT_BY_POS)){

     for ( int iPos=OrdersHistoryTotal()- 1 ; iPos >= 0 ; iPos--)
     if (MySelect(iPos, SELECT_BY_POS, MODE_HISTORY)){
         int nextTkt = OrderTicket();
     
               if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET)){
                   if ((Bid-OrderOpenPrice())>(TrailingStart*Pip)){
                     if (OrderStopLoss()<Bid-(TrailingStop*Pip)){
                         if (OrderModify(OrderTicket(),OrderOpenPrice(),Bid-(TrailingStop*Pip),OrderTakeProfit(),Blue))
                         Print ( "Buy = " , GetLastError ());
                         return ( 0 );
                        RefreshRates();
                        }     
                     }  
                  }     
               }
               if ( OrderSelect (OrderTicket(),SELECT_BY_TICKET)){
                   if ((OrderOpenPrice()-Ask)>(TrailingStart*Pip)){
                     if (OrderStopLoss()>Ask+(TrailingStop*Pip) || OrderStopLoss()== 0 ){
                         if (OrderModify(OrderTicket(),OrderOpenPrice(),Ask+(TrailingStop*Pip),OrderTakeProfit(),Red))
                         Print ( "Sell = " , GetLastError ());
                         return ( 0 );
                        RefreshRates();
                        }
                     }
                  }  
               }
            
         
         
   return ( 0 );
}
//+------------------------------------------------------------------+



 
Trader3000 :

예, 일부 차트에서만 작동하기 때문에 OrderSelect에는 확실히 문제가 있습니다. 다른 문제는 거래가 수동으로 이루어지기 때문에 MagicNumber를 포함할 수 없다는 것입니다. 관련성이 있다고 생각되는 코드 부분을 사용했지만 컴파일할 수 없습니다.

구축할 수 있는 완벽하게 좋은 스켈레톤 코드를 주었습니다. 이 코드는 문제를 수정하고 그 이전에 나열하기도 했지만 무시하고 코드가 원하는 대로 되지 않는 이유에 대해 계속 고민하고 있습니다!

왜요? 코드가 작동하지 않기를 원하십니까? 예제를 사용하고 직접 테스트하십시오!

 
그는 자르고 붙여넣기만 하면 되고 코딩을 배울 필요가 없다고 생각합니다. 그는 다음과 같이 묻지 않고는 이 간단한 오류를 고칠 수도 없습니다.
'MySelect' - 전역 범위에서만 함수를 선언할 수 있습니다. 후행_v26.mq4 31 13
사유: