Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 100

 

Olá a todos, podem me ajudar a encontrar um erro no código da EA, acho que pesquisei tudo isso, parece estar tudo escrito corretamente no código, mas o programa não negocia corretamente por alguma razão! A idéia é a seguinte: o assessor tem que procurar duas velas longas da mesma direção (o comprimento entre as velas é ajustável no assessor, ou seja, entre as duas velas mínimas ou máximas, dependendo da direção), se o preço na direção oposta quebrar o mínimo ou máximo da última vela, deve ser aberto um negócio (Exemplo de situações de imagem no quadro anexo ao arquivo). O conselheiro deve abrir negócios em todas essas situações adequadas, mas por alguma razão ele abre negócios somente nas janelas de negociação entre dias. Aqui está a situação, que não é difícil para os programadores, por favor, ajude, conserte o erro. Código EA veja abaixo, assim como no arquivo anexo.


//+-----------------------------------------------------------------------------------------------+

//| Espaçamento_Candles.mq4 |

//| Direitos Autorais 2017, Vladim |

//| vk.com/id229534564 |

//| Correspondência: Vladim120385@yandex.ru |

//+-----------------------------------------------------------------------------------------------+

#Direitos autorais de propriedade "Copyright 2017, Vladim"

#link de propriedade "vk.com/id229534564"

#propriedade versão "1.00"

#propriedade rigorosa


//--- Parâmetros EA

paramEA de corda externa = ""; // Parâmetros EA

volume duplo externo = 0,01; // Volume

stopLoss duplo externo = 5; // StopLoss.

takeProfit duplo externo = 1,5; // TakeProfit

Espaçamento máximo externo duplo = 150; // Espaçamento máximo

duplo MinSpacing externo = 30; // MinSpacing

TrailingStop duplo externo = 0; // TrailingStop

magia int externa = 127; // Magia


//--- variáveis globais

data/hora newCandle;

int ponta;


//+-----------------------------------------------------------------------------------------------+

int OnInit()

{

return(INIT_SUCCEED);

}

//+-----------------------------------------------------------------------------------------------+

nulo OnDeinit(const int razão)

{

}

//+-----------------------------------------------------------------------------------------------+

nulo OnTick()

{

if(newCandle != Tempo[0]) FindPattern();

newCandle = Tempo[0];

}

//+-----------------------------------------------------------------------------------------------+

OpenOrder(int type) // Abrir uma ordem de mercado

{

if(type == OP_BUY) if(OrderSend(_Symbol, OP_BUY, volume, Ask, 0, 0, 0, "", magic, 0)) SetSLTP(OP_BUY);

if(type == OP_SELL) if(OrderSend(_Symbol, OP_SELL, volume, Bid, 0, 0, 0, 0, "", magic, 0)) SetSLTP(OP_SELL);

}

//+-----------------------------------------------------------------------------------------------+

SetSLTP(tipo int) //set stop orders

{

dupla lâmina = 0;

duplo tp = 0;

if(type == OP_BUY)

for(int i = 0; i < OrderTotal(); i++)

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_BUY && OrderStopLoss() == 0)

{

sl = NormalizeDouble(Low[1] - stopLoss * _Point, _Digits);

tp = NormalizeDuplo(PreçoAbrir Pedido() + (PreçoAbrir Pedido() - Baixo[1]) * takeProfit, Digits);

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) retorna;

}

if(type == OP_SELL)

for(int i = 0; i < OrderTotal(); i++)

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

if(OrderSymbol() == _Symbol && OrderMagicNumber() == magic && OrderType() == OP_SELLL && OrderStopLoss() == 0)

{

sl = NormalizeDouble(Alta[1] + stopLoss * _Point, _Digits);

tp = NormalizeDouble(OrderOpenPrice() - (Alto[1] - OrderOpenPrice()) * takeProfit, Digits);

if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0)) retorna;

}

}

//+-----------------------------------------------------------------------------------------------+

FindPattern() // Procura de longa distância entre castiçais

