Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1415
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Ricerca di "calculate lotsize": https://www.mql5.com/en/search#!keyword=calculate%20lotsize&module=mql5_module_forum
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?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)
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.
Grazie per il codice. L'unica cosa che mancava era l'adattamento a una dimensione di lotto intermedia valida:
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:
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:
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();
}
//+------------------------------------------------------------------+
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:
Sul conto MQ, le dimensioni dei lotti sarebbero troppo elevate.
Ecco il mio script per confrontare i due metodi:
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:
Se ho usato correttamente la ricerca sul forum, non c'è modo di interrogare il valore "CommissionPerLot" direttamente con MQL5, vero?
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.