Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 33

 
spoiltboy:

Bene. Puoi dirmi dov'è l'errore?

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");
  } 

Tutto funziona, fa un ordine al prezzo di maxpr1.

Poi voglio fare lo stesso, ma al prezzo 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");
  }

Errore 130 (fermate sbagliate). Cosa sto facendo di sbagliato?


Quando piazzi un ordine pendente, il prezzo di apertura non può essere troppo vicino al mercato. La distanza minima del prezzo in sospeso dal prezzo corrente di mercato in punti può anche essere ottenuta usando la funzione MarketInfo() con il parametro MODE_STOPLEVEL. Se il prezzo aperto dell'ordine pendente non è corretto, verrà generato un errore 130 (ERR_INVALID_STOPS).

 
Alekseu Fedotov:
No, non è questo, il divario è lì. Ho anche provato a cambiare il buy pending, l'ho provato sullo stesso grafico e ha fatto gli stessi errori.
 
spoiltboy:
No, non è questo, il divario è lì. Inoltre, ho provato a cambiare il mio Buy pending, testato sullo stesso grafico, stessi errori.

Una lacuna è una lacuna, ma probabilmente non hai letto tutto ciò che segue

....... Se ilprezzo aperto dell' ordine pendente non è corretto, verrà generato l'errore 130 (ERR_INVALID_STOPS)...........

Cioè state cercando di impostare OP_SELLLIMIT al di sotto del prezzo di mercato.

 
Alekseu Fedotov:

Una lacuna è una lacuna, ma probabilmente non hai letto tutto quello che segue

....... Se ilprezzo aperto dell' ordine pendente non è corretto, verrà generato l'errore 130 (ERR_INVALID_STOPS)...........

Cioè state cercando di impostare OP_SELLLIMIT al di sotto del prezzo di mercato.

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

  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;} // vendere stop

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

Non c'è nessun segnale per chiudere un trade aperto da solo.

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

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

Non c'è nessun segnale per uscire da un trade da solo.

Sulla barra zero il segnale "sfarfalla" che non è visibile post factum. Esegui la visualizzazione su tutte le zecche nel tester, le domande scompariranno.
 
Vitalie Postolache:
Alla barra zero il segnale "sfarfalla", il che non è visibile a posteriori. Esegui la visualizzazione su tutte le zecche nel tester, le domande scompariranno.
Non è questo il problema. Quando scatta un ordine, un trade si apre e si chiude immediatamente quando appare una nuova candela e non c'è un segnale di inversione. Ecco perché ti ho dato un pezzo di codice per chiudere i trade.
 
Movlat Baghiyev:
Non è questo il problema. Quando un ordine viene attivato, viene aperto un trade che viene immediatamente chiuso quando appare una nuova candela e non c'è un segnale di inversione. Ecco perché ti ho dato un pezzo di codice per chiudere i trade.
È necessario annullare la variabile"sig" dopo l'impostazione perché il segnale sarà costante, se la si annulla, allora la variabile prenderà di nuovo valore dopo il prossimo attraversamento e la si annulla di nuovo dopo aver completato tutte le azioni. Oppure si può mettere una bandiera che se c'è stato un incrocio in alto, il prossimo dovrebbe essere in basso e se non c'è un incrocio in basso, allora tutti i segnali vengono ignorati fino a quando non c'è un incrocio inverso
 

Salve.

Puoi dirmi cosa c'è che non va?

L'icona dovrebbe essere impostata se la linea dell'indicatore ha attraversato il livello 20, sul periodo M1, e la linea dell'indicatore è sopra il livello 50, sul periodo M5.

Per qualche ragione il marchio è impostato anche se la linea su M5 è sotto il livello impostato di 50.

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:

Salve.

Puoi dirmi cosa c'è che non va?

L'icona dovrebbe essere impostata se la linea dell'indicatore ha attraversato il livello 20, sul periodo M1, e la linea dell'indicatore è sopra il livello 50, sul periodo M5.

Per qualche motivo il segno è impostato anche se la linea su M5 è sotto il livello impostato di 50.

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);
  }

Il tuo ciclo è strano. Strano.

//+------------------------------------------------------------------+
   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--) {
      // основной цикл индикатора
      }
//+------------------------------------------------------------------+

Perché limitare il controllo per più di 1. Per esempio, la storia viene caricata e la differenza sarà maggiore di uno. Se tutto è normale, allora la differenza rates_total-prev_calculated sarà o 0 o 1
0 - un nuovo tick è arrivato e una nuova barra non ha iniziato a formarsi.
1 - un nuovo tick è arrivato e una nuova barra ha iniziato a formarsi

Mostraci tutto il tuo indicatore - vediamo cosa c'è di sbagliato.