Erros, bugs, perguntas - página 284

 
alexvd:

Como são definidos as paragens e TPs?

Abre primeiro uma posição e só depois a modifica, ou especifica imediatamente o SL e TP adequados?

Primeiro abre-se uma posição e depois modifica-se...
 
Voodoo_King:

construir 384. parece que encontrei outro insecto... Ao visualizar o histórico, as ordens - os níveis definidos de Stop Loss e Take Profit não são exibidos...


São "exibidos" quando uma ordem está a ser definida. Não são exibidos quando uma posição é fechada pelo servidor utilizando uma paragem, o que é natural, uma vez que o servidor não define paragens quando se fecha uma posição.
















































































































 

Descobri algo parecido com isto. Não sei se é um insecto ou não, mas parece-se com um. O seguinte código:

lot=NormalizeDouble(My_AccountInfo.MaxLotCheck(_Symbol,ORDER_TYPE_BUY,latest_price.ask)/10,2);
printf(lot);

Saídas no registo do testador (com um depósito de $1000):

2011.01.28 20:06:48    Core 1    2010.01.04 00:56:00   0.07000000000000001

A função (NormalizeDouble) não deveria remover todos os dígitos não-zero após 7?

Pensei ter encontrado uma solução na forma: lot=floor((My_AccountInfo.MaxLotCheck(_Symbol,ORDER_TYPE_SELLL,latest_price.ask)/10)*100)/100,

mas também obtive resultados semelhantes. O que fazer - quão crítico é nas consultas comerciais?

 

Boa tarde!

Adicionei a função Comentar ao corpo do laço, para que pudesse mostrar a percentagem do estado de execução do laço e um par de outros valores. O algoritmo simples levou 5 minutos (se não mais) para executar no corpo do laço, mas apenas recalculou 32000 valores de barras (Fechado,Alto,Baixo,Aberto). Queixei-me que o conjunto está a aumentar dinamicamente enquanto o laço está a funcionar, mas não é verdade. Após a depuração do algoritmo, o Comentário foi removido - o cálculo é agora efectuado numa dádiva de Deus.

A função Comentar atrasa realmente a execução dos programas? Estou francamente surpreendido.

Sistema: Windows XP, Terminal 5.00.384.

Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - Документация по MQL5
 
KffAlex:

Boa tarde!

Adicionei a função Comentar ao corpo do laço, para que pudesse mostrar a percentagem do estado de execução do laço e um par de outros valores. O algoritmo simples levou 5 minutos (se não mais) para executar no corpo do laço, mas apenas recalculou 32000 valores de barras (Fechado,Alto,Baixo,Aberto). Queixei-me que o conjunto está a aumentar dinamicamente enquanto o laço está a funcionar, mas não é verdade. Após a depuração do algoritmo, o Comentário foi removido - o cálculo é agora efectuado numa dádiva de Deus.

A função Comentar atrasa realmente a execução dos programas? Estou francamente surpreendido.

Sistema: Windows XP, Terminal 5.00.384.

Tenho notado o mesmo efeito.
 

Ao executar o Expert Advisor sobre a história utilizando apenas os preços de abertura, as posições de Venda não são abertas aos preços de abertura, mas sim aos preços altos, e são fechadas aos preços baixos.

Porque é que isto acontece?

O Expert Advisor procura sinais para abrir e fechar posições usando apenas preços Open[0]. O EventSetTimer(1) é usado;

 
Valmars:

São produzidos quando é feita uma encomenda. Não disponível quando uma posição é fechada pelo servidor utilizando uma paragem, o que é natural porque o servidor não define paragens quando uma posição é fechada.

O que se passa?) ? onde aparecem quando são feitas as encomendas ?

Estou a falar do relatório "História", e não vejo nada nas colunas Stop Loss and Take Profit, apesar de as posições terem estes valores.

como posso saber se foi ou não estabelecida uma paragem de perda? quer dizer, se foi activada, posso vê-la, mas não?

 

Tenho a seguinte pergunta.

