Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 33
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
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 :
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.
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é.
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é.
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;} // stop d'achat
Il n'y a pas de signal pour fermer une transaction ouverte par elle-même.
if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // stop d'achat
Il n'y a pas de signal pour sortir d'une transaction en soi.
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 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.
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.
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);
}
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.
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.