Fehler, Irrtümer, Fragen - Seite 737

 
-Alexey-:
Warum testet das Prüfgerät, wenn ich die Taste "Start" drücke, nicht von der anfänglichen Einzahlungsebene aus, sondern von der Ebene aus, auf der der letzte Test endete? Ein solches Problem gibt es nicht in 4. Wie beginnt man die Prüfung ab der ersten Einzahlung?

Wir können die von Ihnen beschriebene Situation nicht reproduzieren.

Weitere Einzelheiten

 
stringo:

Wir können die von Ihnen beschriebene Situation nicht reproduzieren.

Geben Sie uns mehr Details

Ich generiere im Assistenten eine Parabel auf den Durchschnitt mit einem Stopp. Ich führe einen Test mit offenen Preisen durch und klicke auf Abbrechen. Ich führe es zum zweiten Mal aus und erhalte die oben beschriebene Situation (Saldo- und Eigenkapitaltabelle wird nicht neu gezeichnet, sondern fortgesetzt). Expert Advisors, die nicht vom Assistenten stammen, sind OK.
Мастер MQL5: Создание эксперта без программирования
Мастер MQL5: Создание эксперта без программирования
  • 2010.12.15
  • MetaQuotes Software Corp.
  • www.mql5.com
Вы хотите быстро проверить торговую идею, не тратя времени на программирование? Выберите в "Мастере MQL5" нужный тип торговых сигналов, подключите модули сопровождения позиций и управления капиталом - на этом вся работа закончена. Создайте свои реализации модулей или закажите их через сервис "Работа" - и комбинируйте новые модули с уже существующими.
 

Dies scheint ein Fehler zu sein.

Im Testmodus mit mehreren Währungen verhält sich der Tester nicht korrekt, wenn er darauf wartet, dass ein neuer Balken auf zwei Instrumenten erscheint.

Eine kleine Klarstellung. Wenn in der Funktion isNewBar ein neuer Balken auf dem Hauptsymbol erscheint, warten wir darauf, dass in der Schleife ein neuer Balken auf dem anderen Symbol erscheint.

Ich füge den Code ein.

//в тестере баг в режиме мультивалютного тестирования
//позиция открывается если на двух инструментах появился новый бар 
#include <Trade\Trade.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\PositionInfo.mqh>
//--- input parameters
input int      Per=10;//период средней 
input string   Instrum1="EURUSD";//первый инструмент
input string   Instrum2="GBPUSD";//второй инструмент
//-------------------------------------------------------
CTrade   trade;//торговые функции
COrderInfo orderinfo;//информация об ордере
CPositionInfo  posinfo;//информация о позиции
int hiMA ;//хэндл индикатора 
int OnInit()
  {
      hiMA=iMA(_Symbol,_Period,Per,0,MODE_SMA,PRICE_OPEN) ;
      if(hiMA < INVALID_HANDLE) return(-1) ;
      return(0);
  }
//====================================================================
void OnDeinit(const int reason)
  {
   IndicatorRelease(hiMA) ;
  }
//=====================================================================
void OnTick()
  {
      if(!isNewBar(Instrum2)) return   ;
      //Print("  Это новый бар  ");
      double   Ma[1] ;//показания индикатора 
      CopyBuffer(hiMA,0,0,1,Ma) ;
      MqlTick price;// будет использоваться для получения текущих/последних котировок цены
      bool possel=posinfo.Select(Instrum1) ;
      SymbolInfoTick(Instrum1,price) ;
      if(possel && price.bid > Ma[0] && posinfo.PositionType() == POSITION_TYPE_SELL)
         {//цена выше средней закрываем короткую позу
            trade.PositionClose(Instrum1) ; return ;
         }
      if( !possel && price.bid > Ma[0])
         {//цена выше средней нет поз открываем длинную позу 
            trade.Buy(0.1,Instrum1,0,0,0,NULL) ; return ;
         }
      if( possel && price.ask < Ma[0] && posinfo.PositionType() == POSITION_TYPE_BUY)
         {//цена ниже средней закрываем длинную позу
            trade.PositionClose(Instrum1) ; return ;
         } 
      if(!possel && price.ask < Ma[0])
         {// цена ниже средней нет поз открываем короткую позу
            trade.Sell(0.1,Instrum1,0,0,0,NULL) ;
         }
      return ;
  }
//=======================================================================
bool isNewBar(string other_symbol)
  {//возвращает труе если новый бар на двух инструментах
   static datetime last_bar_time=0;
   int cntsleep ;
   if(last_bar_time==0)
     {//--- это первый вызов, запишем время открытия и выйдем
      last_bar_time=(datetime)SeriesInfoInteger(_Symbol,Period(),SERIES_LASTBAR_DATE);
      return(false);
     }
   datetime curr_time=(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);
   if(curr_time!=last_bar_time)
     {//время открытия не совпадает это новый бар 
      last_bar_time=curr_time;
      cntsleep=0 ;
      while(!(curr_time == (datetime)SeriesInfoInteger(other_symbol,Period(),SERIES_LASTBAR_DATE)))
         {// ждем появления нового бара на втором инструменте   
            Sleep(5000); 
            if(cntsleep >10) return(false) ;// недождались 
            cntsleep++ ;
         }
      return(true) ;
     }
    return(false) ;
  }
