Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 35

 

Hallo!
Um den Indikator zu korrigieren, mussten Sie alle Punkte "." durch ein leeres "" ersetzen.

Dateien:
supDem.zip  68 kb
 

Grüße.

Ich habe die Art derAuftragsauswahl in der geschriebenen Funktion bestimmter Auftragszählungen von Auswahl nach Auftrag auf Auswahl nach Ticket geändert.

int BuyLimitCount(){
int count=0
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POSMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}  

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

Danach, wenn ein paar Dutzend Kerzen laufen, funktioniert alles korrekt, und danach gibt es wiederholt Fehler im Protokoll:

2016.12.17 17:44:31.609 2016.12.07 00:27 test3 EURUSD,M1: unbekanntes Ticket 2 für OrderModify-Funktion

2016.12.17 17:44:31.608 2016.12.07 00:25 test3 EURUSD,M1: OrderModify error 4108 // Ungültige Ticketnummer.

Hier ist der vollständige Text, ich habe ihn in allen vier Funktionen geändert:

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0int ticketUP, ticketD;


void OnTick()  
{
double maxpr1=-9999double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}} 

if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1Print("ERROR OP_BUY"); else Print("OP_BUY OK");}

if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1Print("ERROR OP_SELL"); else Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1;
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
OrderModify(ticketD, maxpr1, slS, tpS, 0, Blue);}

if (z!=minpr1){z=minpr1;
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
OrderModify(ticketUP, minpr1, slB, tpB, 0, Red);}

double maxpr=-9999double minpr=9999;

for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}

for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}} 

string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max "DoubleToStr(maxpr, 5), ", min "DoubleToStr(minpr, 5),".");
}

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

int BuyCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}return(count);}

int SellLimitCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}return(count);}

int SellCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}return(count);}


Und hier gibt es einen Moment - nachdem ich die Auswahlfunktion geändert hatte, begann die Funktion zum Ändern von Aufträgen einen Fehler zu erzeugen, und erst nach einiger Zeit desTestens war zunächst alles normal.

Warum passiert das und wie kann man damit umgehen?


 
spoiltboy:

Grüße.

Ich habe die Art derAuftragsauswahl in der geschriebenen Funktion bestimmter Auftragszählungen von Auswahl nach Auftrag auf Auswahl nach Ticket geändert.

int BuyLimitCount(){
int count=0
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POSMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}  

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

Danach, wenn ein paar Dutzend Kerzen laufen, funktioniert alles korrekt, und danach gibt es wiederholt Fehler im Protokoll:

2016.12.17 17:44:31.609 2016.12.07 00:27 test3 EURUSD,M1: unbekanntes Ticket 2 für OrderModify-Funktion

2016.12.17 17:44:31.608 2016.12.07 00:25 test3 EURUSD,M1: OrderModify error 4108 // Ungültige Ticketnummer.

Hier ist der vollständige Text, ich habe ihn in allen vier Funktionen geändert:

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0int ticketUP, ticketD;


void OnTick()  
{
double maxpr1=-9999double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}} 

if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1Print("ERROR OP_BUY"); else Print("OP_BUY OK");}

if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1Print("ERROR OP_SELL"); else Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1;
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
OrderModify(ticketD, maxpr1, slS, tpS, 0, Blue);}

if (z!=minpr1){z=minpr1;
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
OrderModify(ticketUP, minpr1, slB, tpB, 0, Red);}

double maxpr=-9999double minpr=9999;

for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}

for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}} 

string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max "DoubleToStr(maxpr, 5), ", min "DoubleToStr(minpr, 5),".");
}

int BuyLimitCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

int BuyCount(){
int count=0
if(OrderSelect(ticketUP, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}return(count);}

int SellLimitCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}return(count);}

int SellCount(){
int count=0
if(OrderSelect(ticketD, SELECT_BY_TICKETMODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}return(count);}


Und hier gibt es einen Moment - nachdem ich die Auswahlfunktion geändert hatte, begann die Funktion zum Ändern von Aufträgen einen Fehler zu erzeugen, und erst nach einiger Zeit desTestens war zunächst alles normal.

Warum passiert das und wie kann man damit umgehen?


Höchstwahrscheinlich erhalten Sie diese Fehlermeldung, weil Sie versuchen, einen Auftrag zu ändern, der bereits ausgelöst oder gelöscht wurde. Sie sollten die Variablen löschen, in denen das Ticket für den schwebenden Auftrag gespeichert ist, zum Beispiel, wenn der schwebende Auftrag ausgelöst wurde.
 
Sergey Gritsay:
Wahrscheinlich erhalten Sie diese Fehlermeldung, weil Sie versuchen, einen schwebenden Auftrag zu ändern, der bereits ausgelöst oder gelöscht wurde. Sie müssen die Variablen zurücksetzen, in denen das schwebende Ticket gespeichert ist, z. B. wann der schwebende Auftrag ausgelöst wurde.
Wissen Sie, wie man es richtig macht? Ich habe keine Ahnung, wie man das macht.
 

Hallo zusammen, helfen Sie mir zu verstehen, was falsch ist.

Mein Expert Advisor öffnet ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,0,0, "AV2",1111,0,Green);

МТ4 schließen, МТ4 öffnen und nach früheren Arbeiten des EA suchen

for(int prev=0; prev<OrdersTotal();prev++) //Prüfung der vorherigen EA-Operation

{

ViborOrdera=OrderSelect(prev,SELECT_BY_POS);

if(AuftragsSymbol()==Symbol())

//*************************************

//-------Check the Purchasing cycle--------

if(OrderType()==OP_BUY && OrderMagicNumber()==1111)

{

PriceAsk=OrderOpenPrice();//offener Preis, benötigt für die weitere Arbeit des EA

}

Frage: Wo liegt der Fehler, gibt es keine Prüfung? Der Hauptteil der Schleife befindet sich in der Inite.

 

Keine Zeit, das zu klären..........

Versuchen Sie zu lesen und an den richtigen Stellen zu platzieren.

boolRefreshRates();

///
 
ed3sss:

Hallo zusammen, helfen Sie mir zu verstehen, was falsch ist.

Mein Expert Advisor öffnet ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,3,0,0, "AV2",1111,0,Green);

МТ4 schließen, МТ4 öffnen und nach früheren Arbeiten des EA suchen


Frage: Wo liegt der Fehler, wenn es keine Prüfung gibt? Der Hauptteil der Schleife ist in Inite.

Und beweisen Sie, dass es die Schleife ist, die nicht in die Schleife eintritt. Und warum sollten Sie ALLE Aufträge überprüfen, von Anfang an, wenn Sie nur die letzten brauchen?
 
Mikhail Kozhemyako:

Keine Zeit, das zu klären..........

Versuchen Sie zu lesen und an den richtigen Stellen zu platzieren.

boolRefreshRates();

///
Hat nicht geholfen(
 
Vitalie Postolache:
Und beweisen Sie, dass es der Kreislauf ist, der nicht in Gang kommt. Außerdem, warum sollten wir ALLE Aufträge von Anfang an prüfen, wenn wir nur die neuesten brauchen?

Beweis: Print("Previous PriceAsk-",PriceAsk); das Protokoll ist leer.

Außerdem, warum sollten wir ALLE Aufträge von Anfang an prüfen, wenn wir nur die neuesten brauchen? - Wie soll man es sonst machen, wenn 10 Währungspaare geöffnet sind?


 

Alles war in Ordnung, bis wir ViborOrdera=OrderSelect(prev,SELECT_BY_POS) in MQL geändert haben;

Früher hieß esOrderSelect(prev,SELECT_BY_POS);. Das ist zwar schon lange her, aber es hat funktioniert.

Grund der Beschwerde: