MQL5에서 함께 배우고 쓰기 - 페이지 10

 

질문이 주제인지 모르겠습니다.

디버깅과 테스터를 결합할 수 있습니까? 저것들. F5로 실행하면 물론 테스터가 시작되지 않습니다. 그리고 테스터에서 전문가를 시작 하면 중단점이 무시됩니다. 아니면 내가 뭔가 잘못하고 있습니까?

 
Lunatic :

질문이 주제인지 모르겠습니다.

디버그와 테스터를 결합할 수 있습니까?

지금은 아닙니다.
 
alexvd :
지금은 아닙니다.

데모에서만 실시간으로? 그러나 흥미로운 상황에서 디버깅은 어떻습니까?

처음에는 디버거에 대해 매우 기뻤지만 디버그 인쇄로 돌아가고 있습니다. 다른 디버깅 기술은 보이지 않습니다. - 실망스럽다.

 

예를 들어 MovingAverage로 제공되는 Expert Advisor를 공부하고 있습니다. 그 안에 있는 모든 것이 아름답습니다. 테스터 질문입니다.

이 EA는 첫 번째 틱에서만 양초를 분석합니다. 일부 상황은 처리하지 않고 미끄러지는 것으로 나타났습니다. 첫 번째 진드기에서 희귀 한 양초가 탄생한다는 것이 밝혀졌습니다. 연결 효과입니까, 제 결함입니까 아니면 테스터입니까?

분명히, 태어날 때만 양초를 처리하기 위해, 즉. 한 번, 마지막으로 처리된 양초를 정적 변수 에 저장해야 합니까?

P/S/ 이제 막 언어를 배우기 시작해서 그런 지루한 질문들입니다.

Документация по MQL5: Основы языка / Переменные / Статические переменные
Документация по MQL5: Основы языка / Переменные / Статические переменные
  • www.mql5.com
Основы языка / Переменные / Статические переменные - Документация по MQL5
 

안녕하세요, 저는 고문을 쓰고 있습니다. 아마도 챔피언십에 대한 시간이있을 것입니다. 나는 겉보기에 간단한 코드를 작성했는데 2개의 사용자 지정 표시기 를 사용하지만 이 표시기의 값은 0이므로 트랜잭션이 완료되지 않았습니다. 내가 무엇을 잘못했는지 확인하거나 표시기 자체에 문제가 있는 것입니까?

 //+------------------------------------------------------------------+
//|                                                  trend_masim.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"

input int period = 48 ;
input int period1 = 30 ;
input int sl= 200 ;
input double lot= 0.1 ;
input long magicBUY1= 102 ;
input int magicSELL1= 202 ;
input string sim= "eur" ;

double ind1[];
double ind2[];
int hind1;
int hind2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {

   hind1= iCustom ( "EURUSD" , PERIOD_H1 , "trend_v3_5" ,period);
   hind2= iCustom ( "EURUSD" , PERIOD_H1 , "trend_v3" , 4 );



   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
IndicatorRelease (hind1);
IndicatorRelease (hind2);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int bar;
double MAX,MIN,H,A0,A1,A2;
void OnTick ()
  {
  
 int   i, j,jj, k, g, q, ticket,l;
    double stop;
    MqlTradeRequest mrequest;  
 MqlTradeResult mresult;
   MqlTick latest_price;   
 


ArraySetAsSeries (ind1,true);
ArraySetAsSeries (ind2,true);
MAX= CopyBuffer (hind1, 2 , 0 , 3 ,ind1);
MIN= CopyBuffer (hind2, 0 , 0 , 3 ,ind2);

SymbolInfoTick ( _Symbol ,latest_price);
//BUY


   if ( PositionSelect ( _Symbol )== 1 && PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY ){jj= 1 ;} //определяет если позиция BUY
   if (jj== 0 ){
if ( ind2[ 1 ]>ind1[ 1 ]){ // условие на покупку
Print ( "индикатор=" ,ind2[ 1 ], " " ,ind1[ 1 ]);
         mrequest.action = TRADE_ACTION_DEAL ;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble (latest_price.ask, _Digits );           // последняя цена ask
         mrequest.sl = NormalizeDouble (latest_price.ask - sl* _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble ( 0 , _Digits ); // Take Profit
         mrequest.symbol = _Symbol ;                                            // символ
         mrequest.volume = lot;                                                // количество лотов для торговли
         mrequest.magic = magicBUY1;                                            // Magic Number
         mrequest.type = ORDER_TYPE_BUY ;                                       // ордер на покупку
         mrequest.type_filling = ORDER_FILLING_AON ;                            // тип исполнения ордера - все или ничего
         mrequest.deviation= 10 ;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
         OrderSend (mrequest,mresult);

GlobalVariableSet ( "k11" +sim,Bars2);
GlobalVariableSet ( "bar11" +sim, Bars ( "EURUSD" , NULL ));
}}
   
  
  }
//+------------------------------------------------------------------+
 

Lunatic :

이 EA는 첫 번째 틱에서만 양초를 분석합니다. 일부 상황은 처리하지 않고 미끄러지는 것으로 나타났습니다. 첫 번째 진드기에서 희귀 한 양초가 탄생한다는 것이 밝혀졌습니다. 연결 효과입니까, 제 결함입니까 아니면 테스터입니까?

분명히, 태어날 때만 양초를 처리하기 위해, 즉. 한 번, 마지막으로 처리된 양초를 정적 변수 에 저장해야 합니까?

새 막대의 모양은 막대를 정적 변수에 저장한 후 막대의 시간을 변경하여 가장 잘 추적할 수 있습니다.

예제는 IsNewBarExpert Advisors의 Limits and Checks 문서에서 찾을 수 있습니다.

 
Automated-Trading :

새 막대의 모양은 막대를 정적 변수에 저장한 후 막대의 시간을 변경하여 가장 잘 추적할 수 있습니다.

예제는 IsNewBarExpert Advisors의 제한 사항 및 확인 문서에서 찾을 수 있습니다.

감사합니다. 이것은 분명합니다.

그러나 내가 이해하지 못하는 것은 Expert Advisors를 디버깅하는 방법입니다. 테스터에서는 우리가 만들고 있는 시스템이 아니라 프로그램의 버그가 분명합니다. 예를 들어, 프로그램이 특정 분기에 들어가지 않는 이유는 명확하지 않습니다. 이유는 무엇입니까? 다른 디버그 인쇄를 넣은 다음 로그에서 찾은 다음 다른 인쇄를 넣고 프로그램이 실행될 때까지 특정 시간을 기다렸다가 로그에서 다시 확인해야 합니까?

프로그램 오류 검색을 구성하는 가장 좋은 방법은 무엇입니까?

 
m_a_sim :

안녕하세요, 저는 고문을 쓰고 있습니다. 아마도 챔피언십에 대한 시간이있을 것입니다. 나는 겉보기에 간단한 코드를 작성했는데 2개의 사용자 지정 표시기 를 사용하지만 이 표시기의 값은 0이므로 트랜잭션이 완료되지 않았습니다. 내가 무엇을 잘못했는지 확인하거나 표시기 자체에 문제가 있는 것입니까?

코드를 디버그하기 위해 사용자 지정 표시기를 MA로 바꿨습니다.

   hind1= iMA ( "EURUSD" , PERIOD_H1 , 20 , 0 , MODE_SMA , PRICE_CLOSE );
   hind2= iMA ( "EURUSD" , PERIOD_H1 , 40 , 0 , MODE_SMA , PRICE_CLOSE );

값을 배열로 복사하는 문제를 수정했습니다.

MAX= CopyBuffer (hind1, 0 , 0 , 3 ,ind1);
MIN= CopyBuffer (hind2, 0 , 0 , 3 ,ind2);

이제 표시기 값이 있습니다.

 //+------------------------------------------------------------------+
//|                                                  trend_masim.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link       "https://www.mql5.com"
#property version   "1.00"

input int period = 48 ;
input int period1 = 30 ;
input int sl= 200 ;
input double lot= 0.1 ;
input long magicBUY1= 102 ;
input int magicSELL1= 202 ;
input string sim= "eur" ;

double ind1[];
double ind2[];
int hind1;
int hind2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {

   hind1= iMA ( "EURUSD" , PERIOD_H1 , 20 , 0 , MODE_SMA , PRICE_CLOSE );
   hind2= iMA ( "EURUSD" , PERIOD_H1 , 40 , 0 , MODE_SMA , PRICE_CLOSE );

   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
IndicatorRelease (hind1);
IndicatorRelease (hind2);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int bar;
double MAX,MIN,H,A0,A1,A2;
void OnTick ()
  {
  
int    i, j,jj, k, g, q, ticket,l;
     double stop;
     MqlTradeRequest mrequest;  
MqlTradeResult mresult;
   MqlTick latest_price;  



ArraySetAsSeries (ind1,true);
ArraySetAsSeries (ind2,true);
MAX= CopyBuffer (hind1, 0 , 0 , 3 ,ind1);
MIN= CopyBuffer (hind2, 0 , 0 , 3 ,ind2);

SymbolInfoTick ( _Symbol ,latest_price);
//BUY


   if ( PositionSelect ( _Symbol )== 1 && PositionGetInteger ( POSITION_TYPE )== POSITION_TYPE_BUY ){jj= 1 ;} //определяет если позиция BUY
   if (jj== 0 ){
if ( ind2[ 1 ]>ind1[ 1 ]){ // условие на покупку
Print ( "индикатор=" ,ind2[ 1 ], " " ,ind1[ 1 ]);
         mrequest.action = TRADE_ACTION_DEAL ;                                   // немедленное исполнение
         mrequest.price = NormalizeDouble (latest_price.ask, _Digits );           // последняя цена ask
         mrequest.sl = NormalizeDouble (latest_price.ask - sl* _Point , _Digits ); // Stop Loss
         mrequest.tp = NormalizeDouble ( 0 , _Digits ); // Take Profit
         mrequest.symbol = _Symbol ;                                             // символ
         mrequest.volume = lot;                                                 // количество лотов для торговли
         mrequest.magic = magicBUY1;                                             // Magic Number
         mrequest.type = ORDER_TYPE_BUY ;                                       // ордер на покупку
         mrequest.type_filling = ORDER_FILLING_AON ;                             // тип исполнения ордера - все или ничего
         mrequest.deviation= 10 ;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
         OrderSend (mrequest,mresult);

}}
  
  
  }
//+------------------------------------------------------------------+
 
AM2 :

코드를 디버그하기 위해 사용자 지정 표시기 를 MA로 바꿨습니다.

값을 배열로 복사하는 문제를 수정했습니다.

이제 표시기 값이 있습니다.

모든 것이 지표에 관한 것으로 밝혀졌습니다. 테스터가 나에게 오류를 제공합니다

2010.09.01 19:44:36 Core 1 2010.06.01 00:00:01 'trend_v3.mq5'(71,9)의 범위를 벗어난 배열
2010.09.01 19:44:36 코어 1 2010.06.01 00:00:01 'trend_v3_5.mq5'(83,9)의 범위를 벗어난 어레이

 

m_a_sim에게

칠면조에서 정보를 복사하기 전에 잘못된 핸들을 확인하는 것이 더 정확한 것 같습니다. 다른 하나는 바로 이 데이터의 가용성에 대한 확인을 구성하는 것입니다....

MAX= CopyBuffer (hind1, 2 , 0 , 3 ,ind1);
MIN= CopyBuffer (hind2, 0 , 0 , 3 ,ind2);