//+-------------------------------------------------------------- -------------------+
//| ADX_Bot_v1.mq4 |
//| Expert Advisor basato su ADX |
//+-------------------------------------------------------------- -------------------+
#proprietà rigorosa
// Impostazioni di input
ingresso int ADX_Period = 3;
immettere doppio DeltaAdx = 1.0;
input int Levigatura = 1;
ingresso int SignalGap = 3;
immettere double LotSize = 0,01;
input bool UseRisk = true;
immettere double RiskPercentage = 0,01;
input bool CloseAllOppositeSignal = true;
input bool StopLossOn = vero;
input int PuntiSL = 20;
input bool TrailingStopOn = true;
ingresso int TrailingStop = 3;
stringa di input CommentText = "++ ADX_Bot_v1 ++";
input int NumeroMagico = 11111;
// Variabili globali
doppio PrevADX = 0,0;
//+-------------------------------------------------------------- -------------------+
//| Funzione di inizializzazione esperta |
//+-------------------------------------------------------------- -------------------+
int OnInit()
{
Print("ADX_Bot_v1 inizializzato.");
restituisci(INIT_RIUSCITO);
}
//+-------------------------------------------------------------- -------------------+
//| Funzione di deinizializzazione esperta |
//+-------------------------------------------------------------- -------------------+
void OnDeinit(const int motivo)
{
Print("ADX_Bot_v1 deinizializzato.");
}
//+-------------------------------------------------------------- -------------------+
//| Funzione tick esperto |
//+-------------------------------------------------------------- -------------------+
annullare OnTick()
{
doppio ADX = iADX(NULL, 0, ADX_Period, PRICE_CLOSE, MODE_MAIN, 0);
doppio PlusDI = iADX(NULL, 0, ADX_Period, PRICE_CLOSE, MODE_PUSDI, 0);
doppio MinusDI = iADX(NULL, 0, ADX_Period, PRICE_CLOSE, MODE_MINUSDI, 0);
// Controlla se ADX ha superato la soglia Delta
bool BuySignal = (ADX > DeltaAdx && PlusDI > MinusDI);
bool SellSignal = (ADX > DeltaAdx && MinusDI > PlusDI);
// Gestire le posizioni di chiusura sul segnale opposto
se (ChiudiTuttiSegnaliOpposti)
{
se (BuySignal) ChiudiTutto(OP_SELL);
se (SellSignal) ChiudiTutto(OP_BUY);
}
// Apri le negoziazioni in base ai segnali
se (BuySignal && !PositionExists(OP_BUY))
OpenTrade(OP_BUY);
altrimenti se (SellSignal && !PositionExists(OP_SELL))
OpenTrade(OP_SELL);
// Arresto di fine corsa
se (TrailingStopOn) ApplicaTrailingStop();
}
//+-------------------------------------------------------------- -------------------+
//| Funzioni |
//+-------------------------------------------------------------- -------------------+
void OpenTrade(int segnaleType)
{
doppio lotto = LotSize;
se (UseRisk)
lotto = CalcolaRischio();
prezzo doppio = (signalType == OP_BUY) ? Chiedi : Offerta;
double sl = (signalType == OP_BUY) ? prezzo - PuntiSL * Punto : prezzo + PuntiSL * Punto;
double tp = 0; // Take profit non specificato
int ticket = OrderSend(Symbol(), signalType, lot, price, 3, sl, tp, CommentText, MagicNumber, 0, clrBlue);
se (biglietto < 0)
Print("Errore durante l'apertura dell'ordine: ", GetLastError());
}
void CloseAll(int segnaleType)
{
per (int i = OrdersTotal() - 1; i >= 0; i--)
{
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == MagicNumber && OrderType() != signalType)
{
se (!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 3, clrRed))
Print("Errore durante la chiusura dell'ordine: ", GetLastError());
}
}
}
}
bool PosizioneEsiste(int segnaleTipo)
{
per (int i = OrdersTotal() - 1; i >= 0; i--)
{
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() == MagicNumber && OrderType() == signalType)
restituisci vero;
}
}
restituisci falso;
}
doppio CalcolaRischio()
{
doppio saldo = AccountBalance();
doppio riskAmount = saldo * RiskPercentage;
doppio lotto = riskAmount / (PointsSL * Point * MarketInfo(Symbol(), MODE_TICKVALUE));
restituisci NormalizeDouble(lotto, 2);
}
void ApplicaStopTrailing()
{
per (int i = OrdersTotal() - 1; i >= 0; i--)
{
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
se (OrderMagicNumber() == MagicNumber)
{
doppio newStop = 0;
se (OrderType() == OP_BUY)
newStop = Offerta - TrailingStop * Punto;
altrimenti se (OrderType() == OP_SELL)
newStop = Chiedi + TrailingStop * Punto;
if ((OrderType() == OP_BUY && newStop > OrderStopLoss()) ||
(OrderType() == OP_SELL && newStop < OrderStopLoss()))
{
if (!OrderModify(OrderTicket(), OrderOpenPrice(), newStop, OrderTakeProfit(), 0, clrGreen))
Print("Errore durante la modifica dell'ordine: ", GetLastError());
}
}
}
}
}