Erros, bugs, perguntas - página 737

 
-Alexey-:
Porquê quando carrego no botão "Start" o testador não testa a partir do nível de depósito inicial, mas a partir do nível onde terminou o último teste. Não existe tal problema em 4. Como começar a testar a partir do nível de depósito inicial?

Não podemos reproduzir a situação que descreve.

Vamos dar mais detalhes

 
stringo:

Não podemos reproduzir a situação que descreve.

Dê-nos mais detalhes

Gero um parabólico no feiticeiro em média com uma paragem. Faço um teste de preços em aberto e clico em cancelar. Faço-o pela segunda vez e obtive a situação descrita acima (o balanço e o gráfico de equidade não são desenhados de novo, mas continuam). Os Conselheiros Especialistas que não pertencem ao Feiticeiro estão OK.
Мастер MQL5: Создание эксперта без программирования
Мастер MQL5: Создание эксперта без программирования
  • 2010.12.15
  • MetaQuotes Software Corp.
  • www.mql5.com
Вы хотите быстро проверить торговую идею, не тратя времени на программирование? Выберите в "Мастере MQL5" нужный тип торговых сигналов, подключите модули сопровождения позиций и управления капиталом - на этом вся работа закончена. Создайте свои реализации модулей или закажите их через сервис "Работа" - и комбинируйте новые модули с уже существующими.
 

Isto parece ser um insecto.

No modo de teste com várias moedas, quando se espera que uma nova barra apareça em dois instrumentos, o testador não se comporta correctamente.

Um pequeno esclarecimento. Na função isNewBar, quando uma nova barra aparece no símbolo principal, esperamos que uma nova barra apareça no laço do outro símbolo.

Estou a colar o 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:

Isto parece ser um insecto.

No modo de teste com várias moedas, quando se espera que uma nova barra apareça em dois instrumentos, o testador não se comporta correctamente.


O que vê exactamente como um insecto, por favor explique. Não forneceu quaisquer pormenores sobre os testes, nem sobre o resultado obtido, nem sobre o resultado esperado.

Para além disso, gostaria de chamar a vossa atenção para as Noções Básicas de Testes no MetaTrader 5. Explica o mecanismo de geração de carrapatos e conceitos básicos.

 
Rosh:

O que vê exactamente como um insecto, por favor explique. Não forneceu quaisquer detalhes dos testes ou do resultado que obteve, e não sabe o resultado esperado.

Para além disso, gostaria de chamar a vossa atenção para as Noções Básicas de Testes no MetaTrader 5. Explica o mecanismo de geração de carrapatos e conceitos básicos.

É fácil.

Iniciamos o Expert Advisor para optimização e vemos o resultado.

Por exemplo, escolhemos o 4º passe, gerimos o Expert Advisor, e obtemos o seu funcionamento normal com todos os ofícios, e aqui está o relatório.

Tenho um pressentimento. No modo de optimização de múltiplas moedas, o testador não pode ligar uma troca à barra se esta não tiver sido aberta na barra aberta.

Se a função isNewBar comentou o laço e não espera pelo aparecimento de uma nova barra num outro símbolo, tudo funciona. Versão terminal 5 construir 642.

Li os artigos e os códigos a partir daí. Embora, eu próprio me conheça, terei de relê-las.

Festas Felizes.

 
-Alexey-:
Gero no feiticeiro um EA em meio com uma paragem parabólica. Faço um teste sobre preços abertos e clico em "cancelar". Faço-o pela segunda vez e obtive a situação descrita acima (o balanço e o gráfico de equidade não são redesenhados, mas continuam). Os Conselheiros Especialistas que não pertencem ao Feiticeiro estão OK.

Criar uma aplicação servicedesk, especificando

  • número de construção
  • O modo bit do sistema e a versão Windows.
  • anexar código do Conselheiro Especialista
  • Configurações da EA e parâmetros de entrada
 

Aqui está um pedaço de código. Como fazer aentrada dos parâmetrosint grusdchf=100; entrada int grusdjpy=100; não deve ser optimizado quandotrpar2=falso

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

Aqui está um pedaço de código. Como fazer aentrada dos parâmetrosint grusdchf=100; entrada int grusdjpy=100; não deve ser optimizado quandotrpar2=falso

Não marcar as caixas de verificação no testador em relação a estes parâmetros. Ou esclarecer a questão, caso contrário, vejo ambiguidade. :)

 

Pergunta:

É necessário passar um conjunto de apontadores de objectos para uma função. Por referência, é claro (uma matriz).

Qual a sintaxe a utilizar?

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

Ou devo utilizá-lo de outra forma?

 
ivandurak:

Aqui está um pedaço de código. Como fazer aentrada dos parâmetrosint grusdchf=100; entrada int grusdjpy=100; não deve ser optimizado quandotrpar2=falso

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;
  }
As caixas de verificação são activadas nas três entradas e depois bloqueadas em falso.