[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 347

 

Por favor, ajude-me a melhorar este código para obter um simples Expert Advisor. A essência é simples: abrimos 2 posições Sell e Bui com paradas especificadas ao preço atual. Então, quando um ou ambos acionam, abrimos novas posições. A essência parece simples, mas ainda não funciona Muito obrigado!

//+------------------------------------------------------------------+
//| 2DiffOrders.mq4 |
//| Copyright © 2008, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
extern double lots=0.01;
extern int SL_in_pips;
extern int TP_in_pips;
int x2;
int init()
{
if(SL_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && SL_in_pips>0)
{
SL_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Stoploss установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
if(TP_in_pips<=MarketInfo(Symbol(),MODE_STOPLEVEL) && TP_in_pips>0)
{
TP_in_pips=MarketInfo(Symbol(),MODE_STOPLEVEL);
Alert("Takeprofit установлен слишком близко к цене открытия. Должен быть минимум ",MarketInfo(Symbol(),MODE_STOPLEVEL),"pt.");
}
x2=1;
while(x2!=0)
{
if(OrderSend(Symbol(),0,lots,Ask,2,Bid-15*Point,Bid+15*Point,0)!=-1)
{
Alert("Ордер типа BUY успешно открыт");
OrderSend(Symbol(),1,lots,Bid,2,Ask+15*Point,Ask-15*Point,0);
x2=GetLastError();
if(x2==0)
Alert("Ордер типа SELL успешно открыт");
if(x2!=0)
Alert("Ордер типа SELL не открыт. Ошибка №: ",x2);
}else
{
x2=GetLastError();
if(x2!=0)
Alert("Ордер типа BUY не открыт. Ошибка №: ",x2);
}
}
//----
return(0);


Arquivos anexados:
ala.mq4  3 kb
 
Reshetov >> :

Isto só parece estar exatamente certo, mas em vista da máquina, a última parte pode assumir valores diferentes. I.e. 2.9999, 3 ou 3.00000001


Para se livrar de tais mal-entendidos, existe a função NormalizeDouble() na MQL.

Sim, a NormalizeDouble() ajuda, obrigado.

Mas ainda não está claro como isto é possível, parece ser uma divisão simples, e se você dividir 0,5 ou 0,9 ou mesmo 0,31 por 0,1, tudo está bem.

e aqui ele tem claramente 2,9, não está claro... a calculadora é mais precisa :-)

Graças a Reshetov e splxgf por sua ajuda.

 
mukata >> :


Mas ainda não está claro como é possível, parece ser uma divisão simples. E se você dividir 0,5 ou 0,9 ou mesmo 0,31 por 0,1, tudo bem.

e aqui é 2,9, não está claro... a calculadora é mais precisa :-)


As calculadoras têm funções de arredondamento incorporadas. E resolvem da mesma forma porque usam o mesmo coprocessador matemático para calcular números de ponto flutuante.

 

Olá!

Você pode me dar uma dica?!!!

Eu mesmo não entendo como fazer isso.

Tarefa:

A EA coloca 1-2 pedidos uma vez por dia.

O valor inicial da variável é definido manualmente e pode tomar um valor de 1 a 10.

Você precisa alterar a variável previamente definida em incrementos de 1 para um valor de - 10

em cada dia útil da EA, somente por 1, se nesse dia a TP não for executada.

Quando o TP é executado, a variável retorna valor - 1.

A contagem SL não é adequada, pois pode ser uma ou duas, e o valor só pode ser alterado uma vez por dia.

Isto é

Variável = 1

Dia 1 SL - variável =2

Dia 2 SL - variável =3

Dia 3 SL - variável =4

Dia 4 TP - variável =1

Dia 5 SL - variável =2

... E assim por diante.

Socorro!

Obrigado.

 
Enter писал(а) >>

Por favor, ajude-me a melhorar este código para obter um simples Expert Advisor. A idéia é simples: abrimos 2 posições Sell e Bui com paradas especificadas ao preço atual. Então, quando um ou ambos acionam, abrimos novas posições. A essência parece simples, mas ainda não funciona Muito obrigado!

Bem, para o trabalho de especialista, a "carne" de conselheiro deve ser colocada em função inicial, da mesma forma.
 

Connoisseurs, por favor, ajudem.

Há um código que calcula um único momento de período e o integra com um grande período, depois o produz como um indicador.

Preciso escrever um indicador com um determinado período que encontre a média da curva resultante e a produza como um indicador.

O código está anexado:

#janela_indicadora de propriedade_separarate_window
#property indicator_buffers 1
#indicador de propriedade_color1 DodgerBlue
#largura_do_indicador de propriedade1 2

//------- Parâmetros indicadores externos ----------------------------------------+
período MTM_Exterior = 1;
//externo int MTM_Integr_Period = 1000;

// Preço_externo aplicado_preço = 0; // Preço usado:
// 0 - PREÇO_FECHAR
// 1 - PRICE_OPEN
// 2 - PREÇO_ELEVADO
// 3 - PREÇO_BAIXO
// 4 - PRICE_MEDIAN
// 5 - PRICE_TYPICAL
// 6 - PREÇO_PONDERADO
NúmeroOfBars externo = 1000; // Número de barras (0-all)

//------- Buffers indicadores ---------------------------------------------------+
duplo buf0[];

//+----------------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado |
//+----------------------------------------------------------------------------+
init() {
SetIndexBuffer (0, buf0);
SetIndexEmptyValue(0, 0);
SetIndexLabel (0, "i-mtm_integr");
SetIndexStyle (0, DRAW_LINE);
}

//+----------------------------------------------------------------------------+
//| Função de desinicialização de indicador personalizada |
//+----------------------------------------------------------------------------+
void deinit() {
Comentário(");
}

//+----------------------------------------------------------------------------+
//| Função de iteração de indicador personalizada |
//+----------------------------------------------------------------------------+
início nulo() {
int LoopBegin, i,j, per=3;
mtm duplo, mtmsum;

se (NumberOfBars==0) LoopBegin=Bars-1;
else LoopBegin=NumberOfBars;
LoopBegin=MathMin(LoopBegin, Bars-1);

para (i=LoopBegin; i>=0; i--) {
mtm=Fechar[i]-Fechar[MTM_Period+i];
mtmsum=mtmsum+mtm;
buf0[i]=mtmsum;
}
/* para (i=LoopBegin-per;i>=per;i--){
mtm=Fechar[i]-Fechar[MTM_Period+i];
mtmsum[i]=0+mtm;
para (j=per;j<=0;j--){
mtmsum[i]=0+mtmsum[i+j];
mtmsum[i]=mtmsum[i]/per;
buf0[i]=mtmsum[i];
}
}*/
}
//+----------------------------------------------------------------------------+

 
VNG писал(а) >>

Connoisseurs, por favor, ajudem.

Há um código que calcula um único momento de período e o integra com um grande período, depois o produz como um indicador.

Preciso escrever um indicador com um determinado período que encontre a média da curva resultante e a produza como um indicador.

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_color2 Red
#property indicator_width1 2

//------- Внешние параметры индикатора ----------------------------------------+
extern int MTM_Period = 1; 
//extern int MTM_Integr_Period = 1000; 

//extern int Applied_Price = 0; // Используемая цена:
// 0 - PRICE_CLOSE
// 1 - PRICE_OPEN
// 2 - PRICE_HIGH
// 3 - PRICE_LOW
// 4 - PRICE_MEDIAN
// 5 - PRICE_TYPICAL
// 6 - PRICE_WEIGHTED
extern int NumberOfBars = 1000; // Количество баров обсчёта (0-все)
extern int MA_Period=3;
extern int MA_Mode=0;

//------- Буферы индикатора ---------------------------------------------------+
double buf0[];
double MA[];
//+----------------------------------------------------------------------------+
//| Custom indicator initialization function |
//+----------------------------------------------------------------------------+
void init() {
  SetIndexBuffer (0, buf0);
  SetIndexEmptyValue(0, 0);
  SetIndexLabel (0, "i-mtm_integr");
  SetIndexStyle (0, DRAW_LINE);
  SetIndexBuffer (1, MA);
  SetIndexLabel (1, "MA");
  SetIndexStyle (1, DRAW_LINE);

}

//+----------------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+----------------------------------------------------------------------------+
void deinit() {
Comment("");
}

//+----------------------------------------------------------------------------+
//| Custom indicator iteration function |
//+----------------------------------------------------------------------------+
void start() {
  int LoopBegin, i, j, per=3;
  double mtm, mtmsum;

  if ( NumberOfBars==0) LoopBegin=Bars-1;
  else LoopBegin= NumberOfBars;
  LoopBegin=MathMin( LoopBegin, Bars-1);

  for ( i= LoopBegin; i>=0; i--) {
    mtm=Close[ i]-Close[ MTM_Period+ i];
    mtmsum= mtmsum+ mtm;
    buf0[ i]= mtmsum;
  }
  for ( i= LoopBegin- per; i>= per; i--){
     MA[ i]= iMAOnArray( buf0, 0, MA_Period, 0, MA_Mode, i);
  }
}
//+----------------------------------------------------------------------------+
Talvez esta variante sirva. Não checou o código, escreveu-o no navegador
 
Reshetov >> :

Isto só parece estar exatamente certo, mas em vista da máquina, a última parte pode assumir valores diferentes. I.e. 2.9999, 3 ou 3.00000001

Para se livrar de tais mal-entendidos, a MQL tem a função NormalizeDouble()


Por que a função NormalizeDouble() não é executada por padrão para todos os valores de Ask, Bid, Low, etc.?

Todos caíram nessa e depois têm que consertá-la "manualmente". Estranho que a MT não consiga ler o que ela mesma desovou.

 
Silen >> :

Obrigado, há alguma garantia de que os dados estarão disponíveis no início()?

você pode tentar usar o RefreshRates() - veja exemplos na ajuda padrão do MetaEditor

 

Há uma opção "Salvar como relatório" na otimização da EA, mas os "Parâmetros de entrada" não são mostrados no explorador da Internet,

embora, a julgar pelo código html, eles estejam presentes ali. Em geral, foi por causa desses parâmetros que a otimização foi iniciada.

Talvez alguém saiba como vê-los no Explorer?


(Há também a possibilidade de copiá-los para arquivo de texto por comando separado, mas é preferível vê-los no IE)