A tarefa é escrever os valores de Equidade num ficheiro específico durante a fase de teste, apagando os valores anteriores.

Mas o que acontece aqui é o seguinte:

1. QuandoFileDelete() está ausente no OnInit(), é escrito para além dos já existentes.

2. Mas quando FileDelete() em OnInit() está presente, apesar dos mesmos registos de equidade em OnCalculatde(), o ficheiro resultante acaba por ficar vazio.

Porque é que isto acontece e como evitá-lo?

Abaixo está o código:

#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
double   Values[];
string   Array[];
string   filename="equity FileWrite25.txt";
int      handle;
int      NumberCopyElements;
string   common_folder;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(){
   SetIndexBuffer(0,Values,INDICATOR_DATA);
   PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, 100);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, EMPTY_VALUE);
   ArraySetAsSeries(Values, false);
   //---
   common_folder=TerminalInfoString(TERMINAL_COMMONDATA_PATH);
   FileDelete(filename,FILE_COMMON);
   return(0);
}
int OnCalculate(const int        rates_total,
                const int        prev_calculated,
                const datetime&  time[],
                const double&    open[],
                const double&    high[],
                const double&    low[],
                const double&    close[],
                const long&      tick_volume[],
                const long&      volume[],
                const int&       spread[])
{  
   uint written;
   handle=FileOpen(filename,FILE_WRITE|FILE_READ|FILE_COMMON|FILE_TXT);
   if(handle!=INVALID_HANDLE){
      FileSeek(handle,0,SEEK_END);
      written=FileWrite(handle,TimeToString(TimeCurrent())," ",AccountInfoDouble(ACCOUNT_EQUITY));//TimeToString(time[i]),
      PrintFormat("Equity FileWrite25 - OnCalculate(): Записано %d байт в общую папку всех терминалов - %s",written,common_folder);
   }
   else {
      Print("Equity FileWrite25 - OnCalculate(): Не удалось открыть файл ",filename,".  Ошибка ",GetLastError());     
   }
   FileClose(handle);
   return rates_total;
}
void OnDeinit(const int reason){
   FileClose(handle);
}
 
Voodoo_King:

o que se passa :) ? onde são expostos quando é feita uma encomenda ?

Estou a falar do relatório "História", e não vejo nada nas colunas Stop Loss and Take Profit, embora as posições tenham estes valores.

como posso saber se uma paragem de perda foi definida ou não? se funcionou, posso vê-la, mas se não?

É apresentado no separador "Histórico/Ordem", e o que pensa que a paragem-perda e o take-profit na ordem, à qual o servidor fecha a posição quando a paragem é accionada, são iguais? Está a olhar para os parâmetros exactos das encomendas.
 
DV2010:

Tenho a seguinte pergunta.

A tarefa é escrever os valores de Equidade num ficheiro específico durante a fase de teste, apagando os valores anteriores.

Mas o que acontece aqui é o seguinte:

1. Quando FileDelete() está ausente no OnInit(), é escrito para além dos já existentes.

2. Mas quando FileDelete() em OnInit() está presente, apesar dos mesmos registos de equidade em OnCalculatde(), o ficheiro resultante acaba por ficar vazio.

Porque é que isto acontece e como evitá-lo?

O código é dado abaixo:

Tenho a solução para a detecção do modo de teste, mas há nele algum empirismo que me envergonha

(Tentei encontrar uma oportunidade para obter programadamente a hora de início do testador, para definir a sua indentação até às profundezas da história e cortar assim o tempo real,

mas infelizmente não o encontrou):

   if(rates_total - prev_calculated > 1 && rates_total - prev_calculated < 10000){
    FileDelete(filename,FILE_COMMON);
   }   
Mas existe um problema de natureza bastante diferente, que é que após alterar o período de teste, os indicadores de acordo com os resultados do teste desaparecem por alguma razão, mas se depois disso se fizer uma compilação para um novo período, então a execução do testador irá exibi-los.

Bug?