- www.metatrader5.com
Um solche Fehler zu finden gibt es den Debugger: https://www.metatrader5.com/de/metaeditor/help/development/debug
Danke jetzt weiss ich gleichviel wie vorher.
ouble sl = SL > 0 ? NormalizeDouble(m_symbol.Ask() - SL * _Point,_Digits) : 0;
double tp = TP > 0 ? NormalizeDouble(m_symbol.Ask() + TP * _Point,_Digits) : 0;
Hallo,
in Ihrem Kode steht folgendes:
double sl = SL > 0 ? NormalizeDouble(m_symbol.Ask() - SL * _Point,_Digits) : 0; double tp = TP > 0 ? NormalizeDouble(m_symbol.Ask() + TP * _Point,_Digits) : 0;
Solange ich weiß, wird die Teilung mit Slash-Zeichen durchgeführt und in Ihrem Kode sollten eigentlich Fehler angezeigt werden.
Zweitens, wenn man mathematische Formeln oder Kombinationen durch NULL teilt, kommt die NULL. )
Gruß Igor
PS: Ah so, mein Fehler! Das ist keine Teilung sondern, wenn SL/TP NULL oder höher ist.
Am besten, wenn Sie kompletten Kode teilen und auch im Kodefenster.
Hallo Carl wie Schreibe ich, dass der Stop nicht schliessen darf wenn der Trailingstop einschaltet.
double sl = SL > 0 ? NormalizeDouble(m_symbol.Ask() - SL * _Point,_Digits) : 0; Original
habe das versucht aber so geht das nicht.
double sl = SL > + 1 ? NormalizeDouble(m_symbol.Ask() + SL * _Point,_Digits) : 1;
Der EA muss so eingestellt sein, dass er kein minus machen kann.
Der EA Arbeitet im Nano Bereich bei einem Zero-Broker mit Zero-Konto.
Also:
- Das "der Stop nicht schliessen darf wenn der Trailingstop einschaltet" verstehe ich nicht ganz.
Wenn der EA eine zB. boolsche Option hat (bool isTrail=true;) dann erkennt er damit, ob es einen gibt oder geben soll,
das hängt dann davon ab, wie der Trailing-Stop programmiert wurde, sofort oder erst wen Gewinn oder .... - NormalizeDouble ist der falsche Ansatz, ich würde über TckSze = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); gehen:
das ist die minimale Schrittweite des Symbols und jede Veränderung muss ein Vielfaches von TckSze sein, ungetestet: diff = round(fabs(neu-alt)/TckSze)* TckSze ! - "Der EA muss so eingestellt sein, dass er kein minus machen kann" das ist ein unerfüllbarer Traum!
Aber such mal nach: https://www.mql5.com/en/search#!keyword=Trailing%20stop
Also:
- Das "der Stop nicht schliessen darf wenn der Trailingstop einschaltet" verstehe ich nicht ganz.
Wenn der EA eine zB. boolsche Option hat (bool isTrail=true;) dann erkennt er damit, ob es einen gibt oder geben soll,
das hängt dann davon ab, wie der Trailing-Stop programmiert wurde, sofort oder erst wen Gewinn oder .... - NormalizeDouble ist der falsche Ansatz, ich würde über TckSze = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); gehen:
das ist die minimale Schrittweite des Symbols und jede Veränderung muss ein Vielfaches von TckSze sein, ungetestet: diff = round(fabs(neu-alt)/TckSze)* TckSze ! - "Der EA muss so eingestellt sein, dass er kein minus machen kann" das ist ein unerfüllbarer Traum!
Aber such mal nach: https://www.mql5.com/en/search#!keyword=Trailing%20stop
Das "der Stop nicht schliessen darf wenn der Trailingstop einschaltet" verstehe ich nicht ganz.
Also Carl, Der Stop muss, zwingend 1 Pip über der geöffneten Order sein und muss wenn der Trailingstop einschaltet erhalten, aktiv bleiben.
Der EA schaltet ein wenn der hereinkommende Tick 2 Pip oder grösser ist, somit kann der Stop zusammen beim Start des gestzt werden.
Verstehst Du was ich meine? Danke.
Das "der Stop nicht schliessen darf wenn der Trailingstop einschaltet" verstehe ich nicht ganz.
Also Carl, Der Stop muss, zwingend 1 Pip über der geöffneten Order sein und muss wenn der Trailingstop einschaltet erhalten, aktiv bleiben.
Der EA schaltet ein wenn der hereinkommende Tick 2 Pip oder grösser ist, somit kann der Stop zusammen beim Start des gestzt werden.
Verstehst Du was ich meine? Danke.
Hier ist der ganze Code, den hat die Anja Vogel aus Berlin https://www.mql5.com/en/users/av-trading geschrieben aber sie ist nicht
erreichbar schon seit Wochen, darum frage ich hier was ich machen muss.
//+------------------------------------------------------------------+
//| AlexanderEA.mq5 |
//+------------------------------------------------------------------+
/******************************************
Ein ganz einfacher EA in MQL5 - MT5
Spread einstellbar 0.00
Kaufen wenn der Tick - Ping grösser als 0.02 pip - Kaufen/Verkaufen
Tailingstop 0.01 pip
ganz einfach ohne Seitenlange Berechnungen, das einzige ist zu warten bis ein Tick reinkommt
der grösser als 0.02 Pip ist. Den EA so dass ich ihn selbst noch bearbeiten kann.
Dieser EA ist nur ein Teil des ganzen.
*****************************************/
#property version "1.0"
#property strict
#include <Trade/Trade.mqh>
#include <Trade/SymbolInfo.mqh>
#include <Trade/PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
CTrade m_trade;
CSymbolInfo m_symbol;
CPositionInfo m_position;
CAccountInfo m_account; // account info wrapper
input double minTick = 0.00002; // min. Tick (z.B. 0.02 / 0 = aus)
input double TS = 0.00001; // Trailingstop (z.B. 0.01)
input double Lot = 1.0; // Lot
input int maxSpread = 0; // max. Spread (Point)
input int SL = 1; // Stoploss (Point)
input int TP = 0; // Takeprofit (Point)
input int Magic = 123456;
ulong ticketNr;
double lastBid;
//+------------------------------------------------------------------+
//| OnInit()
//+------------------------------------------------------------------+
int OnInit()
{
Comment("START");
lastBid = m_symbol.Bid();
m_symbol.Name(Symbol()); // set symbol name
m_trade.SetExpertMagicNumber(Magic);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| OnTick()
//+------------------------------------------------------------------+
void OnTick()
{
//+------------------------------------------------------------------ Profit?
calculateProfit();
Comment("Profit: " + DoubleToString(historyProfit, 2), " | Ask (= Kauf) - Bid (= Verkauf) = ",
NormalizeDouble(m_symbol.Ask() - m_symbol.Bid(), _Digits));
//+------------------------------------------------------------------ Position vorhanden?
bool hasPosition = false;
for (int i = PositionsTotal()-1; i>=0; i--) {
ticketNr = PositionGetTicket(i); // Position laden
if (m_position.SelectByTicket(ticketNr)) { // Position laden
if (m_position.Symbol() != m_symbol.Name()) continue; // anderes Instrument?
if (m_position.Magic() != Magic) continue; // anderer EA?
//Comment("Position existiert! Ticket = ", ticketNr);
hasPosition = true;
break;
}
}
//+------------------------------------------------------------------ Trailing
if (hasPosition) {
trailPositions();
lastBid = m_symbol.Bid(); // letzten Preis merken
//Comment("Wegen Position nicht mehr kaufen");
return; // nicht mehr kaufen
}
//+------------------------------------------------------------------
//+------------------------------------------------------------------
//+------------------------------------------------------------------
if(!m_symbol.RefreshRates()){
return;
}
if (m_symbol.Spread() > maxSpread) {
Comment("Spread: ", m_symbol.Spread(), " > ", maxSpread);
return;
}
//+------------------------------------------------------------------ Kaufen/Verkaufen
if (minTick <= 0) return; // Ausschalter
if (lastBid != m_symbol.Bid()) {
Comment(m_symbol.Bid() - lastBid);
if (m_symbol.Bid() >= (lastBid + minTick)) {
double sl = SL > 0 ? NormalizeDouble(m_symbol.Ask() - SL * _Point,_Digits) : 0;
double tp = TP > 0 ? NormalizeDouble(m_symbol.Ask() + TP * _Point,_Digits) : 0;
double lot = NormalizeLots(Lot);
{m_trade.SetExpertMagicNumber(Magic);}
m_trade.Buy(lot,m_symbol.Name(),m_symbol.Ask(),sl,tp,"");
{
static datetime prev_time=0;
if(prev_time==iTime(m_symbol.Name(),Period(),0))
return;
prev_time=iTime(m_symbol.Name(),Period(),0);
if(PositionsTotal()==0)
m_trade.SetExpertMagicNumber(Magic);
m_trade.Buy(lot,Symbol(),m_symbol.Ask(),sl,tp,"");}
}
else if (m_symbol.Bid() <= (lastBid - minTick)) {
double sl = SL > 0 ? NormalizeDouble(m_symbol.Bid() + SL * _Point,_Digits) : 0;
double tp = TP > 0 ? NormalizeDouble(m_symbol.Bid() - TP * _Point,_Digits) : 0;
double lot = NormalizeLots(Lot);
m_trade.SetExpertMagicNumber(Magic);
m_trade.Sell(lot,m_symbol.Name(),m_symbol.Ask(),sl,tp,"");
}
}
lastBid = m_symbol.Bid(); // letzten Preis merken
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
// NormalizeLots
//+------------------------------------------------------------------+
double NormalizeLots(double value)
{
double min = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double max = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double st = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
double rounded = st*(int)MathRound(value / st);
rounded = MathMax(rounded, min);
rounded = MathMin(rounded, max);
rounded = NormalizeDouble(rounded, 2);
return rounded;
}
//+------------------------------------------------------------------+
// trailPositions()
//+------------------------------------------------------------------+
void trailPositions()
{
if (TS <= 0) return;
CPositionInfo position;
CTrade trade;
double stopLoss = TS; // * _Point;
for (int i = PositionsTotal()-1; i >= 0; i--) {
if (position.SelectByIndex(i) && position.Symbol() == Symbol() && position.Magic() == Magic) {
ENUM_POSITION_TYPE type = position.PositionType();
double CurrentSL = position.StopLoss();
double CurrentTP = position.TakeProfit();
double CurrentPrice = position.PriceCurrent();
if (type == POSITION_TYPE_BUY) {
if (CurrentPrice - stopLoss > CurrentSL || CurrentSL == 0.0) {
trade.PositionModify(position.Ticket(), NormalizeDouble((CurrentPrice - stopLoss), Digits()), CurrentTP);
}
}
if (type == POSITION_TYPE_SELL) {
if (CurrentPrice + stopLoss < CurrentSL || CurrentSL == 0.0) {
trade.PositionModify(position.Ticket(), NormalizeDouble((CurrentPrice + stopLoss), Digits()), CurrentTP);
}
}
}
}
}
//+------------------------------------------------------------------+
// calculateProfit (History)
//+------------------------------------------------------------------+
int historyPositions = 0;
double historyProfit = 0.0;
void calculateProfit()
{
// vor der Neuberechnung zurück setzen:
historyPositions = 0;
historyProfit = 0.0;
HistorySelect(0,TimeCurrent());
for (int i=(HistoryDealsTotal()-1); i >= 0; i--) {
ulong ticketDeal = HistoryDealGetTicket(i);
if (ticketDeal > 0) {
if (HistoryDealGetString(ticketDeal,DEAL_SYMBOL) != Symbol()) continue;
if (HistoryDealGetInteger(ticketDeal,DEAL_MAGIC) != Magic) continue;
if (HistoryDealGetInteger(ticketDeal,DEAL_ENTRY) == DEAL_ENTRY_OUT) {
double profit = HistoryDealGetDouble(ticketDeal,DEAL_PROFIT)
+ HistoryDealGetDouble(ticketDeal,DEAL_SWAP)
+ HistoryDealGetDouble(ticketDeal,DEAL_COMMISSION);
historyPositions++;
historyProfit += profit;
}
}
}
}
Eine Profi Queen geschrieben.
Der EA darf kein minus machen.
Das "der Stop nicht schliessen darf wenn der Trailingstop einschaltet" verstehe ich nicht ganz.
Also Carl, Der Stop muss, zwingend 1 Pip über der geöffneten Order sein und muss wenn der Trailingstop einschaltet erhalten, aktiv bleiben.
Der EA schaltet ein wenn der hereinkommende Tick 2 Pip oder grösser ist, somit kann der Stop zusammen beim Start des gestzt werden.
Verstehst Du was ich meine? Danke.
Zeig mal ein Preis-, Positionsbeispiel das zeigt, was nicht eintritt aber passieren sollte!
Außerdem:
- Pip gibt es nicht (mehr), we gibt nur Point, den kleinst mögliche Preisänderung.
- Was heißt "1 Pip über der geöffneten Order" ? Eröffnungskurs, aktuellem Kurs, irgendwas mit Gewinn, ...?
- Schreib einmal genau(!) den zeitlichen Ablauf auf, was wann passieren soll: Kauf/Verkauf, Eröffnungskurs, Stop Loss, Trailing Stop, jew. Veränderungen ...
Am besten am Beispiel eines Chart-Situation für den Strategie-Tester, also mit Symbol (am besten EURUSD) und Zeitraum.
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Hallo zusammen
habe ein Ding das bei min 2 Pip oder höher einschalten soll, nur der Schaltet schon früher ein. Was fehlt?
if (minTick <= 0) return; // Ausschalter
if (lastBid != m_symbol.Bid()) {
Comment(m_symbol.Bid() - lastBid);
if (m_symbol.Bid() >= (lastBid + minTick)) {
double sl = SL > 0 ? NormalizeDouble(m_symbol.Ask() - SL * _Point,_Digits) : 0;
double tp = TP > 0 ? NormalizeDouble(m_symbol.Ask() + TP * _Point,_Digits) : 0;
double lot = NormalizeLots(Lot);