{

if(Alto[1] < Alto[2] && Lance > Alto[1] && Baixo[1] < Baixo[2])

{

espaçamento duplo = NormalizeDuplo((Alto[2] - Alto[1]) / _Ponto, 0);

if(maxSpacing >= espaçamento && minSpacing <= espaçamento)

OpenOrder(OP_BUY);

}

if(Baixo[1] > Baixo[2] && Oferta < Baixo[1] && Alto[1] > Alto[2])

{

espaçamento duplo = NormalizeDuplo((Baixo[1] - Baixo[2]) / _Ponto, 0);

if(maxSpacing >= espaçamento && minSpacing <= espaçamento)

OpenOrder(OP_SELL);

}

{

if(TrailingStop!=0) TrailingStop();

}

}

//+-----------------------------------------------------------------------------------------------+

TrailingStop() vazio

{

duplo StLo,OSL,OOP;

bool error=true;

para (int i=0; i<OrdersTotal(); i++)

{

se (OrderSelect(i, SELECT_BY_POS))

{

dica = OrderType();

if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)

{

OSL = NormalizeDouble(OrderStopLoss(),Digits);

OOP = NormalizeDouble(OrderOpenPrice(),Digits);

se (tip==0)

{

StLo = NormalizeDouble(Bid - TrailingStop*Point,Dígitos);

se (StLo < OOP) continuar;

se (StLo > OSL)

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);


}

se (tip===1)

{

StLo = NormalizeDouble(Pergunte + TrailingStop*Point,Dígitos);

se (StLo > OOP) continuar;

se (StLo < OSL || OSL==0 )

error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);

}

if (!error) Alert("Error TrailingStop ",GetLastError()," ",Symbol()," SL ",StLo);

}

}

}

}

//+-----------------------------------------------------------------------------------------------+

Arquivos anexados:
 
Vladim1203:

Olá a todos, vocês podem me ajudar a encontrar um erro no código da EA, acho que pesquisei tudo, parece que está tudo escrito corretamente no código, mas o programa não negocia corretamente por alguma razão! A idéia é a seguinte: o assessor tem que procurar duas velas longas da mesma direção (o comprimento entre as velas é ajustável no assessor, ou seja, entre as duas velas mínimas ou máximas, dependendo da direção), se o preço na direção oposta quebrar o mínimo ou máximo da última vela, deve ser aberto um negócio (Exemplo de situações de imagem no quadro anexo ao arquivo). O conselheiro deve abrir negócios em todas essas situações adequadas, mas por alguma razão ele abre negócios somente nas janelas de negociação entre dias. Aqui está a situação, que não é difícil para os programadores, por favor, ajude, conserte o erro. O código EA pode ser visto abaixo e também no arquivo anexo.

Talvez já seja suficiente, você amontoou postes em cada linha e, ao mesmo tempo, criou o seu próprio.

 
kuzhakov:

Hi.
Você pode me dizer como limitar o comércio da EA pelo tempo?
Tentei muitos métodos do fórum, mas nada funcionou, não entendo nada de escrita.
Seria bom se você pudesse apenas apontar o dedo para o que colocar dentro.


Insira-o após o início. e o eXpert negociará todos os dias em um determinado intervalo de tempo no terminal


int val=Hour();
 double min=Minute();
 double Dl = val + min/100;  
 double L = xxxx+xxxx/100; //час + минуты вместо хххх - это начало времени
 double P = xxxx+xxxx/100; //час + минуты вместо хххх - это конец времени
 if(Dl<L)return;
 if(Dl>P)return;
 
Vladim1203:

Olá a todos, vocês podem me ajudar a encontrar um erro no código da EA, acho que pesquisei tudo, parece que está tudo escrito corretamente no código, mas o programa não negocia corretamente por alguma razão! A idéia é a seguinte: o assessor tem que procurar duas velas longas da mesma direção (o comprimento entre as velas é ajustável no assessor, ou seja, entre as duas velas mínimas ou máximas, dependendo da direção), se o preço na direção oposta quebrar o mínimo ou máximo da última vela, deve ser aberto um negócio (Exemplo de situações de imagem no quadro anexo ao arquivo). O conselheiro deve abrir negócios em todas essas situações adequadas, mas por alguma razão ele abre negócios somente nas janelas de negociação entre dias. Aqui está a situação, que não é difícil para os programadores, por favor, ajude, conserte o erro. Veja o código EA abaixo e também no arquivo anexo.


