Discussione sull’articolo "Guida Step-By-Step alla scrittura di un Expert Advisor in MQL5 per Principianti" - pagina 29
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
Ciao a tutti,
Attualmente ho l'EA di Samuel in esecuzione su un conto demo e sono abbastanza soddisfatto. Buona programmazione!
Di tanto in tanto mostra un buon trading, ma ha un punto debole:
Le opzioni SELL si accumulano nei punti di svolta nella valle dei grafici e lo stesso nei picchi corrispondenti con le opzioni BUY, che poi colpiscono i libri in modo massiccio come negativi. Vorrei riprogrammare questa situazione, cioè comprare in giornata e vendere al picco, ma finora i miei tentativi sono falliti. Inoltre ho solo una conoscenza rudimentale di MQL5.
Qualcuno può aiutarmi?
SG e molte grazie!
Questo di solito non funziona perché anche gli altri punti in cui l'EA prende una posizione redditizia sono invertiti ....
Ma leggete questo:
Specifiche di EA-freelancer : https://www.mql5.com/it/articles/4368
Indi : https://www.mql5.com/it/articles/4304
Come ordinare un robot di trading in MQL5 e MQL4 : https://www.mql5.com/it/articles/117
Grazie a questi suggerimenti è possibile specificare con maggiore precisione la propria idea, sia per vedere se funziona, sia per chiedere a qualcuno di realizzarla, con o senza pagamento.
Ciao a tutti (specialmente al caro autore)
Ho seguito questo articolo. Mi è piaciuto molto e ho imparato molto da esso.
Grazie per aver scritto un articolo così informativo.
Tuttavia ho un problema. Il mio EA non ha piazzato alcun ordine. Ho scaricato il codice dell'autore ma anch'esso non ha piazzato alcun ordine.
Dato che l'articolo ha 13 anni, presumo che il codice sia ormai obsoleto. Qualcuno può aiutarmi?
Il mio codice è nel file sottostante. Grazie a tutti in anticipo.
Salve, voglio avvertirvi che sono un principiante, quindi non imprecate molto se non nulla)
Volevo creare un Expert Advisor attraverso il generatore (e tutto sembra andare bene, ma c'è un ma)
Vorrei aprire un'operazione non subito dopo la chiusura della precedente, ma ad esempio dopo una candela,
Ho provato a scrivere qualcosa, ma alla fine mi da un errore.
Qualcuno può aiutarmi o indicarmi qual è l'errore e come risolverlo?
Ecco il codice attuale:
//+------------------------------------------------------------------+
//| ParExpert.mq5 |
//| Copyright 2022, MetaQuotes Ltd. | |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#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\TrailingFixedPips.mqh>
//--- gestione del denaro disponibile
#include <Expert\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Ingressi |
//+------------------------------------------------------------------+
//--- input per l'esperto
input string Expert_Title = "ParExpert"; // Nome del documento
ulong Expert_MagicNumber = 24195; //
bool Expert_EveryTick = false; //
//--- ingressi per il segnale principale
input int Signal_ThresholdOpen = 10; // Valore di soglia del segnale da aprire [0...100]
input int Signal_ThresholdClose = 0; // Valore di soglia del segnale da chiudere [0...100].
input double Signal_PriceLevel = 0.0; // Livello di prezzo per eseguire una transazione
input double Signal_StopLevel = 500; // Livello di stop loss (in punti)
input double Signal_TakeLevel = 70; // Livello di take profit (in punti)
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 = 0.6; // Parabolic SAR(0.02,0.2) Peso [0...1.0]
//--- input per il trailing
input int Trailing_FixedPips_StopLevel = 0; // Livello di trailing stop loss (in punti)
input int Trailing_FixedPips_ProfitLevel= 10; // Livello di trailing del Take Profit (in punti)
//--- input per il denaro
input double Money_FixLot_Percent = 10.0; // Percentuale
input double Money_FixLot_Lots = 0.1; // Volume fisso
//--- input per il cooldown del trade
input int Expert_TradeCooldown = 1; // Periodo di cooldown tra gli scambi (in barre)
//+------------------------------------------------------------------+
//| Oggetto globale dell'esperto |
//+------------------------------------------------------------------+
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.StopLevel(Signal_StopLevel);
signal.TakeLevel(Signal_TakeLevel);
signal.Expiration(Signal_Expiration);
//--- Creazione del filtro CSignalSAR
CSignalSAR *filtro0 = nuovo CSignalSAR;
if (filter0 == NULL)
{
//--- fallito
printf(__FUNCTION__ + ": error creating filter0");
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
CTrailingFixedPips *trailing = new CTrailingFixedPips;
if (trailing == NULL)
{
//--- fallita
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__ + ": error initialising trailing");
ExtExpert.Deinit();
return (INIT_FAILED);
}
//--- Impostare i parametri di trailing
trailing.StopLevel(Trailing_FixedPips_StopLevel);
trailing.ProfitLevel(Trailing_FixedPips_ProfitLevel);
//--- Creazione dell'oggetto denaro
CMoneyFixedLot *money = nuovo CMoneyFixedLot;
if (money == NULL)
{
//--- fallita
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);
}
//--- Inizializza la variabile dell'ora dell'ultimo scambio
datetime lastTradeTime = 0;
ExtExpert.SetVariable("LastTradeTime", lastTradeTime);
//--- ok
return (INIT_SUCCEED);
}
//+------------------------------------------------------------------+
//| Funzione di deinizializzazione dell'esperto |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ExtExpert.Deinit();
}
//+------------------------------------------------------------------+
//| Funzione di gestione dell'evento "Tick" |
//+------------------------------------------------------------------+
void OnTick()
{
//--- Controlla il tempo trascorso dall'ultimo scambio
datetime lastTradeTime = ExtExpert.GetVariable("LastTradeTime");
int cooldownBars = Bars - ExtExpert.GetBarShiftByTime(Symbol(), Period(), lastTradeTime);
se (cooldownBars < Expert_TradeCooldown)
{
//--- Il periodo di cooldown dell'operazione non è trascorso, saltare l'apertura di un nuovo trade
ritorno;
}
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| Funzione di gestione dell'evento "Trade" |
//+------------------------------------------------------------------+
void OnTrade()
{
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| Funzione di gestione dell'evento "Timer" |
//+------------------------------------------------------------------+
void OnTimer()
{
ExtExpert.OnTimer();
}
//+------------------------------------------------------------------+
Ciao a tutti😊
@Mario31415927
Questo è semplicemente perché nel ticker, ogni volta che un nuovo periodo o nuova barra (qualsiasi cosa) le variabili:
vengono resettate, indipendentemente dal fatto che le posizioni siano già aperte o meno.
Questo può essere trovato in modo relativamente rapido nel codice.
Tuttavia, è lecito chiedersi se ciò fosse previsto e, in tal caso, come si chiudono di nuovo tutte le posizioni?
Forse non capisco il tipo di ordine TRADE_ACTION_DEAL in questo contesto?
Il processo dell'ordine di compravendita potrebbe anche essere semplicemente adattato alla classe Trade. Come ad esempio:
Cordiali saluti:-)Leggere: https://www.mql5.com/it/articles/232
Questo spiega la differenza e le relazioni tra ordini, posizioni e transazioni. Queste ultime riflettono i processi di prenotazione sul lato del broker.
Leggi: https://www.mql5.com/it/articles/232
Questo spiega la differenza e le relazioni tra ordini, posizioni e transazioni. Queste ultime riflettono i processi di prenotazione sul lato del broker.
Ciao Carl,
grazie per il suggerimento!
Tuttavia, devo correggermi.
E' vero che le variabili vengono azzerate per ogni nuovo periodo di tempo:
Ma sono successivamente impostate di nuovo se c'è una posizione di conseguenza.
Tuttavia, mi capita che l'acquisto (POSITION_TYPE_BUY) venga interrogato correttamente, ma non la vendita (POSITION_TYPE_SELL). La variabile non è più impostata?
Devo eseguire il debug del codice passo dopo passo. Questo può essere solo un errore logico😉
Sell_opened = true; // È una Sell
Oh cielo, oggi sono proprio in palla.
Viene interrogato solo una volta. Questo è l'errore;-)
Tutte le posizioni devono essere ricercate come segue;
Si trattava effettivamente di un errore, sembra che si tratti di un file web.
L'ho riscritto io stesso in base al contenuto e l'ho caricato. Non so se ci sono dettagli perché sono alle prime armi. Spero che sia d'aiuto.
Tester - "Modalità di riempimento non supportata".
Provato su 3 diversi broker. Qual è il problema?