[ARQUIVO] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 3. - página 368

 

Boa tarde!

Eu tenho uma tarefa, parece fácil à primeira vista, mas não funciona. Há uma matriz na qual os valores estão sempre em fila (em alguns casos os valores podem ir em ordem ascendente, em outros casos - em ordem descendente). Há algum nível (vermelho na foto). Você precisa encontrar os dois valores da matriz que estão mais próximos do nível da linha vermelha. Na figura a) serão valores de array com índices 0 e 1. Na figura b) serão valores de array com índices 2 e 1. Nas figuras c) e f) serão valores de array com índices 0 e 0. Nas figuras d) e e e) serão valores de array com índices 2 e 2.

Por favor, me diga como resolver este problema. Agradecemos antecipadamente.

 
Roman.:

Então não se preocupe - basta mover o código do indicador para o Expert Advisor como é para cumprir os critérios de negociação e pronto - então no quadro usando estas condições de negociação transferidas deste indicador você abre posições através do Expert Advisor e pronto...
Obrigado, estou trabalhando nisso :)
 
skyjet:
Obrigado, estou resolvendo isso :)

De nada... Todos já passaram por isso. :-)
 
drknn:

Hoje é sábado - dia de folga. Você inicia a EA, a inicialização acontece, mas como é dia de folga e não há carrapato, a função de início não é iniciada (ou seja, o comércio() não é chamado). Para verificar se funciona corretamente, você precisa colar a chamada desta função no bloco de inicialização, ou testá-la no testador.

Depois de substituir esta função no Init() e adicionar o código de verificação Print(DayOfWeek()) verificou-se que o tempo foi tirado do servidor, e o tempo do servidor era sexta-feira...

Substituída

if(DayOfWeek()==0 || DayOfWeek()==6)

para

  if(TimeDayOfWeek(TimeLocal())==0 || TimeDayOfWeek(TimeLocal())==6)

e funcionou como pretendido.

Obrigado.

 

Olá, camaradas!

Enfrentou um problema inesperado.

Anteontem, o testador estava trabalhando como deveria. Desde ontem à noite, qualquer versão da estratégia no testador abre um negócio e depois de um segundo, ou alguns minutos/horas de história, o testador deixa de funcionar. Sem erros, nada.

Alguém tem algum problema com isso? Favor informar

 

Olá.

Por favor, ajude-me a encontrar o erro.

Abaixo está a seção problemática em sua totalidade, extraída da EA.

extern int      MAGIC= 1; 

int start()
  {
//----
  int tt = 0;
  double SchBuyLots     = SchBuyLots_b(MAGIC);
  double SchSellLots    = SchSellLots_b(MAGIC);
  double SchBuyLots100  = SchBuyLots100_b();
  double SchSellLots100 = SchSellLots100_b();
  double SchBuyLimitLots    = SchBuyLimitLots_b(MAGIC);
  double SchSellLimitLots   = SchSellLimitLots_b(MAGIC);
  double SchBuyStopLots100  = SchBuyStopLots100_b();
  double SchSellStopLots100 = SchSellStopLots100_b();

  double dy=0;
  double dx=SchBuyLots+SchBuyLots100-SchSellLots-SchSellLots100;
  if (dx!=0) dy=MathAbs(dx);

  double zx=SchBuyLimitLots-SchSellLimitLots;

  if (dx>0 && dy+zx!=SchSellStopLots100)tt=1; else tt=2;
 
  Alert (dy+zx,"---",SchSellStopLots100,"---",tt);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
// ----------------- SchBuyLots() ---------------------------------------------
//  Функция возвращает суммарный лот Бай-ордеров для Магика
//----------------------------------------------------------------
double SchBuyLots_b(int MAGIC) {
  double SchBuyLots=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC){ 
      if(OrderType()==OP_BUY) {
        SchBuyLots=SchBuyLots+OrderLots();
       }
      }
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchBuyLots);
}
// ----------------------------------------------------------------------------

// ----------------- SchSellLots() ---------------------------------------------
//  Функция возвращает суммарный лот Сейл-ордеров для Магика
//-----------------------------------------------------------------
double SchSellLots_b(int MAGIC) {
  double SchSellLots=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC) {
      if(OrderType()==OP_SELL) {
        SchSellLots=SchSellLots+OrderLots();
       }  
      }  
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchSellLots);
}
// -------------------------------------------------------------------------------

// ----------------- SchBuyLots100() ---------------------------------------------
//  Функция возвращает суммарный лот Бай-ордеров для Магика 100
//--------------------------------------------------------------------------------
double SchBuyLots100_b() {
  double SchBuyLots100=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()==100) {
      if(OrderType()==OP_BUY) {
        SchBuyLots100=SchBuyLots100+OrderLots();
       }
      }
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchBuyLots100);
}
// --------------------------------------------------------------------------------

// ----------------- SchSellLots100() ---------------------------------------------
//  Функция возвращает суммарный лот Сейл-ордеров для Магика 100
//---------------------------------------------------------------------------------
double SchSellLots100_b() {
  double SchSellLots100=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()==100) {
      if(OrderType()==OP_SELL) {
        SchSellLots100=SchSellLots100+OrderLots();
       }  
      }  
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchSellLots100);
}
// ----------------------------------------------------------------------------
// ----------------- SchBuyLimitLots() ------------------------------------------
//  Функция возвращает суммарный лот BuyLimit-ордеров для Магика
//------------------------------------------------------------------------------
double SchBuyLimitLots_b(int MAGIC) {
  double SchBuyLimitLots=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC){ 
      if(OrderType()==OP_BUYLIMIT) {
        SchBuyLimitLots=SchBuyLimitLots+OrderLots();
       }
      }
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchBuyLimitLots);
}
// ----------------------------------------------------------------------------

// ----------------- SchSellLimitLots() ----------------------------------------
//  Функция возвращает суммарный лот SellLimit-ордеров для Магика
//-----------------------------------------------------------------------------
double SchSellLimitLots_b(int MAGIC) {
  double SchSellLimitLots=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()== MAGIC) {
      if(OrderType()==OP_SELLLIMIT) {
        SchSellLimitLots=SchSellLimitLots+OrderLots();
       }  
      }  
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchSellLimitLots);
}
// -------------------------------------------------------------------------------
// ----------------- SchBuyStopLots100() -----------------------------------------
//  Функция возвращает суммарный лот BuyStop-ордеров для Магика 100
//--------------------------------------------------------------------------------
double SchBuyStopLots100_b() {
  double SchBuyStopLots100=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()==100) {
      if(OrderType()==OP_BUYSTOP) {
        SchBuyStopLots100=SchBuyStopLots100+OrderLots();
       }
      }
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchBuyStopLots100);
}
// --------------------------------------------------------------------------------

// ----------------- SchSellStopLots100() -----------------------------------------
//  Функция возвращает суммарный лот SellStop-ордеров для Магика 100
//---------------------------------------------------------------------------------
double SchSellStopLots100_b() {
  double SchSellStopLots100=0;
  int i;
  string SMB=Symbol();
  for (i=OrdersTotal()-1;i>=0;i--) {//Начало цикла
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {}
    else{//начало работы с выбранным ордером
      if(OrderSymbol()== SMB && OrderMagicNumber()==100) {
      if(OrderType()==OP_SELLSTOP) {
        SchSellStopLots100=SchSellStopLots100+OrderLots();
       }  
      }  
    }//конец работы с выбранным ордером
  }//Конец цикла
  return(SchSellStopLots100);
}
// --------------------------------------------------------------------------------

Por favor, preste atenção à linha (quase no início):

 if (dx>0 && dy+zx!=SchSellStopLots100)tt=1; else tt=2;

Por alguma razão, quando os valores dy+zx e SchSellStopLots100 são iguais separadamente (verifiquei com allerts) nesta expressão eles não são mais iguais um ao outro, e a variável tt toma o valor 1 em vez de 2.

Peço-lhes que me ajudem a encontrar a falha.

Agradecemos antecipadamente.

 
As condições comerciais do servidor mudaram durante o fim de semana. Você deve testar em um terminal separado não conectado a um corretor/rede, usando um utilitário especial para definir o spread correto. Melhor busca de artigos sobre testes de EAs e como fazê-lo corretamente.
 
nemo811:

(verificado com allerts)

É melhor verificar via diferença ND ou modulo menos do que algum delta.
 
splxgf:
Melhor verificar via ND ou modulo de diferenças menos do que algum delta.

Por alguma razão, adicionar dy e zx dá um número 0,3 (no meu teste particular da situação atual do mercado) quando comparado a este número não é igual a este. Ou seja, eu adiciono dy+zx e recebo 0,3. Eu comparo dy+zx com 0,3 - eles não são iguais.

Comparando o dy e o zx com os números que eles retornam - é igual ao trabalho como deveriam.

Adivinhe.

Por favor, ajude.

 
ramirez17:

Olá, camaradas!

Enfrentou um problema inesperado.

Anteontem, o testador estava trabalhando como deveria. Desde ontem à noite, qualquer versão da estratégia no testador abre um negócio e depois de um segundo, ou alguns minutos/horas de história, o testador deixa de funcionar. Sem erros, nada.

Alguém tem algum problema com isso? Favor informar

O testador tem uma revista. Tudo está escrito ali. Não há telepatas aqui para ler os logs de seu testador à distância.