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

 

Olá, tenho um comportamento estranho da função do sistema OrderCalcProfit, tenho a sensação de que o parâmetro volume é ignorado no cálculo, ou seja, o tamanho do lucro é sempre calculado para o volume 1.0

Estou a tentar verificá-lo no testador para diferentes pares de moedas em diferentes contas de demonstração.

1. O cálculo está correcto para 1.0, ver calc_profi101.png.

2. A segunda e quaisquer chamadas subsequentes da função retornam um resultado de lucro baseado num volume de 1,0, o valor do volume é ignorado, ver imagem de ecrã (calc_profit02.png) - volume passado 0,5, mas o resultado continua a ser o mesmo que para 1,0

Pode dizer-me qual poderá ser o problema. Obrigado

Arquivos anexados:
 
aveshoff:

Olá, tenho um comportamento estranho da função do sistema OrderCalcProfit, tenho a sensação de que o parâmetro volume é ignorado no cálculo, ou seja, o lucro é sempre calculado para o volume 1.0

Estou a tentar verificá-lo no testador para diferentes pares de moedas em diferentes contas de demonstração.

1. O cálculo está correcto para 1.0, ver calc_profi101.png.

2. A segunda e quaisquer chamadas subsequentes da função retornam um resultado de lucro baseado num volume de 1,0, o valor do volume é ignorado, ver imagem de ecrã (calc_profit02.png) - volume passado 0,5, mas o resultado continua a ser o mesmo que para 1,0

Pode dizer-me qual poderá ser o problema. Obrigado

Penso que a resposta está na ajuda:

"... lucro

[Variável que manterá o valor de lucro calculado se a função for bem sucedida. O valor da estimativa de lucro depende de muitos factores e pode mudar à medida que o ambiente do mercado muda. ... "


Acrescentado: embora isto seja apenas um palpite.

 
aveshoff:

Olá, tenho um comportamento estranho da função do sistema OrderCalcProfit, tenho a sensação de que o parâmetro volume é ignorado no cálculo, ou seja, o lucro é sempre calculado para o volume 1.0

Estou a tentar verificá-lo no testador para diferentes pares de moedas em diferentes contas de demonstração.

1. O cálculo está correcto para 1.0, ver calc_profi101.png.

2. A segunda e quaisquer chamadas subsequentes da função retornam um resultado de lucro baseado num volume de 1,0, o valor do volume é ignorado, ver imagem de ecrã (calc_profit02.png) - volume passado 0,5, mas o resultado continua a ser o mesmo que para 1,0

Pode dizer-me qual poderá ser o problema. Obrigado

Aqui está o examinador de testes - tudo funciona correctamente:

//+------------------------------------------------------------------+
//|                                             OrderProfitCheck.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\AccountInfo.mqh>
CAccountInfo      m_account;                    // object of CAccountInfo class
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   string symbol=Symbol();
   ENUM_ORDER_TYPE trade_operation=ORDER_TYPE_BUY;
   double volume=1.0;
   double price_open=1.09350;
   double price_close=1.0930;
   double profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print("Volume 1.0, profit -> ",DoubleToString(profit,2));
   volume=0.5;
   profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print("Volume 0.5, profit -> ",DoubleToString(profit,2));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+

e o resultado:

2019.09.30 07:47:21.688 OrderProfitCheck (EURUSD,H1)    Volume 1.0, profit -> -50.00
2019.09.30 07:47:21.688 OrderProfitCheck (EURUSD,H1)    Volume 0.5, profit -> -25.00
Arquivos anexados:
 
Pode dizer-me. É possível e como pode a linguagem do terminal em uso ser conhecida programticamente?
 
Uladzimir Izerski:
Pode dar-me uma dica? É possível e como posso programar a língua do terminal em uso?

Determino isto ou a língua terminal russa ou se outra - a saída é em inglês.

   if(InpTrailingStop!=0 && InpTrailingStep==0)
     {
      string err_text=(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")?
                      "Трейлинг невозможен: параметр \"Trailing Step\" равен нулю!":
                      "Trailing is not possible: parameter \"Trailing Step\" is zero!";
      //--- when testing, we will only output to the log about incorrect input parameters
      if(MQLInfoInteger(MQL_TESTER))
        {
         Print(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_FAILED);
        }
      else // if the Expert Advisor is run on the chart, tell the user about the error
        {
         Alert(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_PARAMETERS_INCORRECT);
        }
     }


Adicionado: pensei ter guardado todas as línguas da enumeração TERMINAL_LANGUAGE - mas não a consigo encontrar. Deve ter perdido ...

 
Boa tarde a todos, alguém pode ajudar a acrescentar aqui que no SL não só se viraria, mas também acrescentaria muito ou mais. E quando o TP é accionado, voltaria atrás por um lote.
input double   Lot=1;
input int      TakeProfit = 6;
input int      Stoploss   = 6;

int TP;
int SL;

CTrade trader;
bool Invertor;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   TP = TakeProfit;
   SL = Stoploss;

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   double points;

   if(!PositionSelect(_Symbol))
     {
      if(Invertor)
         trader.Buy(Lot);
      else trader.Sell(Lot);
     }
   else
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         points=(SymbolInfoDouble(_Symbol,SYMBOL_BID)-PositionGetDouble(POSITION_PRICE_OPEN))/_Point;
         if(points>=TP)
           {
            trader.PositionClose(_Symbol);
            Invertor=true;
           }

         if(points<=-SL)
           {
            trader.PositionClose(_Symbol);
            Invertor=false;
           }
        }
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         points=(PositionGetDouble(POSITION_PRICE_OPEN)-SymbolInfoDouble(_Symbol,SYMBOL_ASK))/_Point;
         if(points>=TP)
           {
            trader.PositionClose(_Symbol);
            Invertor=false;
           }
         if(points<=-SL)
           {
            trader.PositionClose(_Symbol);
            Invertor=true;
           }
        }
     }   
  }
 
Andrey990:
Bom dia a todos, alguém pode ajudar a acrescentar aqui que no SL não seria apenas um capotamento, mas também adicionar muito ou mais. E quando o TP é accionado, devolve um lote.

1. Aconselho categoricamente a não utilizar funções que seleccionem uma posição por um personagem. Utilizar uma função que seleccione uma posição através de um índice numa lista.

2. Para saber como uma posição foi encerrada, a enumeraçãoENUM_DEAL_REASON deve ser vista na OnTradeTransaction.

Exemplo com ENUM_DEAL_REASON:

Stop Loss Take Profit

Se fechar por Stop Loss - duplicar o volume, se por Take Profit - definir o volume mínimo. Para detectar que o comércio ocorreu como resultado de Stop Loss ou Take Profit, utilizar a OnTradeTransaction. Da construção 1625 há uma bela enumeração ENUM_DEAL_REASON: ENUM_DEAL_REASON Descrição DEAL_REASON_SL Operação feita como resultado de Stop Loss desencadeando DEAL_REASON_TP Operação feita como resultado de Take Profit desencadeando... que pode ser rastreada na OnTradeTransaction. Por outras palavras, agora pode facilmente e mais importante, determinar de forma fiável que esta troca foi o resultado de Take Profit ou Stop Loss desencadeando. Neste momento (construir 1626), esta EA só pode ser testada ao vivo - ou num gráfico ou no modo de depuração utilizando dados reais (F5 no MetaEditor). Também apliquei uma solução por agora: Determinar o que desencadeou: Take Profit ou Stop Loss no procedimento da OnTradeTransaction: if (deal_symbol===m_symbol...

CodeBase | 2017.07.13 07:42 |Vladimir Karputov| EAs | MetaTrader 5

 

É possível introduzir detalhes de login de conta num programa de terceiros e gerir a conta e, sabe, abrir/fechar posições?

Ou é apenas através de um robô que é instalado na conta?

 

Estou a transferir indicadores de MQL4 para MQL5, pergunta sobre "tampões" e "parcelas". O indicador tem 2 tampões e 1 parcela:

#nóculos_indicadores de propriedade 2
#property indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_CALCULATIONS);
SetIndexBuffer(1,Array2,INDICATOR_DATA);


Se o primeiro tampão for utilizado para cálculos, etc., e o segundo deve ser traçado, então

primeiro, é necessário definir DRAW_NONE para o primeiro buffer se já estiver definido para INDICADOR_CALCULATIONS na função SetIndexBuffer() ?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

segundo, que índice devo definir em PlotIndexSetInteger() em vez do ponto de interrogação (?) se apenas o segundo buffer deve ser desenhado?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM);


Terceiro, se eu usar dois estilos do tipo DRAW_HISTOGRAM, posso definir cor para cada um deles e obter histograma como no indicador Volumes, onde as barras verdes e vermelhas se alternam, mas se eu usar DRAW_HISTOGRAM2, posso definir duas cores para uma barra também ou apenas uma cor é definida para este estilo?

 
The_Sheikh:

Estou a transferir indicadores de MQL4 para MQL5, pergunta sobre "tampões" e "parcelas". O indicador tem 2 tampões e 1 parcela:

#nóculos_indicadores de propriedade 2
#property indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_CALCULATIONS);
SetIndexBuffer(1,Array2,INDICATOR_DATA);


Se o primeiro tampão for utilizado para cálculos, etc., e o segundo deve ser traçado, então

primeiro, é necessário definir DRAW_NONE para o primeiro buffer se já estiver definido para INDICADOR_CALCULATIONS na função SetIndexBuffer() ?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

segundo, que índice devo definir em PlotIndexSetInteger() em vez do ponto de interrogação (?) se apenas o segundo buffer deve ser desenhado?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM);


Terceiro, se eu usar dois estilos do tipo DRAW_HISTOGRAM, posso definir cor para cada um deles e obter histograma como no indicador Volumes, onde as barras verdes e vermelhas se alternam, mas se eu usar DRAW_HISTOGRAM 2, posso definir duas cores para uma barra também ou apenas uma cor é definida para este estilo?

Porque estás a ser tão duro contigo mesmo? Qual é o problema em atribuir primeiro os amortecedores de visualização, e depois os amortecedores auxiliares?

Para DRAW_HISTOGRAМ2 são definidos 3 amortecedores e a sequência é obrigatória, primeiro 2 amortecedores de valor, seguidos de um amortecedor de cor. Mas existe uma diferença entre DRAW_HISTOGRAM e DRAW_HISTOGRAM2 na medida em que DRAW_HISTOGRAM é extraído de zero para o valor no tampão, enquanto DRAW_HISTOGRAM2 é extraído do valor de um tampão para o valor de outro tampão.

Razão: