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

 

Igor Makanu:

o CTrade standard não fornece um serviço pronto a usar

No MT4 há coisas de comércio que estão codificadas numa linha. No MT5 não se pode fazer a mesma coisa através de SB mesmo em cem linhas. Em MQL5 puro, é ainda pior. Tudo bem.

 

Obrigado, bom exemplo que vou analisar, aqui está um guião para MT4 - determinar o lucro em pips:

//+------------------------------------------------------------------+
//|                                        LastOrderProfitInPips.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   printf("Прибыль последнего закрытого ордера %d пунктов",LastHistoryProfit());

  }
//+------------------------------------------------------------------+
int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t)
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point);
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+

Escrevi-o do zero em 10 minutos? - Bem, sobre isso, a lógica é simples e directa - pega-se nela e escreve-se, no MT5 até agora só discutimos um cavalo esférico no vácuo... se houver negociações e se há ordens, deixados para discutir tipos de compensação de contas ou hedge.... e escreveremos algo pela manhã.

 
Igor Makanu:

Obrigado, bom exemplo, vou estudá-lo, fiz um guião para o MT4 - determinar o lucro em pips

Não preciso de lhe dizer como executar este guião em MT5. No entanto, o próprio guião tem erros.

Primeiro vou mostrar-vos a história

e o resultado da execução

Прибыль последнего закрытого ордера -259 пунктов


Aqui estão os erros

int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++) // Надо бежать в обратную сторону, т.к. последняя позиция может быть закрыта в ту же секунду, что и предпоследняя.
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t) // В отличие от MT4, в MT5 это можно не делать - сортировка по времени закрытия есть.
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point); // При таком вычислении легко потерять один пункт.
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
 
fxsaber:

E os erros aqui.

При таком вычислении легко потерять один пункт.

Como reparar? Nunca pensei nisso, o esquema parece ser padrão: 2 preços - encontrar a diferença e dividir por pontos

concordo com o resto, mas preciso de pensar, o esquema de rebidding da ordem é clássico e quero comparar o tempo com o mais alto.... só por precaução. preciso de pensar, embora seja a primeira vez que o tenho de fazer - 99,99% das vezes ninguém sequer tenta negociar TS de balanço no MT4

 
Igor Makanu:

Como consertá-lo? Nunca pensei nisso, o esquema parece ser padrão: 2 preços - encontrar a diferença e dividir por pontos

Perda na fundição dupla -> int.

Concordo com o resto, mas preciso de pensar, o esquema de execução de ordens é clássico, e quero comparar os tempos para a maioria.... só por precaução. preciso de pensar, embora seja a primeira vez que o tenho de fazer - em 99,99% dos casos ninguém sequer tenta negociar TS de hft no MT4

O HFT não tem nada a ver com isto. FecharO roteiro pode muito bem fechar duas posições no espaço de um segundo. Em MT4 tem de se comparar, em MT5 é desnecessário. E é provavelmente mais fácil de comparar através do ArraySort (se, por exemplo, quiser mudar rapidamente para a penúltima posição fechada).

 
fxsaber:

A perda ao fundir duplo -> int.

tudo isto é claro, mas como calcular correctamente a diferença de 2 preços em pontos inteiros?

 
Igor Makanu:

Tudo isto é claro, mas como calcular a diferença em pips entre 2 preços?

Fórum sobre comércio, sistemas comerciais automatizados e teste de estratégias comerciais

precisa de ajuda para o total calculado de pips para encomenda fechada hoje (Mql5)

fxsaber, 2017.10.25 01:00

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

int PriceToInteger( const double Price, const double point )
{
  return((int)(Price / point + 0.1));
}

int GetTotalPips( const datetime From = 0 )
{
  int Res = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      if (OrderCloseTime() < From)
        break;
      else if (OrderType() <= OP_SELL)
      {
        const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);
        
        Res += OrderType() ? PriceToInteger(OrderOpenPrice(), point) - PriceToInteger(OrderClosePrice(), point)
                           : PriceToInteger(OrderClosePrice(), point) - PriceToInteger(OrderOpenPrice(), point);
      }
        
  return(Res);
}

void OnStart()
{
  datetime Today = TimeCurrent();
  
  Today -= Today % PeriodSeconds(PERIOD_D1);
  
  Alert(GetTotalPips(Today));
}
 
fxsaber:

Obrigado!

Gostei especialmente.

const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);

Vou ter isso em mente, normalmente escrevo tudo em visibilidade global, o vosso exemplo lê-se muito melhor


....


E isto é correcto? No laço de encomenda, SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT); seria recalculado de cada vez, porqueOrderSymbol() será diferente de cada vez?

 

Fórum sobre Comércio, Sistemas de Comércio Automatizados e Testes de Estratégia

Perguntas de Iniciantes MQL5 MT5 MetaTrader 5

Igor Makanu, 2019.06.04 18:43

Obrigado, bom exemplo que vou analisar, aqui está um guião que redigi para o MT4 - determinar o lucro em pips:

//+------------------------------------------------------------------+
//|                                        LastOrderProfitInPips.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   printf("Прибыль последнего закрытого ордера %d пунктов",LastHistoryProfit());

  }
//+------------------------------------------------------------------+
int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t)
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point);
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+

Escrito de raiz em 10 minutos? - Bem, aproximadamente assim, a lógica é simples e directa - pega-se nela e escreve-se, em MT5 estamos a discutir apenas um cavalo esférico no vácuo... se houver negociações e se há ordens, deixados para discutir tipos de compensação de contas ou hedge.... e escreveremos algo pela manhã.

E posso perguntar porque devemos tomar o valor absoluto da diferença entre o preço de abertura e o preço de fecho e depois, se o lucro da posição for inferior a zero, substituir um sinal de menos pelo valor.
 
Alexey Viktorov:
E posso perguntar porque devemos tomar o valor absoluto da diferença entre o preço de abertura e de fecho, e depois, se o lucro da posição for inferior a zero, substituir o sinal de menos pelo valor.

Escrevi-o na mosca, como queria - queria produzir +100 pontos ou -100 pontos, era uma questão de gosto - não tinha tarefa específica, mas para escrever condições para determinar o tipo de encomenda e comparar o preço de abertura e fecho, parecia que haveria demasiadas linhas extra...

ZS: Este é um fórum para programadores, não é? - São assim, podem optimizar um código (especialmente o de outra pessoa) 10 vezes, de modo a que em vez de 5 linhas sejam 4)))