Обработчик события "новый бар"
Обработчик события "новый бар"
  • 2010.10.04
  • Konstantin Gruzdev
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 
ivandurak:

Dies scheint ein Fehler zu sein.

Im Testmodus mit mehreren Währungen verhält sich der Tester nicht korrekt, wenn er darauf wartet, dass ein neuer Balken auf zwei Instrumenten erscheint.


Was genau sehen Sie als Fehler an, bitte erklären Sie das. Sie haben keine Angaben zu den Tests, dem erzielten Ergebnis oder dem erwarteten Ergebnis gemacht.

Außerdem möchte ich Ihre Aufmerksamkeit auf die Grundlagen des Testens in MetaTrader 5 lenken. Es werden der Mechanismus der Zeckenerzeugung und grundlegende Konzepte erläutert.

 
Rosh:

Was genau sehen Sie als Fehler an, bitte erklären Sie das. Sie haben keine Angaben zu den Tests oder den Ergebnissen gemacht, und Sie kennen das erwartete Ergebnis nicht.

Außerdem möchte ich Ihre Aufmerksamkeit auf die Grundlagen des Testens in MetaTrader 5 lenken. Sie erklärt den Mechanismus der Zeckenerzeugung und die grundlegenden Konzepte.

Es ist ganz einfach.

Wir starten den Expert Advisor zur Optimierung und sehen das Ergebnis.

Wir wählen zum Beispiel den 4. Durchgang, führen den Expert Advisor aus und erhalten seinen normalen Betrieb mit allen Trades - hier ist der Bericht.

Ich habe ein Gefühl. Im Optimierungsmodus für mehrere Währungen kann der Prüfer einen Handel nicht an den Barren binden, wenn er nicht am offenen Barren eröffnet wurde.

Wenn die Funktion isNewBar die Schleife auskommentiert hat und nicht auf das Erscheinen eines neuen Balkens auf einem anderen Symbol wartet, funktioniert alles. Terminal Version 5 Build 642.

Ich habe die Artikel und die Codes von dort gelesen. Obwohl ich mich selbst kenne, muss ich sie vielleicht noch einmal lesen.

Schöne Feiertage.

 
-Alexey-:
Ich generiere im Assistenten einen EA auf Medium mit einem parabolischen Stop. Ich führe einen Test mit offenen Preisen durch und klicke auf "Abbrechen". Ich führe es zum zweiten Mal aus und erhalte die oben beschriebene Situation (das Diagramm für den Saldo und das Eigenkapital wird nicht neu gezeichnet, sondern bleibt bestehen). Expert Advisors, die nicht vom Assistenten stammen, sind OK.

Erstellen Sie eine Servicedesk-Anwendung mit folgenden Angaben

  • Build-Nummer
  • Der System-Bit-Modus und die Windows-Version.
  • Code des Expert Advisors einfügen
  • Einstellungen und Eingabeparameter des EA
 

Hier ist ein Teil des Codes. Wie kann man erreichen, dass die Parameterinput int grusdchf=100; input int grusdjpy=100; nicht optimiert werden, wenntrpar2=false

//------------------------------------------------------------
input bool  trpar1=true ;//разрешение торговли по EURUDSD
input int   greurusd=100;//сетка для EURUSD
input int   grgbpusd=100;//сетка для GBPUSD
//------------------------------------------------------------
input bool  trpar2=true;//
input int   grusdchf=100;//
input int   grusdjpy=100;//
//------------------------------------------------------------
input bool  trpar3=true;//
input int   graudjpy=100;//
input int   grchfjpy=100;//
 
ivandurak:

Hier ist ein Teil des Codes. Wie kann man erreichen, dass die Parameterinput int grusdchf=100; input int grusdjpy=100; nicht optimiert werden, wenntrpar2=false

Kreuzen Sie die Kontrollkästchen im Prüfgerät für diese Parameter nicht an. Oder klären Sie die Frage, sonst sehe ich Unklarheiten. :)

 

Frage:

Sie müssen ein Array von Objektzeigern an eine Funktion übergeben. Natürlich per Verweis (ein Array).

Welche Syntax ist zu verwenden?

void MyFunc(MyClass &*MayClassPointersArray[]);  / не компилируется.
void MyFunc(MyClass *&MayClassPointersArray[]);  / компилируется, но сомневаюсь что смысл правильный

Oder sollte ich es auf andere Weise verwenden?

 
ivandurak:

Hier ist ein Teil des Codes. Wie kann man erreichen, dass die Parameterinput int grusdchf=100; input int grusdjpy=100; nicht optimiert werden, wenntrpar2=false

input bool trpar2=true;
input int grusdchf=100;
input int grusdjpy=100;

if (trpair2==false)  // если false то всегда 100
  {
   x_grusdchf=100;
   x_grusdjpy=100;
  }
 else                // если true то значения с перебора 
  {
   x_grusdchf=grusdchf;
   x_grusdjpy=grusdjpy;
  }
Die Kontrollkästchen werden für alle drei Eingänge aktiviert und dann auf false gesperrt.