Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 33

 
spoiltboy:

Bon après-midi. Pouvez-vous me dire où se trouve l'erreur ?

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

Tout fonctionne, passe une commande au prix de maxpr1.

Ensuite, je veux faire la même chose, mais au prix 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");
  }

Erreur 130 (arrêts erronés). Qu'est-ce que je fais de mal ?


Lorsque vous passez un ordre en suspens, le prix d'ouverture ne peut pas être trop proche du marché. La distance minimale du prix en suspens par rapport au prix actuel du marché en points peut également être obtenue en utilisant la fonction MarketInfo() avec le paramètre MODE_STOPLEVEL. Si le prix ouvert de l'ordre en attente est incorrect, une erreur 130 (ERR_INVALID_STOPS) sera générée.

 
Alekseu Fedotov:
Non, ce n'est pas ça, l'écart est là. J'ai également essayé de modifier l'achat en attente, je l'ai testé sur le même graphique et il a fait les mêmes erreurs.
 
spoiltboy:
Non, ce n'est pas ça, l'écart est là. De plus, j'ai essayé de changer mon Buy pending, je l'ai testé sur le même graphique, mêmes erreurs.

Une lacune est une lacune, mais vous n'avez probablement pas lu tous les points suivants

....... Si leprix ouvert de l' ordre en attente est incorrect, l'erreur 130 (ERR_INVALID_STOPS).......... sera générée.

c'est-à-dire que vous essayez de fixer OP_SELLLIMIT en dessous du prix du marché.

 
Alekseu Fedotov:

Une lacune est une lacune, mais vous n'avez probablement pas lu tous les points suivants

....... Sile prix ouvert de l' ordre en attente est incorrect, l'erreur 130 (ERR_INVALID_STOPS).......... sera générée.

c'est-à-dire que vous essayez de fixer OP_SELLLIMIT en dessous du prix du marché.

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

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

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

Il n'y a pas de signal pour fermer une transaction ouverte par elle-même.

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

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

Il n'y a pas de signal pour sortir d'une transaction en soi.

Sur la barre de zéro, le signal "clignote", ce qui n'est pas visible post factum. Lancez la visualisation sur tous les ticks dans le testeur, les questions disparaîtront.
 
Vitalie Postolache:
A la barre zéro, le signal "vacille", ce qui n'est pas visible post-facto. Exécutez la visualisation sur tous les ticks du testeur, les questions disparaîtront.
Ce n'est pas le problème. Lorsqu'un ordre se déclenche, un trade s'ouvre et se ferme immédiatement lorsqu'une nouvelle bougie apparaît et qu'il n'y a pas de signal inverse. C'est pourquoi je vous ai donné un morceau de code pour fermer les trades.
 
Movlat Baghiyev:
Ce n'est pas le problème. Lorsqu'un ordre est déclenché, une transaction est ouverte et elle est immédiatement fermée lorsqu'une nouvelle bougie apparaît et qu'il n'y a pas de signal inverse. C'est pourquoi je vous ai donné un morceau de code pour fermer les transactions.
Vous devez annuler la variable"sig" après le réglage parce que le signal sera constant, si vous l'annulez, la variable reprendra sa valeur après le prochain croisement et l'annulez à nouveau après avoir terminé toutes les actions. Ou vous pouvez mettre un drapeau indiquant que s'il y a eu un croisement vers le haut, le prochain doit être vers le bas et s'il n'y a pas de croisement vers le bas, alors tous les signaux sont ignorés jusqu'à ce qu'il y ait un croisement inverse.
 

Bonjour.

Pouvez-vous me dire ce qui ne va pas ?

L'icône doit être activée si la ligne de l'indicateur a franchi le niveau 20, sur la période M1, et si la ligne de l'indicateur est au-dessus du niveau 50, sur la période M5.

Pour une raison quelconque, la marque est fixée même si la ligne sur M5 est inférieure au niveau fixé de 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:

Bonjour.

Pouvez-vous me dire ce qui ne va pas ?

L'icône doit être activée si la ligne de l'indicateur a franchi le niveau 20, sur la période M1, et si la ligne de l'indicateur est au-dessus du niveau 50, sur la période M5.

Pour une raison quelconque, le panneau est activé même si la ligne sur la M5 est inférieure au niveau fixé de 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);
  }

Votre cycle est étrange. Étrange.

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

Pourquoi limiter la vérification à plus de 1. Par exemple, l'historique est chargé et la différence sera supérieure à un. Si tout est normal, alors la différence rates_total-prev_calculated sera soit 0, soit 1.
0 - un nouveau tick est arrivé et une nouvelle barre n'a pas commencé à se former.
1 - un nouveau tick est arrivé et une nouvelle barre a commencé à se former

Montrez-nous votre indicateur complet - voyons ce qui ne va pas.