Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 33

 
spoiltboy:

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:

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(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.

 
Alekseu Fedotov:
Nein, das ist es nicht, die Lücke ist da. Ich habe auch versucht, die ausstehenden Käufe zu ändern, ich habe es auf dem gleichen Chart getestet und es hat die gleichen Fehler gemacht.
 
spoiltboy:
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.

 
Alekseu Fedotov:

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.

Ich danke Ihnen.
 
//------------закрываем ордер по обратному сигналу удаляем или модифицируем отложки------

  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 (FMA1<GrossMA1 && FMA2>GrossMA2 ) {sig=2;} // Verkaufsstopp

if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // Kaufstopp

Es gibt kein Signal, einen offenen Handel von selbst zu schließen.

 
Movlat Baghiyev:
if (FMA1<GrossMA1 && FMA2>GrossMA2 ) {sig=2;} // Verkaufsstopp

if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // Kaufstopp

Es gibt kein Signal, das den Ausstieg aus einem Handel von sich aus anzeigt.

Auf dem Nullbalken "flackert" das Signal, was im Nachhinein nicht sichtbar ist. Führen Sie die Visualisierung für alle Zecken im Tester durch, die Fragen werden verschwinden.
 
Vitalie Postolache:
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 ein Stück Code zum Schließen von Trades gegeben.
 
Movlat Baghiyev:
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.
Sie müssen die Variable"sig" nach dem Setzen auf Null setzen, da das Signal konstant bleibt. Wenn Sie es auf Null setzen, wird die Variable nach dem nächsten Durchgang wieder einen Wert annehmen und nach Abschluss aller Aktionen wieder auf Null gesetzt. Oder Sie können eine Flagge setzen, die besagt, dass, wenn es eine Kreuzung nach oben gab, die nächste Kreuzung nach unten sein sollte, und wenn es keine Kreuzung nach unten gibt, dann werden alle Signale ignoriert, bis es eine Kreuzung nach hinten gibt.
 

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.

int OnCalculate(const int rates_total,
                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);
  }
 
mila.com:

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.

int OnCalculate(const int rates_total,
                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.

Grund der Beschwerde: