Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 31
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
Der Fehler liegt irgendwo weiter oben im Code, im Bereich der Auftragsauswahl.
Den Rest rühre ich nicht an.
In jedem Fall müssen Sie den vorangehenden und den nachfolgenden Code sehen, nicht nur die Bedingungszeilen.
...
Möchten Sie den Code bereinigen und ihn richtig einfügen, indem Sie den SRC verwenden?
Warum wenden Sie OrderSelect nicht an, bevor Sie versuchen zu löschen?
...
Ich weiß nicht, warum Sie dort so viele Schleifen benötigen, wenn Sie die erforderlichen Strukturfelder über die Anzahl der Aufträge und Positionen in einer einzigen ausfüllen können.
Ich habe unnötige Dinge entfernt, und ich habe auch die Löschung entfernt. Sie brauchen nicht nach Ticket zu löschen (Sie müssen es vor dem Löschen immer noch wissen), sondern in der Schleife die richtige Reihenfolge nach Index zu finden und sie zu löschen.
Wir brauchen also eine weitere Funktion zum Suchen und Löschen von Aufträgen, die im Falle einer Bedingung aufgerufen werden sollte, aber welche Art von Bedingung - das habe ich nicht sofort verstanden, als ich mir Ihren Code ansah, und ich hatte keine Zeit, ihn durchzusehen. Beschreiben Sie die notwendigen Bedingungen in Worten und wir sagen Ihnen, wie Sie löschen können.
Ich hatte es selbst geschrieben, ohne nachzusehen, daher kann es Fehler in der Funktion geben, die die Struktur mit der Anzahl der Aufträge und Positionen füllt - ich habe es nicht überprüft.
input double LotB=0.1; // Лот Buy
input double LotS=0.1; // Лот Sell
input int Pointsl=100; // StopLoss в пунктах
input int Pointtp=100; // TakeProfit в пунктах
input int NumBars=10; // Количество баров для поиска Max/Min
input int Magic=100500; // Magic
//--- global variables
struct DataNumOrders
{
int buy; // Количество позиций Buy
int sell; // Количество позиций Sell
int buy_limit; // Количество ордеров BuyLimit
int buy_stop; // Количество ордеров BuyStop
int sell_limit; // Количество ордеров SellLimit
int sell_stop; // Количество ордеров SellStop
};
DataNumOrders numOrders; // Количество ордеров
double lotB, lotS;
int pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
numBars=(NumBars<1?1:NumBars>Bars?Bars:NumBars);
pointsl=(Pointsl<0?0:Pointsl);
pointtp=(Pointtp<0?0:Pointtp);
double minLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
double maxLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- заполним структуру количеством ордеров и позиций
GetNumOrders(Symbol(),Magic,numOrders);
//--- найдём максимальную и минимальную цены за bars свечей
double maxPrice=0.0; double minPrice=DBL_MAX;
for(int i=0; i<numBars; i++) {
double max_i=iHigh(Symbol(),PERIOD_CURRENT,i);
if(max_i>maxPrice) maxPrice=max_i;
double min_i=iLow(Symbol(),PERIOD_CURRENT,i);
if(min_i<minPrice) minPrice=min_i;
}
//--- выставим BuyLimit
if(numOrders.buy_limit==0 && numOrders.buy==0) {
double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits()));
double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits()));
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed);
if(ticketUP==-1) Print("ERROR OP_BUY");
else Print("OP_BUY OK");
}
//--- выставим SellLimit
if(numOrders.buy_limit==0 && numOrders.sell==0) {
double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits()));
double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits()));
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue);
if(ticketD==-1) Print("ERROR OP_SELL");
else Print("OP_SELL OK");
}
//--- Тут должно быть удаление, но не понятно при каких условиях. Опишите их
//---
string a=(numBars==1)?"bar: ":IntegerToString(numBars,1)+" bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxPrice, Digits()), ", min ", DoubleToStr(minPrice, Digits()),".");
}
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров |
//+------------------------------------------------------------------+
void GetNumOrders(string symbol_name, int magic_number, DataNumOrders &number_of) {
ZeroMemory(number_of);
for(int i=OrdersTotal()-1; i>=0; i--) {
if(OrderSelect(i,SELECT_BY_POS)) {
if(OrderMagicNumber()!=magic_number) continue;
if(OrderSymbol()!=symbol_name) continue;
if(OrderType()==OP_BUY) number_of.buy++;
if(OrderType()==OP_BUYLIMIT) number_of.buy_limit++;
if(OrderType()==OP_BUYSTOP) number_of.buy_stop++;
if(OrderType()==OP_SELL) number_of.sell++;
if(OrderType()==OP_SELLLIMIT) number_of.sell_limit++;
if(OrderType()==OP_SELLSTOP) number_of.sell_stop++;
}
}
}
//+------------------------------------------------------------------+
Was wollen Sie generell mit diesem, Entschuldigung, gruseligen Code erreichen?
wie man das Folgende schreibt:
Wenn sich der Kurs um 1% verändert hat, z.B. am OPEN-Tag um 1% mehr als am Slose-Tag
wie man das Folgende schreibt:
Wenn sich der Kurs um 1 % verändert hat, ist der OPEN-Tag beispielsweise um 1 % größer als der Close-Tag.
Das ist etwas anderes, jetzt ist klar, worauf sich die 1% beziehen ;)
Der Expert Advisor zählt die Minimal- und Maximalwerte der letzten X Bars und platziert die Orders nach diesen Werten. Wenn es eine Verringerung des Maximums oder eine Erhöhung des Minimums gibt, müssen Sie den entsprechenden Auftrag löschen und ihn mit den neuen Daten öffnen.
Warum sollten Sie löschen, wenn Sie den festgesetzten Preis und den Stop und Takeout relativ zum neuen Niveau ändern können? Schließlich geben Sie nur dann schwebende Aufträge auf, wenn es keine schwebenden Aufträge und keine Marktpositionen gibt. Wenn also eine schwebende Order auf dem Markt ist und es keine entsprechende Marktposition gibt, dann müssen wir nur die Preise der schwebenden Order ändern - den Set-Preis auf ein neues Niveau und die Stop-Order auf das neue Niveau.
Sie müssen sich jedes Mal die gefundenen Preise von Max und Min merken. Wenn der aktuell gefundene Preis von Max niedriger ist als der vorherige, ändern wir das ausstehende BuyLimit und speichern den neuen Preis von Max. Für Min Preis, Spiegel es.