Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1415

 
  1. La maggior parte dei broker non emette più richieste di margine, poiché tutte le posizioni vengono chiuse (automaticamente?) prima che il conto vada in rosso (e si debba aggiungere denaro: la richiesta di margine).
  2. Il margine è l'importo considerato come deposito per una posizione aperta, ACCOUNT_MARGIN_FREE è la parte rimanente (non utilizzata).
  3. Un massimo tra il 5% e il 10% del saldo del conto (saldo) o del capitale (saldo del conto + posizioni aperte, capitale proprio) dovrebbe essere utilizzato per il trading al fine di evitare che le posizioni vengano chiuse a causa della mancanza di capitale e delle perdite nelle posizioni.
  4. Il rischio di una posizione dipende dallo SL e dalla dimensione del lotto, poiché lo SL è solitamente fisso per ragioni tecniche, la dimensione del lotto viene utilizzata per calcolare il rischio:
    Ricerca di "calculate lotsize": https://www.mql5.com/en/search#!keyword=calculate%20lotsize&module=mql5_module_forum
  5. La maggior parte degli articoli è disponibile anche in tedesco, basta sostituire la /en/ nell'URL con /de/: https://www.mql5.com/de/articles/2555
 
Grazie per le informazioni. Nei controlli che un robot di trading deve superare viene menzionato il metodo "CheckMoneyForTrade", che controlla se il margine da utilizzare per l'operazione è maggiore del margine libero (ACCOUNT_FREE_MARGIN). Se ho capito bene, si dovrebbe anche controllare se i fondi utilizzati superano una certa percentuale del saldo del conto, cioè qualcosa di simile:
 if (freeMargin - tradeMargin < balance * 0.9) return false;

In questo caso si può ovviamente cambiare lo 0,9 in (1 - maxRisk) e implementare una proprietà "Rischio massimo in %" che può essere impostata dall'utente.

P.S. Nel forum si usa il nome o il cognome?
 
Benjamin Fotteler #:
Grazie per le informazioni. Nei controlli che un robot di trading deve superare viene menzionato il metodo "CheckMoneyForTrade", che controlla se il margine da utilizzare per l'operazione è maggiore del margine libero (ACCOUNT_FREE_MARGIN). Se ho capito bene, si dovrebbe anche verificare se i fondi utilizzati superano una certa percentuale del saldo del conto, cioè qualcosa di simile:

In questo caso si può ovviamente modificare lo 0,9 in (1 - maxRisk) e implementare una proprietà "Rischio massimo in %" che può essere impostata dall'utente.

P.S. Ci diamo del tu o del tu qui nel forum?

Tutti inciampano sulla dimensione del lotto e qui c'è un sacco di codice e di commenti!

Ho trovato quello che William Roeder ha scritto per MT5, che sarebbe la funzione non testata(!!):
(https://www.mql5.com/en/forum/133792/page3#comment_3405179 & https://www.mql5.com/en/forum/390088#comment_28092477)

double lotsz (double risk, double sl, ENUM_ORDER_TYPE ordDir, string sym="", double CommissionPerLot=0) {
   MqlTick mqTick;
   if (sym == "") sym = _Symbol;
   double deltaValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   SymbolInfoTick(sym,mqTick); 
   double diff = (ordDir==ORDER_TYPE_BUY) ? mqTick.ask - sl : ( (ordDir==ORDER_TYPE_SELL) ? sl - mqTick.bid : -1.0 );
   if (diff<0.0) return(0.0);
   double lts = ( (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk/100) / (diff * deltaValue + CommissionPerLot) );
   return( fmin(fmax(SymbolInfoDouble(sym,SYMBOL_VOLUME_MIN),lts),SymbolInfoDouble(sym,SYMBOL_VOLUME_MAX)));
}
// use: lotsz(5, sl)

Per favore fatemi sapere se trovate un errore!

Dato che la maggior parte delle persone qui sono in qualche modo anonime con i loro nickname o nomi di battesimo, e una volta era ancora più così, il "Du" si è naturalizzato.

Why is there NO Complete EA within the Code-Base? - When does the market close or open?
Why is there NO Complete EA within the Code-Base? - When does the market close or open?
  • 2011.08.20
  • www.mql5.com
I wanted to close all orders before end of the week (market close friday,) to prevent loss should the market gap over the week end, by passing the sl. ) so the question is when does the market close (or open. For example info on opened charts and history data, time info (like gmt, timezone, dst), market open, close info
 

Grazie per il codice. L'unica cosa che mancava era l'adattamento a una dimensione di lotto intermedia valida:

double lotsz (double risk, double sl, ENUM_ORDER_TYPE ordDir, string sym="", double CommissionPerLot=0) {
   MqlTick mqTick;
   if (sym == "") sym = _Symbol;
   double deltaValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   SymbolInfoTick(sym,mqTick); 
   double diff = (ordDir==ORDER_TYPE_BUY) ? mqTick.ask - sl : ( (ordDir==ORDER_TYPE_SELL) ? sl - mqTick.bid : -1.0 );
   if (diff<0.0) return(0.0);
   double lts = ( (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk/100) / (diff * deltaValue + CommissionPerLot) );
   lts = ( fmin(fmax(SymbolInfoDouble(sym,SYMBOL_VOLUME_MIN),lts),SymbolInfoDouble(sym,SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return ((int)MathRound(lts/stepSize)*stepSize);
}
// use: lotsz(5, sl)

Ho un'altra domanda: se calcolo la perdita di un'operazione interrotta con TICK_VALUE o con deltaValue come sopra, il risultato è sempre leggermente diverso dal calcolo interno di MQL5:

double price=(ordDir==ORDER_TYPE_BUY) ? mqTick.ask : ((ordDir==ORDER_TYPE_SELL) ? mqTick.bid : mqTick.last);
double loss;
OrderCalcProfit(ordDir, sym, 1, price, sl, loss)

E' perché la perdita/guadagno per tick è diversa per un conto EUR e per il prezzo di mercato 1.0 e il prezzo di mercato 1.2? Perché se inserisco, ad esempio, "price + 0.1" al posto di price e "sl + 0.1" al posto di sl nel codice sottostante, la distanza dei tick (diff) è la stessa, ma i rispettivi risultati emessi da OrderCalcProfit sono diversi. E quando guardo i profitti/perdite che ottengo dalle operazioni manuali, quest'ultima sembra essere confermata.

Se ho ragione, il codice seguente sarebbe più preciso:

double lotsz (double risk, double entry, double sl, ENUM_ORDER_TYPE ordDir, string sym="", double CommissionPerLot=0) {
   if (sym == "") sym = _Symbol;
   double loss;
   OrderCalcProfit(ordDir, sym, 1, entry, sl, loss);
   double lts = ((AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01) / -loss);
   lts = (fmin(fmax(SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN), lts), SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return ((int)MathRound(lts / stepSize) * stepSize);
}
// use: lotsz(5, ask, sl)
P.S. Grazie ancora per l'idea di base: legare il fattore di rischio non al saldo ma al margine libero ha chiaramente senso.
 

Il seguente codice è stato creato in base all'esperto parabolic sar di mql 5. Posso invertire il funzionamento del segnale di acquisto e del segnale di vendita qui? Cioè, quando arriva il segnale di acquisto, voglio che apra le vendite invece di comprare. qualcuno può aiutare?




#property copyright "Copyright 2022, MetaQuotes Ltd."

#property link"https://www.mql5.com"

#property version "1.00"

//+------------------------------------------------------------------+

//| Includi |

//+------------------------------------------------------------------+

#include <Esperto.mqh>

//--- segnali disponibili

#include <Expert\Signal\SignalSAR.mqh>

//--- trailing disponibili

#includere <Expert\Trailing\TrailingNone.mqh>

//--- gestione del denaro disponibile

#include <Expert\Money\Money\MoneyFixedLot.mqh>

//+------------------------------------------------------------------+

//| Ingressi

//+------------------------------------------------------------------+

//--- input per l'esperto

input string Expert_Title ="sar"; // Nome del documento

ulong Expert_MagicNumber =13831; //

bool Expert_EveryTick =false; //

//--- ingressi per il segnale principale

input int Signal_ThresholdOpen =10; // Valore della soglia del segnale da aprire [0...100].

input int Signal_ThresholdClose=10; // Valore di soglia del segnale per la chiusura [0...100].

input double Signal_PriceLevel =0.0; // Livello di prezzo per eseguire una transazione

input int Signal_Expiration =4; // Scadenza degli ordini pendenti (in barre)

input double Signal_SAR_Step =0.02; // Incremento di velocità del SAR parabolico(0.02,0.2)

input double Signal_SAR_Maximum =0.2; // Parabolic SAR(0.02,0.2) Velocità massima

input double Signal_SAR_Weight =1.0; // Parabolica SAR(0.02,0.2) Peso [0....1.0]

//--- input per il denaro

input double Money_FixLot_Percent =10.0; // Percentuale

input double Money_FixLot_Lots =0.1; // Volume fisso

//+------------------------------------------------------------------+

//| Oggetto esperto globale |

//+------------------------------------------------------------------+

CExpert ExtExpert;

//+------------------------------------------------------------------+

//| Funzione di inizializzazione dell'esperto |

//+------------------------------------------------------------------+

int OnInit()

{

//--- Inizializzazione dell'esperto

if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))

{

//----- fallito

printf(__FUNCTION__+": errore di inizializzazione dell'esperto");

ExtExpert.Deinit();

return(INIT_FAILED);

}

//--- Creazione del segnale

CExpertSignal *signal=nuovo CExpertSignal;

if(signal==NULL)

{

//----- fallito

printf(__FUNCTION__+": errore nella creazione del segnale");

ExtExpert.Deinit();

return(INIT_FAILED);

}

//---

ExtExpert.InitSignal(segnale);

signal.ThresholdOpen(Signal_ThresholdOpen);

signal.ThresholdClose(Signal_ThresholdClose);

signal.PriceLevel(Signal_PriceLevel);

signal.Expiration(Signal_Expiration);

//--- Creazione del filtro CSignalSAR

CSignalSAR *filtro0=nuovo CSignalSAR;

if(filtro0==NULL)

{

//----- fallito

printf(__FUNCTION__+": errore nella creazione del filtro0");

ExtExpert.Deinit();

return(INIT_FAILED);

}

signal.AddFilter(filter0);

//--- Impostazione dei parametri del filtro

filter0.Step(Signal_SAR_Step);

filter0.Maximum(Signal_SAR_Maximum);

filter0.Weight(Signal_SAR_Weight);

//--- Creazione dell'oggetto trailing

CTrailingNone *trailing=nuovo CTrailingNone;

if(trailing==NULL)

{

//----- non è riuscito

printf(__FUNCTION__+": errore nella creazione di trailing");

ExtExpert.Deinit();

return(INIT_FAILED);

}

//--- Aggiungere il trailing all'esperto (sarà cancellato automaticamente))

if(!ExtExpert.InitTrailing(trailing))

{

//----- fallito

printf(__FUNCTION__+": errore di inizializzazione del trailing");

ExtExpert.Deinit();

return(INIT_FAILED);

}

//--- Impostare i parametri di trailing

//--- Creazione dell'oggetto denaro

CMoneyFixedLot *money=nuovo CMoneyFixedLot;

if(money==NULL)

{

//----- fallito

printf(__FUNCTION__+": errore nella creazione del denaro");

ExtExpert.Deinit();

return(INIT_FAILED);

}

//--- Aggiungere denaro all'esperto (sarà cancellato automaticamente))

if(!ExtExpert.InitMoney(money))

{

//----- fallito

printf(__FUNCTION__+": errore di inizializzazione del denaro");

ExtExpert.Deinit();

return(INIT_FAILED);

}

//--- Impostare i parametri del denaro

money.Percent(Money_FixLot_Percent);

money.Lots(Money_FixLot_Lots);

//--- Controllare i parametri di tutti gli oggetti di trading

if(!ExtExpert.ValidationSettings())

{

//----- fallito

ExtExpert.Deinit();

return(INIT_FAILED);

}

//--- Regolazione di tutti gli indicatori necessari

if(!ExtExpert.InitIndicators())

{

//----- fallito

printf(__FUNCTION__+": errore di inizializzazione degli indicatori");

ExtExpert.Deinit();

return(INIT_FAILED);

}

//--- ok

return(INIT_SUCCEED);

}

//+------------------------------------------------------------------+

//| Funzione di deinizializzazione dell'esperto |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

ExtExpert.Deinit();

}

//+------------------------------------------------------------------+

//| Funzione di gestione dell'evento "Tick" |

//+------------------------------------------------------------------+

void OnTick()

{

ExtExpert.OnTick();

}

//+------------------------------------------------------------------+

//| Funzione di gestione dell'evento "Trade" |

//+------------------------------------------------------------------+

void OnTrade()

{

ExtExpert.OnTrade();

}

//+------------------------------------------------------------------+

//| Funzione di gestione dell'evento "Timer" |

//+------------------------------------------------------------------+

void OnTimer()

{

ExtExpert.OnTimer();

}

//+------------------------------------------------------------------+


 
Suggerimento interessante, ci darò un'occhiata. La funzione OrderCalcProfit() esiste solo in MT5 e le idee per il calcolo dei lotti risalgono ai tempi di MT4...
 
Non riesco ad aprire la mia sessione nell'app per vedere quanti soldi ho
 

Ora ho avuto il tempo di capire la vostra soluzione. È più precisa (mentre l'altra è più prudente perché si tiene conto delle commissioni?) e apparentemente è meno soggetta a errori, come si può vedere con l'oro e l'argento sul conto demo di MQ - con Roboforex è, come previsto, un po' più prudente della vostra soluzione:

MetaQuotes demo account (b. 3369 Beta channel)
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   XAUUSD  in: 1717.65000 sl:1717.15000  diff:0.50000  delta:10.00000  delta:*diff:5.00000  tVal:0.10000  tSz:0.01000
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   XAGUSD  in: 18.45100 sl:18.40100  diff:0.05000  delta:500.00000  delta:*diff:25.00000  tVal:0.50000  tSz:0.00100
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   EURUSD  in: 1.02185 sl:1.02235  diff:0.00050  delta:97861.72139  delta:*diff:48.93086  tVal:0.97862  tSz:0.00001
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 9983.40 EUR:  XAUUSD  BU  in: 1717.65000  sl: 1717.15000  lotsC: 71.3100 (-3489.26)  lotsB: 10.2000 (-499.09)
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 9983.40 EUR:  XAGUSD  BU  in: 18.45100  sl: 18.40100  lotsC: 18.4900 (-4523.66)  lotsB: 2.0400 (-499.09)
2022.07.25 17:43:42.645 test_MM-functions (EURUSD,M1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 9983.40 EUR:  EURUSD  SE  in: 1.02185  sl: 1.02235  lotsC: 9.8000 (-479.29)  lotsB: 10.2100 (-499.34)


RoboForex Demo account (b. 3320 release channel)
2022.07.25 17:46:22.772 test_MM-functions (EURUSD,D1)   XAUUSD  in: 1717.10000 sl:1717.15000  diff:0.05000  delta:100.00000  delta:*diff:5.00000  tVal:0.10000  tSz:0.00100
2022.07.25 17:46:22.772 test_MM-functions (EURUSD,D1)   XAGUSD  in: 18.43400 sl:18.43350  diff:0.00050  delta:5000.00000  delta:*diff:2.50000  tVal:0.05000  tSz:0.00001
2022.07.25 17:46:22.772 test_MM-functions (EURUSD,D1)   EURUSD  in: 1.02186 sl:1.02236  diff:0.00050  delta:100000.00000  delta:*diff:50.00000  tVal:1.00000  tSz:0.00001
2022.07.25 17:46:22.773 test_MM-functions (EURUSD,D1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 5348.69 USD:  XAUUSD  SE  in: 1717.10000  sl: 1717.15000  lotsC: 38.2000 (-191.00)  lotsB: 53.4900 (-267.45)
2022.07.25 17:46:22.773 test_MM-functions (EURUSD,D1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 5348.69 USD:  XAGUSD  BU  in: 18.43400  sl: 18.43350  lotsC: 59.4300 (-148.57)  lotsB: 106.9700 (-267.42)
2022.07.25 17:46:22.773 test_MM-functions (EURUSD,D1)   Set: Risk: 5.0 %, dSL: 50  Com/Lot: 2.00  Free: 5348.69 USD:  EURUSD  SE  in: 1.02186  sl: 1.02236  lotsC: 5.1400 (-257.00)  lotsB: 5.3500 (-267.50)

Sul conto MQ, le dimensioni dei lotti sarebbero troppo elevate.

Ecco il mio script per confrontare i due metodi:

//+------------------------------------------------------------------+
//|                                            test_MM-functions.mq5 |
//|                                                            Calli |
//|                              https://www.mql5.com/de/users/gooly |
//+------------------------------------------------------------------+
#property copyright "Calli"
#property link      "https://www.mql5.com/de/users/gooly"
#property version   "1.00"
#property script_show_inputs
//--- input parameters
input double   risk_perCent   = 5.0;   // risk of capital in % on free_margin
input double   diff_sl        = 50;    // diff sl in points from entry
input double   CommPerLot     = 2.00;  

string Com = "",Syms[] = {"XAUUSD", "XAGUSD", "EURUSD" }; //,"AUDUSD","GBPCHF","GBPUSD", "EURCAD", "USDCAD", "USDRUB", "GBPJPY", "USDJPY"};

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
#define  forEach(TYPE, VAR, ARRAY) \
                TYPE VAR=NULL; \
                for(int i##VAR=0;  i##VAR<ArraySize(ARRAY)&&((VAR=ARRAY[i##VAR])!=NULL||true);  i##VAR++)

void OnStart()
  {
//---
   MqlTick mqTick;
   forEach(string, sym, Syms){
      
      double pnt = SymbolInfoDouble(sym,SYMBOL_POINT);
      ENUM_ORDER_TYPE ord = GetMicrosecondCount()%2==0 ? ORDER_TYPE_BUY : ORDER_TYPE_SELL; // randomly buy or sell
      SymbolInfoTick(sym,mqTick); 
      double entry = (ord==ORDER_TYPE_BUY) ? mqTick.ask : mqTick.bid,
             sl    = (ord==ORDER_TYPE_BUY) ? entry - diff_sl*pnt : entry + diff_sl*pnt,
             lossC = 0.0, lossB = 0.0,
             lotsC = lotszC(risk_perCent, entry, sl, sym, CommPerLot), 
             lotsB = lotszB(risk_perCent, entry, sl, sym, CommPerLot);
      
      if (!OrderCalcProfit(ord, sym, lotsC, entry, sl, lossC) ) 
         Print("chk OrderCalcProfit(",EnumToString(ord),", ",sym,", lot: ",lotsC,", in: ",DoubleToString(entry,6),", out: ",DoubleToString(sl,6),", lossC) => err: ",_LastError," lossC: ",lossC);
             
      if (!OrderCalcProfit(ord, sym, lotsB, entry, sl, lossB) ) 
         Print("chk OrderCalcProfit(",EnumToString(ord),", ",sym,", lot: ",lotsC,", in: ",DoubleToString(entry,6),", out: ",DoubleToString(sl,6),", lossC) => err: ",_LastError," lossC: ",lossC);
             
      string res = StringFormat("Set: Risk: %.1f %%, dSL: %.0f  Com/Lot: %.2f  Free: %.2f %s:  %s  %s  in: %.5f  sl: %.5f  lotsC: %.4f (%+.2f)  lotsB: %.4f (%+.2f)",
                                 risk_perCent, diff_sl, CommPerLot,
                                 AccountInfoDouble(ACCOUNT_MARGIN_FREE),AccountInfoString(ACCOUNT_CURRENCY),
                                 sym, (ord==ORDER_TYPE_BUY ? "BU" : "SE"), entry, sl, lotsC, lossC, lotsB, lossB );
      Com = Com + res+"\n";
   }
   Comment(Com);
   //Print(Com);
  }
//+------------------------------------------------------------------+
double lotszC (double risk, double entry, double sl, string sym="", double CommissionPerLot=0) {
   if (sym == "") sym = _Symbol;
   double deltaValue = SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE) / SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE);
   ENUM_ORDER_TYPE ordDir = entry > sl ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
   double diff = fabs (entry - sl); 
   Print(sym,"  in: ",DoubleToString(entry,5)," sl:",DoubleToString(sl,5),"  diff:",DoubleToString(diff,5),
         "  delta:",DoubleToString(deltaValue,5),"  delta:*diff:",DoubleToString(deltaValue*diff,5),
         "  tVal:",DoubleToString(SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_VALUE),5),"  tSz:",
         DoubleToString(SymbolInfoDouble(sym, SYMBOL_TRADE_TICK_SIZE),5));
   double lts = ( (AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk/100) / (diff * deltaValue + CommissionPerLot) );
   lts = ( fmin(fmax(SymbolInfoDouble(sym,SYMBOL_VOLUME_MIN),lts),SymbolInfoDouble(sym,SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return (MathRound(lts/stepSize)*stepSize);
}

double lotszB (double risk, double entry, double sl, string sym="", double CommissionPerLot=0) {
   if (sym == "") sym = _Symbol;
   ENUM_ORDER_TYPE ordDir = entry > sl ? ORDER_TYPE_BUY : ORDER_TYPE_SELL;
   double loss;
   if (!OrderCalcProfit(ordDir, sym, 1, entry, sl, loss)) return(-1.0);
   double lts = ((AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01) / -loss);
   lts = (fmin(fmax(SymbolInfoDouble(sym, SYMBOL_VOLUME_MIN), lts), SymbolInfoDouble(sym, SYMBOL_VOLUME_MAX)));
   double stepSize = SymbolInfoDouble(sym, SYMBOL_VOLUME_STEP);
   return (MathRound(lts / stepSize) * stepSize);
}

Ho ricavato la direzione da in > sl (comprare) o in < sl (vendere). In questo modo non ci sarebbero problemi con gli ordini pendenti.

 

Grazie per i vostri test. Sì, se si confrontano i risultati tra loro, si può notare da un lato la coerenza di OrderCalcProfit e dall'altro, almeno per EURUSD e RoboForex, che i risultati differiscono di circa "Lot size * CommissionPerLot". Questo potrebbe essere aggiunto:

if (!OrderCalcProfit(ordDir, sym, 1, entry, sl, loss)) return(-1.0);
double lts = ((AccountInfoDouble(ACCOUNT_MARGIN_FREE) * risk * 0.01) / (-loss + CommissionPerLot);
Se ho usato correttamente la ricerca sul forum, non c'è modo di interrogare il valore "CommissionPerLot" direttamente con MQL5, vero?
 
Benjamin Fotteler #:


Se ho usato correttamente la ricerca sul forum, non c'è modo di interrogare il valore "CommissionPerLot" direttamente con MQL5, vero?

Sì, non direttamente nel terminale, ma richiedendolo al broker o nella cronologia di trading: DEAL_COMMISSION.

Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Eigenschaften der Deals
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Handelskonstanten / Eigenschaften der Deals
  • www.mql5.com
Eigenschaften der Deals - Handelskonstanten - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5