Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1128

 

Ciao, ho uno strano comportamento della funzione di sistema OrderCalcProfit, ho la sensazione che il parametro volume sia ignorato nel calcolo, cioè la dimensione del profitto è sempre calcolata per il volume 1.0

Sto cercando di verificarlo nel tester per diverse coppie di valute su diversi conti demo.

1. Il calcolo è corretto per 1.0, vedi calc_profi101.png.

2. La seconda e tutte le chiamate successive della funzione restituiscono un risultato di profitto basato su un volume di 1.0, il valore del volume è ignorato, vedi uno screenshot (calc_profit02.png) - volume passato 0.5, ma il risultato è ancora lo stesso che per 1.0

Potete dirmi quale potrebbe essere il problema. Grazie

File:
 
aveshoff:

Ciao, ho uno strano comportamento della funzione di sistema OrderCalcProfit, ho la sensazione che il parametro volume sia ignorato nel calcolo, cioè la dimensione del profitto è sempre calcolata per il volume 1.0

Sto cercando di verificarlo nel tester per diverse coppie di valute su diversi conti demo.

1. Il calcolo è corretto per 1.0, vedi calc_profi101.png.

2. La seconda e tutte le chiamate successive della funzione restituiscono un risultato di profitto basato su un volume di 1.0, il valore del volume è ignorato, vedi uno screenshot (calc_profit02.png) - volume passato 0.5, ma il risultato è ancora lo stesso che per 1.0

Puoi dirmi quale potrebbe essere il problema. Grazie

Penso che la risposta sia nella guida:

"... profitto

[out] Variabile che conterrà il valore di profitto calcolato se la funzione ha successo. Il valore della stima del profitto dipende da molti fattori e può cambiare quando cambia l'ambiente di mercato. ... "


Aggiunto: anche se questa è solo un'ipotesi.

 
aveshoff:

Ciao, ho uno strano comportamento della funzione di sistema OrderCalcProfit, ho la sensazione che il parametro volume sia ignorato nel calcolo, cioè la dimensione del profitto è sempre calcolata per il volume 1.0

Sto cercando di verificarlo nel tester per diverse coppie di valute su diversi conti demo.

1. Il calcolo è corretto per 1.0, vedi calc_profi101.png.

2. La seconda e tutte le chiamate successive della funzione restituiscono un risultato di profitto basato su un volume di 1.0, il valore del volume è ignorato, vedi uno screenshot (calc_profit02.png) - volume passato 0.5, ma il risultato è ancora lo stesso che per 1.0

Potete dirmi quale potrebbe essere il problema. Grazie

Ecco l'esaminatore del test - tutto funziona correttamente:

//+------------------------------------------------------------------+
//|                                             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 il risultato:

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
File:
 
Può dirmi. È possibile e come si può conoscere programmaticamente la lingua del terminale in uso?
 
Uladzimir Izerski:
Puoi darmi un suggerimento. È possibile e come posso trovare programmaticamente la lingua del terminale in uso?

Determino questo o la lingua del terminale russo o se un altro - l'output è in inglese.

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


Aggiunto: pensavo di aver salvato tutte le lingue dall'enumerazione TERMINAL_LANGUAGE - ma non lo trovo. Deve aver perso ...

 
Buon pomeriggio a tutti, qualcuno può aiutare ad aggiungere qui che a SL non sarebbe solo flip, ma anche aggiungere un sacco o più. E quando il TP viene attivato, torna indietro di un lotto.
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:
Buon giorno a tutti, qualcuno può aiutare ad aggiungere qui che a SL non sarebbe solo un rollover ma anche aggiungere un sacco o più. E quando il TP viene attivato, restituisce un lotto.

1. Sconsiglio categoricamente l'uso di funzioni che selezionano una posizione in base a un carattere. Usa una funzione che seleziona una posizione per un indice in una lista.

2. Per sapere come è stata chiusa una posizione, l'enumerazioneENUM_DEAL_REASON deve essere vista in OnTradeTransaction.

Esempio con ENUM_DEAL_REASON:

