Spike Trader Expert Advisor – spielt Hochs und Tiefs
Der Spike Trader Forex Expert Advisor basiert auf der Idee, dass Spike-Balken einer Bewegung in die entgegengesetzte Richtung des Spikes vorausgehen. Dieser EA wurde von der Handelsstrategie inspiriert, die in der Mai-Ausgabe 2012 der Zeitschrift Currency Trader beschrieben wurde.
Zur Strategie
Der Spike ist definiert als ein Balken, der höher ist als die vorherigen BarsNumber-Balken, höher als der vorherige Balken nach PercentageDifference und der im unteren DrittelOderHälfte seiner Länge geschlossen hat. Bei einem bullischen Signal wird alles invertiert. Die Position wird offen gehalten, bis Hold-Bars vergehen oder ein entgegengesetztes Signal empfangen wird. Wenn ein neues Signal in der gleichen Richtung eintrifft, wird der Timer der Position zurückgesetzt und keine neue Position eröffnet.
Diese Strategie enthält keine Stop-Loss- oder Take-Profit-Levels.
Eingabe-Parameter
Standardeinstellungen
- Hold (Standardwert = 11) – wie viele Bars soll die Position offen gehalten werden.
- BarsNumber (Standardwert = 3) – wie viele der vorangegangenen Bars für die Analyse der Einstiegsbedingung geprüft werden sollen.
- PercentageDifference (Standard = 0,003) – die gewünschte prozentuale Differenz zum vorherigen Balken.
- ThirdOrHalf (Standardwert = 0,5) – der geprüfte Balken sollte im unteren Teil des vorherigen Balkens schließen. Dieser Wert bestimmt diesen Teil. Zum Beispiel bedeutet 0,5 untere/obere Hälfte. 0,33 bedeutet unteres/oberes Drittel und so weiter.
Geldverwaltung
- Lots (Standardwert = 0,1) – das Volumen für den Handel.
Sonstiges
- Slippage (Standardwert = 30) – die zulässige Preisabweichung in Punkten.
- OrderCommentary (Standardwert = „Spike Trader“) – der Kommentar für die von diesem EA eröffneten Positionen.
Tipps
Wenn Sie den EA auf ein unterschiedliche Währungspaare oder einen anderen Zeitrahmen anwenden wollen, sollten Sie ihn für andere Eingabeeinstellungen, insbesondere den Parameter PercentageDifference, neu optimieren.
Info: Dieser EA ist ECN-sicher. Sie können diesen Expert Advisor bei ECN-Brokern (Marktausführung) frei verwenden, da er entweder keine Stop-Loss- und Take-Profit-Levels in seinen Handelsaufträgen anwendet oder nur schwebende Aufträge sendet.
Ein hohes Risiko
Dieser EA ist sehr riskant, da keine Stop-Punkte gesetzt werden. Er schließt ausschließlich nach des erreichen der Bars, auf der jeweiligen Zeiteinheit.
Download
MetaTrader5 Code
//+------------------------------------------------------------------+
//| SpikeTrader.mq5 |
//| https://multibank.cash |
//| Based on the EA by Community. |
//+------------------------------------------------------------------+
#property copyright "GNU General Public License (GPL)"
#property link "https://multibank.cash"
#property version "1.01"
#property description "Trades on spikes that are:"
#property description "1) Higher/lower than N preceding bars;"
#property description "2) Higher/lower than the previous bar by X percent;"
#property description "3) Close in bottom or upper third/half of the bar."
#include <Trade/Trade.mqh>
#include <Trade/PositionInfo.mqh>
input group "Main"
input int Hold = 11; // Hold: Position holding time in bars.
input int BarsNumber = 4; // BarsNumber: N preceding bars to check.
input double PercentageDifference = 0.003; // PercentageDifference1: X percentage for bar comparison.
input double ThirdOrHalf = 0.5; // ThirdOrHalf: Top/bottom share of a bar to close in.
input group "Money management"
input double Lots = 0.1;
input group "Miscellaneous"
input int Slippage = 30;
input string OrderCommentary = "Spike Trader";
int LastBars = 0;
int Timer = 0;
CTrade *Trade;
CPositionInfo PositionInfo;
void OnInit()
{
// Initialize the Trade class object.
Trade = new CTrade;
Trade.SetDeviationInPoints(Slippage);
}
void OnDeinit(const int reason)
{
delete Trade;
}
void OnTick()
{
//Wait for the new Bar in a chart.
if (LastBars == Bars(_Symbol, _Period)) return;
else LastBars = Bars(_Symbol, _Period);
if (Timer == 1) Trade.PositionClose(_Symbol);
if (Timer > 0) Timer--;
CheckEntry();
}
//+------------------------------------------------------------------+
//| Check for entry conditions and trade if necessary. |
//+------------------------------------------------------------------+
void CheckEntry()
{
MqlRates rates[];
ArraySetAsSeries(rates, true);
int copied = CopyRates(_Symbol, _Period, 1, BarsNumber + 1, rates);
if (copied != BarsNumber + 1) Print("Error copying price data ", GetLastError());
// Empty bar.
if (rates[0].high - rates[0].low == 0) return;
if (CheckSellEntry(rates))
{
if (PositionInfo.Select(_Symbol))
{
// If same direction - just reset the timer.
if (PositionInfo.PositionType() == POSITION_TYPE_SELL)
{
Timer = Hold;
return;
}
else Trade.PositionClose(_Symbol);
}
double Bid = SymbolInfoDouble(Symbol(), SYMBOL_BID);
Trade.PositionOpen(_Symbol, ORDER_TYPE_SELL, Lots, Bid, 0, 0, OrderCommentary);
Timer = Hold;
}
else if (CheckBuyEntry(rates))
{
if (PositionInfo.Select(_Symbol))
{
// If same direction - just reset the timer.
if (PositionInfo.PositionType() == POSITION_TYPE_BUY)
{
Timer = Hold;
return;
}
else Trade.PositionClose(_Symbol);
}
double Ask = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
Trade.PositionOpen(_Symbol, ORDER_TYPE_BUY, Lots, Ask, 0, 0, OrderCommentary);
Timer = Hold;
}
}
bool CheckSellEntry(MqlRates &rates[])
{
// If the bar isn't higher than at least one of the previous bars - return false.
for (int i = 1; i < BarsNumber + 1; i++)
if (rates[0].high <= rates[i].high) return false;
// If not higher than the previous bar by required percentage difference - return false.
if ((rates[0].high - rates[1].high) / rates[1].high < PercentageDifference) return false;
// If closed above the lower third/half - return false.
if ((rates[0].close - rates[0].low) / (rates[0].high - rates[0].low) > ThirdOrHalf) return false;
return true;
}
bool CheckBuyEntry(MqlRates &rates[])
{
// If the bar isn't lower than at least one of the previous bars - return false.
for (int i = 1; i < BarsNumber + 1; i++)
if (rates[0].low >= rates[i].low) return false;
// If not lower than the previous bar by required percentage difference - return false.
if ((rates[1].low - rates[0].low) / rates[1].low < PercentageDifference) return false;
// If closed below the upper third/half - return false.
if ((rates[0].high - rates[0].close) / (rates[0].high - rates[0].low) > ThirdOrHalf) return false;
return true;
}
//+------------------------------------------------------------------+