Como codificar? - página 6

 

Código de erro: 4109

Olá a todos:

Eu escrevi um roteiro para fechar todas as negociações, incluindo as ordens pendentes, mas fui desapontado após testá-lo. As funções: OrderClose, e Orderdelete falham no fechamento das negociações. Ao chamar a função GetLastError, recebo o código de erro: 4109 que é definido no arquivo de cabeçalho de erro como TRADE_NOT_ALLOWED.

Até tentei executar os scripts que vêm com a plataforma, mas sem sucesso.

Espero que alguém consiga resolver o problema.

Obrigado,

Arquivos anexados:
closeall2.mq4  2 kb
 

Ok, tente este aqui. Acho que a variável Lotes e Preços deve ser o dobro e não o número inteiro. Espero que isto ajude

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

//| CloseAll.mq4 |

//| FX5 |

//| |

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

#property copyright "FX5"

#property link " "

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

//| script program start function |

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

int start()

{

//----

int Ticket,Lots,Price,Type,Result;

int Error=0;

int Total=OrdersTotal();

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

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==0)

{

Alert("Can''t select the order indexed: ",i);

Alert("Error code is ", GetLastError());

Error++;

}

else

{

/* Lots=OrderLots();

Ticket=OrderTicket();

Type=OrderType();*/

Result=0;

/* if(Type==OP_BUY)

Price=Bid;

if(Type==OP_SELL)

Price=Ask;*/

// if(Type==OP_BUY || Type==OP_SELL)

if(OrderType()<=OP_SELL)

{

Alert(OP_BUY," ",OP_SELL," ",Type);

// Result=OrderClose(Ticket,Lots,Price,5,Blue);

if(OrderType()==OP_BUY) Result=OrderClose(OrderTicket(),OrderLots(),Bid,5,Blue);

if(OrderType()==OP_SELL) Result=OrderClose(OrderTicket(),OrderLots(),Ask,5,Blue);

}

else

{

Result=OrderDelete(OrderTicket());

}

if(Result==0)

{

Alert("Can''t close the Order number: ",i," with Ticket: ",Ticket);

Alert("Error Code: ",GetLastError());

Error++;

}

}

}

if(Error!=0)

Alert(Error," Errors have occured");

else

Alert("Close all Orders Succeeded with no Errors");

//----

return(0);

}

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

tente isto

FX5:
Olá a todos:

Eu escrevi um roteiro para fechar todas as negociações, incluindo as ordens pendentes, mas fui desapontado após testá-lo. As funções: OrderClose, e Orderdelete falham no fechamento das negociações. Ao chamar a função GetLastError, recebo o código de erro: 4109 que é definido no arquivo de cabeçalho de erro como TRADE_NOT_ALLOWED.

Até tentei executar os scripts que vêm com a plataforma, mas sem sucesso.

Espero que alguém consiga resolver o problema.

Obrigado,

No metatrader, vá para ferramentas -> opções, clique na aba expert advisor e selecione allow live trading, e clique no allow dll import, e desmarque confirmar chamadas. Eu escrevi alguns scripts e estava tendo o mesmo problema.

 
firedave:
Ok, tente este aqui. Acho que a variável Lotes e Preços deve ser o dobro e não o número inteiro. Espero que isto ajude
//+------------------------------------------------------------------+

//| CloseAll.mq4 |

//| FX5 |

//| |

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

#property copyright "FX5"

#property link " "

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

//| script program start function |

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

int start()

{

//----

int Ticket,Lots,Price,Type,Result;

int Error=0;

int Total=OrdersTotal();

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

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==0)

{

Alert("Can''t select the order indexed: ",i);

Alert("Error code is ", GetLastError());

Error++;

}

else

{

/* Lots=OrderLots();

Ticket=OrderTicket();

Type=OrderType();*/

Result=0;

/* if(Type==OP_BUY)

Price=Bid;

if(Type==OP_SELL)

Price=Ask;*/

// if(Type==OP_BUY || Type==OP_SELL)

if(OrderType()<=OP_SELL)

{

Alert(OP_BUY," ",OP_SELL," ",Type);

// Result=OrderClose(Ticket,Lots,Price,5,Blue);

if(OrderType()==OP_BUY) Result=OrderClose(OrderTicket(),OrderLots(),Bid,5,Blue);

if(OrderType()==OP_SELL) Result=OrderClose(OrderTicket(),OrderLots(),Ask,5,Blue);

}

else

{

Result=OrderDelete(OrderTicket());

}

if(Result==0)

{

Alert("Can''t close the Order number: ",i," with Ticket: ",Ticket);

Alert("Error Code: ",GetLastError());

Error++;

}

}

}

if(Error!=0)

Alert(Error," Errors have occured");

else

Alert("Close all Orders Succeeded with no Errors");

//----

return(0);

}

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

Isto pode estar errado: para apagar várias ordens, você deve começar a partir da última, pois seus índices estão diminuindo após o processo de apagamento.

Portanto, no lugar de " for(int i=0;i=0;i--)".

 

Obrigado firedave pela modificação do código. Foi um pequeno bug ao qual eu não prestei atenção.

Crepuscular, muito obrigado pela dica. Eu poderia ter passado um século antes de descobrir a solução. Finalmente, eu tenho um código de trabalho.

 

Michel, essa foi uma nota muito inteligente, muito obrigado.

 

obter a função max drawdown

eu gostaria de escrever uma função que obtenha o máximo de saque do comércio que foi fechado. eu encontrei duas soluções.

1. calcular o drawdown enquanto o comércio ainda está ativo. salvar o número em uma variável global e escrever os dados para arquivar de acordo com o número do bilhete. O MT4 teria que estar sempre online.

2. obter o drawdown obtendo a maior alta ou a menor baixa do gráfico de 1 min. o problema aqui é que temos que ter o histórico de 1 min. para a troca. (eu usaria este método se eu pudesse obter as barras de 1 min necessárias se elas já não fossem baixadas)

Eu gostaria de encontrar uma maneira mais agradável de obter o máximo de saque.

Qualquer contribuição é apreciada.

 
harriss:
gostaria de escrever uma função que obtenha o máximo de drawdown de negócios que foram fechados. encontrei duas soluções.

1. calcular o sorteio enquanto o comércio ainda estiver ativo. salvar o número em uma variável global e escrever os dados para arquivar de acordo com o número do bilhete. O MT4 teria que estar sempre online.

2. obter o drawdown obtendo a maior alta ou a menor baixa do gráfico de 1 min. o problema aqui é que temos que ter o histórico de 1 min. para a troca. (eu usaria este método se eu conseguisse obter as barras de 1 min necessárias se elas já não fossem baixadas)

Eu gostaria de encontrar uma maneira mais agradável de obter o máximo de saque.

Qualquer contribuição é apreciada.

Salam harriss,

O que você quis dizer com "drawdown"?

Você quer dizer que o máximo de perda de um dos negócios fechados foi feito?

 

levantamento de crédito

O que eu quero dizer com drawdown é, qual é o ponto mais baixo do comércio. Por exemplo, se o comércio atingir o ponto de parada, então o ponto de parada seria o drawdown. Agora, se o comércio acabasse no lado positivo e fosse -15 pips em um ponto, então o drawdown seria 15. Finalmente, se o comércio fechasse em -15 pips mas fosse -30 em um ponto, então o drawdown seria de 30.

 

Como codificar alertas/alarmes para indicadores?

Olá, gostaria de saber mais sobre como codificar alertas/alarmes.

Não sou um programador, mas tenho a cabeça sobre meus ombros e geralmente sou capaz de mexer em alguma coisa, desmontá-la e colocá-la novamente mais perto da maneira que eu quero.

Já passei por alguns dos indicadores com alertas e copiei as funções gerais de alerta que vi para outros indicadores que eu queria ter alertas. Tive resultados mistos.

Notei que as principais funções chamadas para alertas são a função Alerta(), a função Comentário() e a função Playsound(). Até agora, estou mais familiarizado com a função Alerta(). Existe uma diferença significativa entre Alert() e Playsound(), por exemplo?

O problema geral que tenho é que não sei como codificar os alertas o suficiente para que ambos sejam perceptíveis, por um lado, mas não ridiculamente distraídos, por outro. Por exemplo, se usar a função Alerta() para algumas cruzes e o indicador não tiver sido impresso com finalidade na barra atual, o alerta pode se repetir várias vezes e eu tenho dificuldade em desligar o alerta. Normalmente tenho que mudar o período de tempo do gráfico.

Primeiro de tudo, existe uma maneira simples de desativar/desativar o alerta somente para a barra atual?

Segundo, existe uma maneira de codificar um alerta para que não seja um incômodo interminável, introduzindo um código que restrinja o número de iterações ou dê ao alerta uma duração fixa? Como você o codificaria?

Uma solução que eu vejo é atrasar o alerta até a próxima barra para que ele não esteja constantemente mudando, mas isso tem a desvantagem de não ser oportuno.

Para evitar o incômodo dos alarmes berserk nos indicadores, usei os alertas de preço pré-determinado que se pode definir usando a janela do terminal e isso ajuda, mas não é o ideal.

Também estou ciente de que os Expert Advisors poderiam ser criados para dar alertas e que existe um botão que pode ligar e desligar seus alertas facilmente. O problema que tenho com os EAs, no entanto, é que noto que outro programa importante que executo concomitantemente com o MetaTrader parece sofrer interferência quando os Expert Advisors são ativados e funcionam de forma lenta.

Existe alguma outra solução para este problema?

Se houver algum indicador lá fora que tenha um código de alerta que evite as armadilhas que enumerei e possa servir como um bom exemplo de como codificar e alertar, você poderia me consultar e/ou publicar?

Muito obrigado.