2017-10-31 1 views
3

MQL5로 시작한다고 생각하십시오.StopMoss가 0이 아닌 경우 ExpertMACD raise [invalid stops]

학습을 위해서, 나는 Alpari-MT5-Demo 계정의 BTCUSD H1 쌍에있는 ExpertMACD (MT5에 기본 설치된)에서 MT5의 EA 최적화를 실행했습니다.

데이터가 변경 되어도 Advisor가 더 이상 진화하지 않는다면 2017 년 7 월까지 모든 데이터가 확인되어 계속 0 점의 거래를 반복합니다 (스크린 샷). 백 테스팅의 경우에도 마찬가지입니다. 2017 년 7 월의 데이터는 거래를하지 않습니다.

테스트 로그에 오류 [invalid stops]가 표시됩니다. 최적화 할 입력에서 손실 중지 수준을 선택 취소하고 기본값을 0으로 설정하면 중지 손실이 더 이상 사용되지 않지만 모든 것이 다시 작동합니다.

무슨 일이 일어나는지 설명해 주시겠습니까? 왜 전체 역사에 종사하는 고문은 2017 년 7 월부터 일하지 않습니까? (나는 진드기 데이터를 확인했는데, 모두 괜찮아 보인다.) Stop Loss를 제거하면 왜 다시 트레이드 되나요?

enter image description here

P.S.

(갑자기) BTCUSD에 대한 확산이 2에서 13000으로 바뀌었을 때 (예, 쉼표없이), 이것은 물론 조언자를 망치고 있으며 일반적으로 ' 말이 되네. 어떻게 가능합니까? 이 경우 어떻게해야합니까? 나는 다른 중개인을 검사하고 2017 년 7 월 어딘가에 나타나는 스프레드가 모두 똑같이 증가했음을 보여줍니다.

나는 Alpari 웹 사이트를 파고 들어 본 결과 the average spread value for BTCUSD이 실제로 그렇게 높은 것으로 나타났습니다. 다시 이것은 어떻게 가능합니까? 왜 그럴까요? (Maybe related to the fork? 제게는 말이 안됩니다.)

마지막으로, 합리적인 stop-loss를 포함하여 주문을 적절하게하기 위해 ExpertMACD를 어떻게 수정 하시겠습니까?

ExpertMACD의 코드는 다음

//+------------------------------------------------------------------+ 
//|             ExpertMACD.mq5 | 
//|     Copyright 2009-2017, MetaQuotes Software Corp. | 
//|            http://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "2009-2017, MetaQuotes Software Corp." 
#property link  "http://www.mql5.com" 
#property version "1.00" 
//+------------------------------------------------------------------+ 
//| Include               | 
//+------------------------------------------------------------------+ 
#include <Expert\Expert.mqh> 
#include <Expert\Signal\SignalMACD.mqh> 
#include <Expert\Trailing\TrailingNone.mqh> 
#include <Expert\Money\MoneyNone.mqh> 
//+------------------------------------------------------------------+ 
//| Inputs               | 
//+------------------------------------------------------------------+ 
//--- inputs for expert 
input string Inp_Expert_Title   ="ExpertMACD"; 
int   Expert_MagicNumber   =10981; 
bool   Expert_EveryTick   =false; 
//--- inputs for signal 
input int Inp_Signal_MACD_PeriodFast =12; 
input int Inp_Signal_MACD_PeriodSlow =24; 
input int Inp_Signal_MACD_PeriodSignal=9; 
input int Inp_Signal_MACD_TakeProfit =50; 
input int Inp_Signal_MACD_StopLoss =20; 
//+------------------------------------------------------------------+ 
//| Global expert object            | 
//+------------------------------------------------------------------+ 
CExpert ExtExpert; 
//+------------------------------------------------------------------+ 
//| Initialization function of the expert       | 
//+------------------------------------------------------------------+ 
int OnInit(void) 
    { 
//--- Initializing expert 
    if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber)) 
    { 
     //--- failed 
     printf(__FUNCTION__+": error initializing expert"); 
     ExtExpert.Deinit(); 
     return(-1); 
    } 
//--- Creation of signal object 
    CSignalMACD *signal=new CSignalMACD; 
    if(signal==NULL) 
    { 
     //--- failed 
     printf(__FUNCTION__+": error creating signal"); 
     ExtExpert.Deinit(); 
     return(-2); 
    } 
//--- Add signal to expert (will be deleted automatically)) 
    if(!ExtExpert.InitSignal(signal)) 
    { 
     //--- failed 
     printf(__FUNCTION__+": error initializing signal"); 
     ExtExpert.Deinit(); 
     return(-3); 
    } 
//--- Set signal parameters 
    signal.PeriodFast(Inp_Signal_MACD_PeriodFast); 
    signal.PeriodSlow(Inp_Signal_MACD_PeriodSlow); 
    signal.PeriodSignal(Inp_Signal_MACD_PeriodSignal); 
    signal.TakeLevel(Inp_Signal_MACD_TakeProfit); 
    signal.StopLevel(Inp_Signal_MACD_StopLoss); 
//--- Check signal parameters 
    if(!signal.ValidationSettings()) 
    { 
     //--- failed 
     printf(__FUNCTION__+": error signal parameters"); 
     ExtExpert.Deinit(); 
     return(-4); 
    } 
//--- Creation of trailing object 
    CTrailingNone *trailing=new CTrailingNone; 
    if(trailing==NULL) 
    { 
     //--- failed 
     printf(__FUNCTION__+": error creating trailing"); 
     ExtExpert.Deinit(); 
     return(-5); 
    } 
//--- Add trailing to expert (will be deleted automatically)) 
    if(!ExtExpert.InitTrailing(trailing)) 
    { 
     //--- failed 
     printf(__FUNCTION__+": error initializing trailing"); 
     ExtExpert.Deinit(); 
     return(-6); 
    } 
//--- Set trailing parameters 
//--- Check trailing parameters 
    if(!trailing.ValidationSettings()) 
    { 
     //--- failed 
     printf(__FUNCTION__+": error trailing parameters"); 
     ExtExpert.Deinit(); 
     return(-7); 
    } 
//--- Creation of money object 
    CMoneyNone *money=new CMoneyNone; 
    if(money==NULL) 
    { 
     //--- failed 
     printf(__FUNCTION__+": error creating money"); 
     ExtExpert.Deinit(); 
     return(-8); 
    } 
//--- Add money to expert (will be deleted automatically)) 
    if(!ExtExpert.InitMoney(money)) 
    { 
     //--- failed 
     printf(__FUNCTION__+": error initializing money"); 
     ExtExpert.Deinit(); 
     return(-9); 
    } 
//--- Set money parameters 
//--- Check money parameters 
    if(!money.ValidationSettings()) 
    { 
     //--- failed 
     printf(__FUNCTION__+": error money parameters"); 
     ExtExpert.Deinit(); 
     return(-10); 
    } 
//--- Tuning of all necessary indicators 
    if(!ExtExpert.InitIndicators()) 
    { 
     //--- failed 
     printf(__FUNCTION__+": error initializing indicators"); 
     ExtExpert.Deinit(); 
     return(-11); 
    } 
//--- succeed 
    return(INIT_SUCCEEDED); 
    } 
//+------------------------------------------------------------------+ 
//| Deinitialization function of the expert       | 
//+------------------------------------------------------------------+ 
void OnDeinit(const int reason) 
    { 
    ExtExpert.Deinit(); 
    } 
//+------------------------------------------------------------------+ 
//| Function-event handler "tick"         | 
//+------------------------------------------------------------------+ 
void OnTick(void) 
    { 
    ExtExpert.OnTick(); 
    } 
//+------------------------------------------------------------------+ 
//| Function-event handler "trade"         | 
//+------------------------------------------------------------------+ 
void OnTrade(void) 
    { 
    ExtExpert.OnTrade(); 
    } 
//+------------------------------------------------------------------+ 
//| Function-event handler "timer"         | 
//+------------------------------------------------------------------+ 
void OnTimer(void) 
    { 
    ExtExpert.OnTimer(); 
    } 
