Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 353

 
_new-rena:

Isto (abaixo) não funciona, escrevi F_Path no explorador, cliquei em enter, o ficheiro abre... A informação do WinApi tem este aspecto?

Quem impede que a bandeira FILE_COMMON seja utilizada na escrita e na leitura? O ficheiro estará disponível para todos os terminais instalados no sistema. Estará na pasta partilhada de todos os terminais.

Em ME File --> Abrir pasta de dados partilhados

 
artmedia70:

Quem impede que a bandeira FILE_COMMON seja utilizada na escrita e na leitura? O ficheiro estará disponível para todos os terminais instalados no sistema. Estará localizado na pasta partilhada de todos os terminais.

Em ME File --> Abrir pasta de dados partilhados

obrigado (!!!), vou experimentá-lo.
 

Olá, alguém encontrou este problema ao criar um pedido comercial com parâmetros:

se eu colocar os seguintes parâmetros:

mrequest.action=TRADE_ACTION_DEAL;
mrequest.type_filling=ORDER_FILLING_FOK;

mrequest.type=ORDER_TYPE_BUY;

o terminal anuncia que especifiquei um método inválido mrequest.type_filling(política de execução de encomendas); se eu especificar mrequest.type_filling=ORDER_FILLING_RETURN, a encomenda é aberta mas não a posso fechar programmaticamente porque o terminal informa que está a ser utilizado um método inválido. Estou a gerir o Expert Advisor num servidor forex e tudo está a funcionar bem noutros servidores. Alguém pode escrever uma política de execução de ordens que possa ser utilizada no desenvolvimento de robôs comerciais para este corretor? Obrigado.
 

Existe um indicador mq4 com função Alerta.

Por exemplo:

//+------------------------------------------------------------------+
//|                                                    RSI-Alert.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_separate_window
//#property indicator_minimum 0
//#property indicator_maximum 100
#property indicator_buffers 3
#property  indicator_color1 LightSeaGreen
#property  indicator_color2 CLR_NONE
#property  indicator_color3 CLR_NONE
#property  indicator_width1 1
#property  indicator_width2 1
#property  indicator_width3 1
#property  indicator_style1 STYLE_SOLID
#property  indicator_style2 STYLE_DOT
#property  indicator_style3 STYLE_DOT
//---- input parameters
extern int RSIPeriod=48;
extern int ApplyTo=0;
extern bool AlertMode=true;
extern int OverBought=0;
extern int OverSold=0;
//---- buffers
double RSIBuffer[];
double RSIOBBuffer[];
double RSIOSBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- indicator lines
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,RSIBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,RSIOBBuffer);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,RSIOSBuffer);
//---- name for DataWindow and indicator subwindow label
   short_name="RSI-Alert("+RSIPeriod+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
   SetIndexLabel(1,"OverBought");
   SetIndexLabel(2,"OverSold");
//----
   SetIndexDrawBegin(0,RSIPeriod);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Relative Strength Index                                          |
//+------------------------------------------------------------------+
int start()
  {
   int    i,counted_bars=IndicatorCounted();
//----
   if(Bars<=RSIPeriod) return(0);
//----
   i=Bars-RSIPeriod-1;
   if(counted_bars>=RSIPeriod) i=Bars-counted_bars-1;
   while(i>=0)
   {
      RSIBuffer[i]=iForce(NULL,0,RSIPeriod,1,0,i);
      RSIOBBuffer[i]=OverBought;
      RSIOSBuffer[i]=OverSold;
      i--;
   }
   
   if(AlertMode)
   {
      if(RSIBuffer[1]<OverBought && RSIBuffer[0]>=OverBought)
         Alert("RSI = "+ RSIBuffer[i]+ ", Sell.");
      else if(RSIBuffer[1]>OverSold && RSIBuffer[0]<=OverSold)
         Alert("RSI = "+ RSIBuffer[i]+ ", Buy.");
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
Como fazer para que, ou no canto superior esquerdo da sub-janela (onde o nome do indicador e os parâmetros são normalmente exibidos), ou de alguma outra forma, indique se o sinal está ligado( boolexterno AlertMode=verdadeiro;) ou desligado?
 
Nilog:

Existe um indicador mq4 com função Alerta.

Por exemplo:

Como fazer no canto superior esquerdo da sub-janela (onde o nome do indicador e os parâmetros são normalmente exibidos), ou de alguma outra forma, indicar se o sinal está activado( boolexterno AlertMode=verdadeiro;) ou desactivado?
Texto de saída por objectos, por exemplo.
 

A documentação diz isso:

При тестировании в эксперте можно обрабатывать пользовательские события с помощью функции OnChartEvent(), но в индикаторах эта функция в тестере не вызывается. Даже если индикатор имеет обработчик OnChartEvent() и этот индикатор используется в тестируемом эксперте, то сам индикатор не будет получать никаких пользовательских событий.

Neste momento esta afirmação não é relevante - nos indicadores esta função é chamada no testador, pelo menos um indicador pode receber eventos gerados por outro indicador no testador.

O problema é que uma vez que o indicador recebe a chamada desta função, não tem acesso aos dados armazenados nas variáveis declaradas a nível global, e vice-versa - todas as alterações feitas nesta função não são armazenadas nas variáveis de nível de acesso global.

Exemplos:

1. o objecto é declarado globalmente e inicializado na função OnInit. Pode ser acedido a partir da função OnCalculate, mas recebemos uma mensagem de erro na função OnChartEvent - ponteiro inválido

2. existe uma função que produz o conteúdo de uma variável para o periódico (a variável é declarada globalmente). Quando chamamos esta função da OnCalculate obtemos o valor esperado, quando chamamos a mesma função da OnChartEvent obtemos um disparate.

 

Bom dia!

Enfrentei um problema ao utilizar eventos, particularmente a função OnChartEvent() num indicador. Ao utilizá-lo num Expert Advisor, não há problema, mas no indicador não funciona correctamente. Isto é, o evento ocorre mas não há forma de alterar os campos existentes. Exemplo:

//

int k;
int OnInit() {
k = 0;
ihandleDE = iCustom(_Symbol, _Period, "DrawExtremums");
//< ... >
return(INIT_SUCCEED);
}

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[])
{
Print("OnCalculate(): k =", k);
//< ... >
return(rates_total);

}

void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
string nameEv = "EXTR_UP";
if (sparam == nameEv)
{
Print("OnChartEvent(): k = ", k);
k++;

}

}

