Einzelnen Beitrag anzeigen
  #14 (permalink)  
Alt 29.01.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

Mocwoc hat dir schon gut geholfen.
Ich wollte trotzdem noch kurz meinen Senf dazugeben

Zitat:
Zitat von Angel Beitrag anzeigen
Code:
if (iMA(Symbol(),0,10,0,1,0,0)>iMA(Symbol(),0,20,0,1,0,0))
   
 {
  ...
   }
    else ObjectDelete(name);
Die Bedingung ist nicht gut. Falls sie zutrifft, wird dein Rechteck erstellt, auch wiederholt!
Falls die Bedingung nicht zutrifft, so löscht du das Objekt, auch wenn keines vorhanden ist. Und das immer wieder und wieder...

Zitat:
Zitat von mocwoc Beitrag anzeigen
1. Ich würde Dir empfehlen, das Zeichnen von Chart-Objekten zumindest in eine Include-Datei auszulagern...
Grundsätzlich schon, allerdings macht es auch nur Sinn, wenn man es auch wirklich benötigt.
Bei seinem Test-EA und seinen Kentnissen ist das allerdings wahrscheinlich noch nicht der Fall. Das verwirrt ihn vielleicht sogar ein bischen...

Zitat:
Zitat von mocwoc Beitrag anzeigen
5. In der OnTick()-Funktion musst Du das creierte Objekt zunächst mal löschen mit ObjectDelete(0,"ObjectName"), dann mit der ausgelagerten ObjectCreate-Funktion neu zeichnen.
Das würde ich nicht machen, schon garnicht in OnTick(). Es ist überhaupt nicht nötig, das Objekt zu löschen und neu zu zeichnen.
Dafür gibt es die Funktion "ObjectMove()"!

Zitat:
Zitat von Angel Beitrag anzeigen
Nach Kompilierung tritt ein gelbes Ausrufezeichen auf mit dem Satz "return value of "OrderSend" should be checked"
"Void" verlangt keinen Rückgabewert, soviel ich weiß. Dennoch soll ich den Wert von "OrderSend" checken? Un dwie mache ich das?
Deine Funktion "Kaufen()" hat den Typ "Void", daher hat DEINE Funktion keinen Rückgabewert, wohl aber die Funktion "OrderSend()", auf welche
sich der Warnhinweis bezieht. Diese Funktion hat einen Int-Rückgabewert und liefet die Tecketnummer bei Erfolg, -1 bei Problemen.

Zitat:
Zitat von Angel Beitrag anzeigen
Falls Kaufen() fehlschlug, zB durch zu große Slippage (Hier 3 Pips), wie soll ich denn die Anweisung dazu geben, es nochmal zu versuchen, Kaufen() durchzuführen bzw. die vorhergegangene Kaufbedingung (liegt im void OnTick()-Bereich) nochmals anzulaufen?
Z.B. durch einen einfachen Schalter (bool-Variable), oder der Überprüfung der vorhandenen Orders.

Zitat:
Zitat von Angel Beitrag anzeigen
Es soll nur das Problem - die aufgerufene (Bool-)Funktion "kaufen" - betrachtet werden...
... "Void" verlangt keinen Rückgabewert, soviel ich weiß...
Code:
void Kaufen()
   {
   OrderSend(Symbol(),OP_BUY,LotSize,Ask,3,Ask-(StopLoss*pips),Ask+(TakeProfit*pips),NULL,MagicNumber,0,Green);
   //   if(OrderSend = true)
   //         {
   //         }
   }
Wiederspricht sich bischen, deine aufgerufene Bool-Funktion "void Kaufen()"

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

Also zusammengefasst (Kommentare beachten!):

Zusammen mit dem Beispiel bzgl. von PlaySound(), welches ich dir hier gepostet habe,
würde eine mögliche Umsetzung so aussehen:
Code:
#property copyright "Copyright No Matter"
#property version   "1.00"
#property strict


long     chart_ID       = ChartID();
string   name           = "ObjektQ";
bool     OBJECT_EXIST   = false;
datetime LAST_BAR       = Time[0];

int      SEC_ON_START   = 0;
int      SEC_CUR        = 0;
bool     SOUND_ACTIVE   = false;

int OnInit()
{
   // Timer setzen, um PlaySound() zu managen...
   EventSetTimer(1);
   
   return(INIT_SUCCEEDED);
}
  
void OnDeinit(const int reason)
{
   ObjectDelete(name);
   EventKillTimer();
}
  
void OnTimer()
{
   if(SOUND_ACTIVE)
   {
      SEC_CUR = TimeSeconds(TimeCurrent());
   
      if(SEC_ON_START < 55)
      {
         if((SEC_CUR >= SEC_ON_START+5) || (SEC_CUR < SEC_ON_START))
            {PlaySound(NULL); SOUND_ACTIVE = false;}
      }
      else
         if(SEC_CUR < SEC_ON_START && SEC_CUR+60 >= SEC_ON_START+5)
            {PlaySound(NULL); SOUND_ACTIVE = false;}
   }
}  

void OnTick()
{
   // Objekt NUR EINMAL erstellen!
   if(!OBJECT_EXIST && iMA(Symbol(),0,10,0,1,0,0) > iMA(Symbol(),0,20,0,1, 0,0))
   {
      ObjectCreate(chart_ID,name,OBJ_RECTANGLE,0,Time[5],Close[5]-0.0001,Time[0],Close[0]+0.0001);
      ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,C'100 ,40,100');
      ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,STYLE_SOLID);
      ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,5);
      ObjectSetInteger(chart_ID,name,OBJPROP_BACK,true);
      ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE, true);
      
      OBJECT_EXIST = true;
      
      // Sofern dieselben Bedingungen für deine Funktion "Kaufen()" gelten...
      // Eine Funktion, die einfach nur eine andere aufruft, ist unnötig!
      
      ResetLastError();
      
      // Hier würde ich unbedingt noch auf deinen StopLoss und TakeProfit achten.
      // Üblicherweise nutzt man z.B. "Ask/Bid +/- StopLoss * Point"
      if(OrderSend(Symbol(),OP_BUY,LotSize,Ask,3,Ask-(StopLoss*pips),Ask+(TakeProfit*pips),NULL,MagicNumber,0,Green) == -1)
      {
         // Fehler bei Orderausführung. Ausgabe des Fehlers mit z.B. einer MessageBox:
         MessageBox("Order konnte nicht ausgeführt werden. Fehler: "+IntegerToString(GetLastError()));
         
         // Vor einem erneuten Versuch Fehler beachten.
         // Bei falschen Bedingungen und entsprechendem Fehler (falscher Stop, Traden deaktiviert, ect...)
         // könnte es schnell zu einer Endlosschleife von Versuchen führen !!!
      }
      else
      {
         // Order wurde gesetzt.
         // PlaySound() aufrufen und nach 5 Sekunden beenden.
         PlaySound("DEINE DATEI");
         SEC_ON_START = TimeSeconds(TimeCurrent());
         SOUND_ACTIVE = true;
      }
   }
   else
   {
      // Da du nicht angegeben hast, wo genau das Rechteck aufhören soll,
      // Zeichnet es sich einfach bei jeder neuen Kerze mit weiter.
      // Hier müsstest du bestimmte Bedingungen setzen...
      
      if(Time[0] != LAST_BAR)
      {
         ObjectMove(chart_ID,name,1,Time[0],ObjectGetDouble(chart_ID,name,OBJPROP_PRICE2));
         LAST_BAR = Time[0];
      }
      
      // === === === === === === === === === ===
      
      // Die Bedingung oben trifft nur einmal zu.
      // Danach musst du Order hier managen.
      // Je nach Vorhaben halt mit erneuter iMA-Prüfung...
      
      if(OrdersTotal() == 0 && iMA(Symbol(),0,10,0,1,0,0) > iMA(Symbol(),0,20,0,1, 0,0))
      {
         // Order wurde offenbar nicht gesetzt.
         // Hier darauf reagieren mit z.B. einem erneuten Versuch.
         // Bei erfolgreichem OrderSend() dann auch PlaySound() setzen...
      }
      else
      {
         // Vorhandene Order managen.
         // Falls mehrere Orders vorhanden, so mit der Ticketnummer filtern
      }
      
   }
}
  
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
   // Für zukünftiges...
}