[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 346
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
Por que pedir conselhos e depois desafiá-los? Este é o mainstream?
Acho que não vale a pena discutir mais. Expliquei tudo passo a passo. continue fazendo o que tem feito.
Que tipo de discussão pode haver? Devemos fechar o pedido com o desvio máximo no preço. O que significa que estamos interessados no preço... Ou seja, devemos encontrar uma ordem extrema pendente (com o preço máximo ou mínimo aberto). Se você não concordar, poderá discutir. Caso contrário, afinal estou certo! Eu sei exatamente o que estou dizendo.
O código elimina ST e TP. Adiciono uma condição para eliminação seletiva
O que não está escrito corretamente? Continua apagando tudo :(
#property show_inputs
extern bool StopLoss = True; // Удалить только StopLoss
extern bool TakeProfit = True; // Удалить только TakeProfit
extern bool ALL = True; // Удалить все
void start()
{
bool fm;
int i;
double SL=OrderStopLoss();
double TP=OrderTakeProfit();
if (StopLoss) SL=0;
if (TakeProfit) TP=0;
if (ALL) {SL=0; TP=0;}
for (i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderType()==OP_BUY)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
}
if (OrderType()==OP_SELL)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),SL,TP,CLR_NONE);
}
}
}
}
Ou não existe outra solução e é preciso escrever o código de exclusão para cada condição?
#property show_inputs
#include <WinUser32.mqh>
extern bool StopLoss = False; // Удалить только StopLoss
extern bool TakeProfit = False; // Удалить только TakeProfit
extern bool ALL = False; // Удалить все
void start()
{
bool fm;
int i;
if (StopLoss)
{
for (i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderType()==OP_BUY)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
}
if (OrderType()==OP_SELL)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,OrderTakeProfit(),CLR_NONE);
}
}
}
return(0);
}
if (TakeProfit)
{
for (i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderType()==OP_BUY)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
}
if (OrderType()==OP_SELL)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),0,CLR_NONE);
}
}
}
return(0);
}
if (ALL)
{
for (i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderType()==OP_BUY)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
}
if (OrderType()==OP_SELL)
{
fm=OrderModify(OrderTicket(),OrderOpenPrice(),0,0,CLR_NONE);
}
}
}
return(0);
}
}
Vadim, por que criar o objeto novamente quando você pode usar ObjectSet() ?
Nesse caso, havia uma função onde o objeto gráfico era completamente criado e configurado. Nela, a função de criação é otimizada. Se o objeto já existe, ele não é criado. Verifique você mesmo. Medir o tempo para criar objetos, depois mudar propriedades. A segunda chamada será muito mais curta. Isto é, nada é recriado.
Como resultado, temos uma função universal que não só cria um objeto, mas também pode personalizá-lo alterando as propriedades do objeto sem muito tempo.
Escrevi uma função que eliminaráas ordens de venda com os preços mais baixos.O número de ordens curtas para fechar é igual aonúmero de ordens de compra que acionaram, ou seja, foram para ordens de mercado.
Assim, se uma ordem de compra é acionada, então fechamos uma ordem de venda, se 2 ordens de compra são acionadas, então fechamos 2 ordens de venda.
Aqui está o código:
montanteOfCurrPending - quantidade de ordens de compra pendentes.
Nível- número de ordens pendentes inicialmente enviadas para cada lado.
OOP- preço aberto do pedido pendente, tomei qualquer valor inalcançável.
Nossa condição é a seguinte: se o contador for menor que asordensToDelete, eliminamos a ordem pendente com o preço mais baixo. Mas todas as posições curtas são eliminadas. O que há de errado comigo?
Escrevi uma função que eliminaráas ordens de venda com os preços mais baixos.O número de ordens curtas para fechar é igual aonúmero de ordens de compra que acionaram, ou seja, foram para ordens de mercado.
Assim, se uma ordem de compra é acionada, então fechamos uma ordem de venda, se 2 ordens de compra são acionadas, então fechamos 2 ordens de venda.
Aqui está o código:
montanteOfCurrPending - quantidade de ordens de compra pendentes.
Nível- número de ordens pendentes inicialmente enviadas para cada lado.
OOP- preço de abertura da ordem pendente, eu tomei qualquer valor inalcançável.
Nossa condição é a seguinte: se o contador for menor que asordensToDelete, eliminamos a ordem pendente com o preço mais baixo. Mas todas as posições curtas são eliminadas. O que há de errado comigo?
Isso é tudo. Ou você tem um monte de pedidos por um preço?
Isso é tudo. Ou você tem um pacote de pedidos a um preço?
Não, ordens em incrementos...
Eu não entendo sua lógica... Por que não: A ordem foi convertida em uma posição de mercado - a ordem pendente oposta mais distante foi removida.
É assim que eu apago a posição mais distante oposta, ou seja, como é uma posição curta, significa a posição com o preço de abertura mais baixo. Aqui eu reescrevi a função, tudo deve ficar claro aqui. Removi as impressões e removi uma variável extra.
Omontante variávelOfCurrPending transfere o número de negócios restantes na compra. Ou seja, se o valor inicial for nivelado e ovalorOfCurrPending for o valor atual dos pedidos, então subtraindo o valor inicial dos pedidos do atual, obteremos a diferença e este é o valor necessário para apagar os shorts. Você vê?
Há algum erro onde eu marquei em vermelho? Como resolvê-lo?Não, encomendas em incrementos.
É assim que eu retiro a posição mais distante, ou seja, por ser uma posição curta, significa a posição com o menor preço de abertura. Aqui eu reescrevi a função, deve ficar claro. Removi as impressões e removi uma variável extra.
Omontante variávelOfCurrPending transfere o número de negócios restantes na compra. Ou seja, se o valor inicial for nivelado e ovalorOfCurrPending for o valor atual dos pedidos, então subtraindo o valor inicial dos pedidos do atual, obteremos a diferença e este é o valor necessário para apagar os shorts. Você vê?
Há algum erro onde eu marquei em vermelho? Como resolver isso corretamente?Ищется ордер, с минимальной ценой открытия
Eu especificaria no comentário de uma ordem pendente seu número de ordem na grade e escreveria o mesmo número na ordem pendente oposta correspondente. Então, quando uma posição de mercado é encontrada, após a leitura do número em seu comentário, a posição oposta correspondente pode ser encontrada com um número idêntico em seu comentário. Uma vez que os magos são usados para outra coisa.
ZS. Eu ainda não tenho tempo para ler/partilhar seu código
Eu escreveria no comentário da posição pendente seu número seqüencial na grade e escreveria o mesmo número na posição pendente oposta correspondente. Então, quando uma posição de mercado é encontrada, após a leitura do número em seu comentário, a correspondente posição pendente oposta pode ser encontrada sem qualquer problema por um número idêntico em seu comentário. Já que você usa mágicos para outra coisa.
ZS. Eu ainda não tenho tempo para ler/partilhar seu código
Hmm. Sim, não há problema em encontrar a ordem pendente correspondente dessa forma, se o número de ordens pendentes em cada direção for o mesmo. E se diferente, então isto não funcionará como eu entendo.