Einzelnen Beitrag anzeigen
  #14 (permalink)  
Alt 06.03.18
next user next user ist offline
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von dundale Beitrag anzeigen
Im Test macht er 4 Trades auf und schließt sie wieder. Aber er soll eigentlich 8 Trades eröffnen.
Sehe jetzt auf den ersten Blick nicht, warum er bei dir nur 4 eröffnet. Da wären Ausgaben an entsprechenden Stellen hilfreich.
Habs mal getestet und bei mir eröffnet er 8.

Noch zum Code:
Code:
if(Digits==3 || Digits==5 || Digits==1)
   pips*=10;
else if(Digits==2)
   pips*=100;
vereinfachen wir das mal...
Code:
if(Digits == 2)
   pips *= 100;
else
   pips *= 10;
=================================================

Code:
if(AutoTrade == true)
   CheckForSignal();

if(TotalOpenOrders() > 4)
   lotSize = lotArray[3];
else
   lotSize = lotArray[0];
  • True braucht man nicht auszuschreiben, einfach if(AutoTrade)
  • Es wäre sinnvoller, ERST die LotSize bei evtl. manuell erstellten Orders anzupassen, und DANN erst eine neue Order zu eröffnen.
  • Müsste der untere Teil nicht so aussehen:
    Code:
    if(TotalOpenOrders() > 4)
       lotSize = lotArray[3];
    else
       lotSize = lotArray[count_lotSize-1];
    So wie du es jetzt hast, müssten die ersten 4 Orders bei dir die ERSTE LotSize haben.
    Die -1 am Ende für den richtigen Index (ohne: bei Order 4 -> Index 4 -> Array Out of Range...)
  • Ich hoffe, dein Code im OnTick() ist nur zum testen. So ein ungefiltertes, direktes setzen einer Order bei jedem Tick ist nicht so toll.

=================================================

Code:
void CheckForSignal()
{
   if(TotalOpenOrders() < 9)
      PlaceOrder(OP_SELL);
}
Da du es bei jedem einzelnen Tick ausführst, "überlappen" sich die Orders extrem.
Auch das kann eine Fehlerquelle sein. Wenn der Kurs jetzt um einen Pip nach unten geht, platzierst du eine Order.
Der Kurs geht einen Pip nach oben -> du platzierst eine Order. Was passiert, wenn der Kurs jetzt um einen Pip wieder nach unten geht ???
Wenn man dann noch beachtet, das du nur Sell-Orders erstellst...

=================================================

Code:
void PlaceOrder(int dir)
{
   if(dir==OP_BUY)
   {
      int ticket=OrderSend(Symbol(),dir,lotArray[count_lotSize],Ask,30,Ask-(SL*pips),Ask+(TP*pips),MyComment,0,0,clrGreen);
      count_lotSize++;
   }
   
   if(dir==OP_SELL)
   {
      int ticket=OrderSend(Symbol(),dir,lotArray[count_lotSize],Bid,30,Bid+(SL*pips),Bid-(TP*pips),MyComment,0,0,clrRed);
      count_lotSize++;
   }
}
Zum einen erstellst du hier zwei mal die gleiche Variable (beim Kompilieren müsste er dir "'ticket' - variable already defined" sagen).
Zum anderen ist "ticket" hier sinnlos, da du nichts weiter damit anfängst.

=================================================

Code:
int TotalOpenOrders()
{
   int total=0;
   
   if(OrdersTotal()>0)
   {
      for(int i=OrdersTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
            if(OrderSymbol() == Symbol())
               total++;
         }   
         else
            Print(__FUNCTION__," Failed to select order ",i," ",GetLastError());
      }
   }
   
   return (total);
}
Die Funktion ist ja doch anders, als ich vermutet hatte. Da hast du mich aber nicht (wirklich) darauf hingeweisen...
Um nicht so viele Funktionsaufrufe zu haben, könnte man es noch etwas verändern, z.B.:
Code:
// Globale Variablen (im Code global!)
int   totalOrders = 0;
int   sameSymbolOrders = 0;

// Bei Ordereröffnung...
void PlaceOrder(int dir)
{
   int ticket = 0;

   if(dir == OP_BUY)
      ticket = OrderSend(Symbol(),dir,lotArray[count_lotSize],Ask,30,Ask-(SL*pips),Ask+(TP*pips),MyComment,0,0,clrGreen);
   else if(dir == OP_SELL)
      ticket = OrderSend(Symbol(),dir,lotArray[count_lotSize],Bid,30,Bid+(SL*pips),Bid-(TP*pips),MyComment,0,0,clrRed);
      
   if(ticket != -1)
   {
      count_lotSize++;
      sameSymbolOrders++;
      totalOrders++;
   }
}

// In OnTick()...
void OnTick()
{
   if(OrdersTotal() != totalOrders)
      CheckAllOrders();

   if(sameSymbolOrders > 4)
      lotSize = lotArray[3];
   else
      lotSize = lotArray[count_lotSize-1];
      
   if(AutoTrade)
      CheckForSignal();
}

// CheckAllOrders()... (TotalOpenOrders())
void CheckAllOrders()
{
   totalOrders = OrdersTotal();
   int count = 0;
   
   for(int i=totalOrders-1; i>=0; i--)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if(OrderSymbol() == Symbol())
            count++;
      }   
      else
         Print(__FUNCTION__," Failed to select order ",i," ",GetLastError());
   }
   
   if(sameSymbolOrders != count)
      sameSymbolOrders = count;
      
   // Wenn manuell erstellte Orders auch zu "count_lotSize" zählen sollen
   // count_lotSize++;
}
So wird die Funktion nur aufgerufen, wenn manuell eine Order erstellt wurde (oder eine gelöscht wurde), und nicht bei jedem Tick erneut.
Außerdem habe ich paar Kleinigkeiten im Code angepasst ("ticket" abgefangen, Code verkleinert, ect...).