Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1054

 

Igor Makanu:

CTrade standard non fornisce un servizio out-of-the-box

Su MT4 ci sono cose di trading che sono codificate in una linea. Su MT5 non si può fare la stessa cosa tramite SB neanche in un centinaio di righe. Su MQL5 puro è ancora peggio. Va bene così.

 

Grazie, buon esempio che esaminerò, ecco uno script che ho abbozzato per MT4 - determinare il profitto in pip:

//+------------------------------------------------------------------+
//|                                        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);
  }
//+------------------------------------------------------------------+

L'ho scritto da zero in 10 minuti? - Bene, a proposito di questo, la logica è semplice e diretta - si prende e si scrive, in MT5 finora si parla solo di un cavallo sferico nel vuoto... se gli scambi e se ci sono ordini, a sinistra per discutere i tipi di conti netting o hedge.... e scriveremo qualcosa entro domattina.

 
Igor Makanu:

Grazie, buon esempio, lo studierò, ho fatto uno script per MT4 - determinare il profitto in pip

Non ho bisogno di dirvi come eseguire questo script in MT5. Tuttavia, lo stesso script ha degli errori.

Prima vi mostrerò la storia

e il risultato dell'esecuzione

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


Ecco gli errori

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 gli errori qui.

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

Non ci ho mai pensato, lo schema sembra essere standard: 2 prezzi - trovare la differenza e dividere per punti

Sono d'accordo con il resto, ma ho bisogno di pensare, lo schema di ribattitura dell'ordine è classico e voglio confrontare il tempo con il più alto.... solo nel caso. Ho bisogno di pensare, anche se è la prima volta che devo farlo - il 99,99% delle volte nessuno prova nemmeno a scambiare hft TS su MT4

 
Igor Makanu:

Non ci ho mai pensato, lo schema sembra essere standard: 2 prezzi - trovare la differenza e dividere per punti

Perdita durante il casting di double -> int.

Sono d'accordo con il resto, ma ho bisogno di pensare, lo schema di esecuzione degli ordini è classico, e voglio confrontare il tempo con il più alto.... solo nel caso. Ho bisogno di pensare, anche se questa è la prima volta che ho incontrato un tale problema - nel 99,99% dei casi nessuno prova nemmeno a commerciare hft TS su MT4

L'HFT non c'entra niente. Lo script CloseAll può benissimo chiudere due posizioni in un secondo. In MT4 devi confrontare, in MT5 non è necessario. Ed è probabilmente più facile da confrontare tramite ArraySort (se, per esempio, volete passare rapidamente alla penultima posizione chiusa).

 
fxsaber:

La perdita durante il casting di double -> int.

è tutto chiaro, ma come faccio a calcolare correttamente la differenza di 2 prezzi in punti interi?

 
Igor Makanu:

Tutto questo è chiaro, ma come faccio a calcolare la differenza in pip tra 2 prezzi?

Forum sul trading, sistemi di trading automatico e test di strategie di trading

bisogno di aiuto per i pip totali calcolati per l'ordine chiuso oggi (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:

Grazie!

Mi è piaciuto particolarmente.

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

Lo terrò a mente, di solito scrivo tutto in visibilità globale, il tuo esempio si legge molto meglio


....


E questo è corretto? Nel ciclo dell'ordine, SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT); verrebbe ricalcolato ogni volta, perchéOrderSymbol() sarà diverso ogni volta?

 

Forum sul trading, sistemi di trading automatico e test di strategia

Domande dai principianti MQL5 MT5 MetaTrader 5

Igor Makanu, 2019.06.04 18:43

Grazie, buon esempio che esaminerò, ecco uno script che ho preparato per MT4 - determinare il profitto in pip:

//+------------------------------------------------------------------+
//|                                        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);
  }
//+------------------------------------------------------------------+

Scritto da zero in 10 minuti? - Beh, all'incirca così, la logica è semplice e diretta - si prende e si scrive, in MT5 stiamo discutendo solo di un cavallo sferico nel vuoto... se gli scambi e se ci sono ordini, a sinistra per discutere i tipi di conti netting o hedge.... e scriveremo qualcosa in mattinata.

E posso chiedere perché dovremmo prendere il valore assoluto della differenza tra il prezzo di apertura e quello di chiusura e poi, se il profitto della posizione è inferiore a zero, sostituire il valore con un segno meno.
 
Alexey Viktorov:
E posso chiedere perché dovremmo prendere il valore assoluto della differenza tra il prezzo di apertura e quello di chiusura, e poi, se il profitto della posizione è inferiore a zero, sostituire il valore con il segno meno.

L'ho scritto al volo, come volevo - volevo emettere +100 punti o -100 punti, era una questione di gusto - non avevo un compito specifico, ma scrivere condizioni per determinare il tipo di ordine e confrontare il prezzo di apertura e di chiusura, sembrava che ci sarebbero state troppe linee extra...

ZS: Questo è un forum per programmatori, vero? - Sono così, possono ottimizzare un codice (specialmente quello di qualcun altro) 10 volte, in modo che invece di 5 linee siano 4 )))