Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Sie brauchen Hilfe.
http://forum.mql4.com/ru/67309#1011467
Bitte weisen Sie darauf hin, dass die Aufträge nicht jeden Tag geöffnet werden, dass das Trawling nicht funktioniert und dass die offenen Aufträge nicht nach TP geschlossen werden. Was mache ich falsch?
input int StartHour = 23; // Время ачало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 40; // StopLoss
input int Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 20; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = true; // Использовать шаг или нет
void OnTick()
{
static bool IsFirstTick = false;
static int ticket = 0;
double lot=Lot_Normalize(Symbol(),Lots,1);
double sl= Dist_Normalize(Symbol(),Trals);
double step= Dist_Normalize(Symbol(),_Step);
int h= TimeHour(TimeCurrent());
if(h == StartHour)
{
Alert("TimeHor: ", h);
if (IsFirstTick == true)
IsFirstTick = false;
bool res;
res= OrderSelect(ticket, SELECT_BY_TICKET);
if(res == true)
{
if(OrderCloseTime() == 0)
{
bool res2;
res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10);
if(res2 == false)
{
Alert("Error Closing Order #", ticket);
} Alert("Closing Order #", ticket);
}
}
if(Open[0] < Open[StartHour])
{
ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot");
Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
if(ticket < 0)
{
Alert("Error Sending Order!");
} Alert("Sending Order! BUY_LIMIT");
}
else
{
ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot");
Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
if(ticket < 0)
{
Alert("Error Sending Order!");
} Alert("Sending Order! SEL_LLIMIT");
}
}
}
double Dist_Normalize(string Smv, int _Distancia)
{
int Dig= int(MarketInfo(Smv,MODE_DIGITS));
double Pip=MarketInfo(Smv,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*10*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
double Lot_Normalize(string Smv, double _lot, double _mult)
{
double minlot=MarketInfo(Smv,MODE_MINLOT);
double maxlot=MarketInfo(Smv,MODE_MAXLOT);
double steplot=MarketInfo(Smv,MODE_LOTSTEP);
double lot= _lot*_mult;
if(lot<=minlot) lot+minlot;
else if(lot>=maxlot) lot=minlot;
else if(lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
void Tralling_Stop(string Smv, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Symbol,MODE_DIGITS));
for(int pos=OrdersTotal()-1; pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Smv &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if(OrderType()==OP_BUY)
{
if(_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Error modifi Order!: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Error modifi Order!: ",GetLastError());
}
}
}
}
}
}
Bitte weisen Sie darauf hin, dass die Aufträge nicht jeden Tag geöffnet werden, dass das Trawling nicht funktioniert und dass die offenen Aufträge nicht nach TP geschlossen werden. Was mache ich falsch?
input int StartHour = 23; // Время ачало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 40; // StopLoss
input int Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 20; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = true; // Использовать шаг или нет
void OnTick()
{
......
IsFirstTick = false;
Ich würde dieses Stück ersetzen durch
Die TM-Variable wird außerhalb der Funktion OnTick() als DateTime deklariert, d. h. sie ist für dieses Modul global.
Ich verstehe diesen Code nicht: if(Open[0] < Open[StartHour])
Die StartHour ist gleich 23 und legt nahe, dass der Eröffnungskurs des Null-Balkens mit dem Eröffnungskurs des 23. vorherigen Balkens verglichen wird. Nun, ok, vielleicht ist es ein Trick des Expert Advisors.
Aber dieses Design ist überhaupt nicht angemessen.
Was ist, wenn die Ticket-Variable gleich Null ist, oder wenn der EA neu initialisiert wurde und diese Variable standardmäßig zurückgesetzt wurde?
Die StartHour ist die Zeit, zu der der EA arbeiten soll. Es sollte 1:00 Uhr nachts sein. Warum funktioniert die Schleppnetzfischerei nicht?
Sie müssen den Code analysieren, um zu verstehen, warum er nicht funktioniert.
Versuchen Sie,die Funktion Print("Tralling_Stop") in die FunktionTralling_Stop() einzufügen, und prüfen Sie, ob diese Meldung (Tralling_Stop) im Protokoll erscheint, wenn nicht, dann wird diese Funktion nicht aufgerufen. Wenn Sie sie haben, analysieren Sie die Funktion Tralling_Stop() selbst, vielleicht enthält sie einige logische Fehler.
Generell gilt: Wo immer es logische Wenn-Bedingungen gibt, fügen Sie Print(" Bedingung 1" ), Print(" Bedingung 2" ), usw. ein. Führen Sie den Expert Advisor im Strategietester aus und im Journal können Sie die Logik Ihres EAs nachvollziehen.
Sie müssen den Code analysieren, um zu verstehen, warum er nicht funktioniert.
Versuchen Sie,die Funktion Print("Tralling_Stop") in die FunktionTralling_Stop() einzufügen, und prüfen Sie, ob diese Meldung (Tralling_Stop) im Protokoll erscheint, wenn nicht, dann wird diese Funktion nicht aufgerufen. Wenn ja, analysieren Sie die Funktion Tralling_Stop() selbst - vielleicht gibt es einige logische Fehler in ihr.
Generell gilt: Wo immer es logische Wenn-Bedingungen gibt, fügen Sie Print(" Bedingung 1" ), Print(" Bedingung 2" ), usw. ein. Führen Sie den Expert Advisor im Strategietester aus und im Journal können Sie die Logik Ihres EAs nachvollziehen.
Ich habe versucht, es umzuschreiben, aber es funktioniert immer noch nicht so, wie ich es brauche. Die Aufträge werden nicht geöffnet, wenn ich es will, und dann werden sie nicht ausgelöst. Der Expert Advisor sollte folgendermaßen funktionieren: Beim Abschluss der letzten Kerze eines Tages (um 00:00 Uhr) sollte er zwei ausstehende Orders öffnen: High (für Kauf) und Low (für Verkauf) und sie dann einfach auslösen.
input int StartHour = 1; // Начало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 10; // StopLoss
extern double Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 5; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = false; // Использовать шаг или неT
void OnTick()
{
static bool IsFirstTick = false;
Trailing();
if (StartHour != Hour()) { return;}
if (OrdersTotal()>0)
{
OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
}
}
//+------------------------------------------------------------------+
void Trailing()
{
if (_StepUse)
{
for (int trall=0; trall<OrdersTotal(); trall++) {
if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() == OP_BUY ) {
if (Bid-OrderOpenPrice() > StopLoss*Point || OrderMagicNumber()==Magic) {
if (OrderStopLoss() < Bid-(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), Bid-StopLoss*Point, OrderTakeProfit(), 0, Blue);
}
}
}
if (OrderType() == OP_SELL) {
if (OrderOpenPrice()-Ask > StopLoss*Point || OrderMagicNumber()==Magic) {
if (OrderStopLoss() > Ask+(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask+StopLoss*Point, OrderTakeProfit(), 0, Blue);
}
}
}
}
}
}
//+------------------------------------------------------------------+
Versuchen Sie
Ersetzen durch:
Ersetzen durch:
Darüber hinaus müssen die Preise mit NormalizeDouble() normalisiert werden. Das heißt, stattLow[1]-StopLoss*Point müssen Sie NormalizeDouble(Low[1]-StopLoss*Point,Digits()) schreiben.
Wenn die Variable _StepUse gleich false ist, funktioniert Ihr Trailing-Stop laut Ihrem Code nicht. Sehen Sie sich den Code der Funktion Trailing() genau an
Versuchen Sie
Ersetzen durch:
Ersetzen durch:
Darüber hinaus müssen die Preise mit NormalizeDouble() normalisiert werden. Das heißt, stattLow[1]-StopLoss*Point müssen Sie NormalizeDouble(Low[1]-StopLoss*Point,Digits()) schreiben.
Wenn die Variable _StepUse gleich false ist, funktioniert Ihr Trailing-Stop laut Ihrem Code nicht. Sehen Sie sich den Code der Funktion Trailing() genau an.
Sind Sie in Kontakt? Senden Sie mir eine Nachricht an http://vk.com/computerwizard116. Ich weiß nicht mehr, wie ich das EA-Problem lösen soll. Ich habe auf diese Strategie für eine Woche auf einem Demo-Konto arbeiten
Und es funktioniert. Und beim Testen schließt dieser Schlingel die Order nicht einmal bis zum Takeout-Punkt(((((( Auf dem Foto können Sie sehen, dass der Preis über den Takeout-Punkt hinausging und zurückging, aber er schloss mit einem Verlust, verdammt!(((
Warum tut er das?
Sind Sie in Kontakt? Senden Sie mir eine E-Mail an http://vk.com/computerwizard116. Ich weiß nicht mehr, wie ich das EA-Problem lösen soll. Ich habe diese Strategie für eine Woche auf einem Demo-Konto verwendet
und es funktioniert. Aber beim Testen schließt dieser Schlingel nicht einmal den Auftrag zum Takeaway. (((((( Auf dem Foto können Sie sehen, dass der Preis über den Takeaway hinausging und zurückging, aber er schloss mit einem Verlust.
Warum tut sie das?
Ich bin nicht in Kontakt.
Take-Profit- undStop-Loss-Aufträge sind nicht vom Berater abhängig, sie werden auf dem Server des Brokers ausgeführt. Der EA setzt nur den Take-Profit und den Stop-Loss, führt sie aber nicht aus. Prüfen Sie, ob der Take Profit bereits gesetzt wurde, nachdem der Kurs diesen Wert erreicht hat. Mit anderen Worten: Zuerst wurde die Order eröffnet, dann bewegte sich der Preis hin und her, und dann wurde der Take Profit festgelegt.
Ich bin nicht in Kontakt.
Die Ausführung von Take-Profit- undStop-Loss-Orders hängt nicht vom EA ab, sie werden auf dem Server des Brokers ausgeführt. Der EA setzt nur die Take- und Stop-Orders, führt sie aber nicht aus. Prüfen Sie, ob der Take Profit bereits gesetzt wurde, nachdem der Kurs diesen Wert erreicht hat. Mit anderen Worten: Zuerst wurde die Order eröffnet, dann ging der Kurs hin und her, und dann wurde der Take Profit festgelegt.