Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 404

 

Comecei a escrever um invólucro para funções de abertura e modificação de encomendas (pensei que iria resolver os meus problemas com a devolução de valores por parte destes operadores), mas existe o mesmo problema.

Explicar qual é o problema (não importa o que eu escreva, há sempre um problema com a devolução de valores da OrderSend, OrderSelex e ModifyOrder)

Código de embalamento .

int start()

{

se (sinal == 1)

{

OrderSendX(Symbol(),OP_BUY,0.1,Ask,0,500,500,"123",123,0,Red);

}

return(0);

}

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

int OrderSendX (símbolo de corda,int cmd, volume duplo,preço duplo,int slippage,stoploss duplo,takeprofit duplo,comentário de corda,

int magic,expiração da data/hora,cor seta_cor)

{

int err=GetLastError();

err = 0;

bool exit_loop = falso;

int ticket = -1;

int Retry = 10;

int cnt = 0;

if(cmd == OP_BUY || cmd == OP_SELL) //cheque o tipo de ordem de abertura

{

while(!exit_loop)

{

bilhete = OrderSend(symbol,cmd,volume,preço,slippage,stoploss,takeprofit,comment,magic,expiration,arrow_color);

err = GetLastError();

switch(err)

{

caso ERR_NO_ERROR:

exit_loop = true;

pausa;

{ caso ERR_SERVER_BUSY:

caso ERR_NO_CONNECTION:

caso ERR_INVALID_PRICE:

caso ERR_BROKER_BUSY:

caso ERR_TRADE_CONTEXT_BUSY:

cnt+++;

pausa;

caso ERR_PRICE_CHANGED:

caso ERR_OFF_QUOTES:

caso ERR_REQUOTE:

RefreshRates();

continuar;

padrão:

exit_loop = true;

pausa;

}

if(cnt>Retry)

exit_loop = true;

if(!exit_loop)

{

Sleep(1000);

RefreshRates();

}

senão

{

if(err !=ERR_NO_ERROR)

{

Imprimir("Erro : " " + erro);

}

}

if(err ==ERR_NO_ERROR)

{

OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);

regresso(bilhete);

}

Imprimir("Erro na ordem de abertura depois" + cnt + "tentativas");

retorno(-1);

}

}

}

 
Leanid Aladzyeu:

Comecei a escrever um invólucro para funções de abertura e modificação de encomendas (pensei que iria resolver os meus problemas com a devolução de valores por parte destes operadores), mas existe o mesmo problema.

Explica-me qual é o problema (independentemente do que escrevi, tenho sempre problemas com a devolução de valores da OrderSend, OrderSelex e ModifyOrder)

https://docs.mql4.com/ru/trading/ordermodify

bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
            if(!res)
               Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
            else
               Print("Цена Stop Loss ордера успешно модифицирована.");

OrderModify() devolve sim , não

OrderModify - Документация на MQL4
  • docs.mql4.com
OrderModify - Документация на MQL4
 

Ninguém consegue explicar.

Vamos tentar outro exemplo em vez de copiar 100 vezes a ajuda para mim.

Como deve ser correcto? Vou utilizar um exemplo para compreender as correcções

{

SL=NormalizeDouble(Bid-TrailingStop*Point,Digitos);

if(OrderStopLoss()!=SL)

OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0);

}

não inserir

"""bilhete """= OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0); todas as vezes está correcto?

 

E obrigado a todos os que tentaram explicar .

Infelizmente não compreendo como designar uma variável para uma variável que é predefinida como função.

 
Leanid Aladzyeu:

E obrigado a todos os que tentaram explicar .

Infelizmente não compreendo como designar uma variável para uma variável que é predefinida como função.

CaroLeanid. Aprender a ler a ajuda e a trabalhar com erros e avisos. Se não aprender como o fazer, nem sequer programará correctamente. Estas são as noções básicas. Já tentou traduzir o que está escrito nos avisos? Compreende o significado das funções que "precisam de ser verificadas"? A ajuda descreve um exemplo correcto de tratamento destas funções. Por exemplo, OrderModify(). Vejam a ajuda:

Valor de retorno

Retorna verdadeiro se a função for concluída com sucesso ou falsa em caso de erro. Para obter informações sobreo erro, é necessário chamar a funçãoGetLastError().

e depois segue um exemplo:

bool res=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
if(!res)
   Print("Ошибка модификации ордера. Код ошибки=",GetLastError());
else
   Print("Цена Stop Loss ордера успешно модифицирована.");

Como se pode ver, o valor de retorno da função é tratado no operador if-else. A variável res é necessária "para a beleza" por uma razão. É o resultado da execução de uma função comercial! A função da qual depende o seu dinheiro! Consequentemente, para processar correctamente todas as variantes possíveis (o processamento neste exemplo não é fornecido), precisamos da variável res e do código de erro devolvido pela função GetLastError(). Os criadores incluíram propositadamente avisos como um lembrete para não esquecer que existem funções "importantes" para prestar atenção ao processamento de valores! Note também que se o valor não for verificado, não haverá erro! Ou seja, neste caso, a função funcionará como está, mas se ocorrer uma situação anormal, esta não será processada. A lista de situações não padronizadas são códigos de retorno da função GetLastError().

Espero que seja mais claro desta forma.

Коды возврата торгового сервера - Документация на MQL4
  • docs.mql4.com
Коды возврата торгового сервера - Документация на MQL4
 
Leanid Aladzyeu:

Comecei a escrever um invólucro para as funções de abertura e modificação de encomendas (pensei que iria resolver o meu problema com a devolução de valores por parte destes operadores), mas há o mesmo problema.

E neste caso não precisa de escrever um invólucro. Não resolverá problemas de aviso sobre a verificação do valor de retorno! Olhe para os exemplos destas funções e faça o mesmo!
 
Tapochun:
E, neste caso, não precisamos de escrever um invólucro. Não vai resolver o problema com o aviso sobre a verificação do valor de retorno! Dê uma vista de olhos aos exemplos destas funções e faça o mesmo!

Como indicado na referência dá um erro.

Escrevi-o desta forma e está bem

if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))

{

Imprimir("A modificação foi bem sucedida");

}

senão Imprimir("Erro ao modificar a encomenda");

 
Inserir código correctamente nas mensagens:Inserir código correctamente no fórum
 
Karputov Vladimir:
Inserir código correctamente nas mensagens:Inserir código correctamente no fórum
aqui tem...
 
Leanid Aladzyeu:

Porque é que o Trawling não funciona para vender? Funciona para comprar!

Sem erros ou avisos , sobre a compilação genética.

Aqui está o código:

void Trailing()
  {
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-OrderOpenPrice()>TrailingStop*Point)
                 {
                  if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep)*Point)
                    {
                     SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);
                     if(OrderStopLoss()!=SL)
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))
                          {
                           Print("Модификация прошла успешно.");
                          }
                     else Print("Ошибка модификации ордера.");
                    }
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(OrderOpenPrice()-Ask>TrailingStop*Point)
                 {
                  if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep)*Point)
                    {
                     SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
                     if(OrderStopLoss()!=SL)
                        if(OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0))
                          {
                           Print("Модификация прошла успешно.");
                          }
                     else Print("Ошибка модификации ордера.");
                    }
                 }
              }
           }
        }
     }
  }

Razão: