Gemeinsam lernen und schreiben in MQL5 - Seite 10

 

Ich weiß nicht, ob das die richtige Frage ist.

Ist es möglich, Debugger und Tester zu kombinieren? D.h. wenn ich mit F5 starte, startet das Testgerät natürlich nicht. Und wenn ich den Exprrt im Tester starte, werden die Haltepunkte ignoriert. Oder mache ich etwas falsch?

 
Lunatic:

Ich weiß nicht, ob das die richtige Frage ist.

Ist es möglich, Debugging und einen Tester zu kombinieren?

Im Moment nicht.
 
alexvd:
Im Moment nicht.

Also nur in Echtzeit auf der Demo? Wie sieht es mit der Fehlersuche in interessanten Situationen aus?

Am Anfang war ich vom Debugger begeistert, aber jetzt bin ich wieder dabei, Ausdrucke zu debuggen. Andere Debugging-Techniken sind nicht sichtbar. - Frustrierend.

 

Betrachten Sie den als Beispiel gelieferten Expert Advisor MovingAverage: Alles an ihm ist wunderschön. Frage zum Testgerät.

Dieser EA analysiert die Kerze nur auf dem ersten Tick. Ich habe festgestellt, dass einige Situationen ohne Verarbeitung verrutscht sind. Es stellt sich heraus, dass ein seltener Kerzenständer aus dem ersten Tick geboren wird. Ist es ein Verbindungseffekt, mein Fehler oder der des Testers?

Um eine Kerze nur bei der Geburt, d.h. einmalig, zu verarbeiten, sollte die zuletzt verarbeitete Kerze in einer statischen Variablen gespeichert werden?

P/S/ Ich fange gerade erst an, die Sprache zu lernen, daher diese langwierigen Fragen.

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

Hallo, ich schreibe gerade einen EA, um zu sehen, ob ich es rechtzeitig zur Meisterschaft schaffe. Ich habe einen einfachen Code geschrieben, der 2 benutzerdefinierte Indikatoren verwendet, aber der Wert dieser Indikatoren ist 0, so dass der Handel nicht durchgeführt wird.

//+------------------------------------------------------------------+
//|                                                  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:

Dieser EA analysiert eine Kerze nur beim ersten Tick. Ich habe festgestellt, dass einige Situationen ohne Verarbeitung durchrutschen. Es stellt sich heraus, dass ein seltener Kerzenständer aus dem ersten Tick geboren wird. Ist es ein Verbindungseffekt, mein Fehler oder der des Testers?

Um eine Kerze nur bei ihrer Geburt, d.h. einmalig, zu verarbeiten, sollte die zuletzt verarbeitete Kerze in einer statischen Variablen gespeichert werden?

Es ist besser, das Erscheinen eines neuen Balkens zu verfolgen, indem man die Zeit des Balkens ändert und sie vorher in einer statischen Variablen speichert.

Beispiele finden Sie im Artikel IsNewBar und im Artikel Beschränkungen und Prüfungen in EAs.

 
Automated-Trading:

Das Erscheinen eines neuen Taktes lässt sich besser verfolgen, indem man die Zeit des Taktes ändert, nachdem man sie zuvor in einer statischen Variablen gespeichert hat.

Beispiele finden Sie in IsNewBar und im Artikel Limits and checks in EAs.

Danke, das ist klar.

Aber hier ist, was ich nicht verstehe - wie man EAs debuggen. Es ist klar, dass nicht das System getestet wird, sondern die Fehler im Programm. Es ist zum Beispiel nicht klar, warum das Programm nicht in eine bestimmte Verzweigung geht - warum? Muss ich verschiedene Debugging-Stempel setzen, dann im Journal nach ihnen suchen, dann andere Stempel setzen, eine gewisse Zeit warten, bis das Programm funktioniert und dann wieder im Journal nachsehen?

Wie kann ich am besten nach Programmfehlern suchen?

 
m_a_sim:

Hallo, ich schreibe gerade einen EA, um zu sehen, ob ich es rechtzeitig zur Meisterschaft schaffe. Ich habe einen einfachen Code geschrieben, der 2 benutzerdefinierte Indikatoren verwendet, aber der Wert dieser Indikatoren ist 0, so dass der Handel nicht durchgeführt wird.

Um Ihren Code zu debuggen, habe ich benutzerdefinierte Indikatoren durch MA ersetzt:

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

Und korrigiertes Kopieren von Werten in ein Array:

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

Jetzt gibt es Indikatorwerte:

//+------------------------------------------------------------------+
//|                                                  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:

Um Ihren Code zu debuggen, habe ich die benutzerdefinierten Indikatoren durch MA ersetzt:

Außerdem wurde das Kopieren von Werten in das Array korrigiert:

Jetzt gibt es Indikatorwerte:

Es geht also nur um die Indikatoren? Der Tester gibt mir eine Fehlermeldung

2010.09.01 19:44:36 Kern 1 2010.06.01 00:00:01 Array außerhalb des Bereichs in 'trend_v3.mq5' (71,9)
2010.09.01 19:44:36 Kern 1 2010.06.01 00:00:01 Array außerhalb des Bereichs in 'trend_v3_5.mq5' (83,9)

 

An m_a_sim

Ich halte es für richtiger, die Handicapfähigkeit von Griffen zu prüfen, bevor man Informationen aus den Indizes kopiert. Es wäre auch besser, die Verfügbarkeit dieser Daten zu prüfen ....

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