verificar condição de entrada de compra e venda

 
Vladim1203:

Olá a todos, vocês podem me ajudar a encontrar um erro no código da EA, acho que pesquisei tudo, parece que está tudo escrito corretamente no código, mas o programa não negocia corretamente por alguma razão! A idéia é a seguinte: o assessor tem que procurar duas velas longas da mesma direção (o comprimento entre as velas é ajustável no assessor, ou seja, entre as duas velas mínimas ou máximas, dependendo da direção), se o preço na direção oposta quebrar o mínimo ou máximo da última vela, deve ser aberto um negócio (Exemplo de situações de imagem no quadro anexo ao arquivo). O conselheiro deve abrir negócios em todas essas situações adequadas, mas por alguma razão ele abre negócios somente nas janelas de negociação entre dias. Aqui está a situação, que não é difícil para os programadores, por favor, ajude, conserte o erro. Veja o código EA abaixo, bem como no arquivo anexo.

É melhor primeiro escrever a parte da EA que marcaria na carta as velas encontradas, para que tudo se torne claro. E as seguintes linhas são desnecessárias em seu caso:

extern string paramEA    = "";     // Parameters EA

и

//+-----------------------------------------------------------------------------------------------+
int OnInit()
{
   
   return(INIT_SUCCEEDED);
}
//+-----------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   
}
//+-----------------------------------------------------------------------------------------------+
 

Por favor, ajude a comunidade ...
*
Descarregado o indicador do filtro Kalman no fórum (código fonte anexado).
Tudo está bem na tabela.


Quando eu tento ler esta linha no Expert Advisor



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

Produz o mesmo grande número, obviamente não relacionado com o indicador:

O que poderia ser?

Arquivos anexados:
 
MikeZv:

Ajuda da comunidade ...
*
Descarregado o indicador do filtro Kalman no fórum (código fonte anexado).
Tudo está bem na tabela.


Quando tento lê-lo em Expert Advisor, a seguinte linha



iValue=iCustom(NULL,timeframe,"Kalmanfilter",  4,1,1  ,0,1);

Produz o mesmo grande número, obviamente não relacionado com o indicador:

O que pode ser ?

VAZIO_VALOR

Valor vazio no buffer indicador

2147483647 (0x7FFFFFFFFFF)

 
Alekseu Fedotov:

VAZIO_VALOR

Valor vazio no buffer indicador

2147483647 (0x7FFFFFFFFFF)


:) Eu já o encontrei ...
Por que ela sai?

 
MikeZv:

:) Eu já o encontrei ...
Mas por que ela vem à tona?


O indicador tem 2 matrizes porque existem 2 cores. Enquanto há uma linha da primeira cor na barra, a matriz com a segunda cor é igual a EMPTY_VALUE,

iValue=iCustom(NULL,timeframe, "Kalmanfilter", 4,1,1,0,1);

iValue = EMPTY_VALUE, então a linha em 1 barra é laranja. (porque matriz azul = EMPTY_VALUE)

 
Nikolay Ivanov:

O indicador tem 2 matrizes porque existem 2 cores. Enquanto há uma linha da primeira cor na barra, a matriz com a segunda cor é igual a EMPTY_VALUE,

iValue=iCustom(NULL,timeframe, "Kalmanfilter", 4,1,1,0,1);

iValue = EMPTY_VALUE, então a linha em 1 barra é laranja. (Porque matriz azul = EMPTY_VALUE)


Obrigado, Nikolai...
Eu tirei de ambas as linhas.
Depois os fundi em um só (deixei um buffer). O mesmo resultado.
*
Tenho uma pergunta a fazer:
O indicador tem a variável draw_begin=500, ou seja, o número de castiçais da extremidade (do castiçal mais fresco) onde o gráfico é desenhado.
E quando extraímos o valor do indicador usando o método iCustom(), esses 500 pontos são contados a partir de que castiçal ?
Por que é importante - draw_begin é usado não só para desenhar, mas também participa do cálculo do indicador ...