Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 99

 

Dratuti. Como você faz um painel como este?

 
Andrey Sokolov:

Dratuti. Como você faz um painel como este?

Pegue o exemplo da kodobase e refaça-o, há muitos conselheiros com painéis para todos os gostos. Começa com o pano de fundo
 
Andrey Sokolov:

Dratuti. Como você faz um painel como este?

Com objetos gráficos.
 
 
Andrey Sokolov:
Vitaly Muzichenko,Artyom Trishkin agradece a você.
Nzt
 
trader781:

Continuando a escrever mais um porquinho no martingale, perdendo até mesmo no testador, caso contrário, como é suposto cultivarmos um alce.

No momento há um parâmetro desejado, que deve ser responsável pela possibilidade de abrir o próximo pedido após o(s) pedido(s) anterior(es) ser(em) fechado(s)

há 2 cenários

1) se o valor for verdadeiro

abrir um pedido

processo

fechar

e reabrir

2) se falso

Abra o pedido

Processo

Fechar

e depois fazer ExpertRemove

o problema é que estas duas condições são mutuamente exclusivas, mas têm de ser combinadas em 1 Expert Advisor, uma vez que

1) o valor é definido no início

2) o valor é estabelecido nas condições de entrada e processamento e aceito para processamento (se verdadeiro, aberto)

3) após o fechamento, definimos falso

Se alguém estiver interessado em tais coisas, eu ficaria feliz em ouvir minhas variantes.
Eu tenho problemas de lógica.

É simples:

  1. abrir um pedido
  2. processar o pedido
  3. fechar o pedido
  4. Verifique a condição e...
    • se for verdade, então ExpertRemove()
  5. Novamente
 
Artyom Trishkin:
Temos problemas com a lógica.

Tudo é simples:

  1. abrir um pedido
  2. processar o pedido
  3. fechar o pedido
  4. verificar a condição e...
    • se for verdade, então ExpertRemove()
  5. e fazer isso novamente
Algo parece errado, se for verdade - você tem que cortar um repolho, não ir para os arbustos)
 
Vitaly Muzichenko:
Algo não parece certo, se for verdade - você deveria estar cortando couve, não nos arbustos)
Errado. Falso. Eu não sei qual é o teste... Merda, ainda há alguma lógica nisso.
Ou você só quer conversar?
 

Por favor, informe. O Expert Advisor não abre ordens no terminal. A compilação está em andamento, de acordo com os gráficos as ordens devem ser abertas. Mas não são. Estou anexando o código.

double Lots=NormalizeDouble((AccountFreeMargin()/100*Percent)/MarketInfo(Symbol(),MODE_MARGINREQUIRED),1);//determinar o número de lotes
double MacdCurrent=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,0);//MACD parameters of the current bar
double MacdPrevious1=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,1);// os parâmetros MACD da barra anterior
double MacdPrevious2=iMACD(NULL,0,Fast_EMA_Period,Slow_EMA_Period,Signal_Period,PRICE_MEDIAN,MODE_MAIN,2);// os parâmetros MACD da linha principal compensados por 2 barras
stopLoss duplo=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//Parâmetros de Parâmetros de Parâmetros de Parâmetros ParabolicSAR da barra atual
double Previous_StopLoss=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//StopLoss parameters by ParabolicSAR parameters of the previous bar
duplo PSARCurrent=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,0);//parameters ParabolicSAR da barra atual
duplo PSARPrevious=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//Parâmetros do PSARPrevious=iSAR(NULL,Period(),Step_PSAR,Maximum_PSAR,1);//ParabolicSAR parâmetros da barra anterior
//+------------------------------------------------------------------+
//| Função de carrapato de especialista|
//+------------------------------------------------------------------+
nulo OnTick()
{
data/hora estática New_Time=TimeCurrent();// Hora da barra atual
bool New_Bar=false; // Bandeira nova barra
int ticket,total,cnt;
//---------------------------------------------------------------------------
{
New_Bar=false; // Nenhuma barra nova
if(Time[0]==Novo_Tempo) // Comparar tempos
{
New_Bar=true; // New_Bar is caught
if(New_Bar==false) // Se uma barra não for nova
voltar; // ...depois sair
}
}
total=OrdensTotal();// Determinação do número de pedidos
if(total<1)
{
//... sem ordens em aberto
if((AccountFreeMargin()/100*Percent)<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT))
//Cheque a disponibilidade de fundos para abrir o lote mínimo
{
Imprimir("Não há fundos suficientes. Fundos livres = ",AccountFreeMargin()));
retornar;
}

//---condição para abertura de posição longa (BUY)
if((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0)
&&
PSARCurrent<iOpen(NULL,0,1))
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,0,NULL,MAGICNUMBER,0,Green);
if(ticket>0)//check position opened
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Imprimir("COMPRAR pedido aberto : ",OrderOpenPrice());
senão
Print("BUY order open error : ",GetLastError()));
retornar;
}
}

//... condição para abrir uma posição curta (SELL)
if((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0)
&&
PSARCurrent>iOpen(NULL,0,1))
{
ticket=OrderSend(Symbol(),OP_SELLL,Lots,Bid,3,StopLoss,0,NULL,MAGICNUMBER,0,Red);
if(ticket>0)//check position opened
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Imprimir("VENDER pedido aberto : ",OrderOpenPrice());
senão
Imprimir("Erro abrindo pedido de VENDA : ",GetLastError()));
retornar;
}
}
//--- sair do bloco "sem ordens abertas

}
//--- é importante entrar no mercado corretamente, mas é mais importante sair dele corretamente
for(cnt=0;cnt<total;cnt++)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
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_BUY)
{
//--- deve ser fechado?
if((MacdCurrent<0 && MacdPrevious1>=0 && MacdPrevious2>0)
&&
PSARCurrent>iOpen(NULL,0,1))
{
//--- Encomende o fechamento e a saída
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
Imprimir("OrderClose error ",GetLastError());
retornar;
}
//------------------Modificar a ordem por StopLoss
if(StopLoss>Previous_StopLoss &&StopLoss<iOpen(NULL,0,0))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue))
Imprimir("Erro de modificação de pedido. Código de erro=",GetLastError()));
senão
Imprimir("Stop Loss price of the order has been modified successfully;)
retornar;
}
}

senão // ir abreviado
if(OrderType()==OP_SELL)
{
//--- deve ser fechado?
if((MacdCurrent>0 && MacdPrevious1<=0 && MacdPrevious2<0)
&&
PSARCurrent<iOpen(NULL,0,1))
{
//--- Encomende o fechamento e a saída
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
Imprimir("OrderClose error ",GetLastError());
retornar;
}
//-----------------Modificar a ordem por StopLoss
if(StopLoss<Previous_StopLoss &&StopLoss>iOpen(NULL,0,0))
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Previous_StopLoss,0,0,Blue))
Imprimir("Erro de modificação de pedido. Código de erro=",GetLastError()));
senão
Imprimir("Stop Loss price of the order has been modified successfully;)
retornar;
}
}
}

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

 
trader781:

Sim, é mais simples do que isso.

mas e se mantivermos isso como um recuo e fizermos o seguinte

verificar a condição e...
  • se for verdade, então o robô pende com uma atividade mínima, de preferência nenhuma

ou seja, como bloquear a entrada para operação posterior

return(0); mas isto não é desejável - não vai lidar com mais nada.
Razão: