Nützliche Funktionen von KimIV - Seite 85

 

Daraufhin wurde dem Abschlussblock eine benutzerdefinierte Positionszählung hinzugefügt, was zu einem "korrekten" Abschluss führte, aberder Fehler 131 erscheint immer noch ein paar Mal im Protokoll:

Ist ein solches Einfügen einer Auftragszählung in eine Schleife normal, wenn man bedenkt, dass es bereits eine Auftragsprüfung gibt und

Könnten Sie den Code korrigieren, um den Fehler 131 zu vermeiden?

Ich danke Ihnen vielmals.

Dateien:
codz2.mq4  5 kb
 
hope писал(а) >>

Könnten Sie bitte den Code ändern, um den Fehler 131 zu vermeiden?

Ich danke Ihnen vielmals.

Und wer wird die Losgröße nach der Teilung für Sie normalisieren? Daher der Fehler.

 

Alex, bevor Sie das Los an die Funktion close übergeben, normalisieren Sie seine Größe mit NormalizeLot().

 

Danke Igor, Alexander,

In der Tat habe ich die Lose überprüft, indem ich Lot/3 (Lot/2, Lot) durch 0,01 in der Funktion SELLCLOSED_1=OrderClose( OrderTicket(), Lot/3, Ask, 0, Red ); ersetzt habe, und den Fehler 131 vermieden. Wir könnten es dabei belassen (0,01), aber zunächst ist es korrekter, in der Lot-Form zu schließen. Zweitens bin ich noch nie mit Benutzerfunktionen und deren Aufruf im Programm in Berührung gekommen, was sich als sehr interessant herausstellte. Ich scheine alles korrekt in den Code eingefügt zu haben und alles funktioniert, aber der Fehler 131 bleibt bestehen. Schauen Sie sich bitte den Code an. Vielleicht habe ich beim Aufruf der Funktion NormalizeLot etwas falsch gemacht.

Dateien:
cod3.mq4  6 kb
 

Entschuldigung. Im ursprünglichen Code ist die Zeile

RefreshRates();
BUYCLOSED_1=OrderClose( OrderTicket(), CloseLot, Bid, 0, Red );

ist der korrekte LotClose, wie in der Bedingung angegeben.

Lot =OrderLots(); // ANZAHL DER LOTS
LotClose =NormalizeLot(Lot); // der Wert des NORMALIZIERTEN LOS wird dem GESCHLOSSENEN LOS zugewiesen

falsch bei Buchung........

 
hope писал(а) >>

Schauen Sie sich bitte den Code an. Vielleicht haben Sie beim Aufruf der Funktion NormalizeLot etwas falsch gemacht.

Versuchen Sie zu ersetzen

  if ( ro) l=MathCeil( lo* k)/ k; else l=MathFloor( lo* k)/ k;

zu

  if ( ro) l=NormalizeDouble(MathCeil( lo* k)/ k,2); else l=NormalizeDouble(MathFloor( lo* k)/ k,2);
 

Guten Morgen Alexander,

Leider hat Ihr Tipp nicht geholfen. Ich habe das Protokoll analysiert und festgestellt, dass der Fehler in zwei Fällen auftritt, wenn der Abschluss eines Teils eines Loses fast mit dem Abschluss eines anderen Teils des Loses zusammenfällt.

Wenn es kein zeitliches Zusammentreffen gibt, wird ein Teil der Partie ohne Fehler abgeschlossen.

Ich habe versucht, die Lose für den Kauf am Ende und die Lose für den Verkauf am Ende separat zu normalisieren, aber ohne Erfolg:

doppelt
Los, // Anzahl der Lose in der ausgewählten Reihenfolge
LotCloseBuy,
LotCloseSell,

............................

Lot =OrderLots();
LotCloseBuy =NormalizeLot(Lot);

LotCloseSell =NormalizeLot(Lot);

............................

BUYCLOSED_3=OrderClose( OrderTicket(), LotCloseBuy, Bid, 0, Red )

...........................

SELLCLOSED_3=OrderClose( OrderTicket(), LotCloseSell, Ask, 0, Red );

...................

Igors Funktion

NormalisierenLos.........

Haben Sie eine Idee?

 

Was bin ich doch für ein Schaf! Igitt - ist das eklig....

Normalisierung der Lose in der Auftragsschleife

//--------------------------------------------------------------- 4 --
// Zählende Aufträge
Symb=Symbol(); // Name des fin.instr.
BuyTotal=0; // Anzahl der Kaufaufträge
SellTotal=0; // Anzahl der Verkaufsaufträge
for(int i=1; i<=OrdersTotal(); i++) // Orderschleife
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Wenn folgende
{ // Orderanalyse:
if (OrderSymbol()!=Symb)continue; // Nicht unser Finanzinstrument
if (OrderType()>1) // Pending
{
Alert(" Pending order detected. Expert Advisor not working.");
return; // Exit start()
}
if (OrderType()==OP_BUY)
{
BuyTotal++; // Zähler für Kaufaufträge
BuyOrdOpPrice=OrderOpenPrice(); // Offener Kaufkurs
}
if (OrderType()==OP_SELL)
{
SellTotal++; // Zähler für Verkaufsaufträge
SellOrdOpPrice=OrderOpenPrice(); // Offener Verkaufskurs
}
Ticket=OrderTicket(); // Gewählte Auftragsnummer.
Tip =OrderType(); // Typ der ausgewählten Bestellung.
Lot =OrderLots();

LotCloseBuy =NormalizeLot(Lot);

LotCloseSell =NormalizeLot(Lot);
}
}

.... und ich habe eine separate Schleife erstellt, um offene Aufträge zu berücksichtigen, bei denen ich Lose normalisieren musste, um sie zu schließen!!!

//--------------------------------------------------------------- 6 --

// Überprüfung der offenen Aufträge
int _GetLastError = 0, _OrdersTotal = OrdersTotal();
int z;


//---- alle offenen Positionen durchlaufen
for ( z = _OrdersTotal-1 ; z >=0; z -- )
{
//Die Schleife für - alle offenen Aufträge durchlaufen
//---- wenn ein Fehler bei der Positionsauswahl auftritt, weiter zum nächsten
if ( !OrderSelect( z, SELECT_BY_POS ) ) )
{
_GetLastError = GetLastError();
Print("OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
continue;
}
//Fertig
//Bindung an Währung und Majik
//---- wenn Position nicht durch aktuelles Instrument geöffnet, überspringe sie
if ( OrderSymbol() != Symbol() ) continue; // ERROR
//Fertig

//---- wenn MagicNumber nicht gleich Expert_ID ist, diese Position überspringen
if ( OrderMagicNumber() != Expert_ID ) continue; // ERROR
//Finished
if (OrderType()==OP_BUY)
{
BuyClot=OrderLots();
}
if (OrderType()==OP_SELL)
{
SellClLot=OrderLots();
}
OpenedLots=OrderLots();
LotCloseBuy =NormalizeLot(OpenedLots); // Anzahl der Lose
LotCloseSell =NormalizeLot(OpenedLots); // Anzahl der Lose

//Prüfen, ob eine Kaufposition eröffnet ist,

........................................

Danke, Igor, Alexander. Ohne die Funktion der Losnormalisierung würde es immer noch zu einer Sackgasse kommen....

 

Guten Abend,

Und der allererste Fehler, der auftritt:

2009.07.08 21:05:45 TestGenerator: Nicht übereinstimmende Datenfehler (Volumengrenze 651 am 2009.07.08 19:00 überschritten)
ist kritisch oder ist es nur ein Testerfehler?

Ich danke Ihnen.

 
Igor - bitte sehen Sie sich den "GAP-Indikator" hier an