Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 623
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Eu já descrevi a tarefa mais simples.
MetaEditor aberto.
Clique em File->Create.
No campo pop-up, selecione Indicador.
...
Mas este código não é aceito pelo tradutor MQL.
Responderei em cerca de 20 minutos
O que vocês, crianças, estão realmente fazendo, agitando as águas?
Ninguém está fazendo alarde. A situação está finalmente começando a se esclarecer um pouco. Acontece que você chama um roteiro de uma função que não pode ser colocada no corpo do código principal.
Também não se esqueça que a MT tem a intenção de trabalhar com dinheiro que deve ser protegido contra os ataques de terceiros. Daí a maior parte das limitações do idioma.
Eu já descrevi uma tarefa simples.
MetaEditor aberto.
Clique em File->Create.
No campo pop-up, selecione Indicador.
No campo Indicator OnCalculate(), embutir qualquer objeto de script com o evento OnStart().
Pessoalmente, não sei como fazer isso. Bem, por exemplo, assim:
int OnCalculate(const int taxas_total,
const int prev_calculado,
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[])
{
//---
for(int i = 1; i < 100;i++)
{
if(open[i] > Max)
{
OnStart()
E aqui escrevemos um roteiro para a construção do objeto em que estamos interessados. Por exemplo, uma elipse ou uma carta em uma carta ou outra coisa
} //if(aberto)
} //for(int i)
//--- valor de retorno de pré_cálculo para a próxima chamada
retorno(taxas_total)
} // OnCalculate
Isso deveria ser algo parecido com isto.
Mas o tradutor da MQL não percebe tal código.
Deve ser algo parecido com isto
Em cerca de 20 minutos eu responderei.
Demorou muito tempo para carregar o vídeo - mais de 40 minutos.
Demorou muito tempo para carregar o vídeo - mais de 40 minutos.
Às vezes também misturo seções do fórum e escrevo uma resposta a uma pergunta em mql4 em mql5.
Em princípio, neste caso nada mudará, exceto a extensão do arquivo, mas em mql4 será supérfluo
e até mesmo completamente desnecessário e inútil.
O que vocês, crianças, estão fazendo, realmente, agitando as águas?
Basta entrar no MetaEditor, e digitar o comando: Arquivo->Criar...
Isto trará à tona um formulário com diferentes arquivos fictícios.
Em particular, serão arquivos fictícios:
- Consultor especializado
- Indicador personalizado
- Roteiro
- Biblioteca, etc.
Estamos interessados nos três primeiros itens: Expert Advisor, Custom Indicator e Script.
Vamos comparar estes manequins:
No Expert Advisor, temos eventos:
-OnInit(), OnDeinit(), OnTick(), OnTimer, OnChartEvent() ... tudo, não mais.
No roteiro, temos os eventos:
- OnStart() ... é isso, não mais.
no indicador que temos eventos:
- OnInit(), OnCalculate(), OnTimer, OnChartEvent() ... tudo, não mais.
A questão natural aqui é como fazer a conexão entre esses objetos.
Acontece que não há nem pode haver conexão entre eles na MQL, porque os fluxos de dados entre estes objetos estão completamente separados e não há conexão entre eles.
Além disso, estou surpreso com o fato de que os criadores da MQL nos dão este fato como um "bem".
E se, por exemplo, em C++, posso facilmente chamar o tradutor BASIC ou Javascript ou qualquer outro tradutor e mudar, por exemplo, para o ambiente de programação Android,
no âmbito da MQL, não posso nem mesmo criar um chamado "script" em ambiente "indicador", porque o ambiente indicador não aceita o comando OnStart().
Que tipo de aberração é esta?
E há coisas tão feias na MQL mais do que suficientes.
Eles estão a cada passo.
Eu li a descrição da MQL - e estou surpreso, porque não há mais nada a fazer.
Enquanto os criadores da MQL proclamam em voz alta que a MQL é descendente de C++.
Claro, sinto muito, mas quero perguntar aos criadores do MQL: - Herdeiro de quê? - Em sua fealdade?
Eu comparo involuntariamente o MQL com o famoso ambiente de programação 1C. Eles também afirmam ser os herdeiros do C++.
Mas tudo é feito muito mais decentemente lá.
E os objetos gráficos, e a comunicação entre os módulos e muito mais.
E o que há na MQL?
Sem classes embutidas, sem objetos relacionados a fios... e nada de nada.
E eu ainda não disse nada sobre a casca matemática do terminal!!!
Esse é um tema totalmente à parte para surpresas!!!
Por que você não lê um pouco de Ajuda e encontra todas aquelas coisas que você está dizendo que não existem, lê sobre aulas integradas na SB, aprende a pedir ajuda educadamente (você pediu ajuda) e aprende a não ser rude com as pessoas que estão tentando ajudá-lo (note isto desinteressadamente)...
Em geral - proíba você por 24 horas por trolling, rudeza e mendicidade (você não mostrou uma linha de seu código para provar todas as suas declarações, mas impudicamente exige que as pessoas que responderam à sua pergunta e declarações, eles lhe fornecerão o código de trabalho para suas necessidades - não é comum aqui - eles ajudam, não fazem por você, note - o código mais simples)
Sem ofensa - aquele que vem até nós sem nada será morto por algo ininteligível.
Mais ainda, eu o avisei para diminuir o aquecimento:
Fórum sobre comércio, sistemas comerciais automatizados e estratégias comerciais de teste
Qualquer pergunta de iniciantes sobre MQL4, ajuda e discussão sobre algoritmos e códigos
Artyom Trishkin, 2018.09.12 14:02
Agora tente sem os insultos e a arrogância.como instalar o mt4 em macOS? ajude por favor!
Exclusivamente em uma máquina virtual. Eu tenho Parallel é caro, mas conveniente e confiável.
https://www.parallels.com/ru/products/desktop/
Estou pedindo ajuda. As questões são:
1. O programa não estabelece limites de perdas tanto na compra quanto na venda em modo de teste. Mas a modificação de ordens pendentes vai bem.
2. Ela não começa em tempo real por conta disso.
Por favor, ajude.
Também gostaria de pedir para apontar quaisquer erros que possam ter ocorrido durante a redação do programa.
Muito obrigado de antemão.
Código do programa:
.input int Porcentagem=50;
entrada no MAGICNUMBER=413;
//Introdução de constantes indicadoras e osciladores para os gráficos de longo prazo
input int Signal_Period_long_term=6;
input int Fast_EMA_Period_long_term=12;
input int Slow_EMA_Period_long_term=24;
//Impacto dos parâmetros dos indicadores e constantes dos osciladores para gráficos de curto prazo
input int Stochastic_Kperiod_short_term=5;
input int Stochastic_Dperiod_short_term=3;
input int Stochastic_slowing_short_term=3;
input ENUM_TIMEFRAMES PERÍODOS_curto_term=PERIOD_M5;
input ENUM_TIMEFRAMES PERÍODOS_long_term=PERIOD_H1;
//-----------------------------------------------------------------------------------------
/como variáveis comuns e seus tipos
data/hora estática Novo_tempo;// hora da barra atual
data/hora estática Hora_Local;
Margem_Percentagem dupla; /Meios de abertura para abertura de pedidos
Lotes duplos;//Determinação do número total de lotes
duplo Lotes_Volume;
//Variáveis e tipos para o gráfico de longo prazo
MacdCurrent_long_term duplo;//MACD parâmetros da linha principal da barra atual
double MacdPrevious_long_term;//MACD parameters of the main line of the previous bar
duplo SinalCurrent_long_term;
//Variáveis e tipos para o gráfico de curto prazo
dupla Stochastic_Current_short_term_main;//Stochastic parameters of the current bar on the 5-minute chart
duplo Stochastic_Previous_short_term_main;//Stochastic parameters of the previous bar on the 5-minute chart
duplo Stochastic_Current_short_term_signal;//Stochastic parameters of the current bar in the 5-minute chart
duplo Stochastic_Previous_short_term_signal;//Stochastic parameters of the previous bar on the 5-minute chart
stopLoss_BUY duplo;
stopLoss duplo_SELL;
preço duplo_BUY;
preço duplo_SELL;
//+------------------------------------------------------------------+
//| Função de inicialização do especialista |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| Função de desinicialização especializada |
//+------------------------------------------------------------------+
nulo OnDeinit(const int razão)
{
//---
}
//+------------------------------------------------------------------+
//| função tick expert |
//+------------------------------------------------------------------+
nulo OnTick()
{
int ticket,cnt;
int total=OrdensTotal();// Determinação do número de pedidos
bool New_Bar=false; // Bandeira nova barra
//Definir os valores variáveis para o gráfico de longo prazo
MacdCurrent_long_term=iMACD(NULL,PERÍODOS_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,1);
MacdPrevious_long_term=iMACD(NULL,PERÍODOS_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,2);
SignalCurrent_long_term=iMACD(NULL,PERÍODOS_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_SIGNAL,1);
//Determinação de valores variáveis para o gráfico de curto prazo
Stochastic_Current_short_term_main=iStochastic(NULL,PERÍODOS_curto_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,1);
Stochastic_Previous_short_term_main=iStochastic(NULL,PERÍODOS_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,2);
Stochastic_Current_short_term_signal=iStochastic(NULL,PERÍODOS_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,1);
Stochastic_Previous_short_term_signal=iStochastic(NULL,PERÍODOS_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,2);
//Definição de variáveis comuns
Price_BUY=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
Price_SELL=iLow(NULL,PERÍODOS_curto_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
StopLoss_BUY=iLow(NULL,PERÍODOS_curto_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
StopLoss_SELL=iHigh(NULL,PERÍODOS_curto_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
Margin_Percent=AccountFreeMargin()*Percent/100;
Lots=NormalizeDouble(Margin_Percent/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2);
Lots_Volume=NormalizeDouble(MathFloor(Lots)+MarketInfo(Symbol(),MODE_LOTSTEP),2);
//-----------------------------------------------------------------------------------------------------------------------
//----- Определение нового бара------------------------------------------------------------------------------------------
Novo_Time=TimeCurrent();
Imprimir("Time=",TimeCurrent();
Print("Bar open time =",iTime(NULL,PERÍODOS_curto_term,0));
if(iTime(NULL,PERÍODOS_curto_term,0)==Novo_Tempo) // Comparar tempos
{
if(iVolume(NULL,PERÍODOS_curto_terminal,0)<=2) //compare volume
Imprimir("Bar volume =",Volume[0]);
if(iBarShift(NULL,PERÍODOS_curto_terminal,TimeCurrent())==0)//Cheque o índice de barras
Print("Bar index =",iBarShift(NULL,PERÍODOS_curto_terminal,TimeCurrent());
New_Bar=true; // Uma nova barra é apanhada
Imprimir("New_Bar");
}
senão se(New_Bar==false) // Se a barra não for nova...
{
Imprimir("Barra não é nova");
retornar;
}
//---Cheque a disponibilidade de fundos para abrir o lote mínimo
if(Margin_Percent<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT))
{
Imprimir("Não há fundos suficientes. Fundos livres = ",AccountFreeMargin()));
retornar;
}
//---Determinação do número de lotes
if(Lotes>Lots_Volume)
{
Lots=NormalizeDouble(Lots_Volume,2);
Imprimir("Número de lotes : ",Lotes);
}
senão se (Lotes<Lots_Volume)
{
Lots=NormalizeDouble(MathFloor(Lots),2);
Imprimir("Número de lotes : ",Lotes);
}
//+------------------------------------------------------------------+
//| Condições para abertura de pedidos se o número de pedidos for igual a zero |
//+------------------------------------------------------------------+
if(total<1)
{
if(MacdCurrent_long_term<0 && MacdCurrent_long_term>SignalCurrent_long_term)
Imprimir ("A condição é verdadeira para COMPRAR");
{
//+---------------------------------------------------------------------------+
//| Condição para abrir uma posição longa de COMPRA apenas |
//+---------------------------------------------------------------------------+
if(Stochastic_Current_short_term_main<Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main>=Stochastic_Previous_short_term_signal)
{
ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price_BUY,3,0,0,NULL,MAGICNUMBER,0,Blue);
if(ticket>0)//check position opened
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Imprimir("COMPRAR pedido aberto : ",OrderOpenPrice());
retornar;
}
else Print("BUY order open error : ",GetLastError()));
retornar;
}
}
}
if(MacdCurrent_long_term>0 && MacdCurrent_long_term<SignalCurrent_long_term)
Imprimir ("A condição é verdadeira para VENDER");
{
//+---------------------------------------------------------------------------+
//| Condição para abertura de posições curtas de VENDA somente |
//+---------------------------------------------------------------------------+
if(Stochastic_Current_short_term_main>Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main<=Stochastic_Previous_short_term_signal)
{
ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Price_SELLL,3,0,0,NULL,MAGICNUMBER,0,Green);
if(ticket>0)//check position opened
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Imprimir("VENDER pedido aberto : ",OrderOpenPrice());
retornar;
}
else Print("Error opening SELL order : ",GetLastError()));
retornar;
}
}
}
}
//+---------------------------------------------------------------------------+
//| Condições de modificação de pedidos |
//+---------------------------------------------------------------------------+
for(cnt=0;cnt<total;cnt++)
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continuar;
if(OrderMagicNumber()==MAGICNUMBER && // verifique o número mágico do pedido
OrderSymbol()==Symbol()) // verificar o símbolo do pedido
{
//--- posição longa aberta
if(OrderType()==OP_BUYSTOP)
{
if(OrderOpenPrice()<Price_BUY && Ask<Price_BUY)
{
if(OrderModify(OrderTicket(),Price_BUY,0,0,0,0,Blue))
Print("O pedido Price_BUY foi modificado com sucesso");
senão Imprimir("Erro ao modificar o pedido de BUYStop. Código de erro=",GetLastError()));
retornar;
}
senão Imprimir ("Preço de modificação é mais alto que o preço do pedido");
retornar;
}
if(OrderType()==OP_SELLSTOP)
{
if(OrderOpenPrice()<Price_SELLL && Bid>Price_SELLL)
{
if(OrderModify(OrderTicket(),Price_SELL,0,0,0,0,Green))
Print("O pedido Price_SELL foi modificado com sucesso");
else Print("Erro ao modificar o pedido SELLStop. Código de erro=",GetLastError();
retornar;
}
}
if(OrderType()==OP_BUY)
{
if(OrderStopLoss()<StopLoss_BUY && StopLoss_BUY<Ask)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_BUY,0,0,Blue))
Print("Price_BUY preço do pedido modificado com sucesso");
senão Imprimir("Erro modificando a ordem de compra. Código de erro=",GetLastError()));
retornar;
}
}
if(OrderType()==OP_SELL)
{
if(OrderStopLoss()>StopLoss_SELLL && StopLoss_SELLL>Bid)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELLL,0,0,Green))
Print("Preço_SELL preço do pedido modificado com sucesso");
senão Imprimir("Erro ao modificar o pedido de VENDA. Código de erro=",GetLastError();
retornar;
}
}
}
}
}
//+------------------------------------------------------------------+
Ajuda a consertar um bug no indicador, ele não se eleva nem abaixa do dia quando está na última vela da hora.
https://prnt.sc/kut6xo
https://prnt.sc/kut79b
Estou pedindo ajuda. As questões são:
1. O programa não estabelece limites de perdas tanto na compra quanto na venda em modo de teste. Mas a modificação de ordens pendentes vai bem.
2. Ela não começa em tempo real por conta disso.
É assim que
modificará E codificará, inserindo-o corretamente (Alt+S).