//----------------------------------------------------------------------------------------------

Como resultado, obtemos:

"OnCalculate(): k = 0" - sempre.

"OnChartEvent(): k = 0,...,123332" - conta de 0 a ...

Como pode isto ser e porquê!? Existe alguma forma de o resolver? Se alguém compreender, uma resposta seria muito apreciada.

P.S.: Esta injustiça ocorre apenas no testador de estratégias, em tempo real tudo funciona correctamente.

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
dariamap:

Bom dia!

Enfrentei um problema ao utilizar eventos, particularmente a função OnChartEvent() num indicador. Ao utilizá-lo num Expert Advisor, não há problema, mas no indicador não funciona correctamente. Isto é, o evento ocorre mas não há forma de alterar os campos existentes. Exemplo:

//

int k;
int OnInit()
{ k = 0;
ihandleDE = iCustom(_Symbol, _Period, "DrawExtremums");
//< ... >
return(INIT_SUCCEED);
}

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[])
{
Print("OnCalculate(): k =", k);
//< ... >
return(rates_total)

}

void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
string nameEv = "EXTR_UP";
if (sparam == nameEv)
{
Print("OnChartEvent(): k = ", k);
k++;

}

}

//----------------------------------------------------------------------------------------------

Como resultado, obtemos:

"OnCalculate(): k = 0" - sempre.

"OnChartEvent(): k = 0,...,123332" - conta de 0 a ...

Como pode isto ser e porquê!? Existe alguma forma de o resolver? Se alguém compreender, uma resposta seria muito apreciada.

P.S.: Esta injustiça ocorre apenas no testador de estratégias, em tempo real tudo funciona correctamente.

Boa noite. No seu tempo, o Service Desk deu uma resposta bastante definitiva sobre este assunto: o terminal e o testador de estratégia são dois programas diferentes, e o desempenho dos Consultores/indicadores peritos no testador e no terminal pode ser diferente. O que frequentemente funciona no terminal do cliente não funciona no Testador de Estratégia. Escrever ao Service Desk, fornecer provas e deixá-los arranjá-las.
 
Tapochun:
Boa noite. No seu tempo, o Service Desk deu uma resposta bastante definitiva sobre este assunto: o terminal e o testador de estratégia são dois programas diferentes, e o trabalho dos Consultores/indicadores peritos no testador e no terminal pode diferir significativamente. O que frequentemente funciona no terminal do cliente não funciona no Testador de Estratégia. Por favor, escreva ao Service Desk e forneça-lhes provas e deixe-os arranjá-las.
Muito obrigado! Estou contente por o problema não ser eu)
 
extern string Symbol1= "EURUSD";
extern string Symbol2= "GBRUSD";

  double Sell1=iFractals(Symbol1,240,MODE_UPPER,2);
  double Sell2=iFractals(Symbol2,240,MODE_UPPER,2);
Pode dizer-me que comando devo escrever para que quando Vender1 e Vender2 fractais são abertos ao mesmo tempo uma ordem seja aberta