Errores, fallos, preguntas - página 737

 
-Alexey-:
Por qué cuando presiono el botón "Start" el probador no hace la prueba desde el nivel de depósito inicial, sino desde el nivel donde terminó la última prueba. No existe ese problema en la 4. ¿Cómo empezar a probar desde el nivel de depósito inicial?

No podemos reproducir la situación que describe.

Vamos a dar más detalles

 
stringo:

No podemos reproducir la situación que describe.

Danos más detalles

Genero una parabólica en el asistente sobre la media con un stop. Hago una prueba sobre los precios abiertos, hago clic en "Cancelar". Lo ejecuto por segunda vez y obtengo la situación descrita anteriormente (el gráfico de saldo y patrimonio no se dibuja de nuevo sino que continúa). Los Asesores Expertos que no son del Asistente están bien.
Мастер MQL5: Создание эксперта без программирования
Мастер MQL5: Создание эксперта без программирования
  • 2010.12.15
  • MetaQuotes Software Corp.
  • www.mql5.com
Вы хотите быстро проверить торговую идею, не тратя времени на программирование? Выберите в "Мастере MQL5" нужный тип торговых сигналов, подключите модули сопровождения позиций и управления капиталом - на этом вся работа закончена. Создайте свои реализации модулей или закажите их через сервис "Работа" - и комбинируйте новые модули с уже существующими.
 

Esto parece ser un error.

En el modo de prueba multidivisa, cuando se espera la aparición de una nueva barra en dos instrumentos, el probador no se comporta correctamente.

Una pequeña aclaración. En la función isNewBar, cuando aparece una nueva barra en el símbolo principal, esperamos a que aparezca una nueva barra en el bucle del otro símbolo.

Pego el código.

//в тестере баг в режиме мультивалютного тестирования
//позиция открывается если на двух инструментах появился новый бар 
#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:

Esto parece ser un error.

En el modo de prueba multidivisa, cuando se espera la aparición de una nueva barra en dos instrumentos, el probador no se comporta correctamente.


Qué es exactamente lo que ve como un error, por favor explíquelo. No ha dado ningún detalle de las pruebas, ni del resultado obtenido, ni del resultado esperado.

Además, me gustaría llamar su atención sobre los fundamentos de las pruebas en MetaTrader 5. Explica el mecanismo de generación de garrapatas y los conceptos básicos.

 
Rosh:

Qué es exactamente lo que ve como un error, por favor explíquelo. No has dado ningún detalle de las pruebas ni del resultado que has obtenido, y no sabes el resultado esperado.

Además, me gustaría llamar su atención sobre los fundamentos de las pruebas en MetaTrader 5. Explica el mecanismo de generación de garrapatas y los conceptos básicos.

Es fácil.

Iniciamos el Asesor Experto para la optimización y vemos el resultado.

Por ejemplo, elegimos la 4ª pasada, ejecutamos el Asesor Experto, y obtenemos su funcionamiento normal con todas las operaciones, y aquí está el informe.

Tengo un presentimiento. En el modo de optimización multidivisa, el probador no puede vincular una operación a la barra si no se ha abierto en la barra abierta.

Si la función isNewBar ha comentado el bucle y no espera la aparición de una nueva barra en otro símbolo, todo funciona. Terminal versión 5 build 642.

He leído los artículos y leído los códigos de allí. Aunque, me conozco, tendré que releerlos.

Felices fiestas.

 
-Alexey-:
Genero en el asistente un EA en medio con un stop parabólico. Hago una prueba con precios abiertos y hago clic en "cancelar". Lo ejecuto por segunda vez y obtengo la situación descrita anteriormente (el gráfico de saldo y patrimonio no se vuelve a dibujar sino que continúa). Los Asesores Expertos que no son del Asistente están bien.

Crear una aplicación servicedesk, especificando

  • número de construcción
  • El modo de bits del sistema y la versión de Windows.
  • adjuntar el código del Asesor Experto
  • Ajustes y parámetros de entrada de EA
 

Aquí hay un trozo de código. Cómo hacer que los parámetrosinput int grusdchf=100; input int grusdjpy=100; no se optimicen cuandotrpar2=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:

Aquí hay un trozo de código. Cómo hacer que los parámetrosinput int grusdchf=100; input int grusdjpy=100; no se optimicen cuandotrpar2=false

No marque las casillas de verificación en el comprobador de estos parámetros. O aclare la pregunta, de lo contrario veo ambigüedad. :)

 

Pregunta:

Es necesario pasar un array de punteros a objetos a una función. Por referencia, por supuesto (un array).

¿Qué sintaxis utilizar?

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

¿O debería utilizarlo de otra manera?

 
ivandurak:

Aquí hay un trozo de código. Cómo hacer que los parámetrosinput int grusdchf=100; input int grusdjpy=100; no se optimicen cuandotrpar2=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;
  }
Las casillas se activan en las tres entradas y se bloquean en falso.
Razón de la queja: