Mocwoc hat dir schon gut geholfen.
Ich wollte trotzdem noch kurz meinen Senf dazugeben
Zitat:
Zitat von Angel
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
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
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
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
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
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...
}