//+------------------------------------------------------------------+ 

업데이트 잠시 후, Alpari의 고객 서비스 대답

: 확산이 올바르게 표시됩니다

우리 웹 사이트의 사양. 스프레드는 점 뒤에 3 자리 숫자로 지정됩니다. 입찰가와 물가 사이의 차이는 약 19 달러입니다.

따라서 19094의 확산은 실제로 19.094입니다.

답변

2

EA를 디버그 해보십시오.

문제를 이해하는 데 도움이 될 것입니다 귀하의 로그는, 어쩌면 stop_loss_in_pips = 0CSampleExpert::LongOpened() 함수 내에서 시장

PrintFormat("%i %s %s - stoploss price before sending an order at %.5f is %.5f", 
       __LINE__, 
       __FUNCSIG__, 
       __FILE__, 
       orderSendPrice, 
       orderStopLossPrice 
      ); 
+0

답장을 보내 주셔서 감사합니다. 나는 거래를 확인하고 갑자기 BTCUSD의 확산이 2에서 13000 (예, 쉼표없이)으로 바뀌 었습니다. 물론 이것은 고문을 망칠 뿐이지 일반적으로 이해가 가지 않습니다. 어떻게 가능합니까? 이 경우 어떻게해야합니까? 나는 다른 중개인을 검사했고 그들은 모두 2017 년 7 월에 somhere로 나타나는 확산의 동일한 증가를 보여줍니다. mk4 spread의 –

+0

이 설정에서 제공됩니다. 현재 스프레드를 사용하지 않는다면 확실히 알 수 있습니다. mql5 스프레드는 막대 (시간, OHLC, 볼륨, 스프레드)로 표시되므로 스프레드가 너무 클 수 있습니다. 아마 SeqWit 때문에 나는 전문가가 아니에요. 나는 최대 확산 필터를 ea의 코드에 도입 할 것을 제안합니다 :'if spread> 입력 매개 변수 - 건너 뛰기 거래' –

+0

그들이 포크와 관련이있는 것처럼 보입니다. 그만큼 확산을 달성함으로써 달성하십시오. 또한 그들은 8 월까지는 될 것이라고 말했으나 아직 시행 중이다. 여기 Alpari로부터의 통신 https://alpari.com/en/company/news/4729_27072017/ –

2

너무 너무 가까이 suggested_stoploss = OrderOpenPrice() - stop_loss_in_pips * pip_Size = OrderOpenPrice() 당신이 경우에 항목을 무시하는 블록을 추가 할 수있다 큰 확산 :

double spread = m_symbol.Ask() 
       - m_symbol.Bid();   // Spread(); is int, not double 

if ( spread > InpMaxSpread * m_adjusted_point){ 
     printf("%i - spread %.5f is too high!", __LINE__, spread); 
     return; 
} 

ShortOpened()와 동일. 또한 입력에 InpMaxSpread을 추가하는 것을 잊지 마십시오.

정지 손실에 관한 질문은 필요한 것이 무엇인지에 따라 달라지며, 이윤의 사용에 대한 예가 코드에 나와 있습니다.

double stoploss = m_symbol.Bid() - InpStopLoss * m_adjusted_point; 

if ( m_trade.PositionOpen(m_symbol, 
          ORDER_TYPE_BUY, 
          InpLots, 
          price, 
          stoploss, 
          tp 
          ) 
    ){ ... } 
+0

어떤 파일이'CSampleExpert :: LongOpened()'입니까? 못 찾겠 어. –

+0

경로 = 터미널 ID \ MQL5 \ Experts \ Examples \ MACD \ MACD Sample.mq5; 'ExpertMACD.mq5'에 대한 내용은 300과 335 –

+1

입니다. (다른 데모를 보았습니다.) CExpert 클래스 (Expert.mqh)가 제공하는'CExpert :: Processing()'이 있는데, CExpert :: CheckOpen() - CheckOpenLong() && CheckOpenShort(), OpenLong()'내가 생각하는 함수를 체크 할 수있는 좋은 곳이 있습니다 (예 :'Expert.mqh'의 753 번 라인) –

관련 문제