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

 

Gumko:

Gumko : E quanto tempo vai demorar para que esta tarefa apareça primeiro...?

Já está de pé há dois dias.

Esperei 8-10 dias, depois desisti e desliguei-o.
 
Pergunto-me quanta carga de CPU tem o software do Testador em segundo plano?
 

Olá a todos.

Modificação e problemas.

Função externa:

bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit){
//---- estrutura vinculativa e resultados comerciais
Pedido MqlTradeRequest;
Resultado MqlTradeResult;
//---- inicialização da estrutura de pesquisa de comércio MqlTradeRequest para modificação de posição
request.action = TRADE_ACTION_SLTP;
request.symbol = símbolo;
request.sl = StopLoss;
request.tp = Takeprofit;
palavra de corda = "";
StringConcatenate(palavra,
"<< ============ Modifyposition(): Modificar a posição",
símbolo," ============ >>>");
Imprimir(palavra);
//---- modificar posição e verificar os resultados da pesquisa de comércio
if(!OrderSend(request,result)||| result.deal==0)
{
Imprimir("Modificar erro =", GetLastError();
devolução(falso);
}
return(true);
}

Mas não funciona desta forma.

Como fazer?

Obrigado :)

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Типы торговых операций - Документация по MQL5
 
mario065: Mas não funciona assim. Como o faço? Obrigado :)

Tente desta forma:

MqlTradeRequest request={0};
MqlTradeResult  result ={0};
 
Yedelkin:

Tente desta forma:

Yedelkin,

Obrigado, não funcionou.

Verifiquei se contava correctamente para o início da chamada de função.

Aqui está como o fiz:

double Bid = NormalizeDouble(SímboloInfoDouble(Moeda,SYMBOL_BID),_Dígitos);
double Ask = NormalizeDouble(SímboloInfoDouble(Moeda,SYMBOL_ASK),_Dígitos);
double Open = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Dígitos);
double SL = NormalizeDouble(PositionGetDouble(POSITION_SL),_Dígitos);
if(Abrir > 0){
start_buy = Perguntar - Abrir; Imprimir("start_buy=",start_buy);
start_sel = Aberto - Bid;Print("start_sel=",start_sel);
}

Surpresa no diário de bordo:

MR 0 Core 1 10:21:49 2012.10.01 10:12:42 negócio #2 vender 0,10 EURUSD a 1,28146 feito (com base no pedido #2)
GH 0 Core 1 10:21:49 2012.10.01 01 01 01:12:42 negócio realizado [#2 vender 0,10 EURUSD a 1,28146]
NI 0 Core 1 10:21:49 2012.10.01 01 01 01:12:42 encomenda executada venda 0,10 a 1,28146 [#2 venda 0,10 EURUSD a 1,28146 (0,00000)
OF 0 Core 1 10:21:49 2012.10.01 01 01 01:12:43 start_buy=0.000129999999999999635
DR 0 Core 1 10:21:49 2012.10.01 01 01:12:43 start_sel=5.000000000010552e-005
LE 0 Core 1 10:21:49 2012.10.01 01 01:12:43 start_buy=0.0001099999999998325
EN 0 Core 1 10:21:49 2012.10.01 01 01:12:43 start_sel=7.00000000000145e-005

Claro que estava a pensar apenas em sela, de onde vieram os números?

Penso ter escrito a função correctamente, tal como se mostra:

Modificação SL & TP

Ordem comercial para modificação dos níveis StopLoss e/ou TakeProfit. Requer 4 campos:

  • símbolo de
  • acção
  • sl
  • tp
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства позиций - Документация по MQL5
 
mario065: Obrigado, não funcionou.

Então o que exactamente "falhou"?

mario065 : Verifiquei se contava correctamente para iniciar a chamada de função, aqui está como o fiz:

Inserir o código correctamente (Ctrl+Alt+M):

  double Bid  = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_BID),_Digits);
  double Ask  = NormalizeDouble(SymbolInfoDouble(Currency,SYMBOL_ASK),_Digits);
  double Open = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
  double SL   = NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits);
  if(Open > 0)
    {
     start_buy = Ask - Open;Print("start_buy=",start_buy);
     start_sel = Open - Bid;Print("start_sel=",start_sel);
    }

Aqui a normalização tem de ser utilizada numa sequência diferente.

1. como os valores do tipo SymbolInfoDouble(Currency,SYMBOL_BID) vêm do servidor, já são considerados normalizados. E não há necessidade de os normalizar uma segunda vez. Isto é, podem simplesmente ser escritas:

double Bid  = SymbolInfoDouble(Currency,SYMBOL_BID);

2. mas após qualquer operação aritmética a normalização desaparece, por isso, se precisar de obter um número normalizado, deve escrevê-lo assim:

start_buy = NormalizeDouble(Ask - Open,_Digits);

Ainda estou a pensar no resto.

 
mario065: Surpresa no diário de bordo:

DR 0 Core 1 10:21:49 2012.10.01 01 01:12:43 start_sel=5.000000000010552e-005
PT 0 Core 1 10:21:49 2012.10.01 01 01:12:43 start_sel=7.0000000145e-005

Naturalmente, apenas interessado na sel - de onde vieram tais números?

7.00000000000145e-005 é apenas uma forma de escrever o valor de um número real. Penso que é chamado "científico". Para mais pormenores, ver."MQL5 Reference Guide / Language Basics / Data Types / Real Types (double, float)".
 
Yedelkin:
7.00000000000145e-005 é apenas uma das formas de registar um valor numérico real. Penso que é chamado "científico". Para mais pormenores, ver."MQL5 Reference Guide / Language Basics / Data Types / Real Types (double, float)".

Yedelkin,

Obrigado por abordar o problema.

Aqui está o código. As funções para abrir a posição foram escritas por Nikolay Kositsin.

Arquivos anexados:
MTB_E.mq5  9 kb
 
Aconselhar como e onde especificar no EA o MA pertencente à janela nº 2.
Por exemplo, acrescentei MA à IFM e quero registar este MA no meu EA. Não sei onde e como o fazer.

Obrigado pela sua resposta)
 
mario065: Aqui está o código. As funções para abrir a posição foram escritas por Nikolay Kositsin. Nikolay Kositsin.

1. Eu diria o seguinte: usar o código de outra pessoa com muito cuidado. Porque o código de outra pessoa significa também os erros de outra pessoa.

2. Aqui(https://www.mql5.com/ru/forum/6343/page64#comment_357008) sugeri que se tentasse zerar correctamente as variáveis antes de as utilizar. Mas o seu código ainda não implementou esta sugestão. Além disso, o seu código contém construções do seguinte tipo:

//+------------------------------------------------------------------+
//| Modify position.                                                 |
//+------------------------------------------------------------------+
bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit)
  {
//---- обявяване на структурата и резултата на търговското искане
   MqlTradeRequest request;
   MqlTradeResult result;
//---- структурна инициализация на  търговското искане MqlTradeRequest за модифициране на  позиция
   request.action       = ...
   request.symbol       = ...
   request.sl           = ...
   request.tp           = ...
   ...
//---- модифицираме позицията и  проверяваме резултата от търговското искане
   if(!OrderSend(request,result) || result.deal==0)
     {
      ...
     }
   ZeroMemory(request);
   ZeroMemory(result);
   return(true);
  }

Como vê, nesta construção, as variáveis de pedido e resultado são zeradas não antes de serem utilizadas, mas depois de serem utilizadas. Além disso, quando estas variáveis locais são zeradas, a função deixa de funcionar, ou seja, essa zeragem em si não tem qualquer significado. Por outras palavras, uma tal construção é um bom exemplo de como as variáveis MqlTradeRequest e MqlTradeResult não devem ser zeradas. Portanto, se estiver ansioso, por favor, tente limpar correctamente as variáveis. Se algo correr mal, por favor, descreva em detalhes o que "não está a funcionar".

3. A Biblioteca Standard tem uma classe comercial"MQL5 Reference / Standard Library / Trade Classes / CTrade". Tente descobrir como aplicá-lo na prática. Na fase inicial de imersão na língua, esta classe pode ser bastante suficiente. Por exemplo, esta classe tem o seguinte método:"MQL5 Reference / Standard Library / Trade Classes / 2CTrade/ PositionModify". É implementado da seguinte forma:

//+------------------------------------------------------------------+
//| Modify specified opened position                                 |
//+------------------------------------------------------------------+
bool CTrade::PositionModify(const string symbol,const double sl,const double tp)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__)) return(false);
//--- clean
   ClearStructures();
//--- setting request
   m_request.action=TRADE_ACTION_SLTP;
   m_request.symbol=symbol;
   m_request.magic =m_magic;
   m_request.sl    =sl;
   m_request.tp    =tp;
//--- action and return the result
   return(OrderSend(m_request,m_result));
  }

A linha 'ClearStructures();' nela limpa a variável m_request antes de a utilizar.

Razão: