Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 30

 
spoiltboy:

Saudações. Eu perguntei por aí, mas ainda não encontrei uma resposta. Você poderia me dizer por que com a seguinte entrada

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}

O sistema gera constantemente erros

: bilhete inválido para OrderDeletefunction

OrderDelete error 4051

De acordo com o livro de referência, é

Valor inválido do parâmetro de função

Embora os parâmetros pareçam ser os mesmos.

Embora se você remover a condição e deixar apenas

OrderDelete(ticketD);

OrderDelete(ticketUP);

ele apaga com sucesso (mas eu preciso dele por condição). O que eu faço de errado? Aqui está a coisa toda:

Como ele deve ser selecionado através da OrderSelect, seu valor deticketD é perdido, e muito provavelmente lá em vez de ticket, alguma besteira, tente imprimir e comparar. E em geral, este estilo de escrita é um disparate.
 
Vitaly Muzichenko:
Como ele tem que ser selecionado via OrderSelect, seu valor deticketD é perdido, e o mais provável é que haja alguma besteira ao invés de ticket, tente imprimi-lo e compará-lo.

É porque a função de exclusão é acionada pela condição de que o valor é perdido? Tentei escrevê-lo assim:

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

OrderDelete(ticketUP);

na próxima condição para "ticketD" escreve os mesmos erros, e a ordem"ticketUP" é apagada com sucesso em cada tic-tac.

 
Vitaly Muzichenko:
E em geral, este estilo de escrita é um absurdo.
Ainda agora comecei, eu gostaria de receber comentários.
 
spoiltboy:
Estou apenas começando, eu gostaria de receber comentários.
cole o código com "SRC" para que você possa vê-lo
 
Renat Akhtyamov:
inserir código via "SRC" para que você possa olhar para
extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0;


void OnTick()  
{
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}

if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1) Print("ERROR OP_BUY"); else Print("OP_BUY OK");}

if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
OrderDelete(ticketUP);


double maxpr=-9999; double minpr=9999;

for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}

for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}}

string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxpr, 5), ", min ", DoubleToStr(minpr, 5),".");
}

int BuyLimitCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}

int BuyCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}}return(count);}

int SellLimitCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}}return(count);}

int SellCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}}return(count);}
 
spoiltboy:

É porque a função de exclusão é acionada pela condição de que o valor é perdido? Tentei escrevê-lo assim:

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

OrderDelete(ticketUP);

Quando a condição para "ticketD" vem, ela escreve os mesmos erros, e a ordem"ticketUP" é apagada com sucesso em cada tick.

Devemos verificar a existência do pedido e, se houver um com tal bilhete, eliminamo-lo; se não houver, não fazemos nada. O que acontece é que a ordem já está apagada, e você continua apagando-a novamente
 
Vitaly Muzichenko:
Devemos verificar a existência do pedido e, se houver um com tal carrapato, o apagaremos, se não, não faremos nada. O que está acontecendo é que a ordem já foi apagada e você continua apagando-a novamente

Nesta entrada, o pedido comticketUP é primeiro aberto e depois apagado em cada tick, enquanto o pedido tikcetD, se a condição correspondente ocorrer, gera um erro de apagamento. É de acordo com a revista.

Ou talvez eu tenha confundido algo?

 
spoiltboy:

mas será que a linha de fundo dos dois por acaso é redundante?

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
OrderDelete(ticketUP);//лишняя?

Se não for supérflua, onde está a condição de eliminação?

Esta é uma variante do código que tenta apagar uma ordem pendente em cada tick, na minha opinião.

E o número do bilhete não é claro.

É isso que vai devolver o erro.

 
spoiltboy:

Nesta entrada, o pedido comticketUP é primeiro aberto e depois apagado em cada tick, enquanto o pedido tikcetD, se a condição correspondente ocorrer, gera um erro de apagamento. É de acordo com a revista.

Ou talvez eu esteja confuso com alguma coisa?

bem, corretamente.

qual é a pergunta então?

 
Renat Akhtyamov:

Bem, é verdade.

Qual é a pergunta então?

Isto é para ordens diferentes. A função de remover um com uma condição, removendo o outro sem uma condição.

A questão é por que no meu caso a função de apagar quando sem uma condição funciona com sucesso e se eu a coloco em uma condição dá um erro quando a condição ocorre.

Razão: