Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 33
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
Guten Tag. Können Sie mir sagen, wo der Fehler liegt?
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=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double 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;}}
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==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
}
Alles funktioniert, er gibt eine Bestellung zum Preis von maxpr1 auf.
Dann möchte ich dasselbe tun, aber zum Preis von minpr1:
double slB, tpB, slS, tpS; double x=0, z=0; int ticketUP, ticketD;
void OnTick()
{
double maxpr1=-9999; double 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;}}
slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
}
Fehler 130 (falsche Haltestellen). Was mache ich falsch?
Wenn Sie einen schwebenden Auftrag erteilen, darf der Eröffnungskurs nicht zu nahe am Markt liegen. Der Mindestabstand des schwebenden Preises zum aktuellen Marktpreis in Punkten kann auch mit der Funktion MarketInfo() mit dem Parameter MODE_STOPLEVEL ermittelt werden. Wenn der Eröffnungskurs des schwebenden Auftrags falsch ist, wird ein Fehler 130 (ERR_INVALID_STOPS) erzeugt.
Nein, das ist es nicht, die Lücke ist da. Außerdem habe ich versucht, meine ausstehenden Käufe zu ändern, und habe es mit demselben Diagramm getestet, mit demselben Fehler.
Eine Lücke ist eine Lücke, aber Sie haben wahrscheinlich nicht alles gelesen, was hier steht
....... Wennder Eröffnungskurs des schwebenden Auftrags falsch ist, wird der Fehler 130 (ERR_INVALID_STOPS).......... erzeugt.
d.h. Sie versuchen, OP_SELLLIMIT unter den Marktpreis zu setzen.
Eine Lücke ist eine Lücke, aber Sie haben wahrscheinlich nicht alles gelesen, was hier steht
....... Wennder Eröffnungskurs des schwebenden Auftrags falsch ist, wird der Fehler 130 (ERR_INVALID_STOPS).......... erzeugt.
d.h. Sie versuchen, OP_SELLLIMIT unter den Marktpreis zu setzen.
for(int i2=total-1; i2>=0; i2--)
if(OrderSelect(i2, SELECT_BY_POS))
if(OrderSymbol()==Symbol() )
if (OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY)
{
if (sig2==1) {bool cl = OrderClose(OrderTicket(),OrderLots(),Bid,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
}
if (OrderType()==OP_SELL)
{
if (sig2==2) {bool cl = OrderClose(OrderTicket(),OrderLots(),Ask,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
}
if (OrderType()==OP_BUYSTOP)
{
if (sig2==2&&Delete_Order==true) {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
//if (sig==1&&OrderOpenPrice()!=buystop_open&&Ask<buystop_open-stops) {bool mod = OrderModify(OrderTicket(),buystop_open,buystop_sl,0,0);Print("Мод. цены бай стоп=" ,buystop_open,", СЛ=",buystop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
}
if (OrderType()==OP_SELLSTOP)
{
if (sig2==1&&Delete_Order==true) {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
//if (sig==1&&OrderOpenPrice()!=sellstop_open&&Bid>sellstop_open+stops) {bool mod = OrderModify(OrderTicket(),sellstop_open,sellstop_sl,0,0);Print("Мод. цены бай стоп=" ,sellstop_open,", СЛ=",sellstop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
}
}
}
//+------------------------------------------------------------------+
if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // Kaufstopp
Es gibt kein Signal, einen offenen Handel von selbst zu schließen.
if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // Kaufstopp
Es gibt kein Signal, das den Ausstieg aus einem Handel von sich aus anzeigt.
Bei Takt Null "flackert" das Signal, was im Nachhinein nicht sichtbar ist. Führen Sie die Visualisierung für alle Zecken im Tester aus, die Fragen verschwinden dann.
Das ist nicht das Problem. Wenn eine Order ausgelöst wird, wird ein Handel eröffnet und sofort wieder geschlossen, wenn eine neue Kerze erscheint und es kein Umkehrsignal gibt. Deshalb habe ich Ihnen einen Code zum Schließen von Trades gegeben.
Hallo.
Können Sie mir sagen, was los ist?
Das Symbol sollte gesetzt werden, wenn die Indikatorlinie in der Periode M1 den Wert 20 überschritten hat und in der Periode M5 über dem Wert 50 liegt.
Aus irgendeinem Grund wird die Markierung auch dann gesetzt, wenn die Linie auf M5 unter dem festgelegten Wert von 50 liegt.
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;
for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
{
UP[i]=Low[i]-distance*MyPoint;
}
//if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
//{
// DOWN[i]=High[i]+distance*MyPoint;
//}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
Hallo.
Können Sie mir sagen, was los ist?
Das Symbol sollte gesetzt werden, wenn die Indikatorlinie in der Periode M1 den Wert 20 überschritten hat und in der Periode M5 über dem Wert 50 liegt.
Aus irgendeinem Grund wird das Zeichen auch dann gesetzt, wenn die Linie auf der M5 unter dem festgelegten Wert von 50 liegt.
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;
for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
{
UP[i]=Low[i]-distance*MyPoint;
}
//if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
//{
// DOWN[i]=High[i]+distance*MyPoint;
//}
}
//--- return value of prev_calculated for next call
return(rates_total);
}
Ihr Zyklus ist seltsam. Seltsam.
if(rates_total<xxx) return(0); // xxx здесь - количество баров, при которых невозможно рассчитать индикатор
int limit=rates_total-prev_calculated;
if(limit>1) { // limit больше 1 в том случае, когда в истории произошли изменения
limit=rates_total-1; // не обязательно -1, если в цикле есть i+1, значит limit=rates_total-2, и т.д., и т.п.
// тут проводим действия когда нужно пересчитать всю историю
}
//---
for(int i=limit; i>=0; i--) {
// основной цикл индикатора
}
//+------------------------------------------------------------------+
Warum die Prüfung auf mehr als 1. Zum Beispiel wird die Historie geladen und die Differenz wird größer als eins sein. Wenn alles normal ist, wird die Differenz rates_total-prev_calculated entweder 0 oder 1 sein.
0 - ein neuer Tick ist gekommen und ein neuer Balken hat noch nicht begonnen, sich zu bilden.
1 - ein neuer Tick ist gekommen und ein neuer Balken hat sich gebildet
Zeigen Sie uns Ihren gesamten Indikator, damit wir sehen, was falsch ist.