Tick Trader

 

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

 
Um solche Fehler zu finden gibt es den Debugger:  https://www.metatrader5.com/de/metaeditor/help/development/debug
Code-Debugging - Programme entwickeln - MetaEditor Hilfe
  • www.metatrader5.com
MetaEditor hat einen eingebauten Debugger, mit dem Sie die Programmausführung Schritt für Schritt (durch einzelne Funktionen) ü...
 
Carl Schreiber #:
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.

 
Alexander Kerker #:

Danke jetzt weiss ich gleichviel wie vorher.

Kannst du bitte den Code mit dem Code-Button posten und alle Variablen die du in Gebrauch hast zeigen.

So dass es nachvollziehbar ist, was der Code tatsächlich macht und welche Werte in den Variablen sind.
 
Alexander Kerker #:

Danke jetzt weiss ich gleichviel wie vorher.

Jetzt komm mal runter. Mit dem was du hier gepostet hast kann dir niemand sagen wo der Fehler ist.

Wenn du Hilfe erwartest, poste etwas, dass den Fehler reproduzierbar macht. Dann wird dir in der Regel geholfen.

Außerdem kann man den Zusammenhang zwischen deiner Beschreibung und dem Code nicht erkennen.
 
Alexander Kerker:

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:

  1. 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 ....
  2. 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 !
  3. "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

 
Carl Schreiber #:

Also:

  1. 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 ....
  2. 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 !
  3. "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.

 
Alexander Kerker #:

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.

Anja Vivia Vogel
Anja Vivia Vogel
  • www.mql5.com
Trader's profile
 
Alexander Kerker #:

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:

  1. Pip gibt es nicht (mehr), we gibt nur Point, den kleinst mögliche Preisänderung.
  2. Was heißt "1 Pip über der geöffneten Order" ? Eröffnungskurs, aktuellem Kurs, irgendwas mit Gewinn, ...?
  3. 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.
Grund der Beschwerde: