Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 39
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
Ich weiß nicht, wie ich es erklären soll. Aber es ist definitiv ein Meisterwerk.
Ich sage Ihnen, dass sie hier gerne sarkastisch sind ))) Trishkin nahm auch daran Anstoß. Er sagte, er werde einen Code haben, um mir zu helfen.
Ich bin genauso neu wie Sie, aber auch ich habe eine Menge Fragen
for(int i=0; i<OrdersTotal(); i++){
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() ||OrderMagicNumber()!=Magic) continue;
if(OrderType()==OP_BUY||OrderType()==OP_SELL) p++;
if(OrderType()==OP_BUYSTOP)
if(signal_bue)OrderDelete(OrderTicket());
else b++;
if(OrderType()==OP_SELLSTOP)
if(signal_sell)OrderDelete(OrderTicket());
else s++;
}
}
1) Woher haben Sie b++?
2) Woher haben Sies++
3)if(signal_bue) ist was sonst?
Und der Rest des Codes. Tut mir leid, wenn ich Sie beleidigt habe.
//| ОТЛОЖКИ.mq4 |
//+------------------------------------------------------------------+
extern double StopLoss = 100; //Стоплосс ордера
extern double TakeProfit = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int Delta = 100; //Расстояние от цены для установки ордера
extern double LOT = 0.1; //Объём позиции
extern int Magic =2;
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if (TrailingStop!=0) Trailing();
//ИНДИКАТОР RSI
double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
int b = 0, s = 0, p = 0, res = 0;
double BuyPrice=Ask+Delta*Point;
double SellPrice=Bid-Delta*Point;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
if (OrderType()==OP_BUYSTOP)
{
if(RSI0<50&&RSI1>50)
OrderDelete(OrderTicket());
else
b++;
}
if (OrderType()==OP_SELLSTOP)
{
if(RSI0>50&&RSI1<50)
OrderDelete(OrderTicket());
else
s++;
}
}
}
double SL,TP; // < !!!!!!!!! эти переменные не используются, можно удалить
//---- buy stop
if(RSI0>50&&RSI1<50 && p<1 && b<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
}
//---- sell stop
if(RSI0<50&&RSI1>50 && p<1 && s<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
}
//----
return(0);
}
Ich sage Ihnen, dass sie hier gerne sarkastisch sind.) Und Trishkin hat es mir übel genommen. Er sagte, er würde mir mit dem Code helfen.
Auf diese Weise ist es einfacher:
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==Type)
OrderDelete(OrderTicket());
}
}
}
Sie befindet sich irgendwo außerhalb der Funktion void OnTick().
if (сигнал_sell)OrderDelete_(OP_BUYSTOP);
Und zwar im Körper der Funktion void OnTick().
Und dies steht im Körper der void-Funktion OnTick()
Ja.
Ich habe sozusagen beendet, was ich konnte. Die Beschreibung ist fertig. Es geht darum, zu verstehen, warum es nicht so funktioniert, wie ich es möchte.
Innerhalb des if()-Blocks befindet sich else . War das wirklich so beabsichtigt?
Weiter. Die Funktion Counts() akzeptiert eine nicht initialisierte globale Variable count, die außerdem innerhalb der Funktion noch einmal definiert wird.
Die Funktion Counts() zählt die Aufträge, vergleicht sie aber mit einem Ticket, das sich in der Hauptfunktion mehrmals ändert. Der Ticketwert bleibt jedoch während des Funktionsablaufs gleich. Wie viele Aufträge wird die Funktion also berechnen? Ist es mehr als einer?
In dieser Form benötigt die Funktion keine Argumente, sondern wird einfach aufgerufen und gibt das Ergebnis zurück.
Nächste. Die Funktion FindLastOType() ist wiederum ein Vergleich mit dem Ticket. Können Sie garantieren, dass er mit einem gültigen Fahrschein verglichen wird? Ist es nicht einfacher, die Schleife zu unterbrechen, wenn der erste Auftrag mit der erforderlichen magischen Zahl und dem Symbol gefunden wird, und dann die Auftragsart zurückzugeben?
Dasselbe gilt für FindLastOrderOpenPrice() und FindLastLot().
Die Funktion ModifyOrders() hat mich so erschreckt, dass ich mich lange Zeit nicht damit befasst habe, um nächtliche Albträume zu vermeiden...
Bitte nehmen Sie Korrekturen am Code vor
Versuchen Sie es ^_~
extern double TakeProfit = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int Delta = 100; //Расстояние от цены для установки ордера
extern double LOT = 0.1; //Объём позиции
extern int Magic =2;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int res = 0;
//ИНДИКАТОР RSI
double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
double BuyPrice=Ask+Delta*Point;
double SellPrice=Bid-Delta*Point;
//---- buy stop
if(RSI0>50&&RSI1<50 && Number(OP_BUYSTOP)<0 && Number(OP_BUY)<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
}
//---- sell stop
if(RSI0<50&&RSI1>50 && Number(OP_SELLSTOP)<0 && Number(OP_SELL)<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
}
//----
if (RSI0>50&&RSI1<50) OrderDelete_(OP_SELLSTOP);
if (RSI0<50&&RSI1>50)OrderDelete_(OP_BUYSTOP);
}
//+------------------------------------------------------------------+
void OrderDelete_(int Type)
{
bool r;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==Type)
r = OrderDelete(OrderTicket());
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Number(int Type)
{
int kp=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==Type)
kp++;
}
}
return(kp);
}
//+------------------------------------------------------------------+
Innerhalb des if()-Blocks gibt es ein else . Sollte es wirklich so sein?
Weiter. Die Funktion Counts() akzeptiert eine nicht initialisierte globale Variable count, die auch in der Funktion selbst noch einmal deklariert wird.
Die Funktion Counts() zählt die Aufträge, vergleicht sie aber mit einem Ticket, das sich in der Hauptfunktion mehrmals ändert. Der Ticketwert bleibt jedoch während des Funktionsablaufs gleich. Wie viele Aufträge wird die Funktion also berechnen? Ist es mehr als einer?
In dieser Form benötigt die Funktion keine Argumente, sondern wird einfach aufgerufen und gibt das Ergebnis zurück.
Nächste. Die Funktion FindLastOType() ist wiederum ein Vergleich mit dem Ticket. Können Sie garantieren, dass er mit einem gültigen Fahrschein verglichen wird? Ist es nicht einfacher, die Schleife zu unterbrechen, wenn der erste Auftrag mit der erforderlichen magischen Zahl und dem Symbol gefunden wird, und dann die Auftragsart zurückzugeben?
Dasselbe gilt für FindLastOrderOpenPrice() und FindLastLot().
Die Funktion ModifyOrders() hat mich so erschreckt, dass ich mich lange Zeit nicht damit befasst habe, um nächtliche Albträume zu vermeiden...
Berichtigung
Anders kann man es nicht ausdrücken, es wäre ein falscher Parameter.
Sie muss den neuesten Stand der Dinge berücksichtigen
Ich werde versuchen, es zu ändern.
Ich habe versucht, die Standardfunktion OrderModify() zu verwenden, aber sie wird blockiert, wenn ich eine Reihe von Aufträgen gleichzeitig und ständig verschiebe
Danke für die Kritik.
Ja, das ist ein Druckfehler in der Klammer. Der Rest der Frage ist berechtigt.
bool condition;
if(condition) {}
gleichbedeutend mit
if(condition==true) {}
и
if(!condition) {}
ist gleich
if(condition==false) {}
Er ist einfach kürzer und vertrauter.