Discussione sull’articolo "Guida Step-By-Step alla scrittura di un Expert Advisor in MQL5 per Principianti" - pagina 29

 
Il file all'interno del download è sbagliato, per favore correggetelo.
 

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.

So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
So formulieren Sie das Pflichtenheft eines Auftrages für einen Handelsroboter
  • www.mql5.com
Handeln Sie nach Ihrer eigenen Strategie? Wenn Sie Ihre Handelsregeln formalisieren und als Algorithmus für ein Programm beschreiben können, wäre es doch besser, Ihren Handel einem automatisierten Expert Advisor anzuvertrauen. Ein Roboter braucht weder Schlaf noch Nahrung und ist keinen menschlichen Schwächen unterworfen. In diesem Artikel zeigen wir Ihnen, wie Sie, um einen Handelsroboter im Freelance-Service in Auftrag zu geben, das sogenannte Pflichtenheft erstellen.
 

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.

File:
myFirstEA.mq5  25 kb
 

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

}

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

Discover new MetaTrader 5 opportunities with MQL5 community and services
Discover new MetaTrader 5 opportunities with MQL5 community and services
  • 2023.05.27
  • www.mql5.com
MQL5: language of trade strategies built-in the MetaTrader 5 Trading Platform, allows writing your own trading robots, technical indicators, scripts and libraries of functions
 
Joosy #:

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.

Handelsereignisse in MetaTrader 5
Handelsereignisse in MetaTrader 5
  • www.mql5.com
Eine Überwachung des aktuellen Status eines Handels-Account bedeutet offene Positions und Order kontrollieren zu können. Bevor ein Handelssignal zu einem Abschluss wird, sollte es vom Client-Terminal als Anfrage zum Handels-Server geschickt werden, wo es in eine Order-Warteschlange gestellt wird und auf seine Bearbeitung wartet. Eine Anfrage vom Handels-Server annehmen, sie löschen, wenn sie abläuft oder auf ihrer Grundlage einen Abschluss ausführen - alle diese Handlungen haben Handelsereignisse zur Folge, und der Handels-Server informiert das Terminal entsprechend darüber.
 
Carl Schreiber #:

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:

   bool Buy_opened = false, Sell_opened = false; // variabili per contenere il risultato della posizione aperta

Ma sono successivamente impostate di nuovo se c'è una posizione di conseguenza.

   if(PositionSelect(_Symbol) == true) { // abbiamo una posizione aperta

      if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) {

         Buy_opened = true;  //È un acquisto

      }

      if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) {

         Sell_opened = true; // È una vendita

      }

   }

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😉

Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmieransatzes schreiben
Einen Expert Advisor mit Hilfe des MQL5 Objekt-orientierten Programmieransatzes schreiben
  • www.mql5.com
Dieser Beitrag beschäftigt sich mit dem Objekt-orientierten Ansatz, um das zu machen, was wir bereits im Artikel "Schrittweiser Leitfaden zum Schreiben eines Expert Advisors in MQL5 für Anfänger" getan haben - einen einfachen Expert Advisor erstellen. Die meisten Menschen glauben, das sei schwer, doch ich darf Ihnen versichern: wenn Sie diesen Beitrag gelesen haben, dann können Sie Ihren eigenen Objekt-orientierten Expert Advisor schreiben.
 
Joosy #:
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;

   bool Buy_opened = false, Sell_opened = false; // variabili per contenere il risultato della posizione aperta
   
   for(int i=0; i < PositionsTotal(); i++) {
      ticket = PositionGetTicket(i);
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && PositionGetInteger(POSITION_MAGIC) == EA_Magic) {
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { 
            Buy_opened = true; 
         }
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) { 
            Sell_opened = true; 
         }
      }   
   }
 

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.

File:
my_first_ea.mq5  12 kb
 

Tester - "Modalità di riempimento non supportata".

Provato su 3 diversi broker. Qual è il problema?