Stop Loss Take Profit

Se si chiude con Stop loss - raddoppia il volume, se con Take Profit - imposta il volume minimo. Per rilevare che la negoziazione si è verificata come risultato dell'attivazione di Stop Loss o Take Profit, usate OnTradeTransaction. Dalla build 1625 c'è una bella enumerazione ENUM_DEAL_REASON: ENUM_DEAL_REASON Descrizione DEAL_REASON_SL Operazione fatta come risultato dell'attivazione dello Stop Loss DEAL_REASON_TP Operazione fatta come risultato dell'attivazione del Take Profit... che può essere tracciata in OnTradeTransaction. In altre parole, ora puoi facilmente e soprattutto, determinare in modo affidabile che questo trade è stato il risultato dell'attivazione del Take Profit o dello Stop Loss. Al momento (build 1626), questo EA può essere testato solo dal vivo - sia su un grafico che in modalità debug utilizzando dati reali (F5 in MetaEditor). Ho anche applicato un workaround per ora: determinare cosa ha innescato: Take Profit o Stop Loss nella procedura OnTradeTransaction: if (deal_symbol==m_symbol...

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

 

È possibile inserire i dati di accesso al conto in un programma di terzi e gestire il conto e, sapete, aprire/chiudere posizioni?

O è solo attraverso un robot installato sull'account?

 

Sto trasferendo gli indicatori da MQL4 a MQL5, domanda sui buffer e le "trame". L'indicatore ha 2 buffer e 1 trama:

#proprietà indicator_buffers 2
#proprietà indicator_plots 1

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


Se il primo buffer viene utilizzato per i calcoli, ecc. e il secondo deve essere tracciato, allora

Innanzitutto, è necessario impostare DRAW_NONE per il primo buffer se è già impostato su INDICATOR_CALCULATIONS nella funzione SetIndexBuffer() ?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

secondo, quale indice dovrei impostare in PlotIndexSetInteger() invece del punto interrogativo (?) se solo il secondo buffer dovrebbe essere disegnato?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM);


In terzo luogo, se uso due stili di tipo DRAW_HISTOGRAM, posso impostare il colore per ciascuno di essi e ottenere un istogramma come nell'indicatore Volumes, dove le barre verdi e rosse si alternano, ma se uso DRAW_HISTOGRAM2, posso impostare anche due colori per una barra o solo un colore è impostato per questo stile?

 
The_Sheikh:

Sto trasferendo gli indicatori da MQL4 a MQL5, domanda sui buffer e le "trame". L'indicatore ha 2 buffer e 1 trama:

#proprietà indicator_buffers 2
#proprietà indicator_plots 1

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


Se il primo buffer viene utilizzato per i calcoli, ecc. e il secondo deve essere tracciato, allora

Innanzitutto, è necessario impostare DRAW_NONE per il primo buffer se è già impostato su INDICATOR_CALCULATIONS nella funzione SetIndexBuffer() ?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

secondo, quale indice dovrei impostare in PlotIndexSetInteger() invece del punto interrogativo (?) se solo il secondo buffer dovrebbe essere disegnato?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM);


In terzo luogo, se uso due stili di tipo DRAW_HISTOGRAM, posso impostare il colore per ciascuno di essi e ottenere un istogramma come nell'indicatore Volumes, dove le barre verdi e rosse si alternano, ma se uso DRAW_HISTOGRAM 2, posso impostare anche due colori per una barra o solo un colore è impostato per questo stile?

Perché sei così duro con te stesso? Qual è il problema di assegnare prima i buffer di visualizzazione e poi quelli ausiliari?

Per DRAW_HISTOGRAМ2 sono definiti 3 buffer e la sequenza è obbligatoria, 2 buffer di valore prima, seguiti da un buffer di colore. Ma c'è una differenza tra DRAW_HISTOGRAM e DRAW_HISTOGRAM2 in quanto DRAW_HISTOGRAM è disegnato da zero al valore nel buffer, mentre DRAW_HISTOGRAM2 è disegnato dal valore di un buffer al valore di un altro buffer.