Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 39
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
Não sei como explicar isso. Mas é definitivamente uma obra-prima.
Estou lhe dizendo que eles gostam de ser sarcásticos aqui )))) Trishkin também se ofendeu. Ele disse que o código vai ajudar.
Sou tão novo quanto você, mas até eu tenho muitas perguntas
for(int i=0; i<OrderTotal(); i++){
if(OrderSelect(i,SELECT_BY_POS)==verdadeiro)
{
if(OrderSymbol()!=Symbol() ||OrderMagicNumber()!=Magic) continuar;
if(OrderType()==OP_BUY||||Po_BUYOrderType()==OP_SELL) p++;
if(OrderType()==OP_BUYSTOP)
if(signal_bue)OrderDelete(OrderTicket());
senão b++;
se(OrderType()==OP_SELLSTOP)
se(signal_sell)OrderDelete(OrderTicket());
mais s++;
}
}
1) onde você conseguiu b++
2) onde você conseguius+++
3)se(sinal_bue) é o que mais?
E o resto do código. Desculpe se eu o ofendi.
//| ОТЛОЖКИ.mq4 |
//+------------------------------------------------------------------+
extern double StopLoss = 100; //Стоплосс ордера
extern double TakeProfit = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int Delta = 100; //Расстояние от цены для установки ордера
extern double LOT = 0.1; //Объём позиции
extern int Magic =2;
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if (TrailingStop!=0) Trailing();
//ИНДИКАТОР RSI
double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
int b = 0, s = 0, p = 0, res = 0;
double BuyPrice=Ask+Delta*Point;
double SellPrice=Bid-Delta*Point;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
if (OrderType()==OP_BUYSTOP)
{
if(RSI0<50&&RSI1>50)
OrderDelete(OrderTicket());
else
b++;
}
if (OrderType()==OP_SELLSTOP)
{
if(RSI0>50&&RSI1<50)
OrderDelete(OrderTicket());
else
s++;
}
}
}
double SL,TP; // < !!!!!!!!! эти переменные не используются, можно удалить
//---- buy stop
if(RSI0>50&&RSI1<50 && p<1 && b<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
}
//---- sell stop
if(RSI0<50&&RSI1>50 && p<1 && s<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
}
//----
return(0);
}
Estou lhe dizendo, eles gostam de ser sarcásticos aqui). E Trishkin se ofendeu com isso. Ele disse que me ajudaria com o código.
É mais simples assim:
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==Type)
OrderDelete(OrderTicket());
}
}
}
Está em algum lugar fora da função OnTick() vazia.
if (сигнал_sell)OrderDelete_(OP_BUYSTOP);
E isto está no corpo funcional OnTick() vazio.
E isto está no corpo de função OnTick() vazio.
Certo.
Acabei o que pude. A descrição é feita. O objetivo é entender por que não funciona como eu quero.
Há mais dentro do bloco if(). Era realmente assim que se pretendia?
Além disso. A função Counts() aceita uma contagem de variáveis globais não inicializadas que, além disso, é definida mais uma vez dentro da função.
A função Counts() conta as ordens, mas as compara a alguns tickets que mudam várias vezes na função principal. Mas o valor do bilhete é o mesmo durante a operação da função. Então, quantos pedidos serão calculados pela função? É mais de um?
Nesta forma, esta função não precisa de argumentos. Basta chamá-la e deixá-la retornar o resultado.
A seguir. Função FindLastOType() é novamente uma comparação com o bilhete. Você pode garantir que ele é comparado a um bilhete válido? Não é mais fácil quebrar o laço quando a primeira encomenda com o número mágico e o símbolo necessários é encontrada e depois devolver o tipo de encomenda?
O mesmo com FindLastOrderOpenPrice() e FindLastLot().
A função ModifyOrders() me horrorizou tanto que eu não olharia para ela por muito tempo para evitar pesadelos à noite...
Favor fazer correções no código
Experimente ^_~
extern double TakeProfit = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int Delta = 100; //Расстояние от цены для установки ордера
extern double LOT = 0.1; //Объём позиции
extern int Magic =2;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int res = 0;
//ИНДИКАТОР RSI
double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
double BuyPrice=Ask+Delta*Point;
double SellPrice=Bid-Delta*Point;
//---- buy stop
if(RSI0>50&&RSI1<50 && Number(OP_BUYSTOP)<0 && Number(OP_BUY)<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
}
//---- sell stop
if(RSI0<50&&RSI1>50 && Number(OP_SELLSTOP)<0 && Number(OP_SELL)<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
}
//----
if (RSI0>50&&RSI1<50) OrderDelete_(OP_SELLSTOP);
if (RSI0<50&&RSI1>50)OrderDelete_(OP_BUYSTOP);
}
//+------------------------------------------------------------------+
void OrderDelete_(int Type)
{
bool r;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==Type)
r = OrderDelete(OrderTicket());
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Number(int Type)
{
int kp=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==Type)
kp++;
}
}
return(kp);
}
//+------------------------------------------------------------------+
Há mais dentro do bloco if(). Era realmente para ser assim?
Além disso. A função Counts() aceita uma contagem de variáveis globais não inicializadas que também é declarada mais uma vez na própria função.
A função Counts() conta as ordens, mas as compara a alguns tickets que mudam várias vezes na função principal. Mas o valor do bilhete é o mesmo durante a operação da função. Então, quantos pedidos serão calculados pela função? É mais de um?
Nesta forma, esta função não precisa de argumentos. Basta chamá-la e deixá-la retornar o resultado.
A seguir. Função FindLastOType() é novamente uma comparação com o bilhete. Você pode garantir que ele é comparado a um bilhete válido? Não é mais simples interromper o loop quando a primeira encomenda com o número mágico e o símbolo necessários é encontrada e depois devolver o tipo de encomenda?
O mesmo com FindLastOrderOpenPrice() e FindLastLot().
Função ModifyOrders() me aterrorizou tanto que eu não olharia para ele por muito tempo para evitar pesadelos à noite...
Correção
Não há outra maneira de colocá-lo em outro lugar, serão parâmetros errados
Tem que levar em conta o mais recente
Vou tentar mudar isso.
Eu tentei usar o OrderModify() padrão, mas ele é banido se eu mover um monte de pedidos simultaneamente e constantemente
Obrigado pela crítica.
Sim, isso é um erro de impressão no suporte. O resto da pergunta é válida.
bool condition;
if(condition) {}
equivale a
if(condition==true) {}
и
if(!condition) {}
igual a
if(condition==false) {}
É apenas mais curto e mais familiar.