Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 39
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
Je ne sais pas comment l'expliquer. Mais c'est définitivement un chef-d'œuvre.
Je te dis qu'ils aiment être sarcastiques ici.) Trishkin s'est également offusqué. Il a dit que le code sera utile.
Je suis aussi nouveau que vous, mais j'ai aussi beaucoup de questions.
for(int i=0; i<OrdersTotal() ; i++){
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol() !=Symbol() ||OrderMagicNumber() !=Magic) continue;
if(OrderType()==OP_BUY||OrderType()==OP_SELL) p++;
if(OrderType()==OP_BUYSTOP)
if(signal_bue)OrderDelete(OrderTicket());
sinon b++;
si(OrderType()==OP_SELLSTOP)
if(signal_sell)OrderDelete(OrderTicket());
sinon s++ ;
}
}
1) où avez-vous obtenu b++
2) Où avez-vous obtenu les++?
3)if(signal_bue) est quoi d'autre ?
Et le reste du code. Désolé si je vous ai offensé.
//| ОТЛОЖКИ.mq4 |
//+------------------------------------------------------------------+
extern double StopLoss = 100; //Стоплосс ордера
extern double TakeProfit = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int Delta = 100; //Расстояние от цены для установки ордера
extern double LOT = 0.1; //Объём позиции
extern int Magic =2;
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if (TrailingStop!=0) Trailing();
//ИНДИКАТОР RSI
double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
int b = 0, s = 0, p = 0, res = 0;
double BuyPrice=Ask+Delta*Point;
double SellPrice=Bid-Delta*Point;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS)==true)
{
if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
if (OrderType()==OP_BUYSTOP)
{
if(RSI0<50&&RSI1>50)
OrderDelete(OrderTicket());
else
b++;
}
if (OrderType()==OP_SELLSTOP)
{
if(RSI0>50&&RSI1<50)
OrderDelete(OrderTicket());
else
s++;
}
}
}
double SL,TP; // < !!!!!!!!! эти переменные не используются, можно удалить
//---- buy stop
if(RSI0>50&&RSI1<50 && p<1 && b<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
}
//---- sell stop
if(RSI0<50&&RSI1>50 && p<1 && s<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
}
//----
return(0);
}
Je vous le dis, ils aiment être sarcastiques ici.) Et Trishkin s'en est offensé. Il a dit qu'il m'aiderait avec le code.
C'est plus simple comme ça :
{
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==Type)
OrderDelete(OrderTicket());
}
}
}
C'est quelque part en dehors de la fonction void OnTick().
if (сигнал_sell)OrderDelete_(OP_BUYSTOP);
Et ceci est dans le corps de la fonction void OnTick().
Et ceci est dans le corps de la fonction void OnTick()
Ok.
J'ai en quelque sorte fini ce que je pouvais. La description est faite. Le but est de comprendre pourquoi il ne fonctionne pas comme je le souhaite.
Il y a autre chose à l'intérieur du bloc if(). C'était vraiment prévu comme ça ?
Plus loin. La fonction Counts() accepte une variable globale non initialisée count qui, par ailleurs, est définie à nouveau à l'intérieur de la fonction.
La fonction Counts() compte les ordres mais les compare à un certain ticket qui change plusieurs fois dans la fonction principale. Mais la valeur du ticket est la même pendant l'opération de la fonction. Alors, combien de commandes la fonction va-t-elle calculer ? Y en a-t-il plus d'un ?
Sous cette forme, cette fonction n'a pas besoin d'arguments, il suffit de l'appeler et de la laisser renvoyer le résultat.
Suivant. La fonction FindLastOType() est à nouveau une comparaison avec le ticket. Pouvez-vous garantir qu'il est comparé à un billet valide ? N'est-il pas plus simple d'interrompre la boucle lorsque le premier ordre comportant le numéro magique et le symbole nécessaires est trouvé, puis de renvoyer le type d'ordre ?
Idem avec FindLastOrderOpenPrice() et FindLastLot().
La fonction ModifyOrders() m'a tellement horrifié que je n'ai pas voulu y jeter un œil pendant longtemps pour dormir sans cauchemars...
Veuillez apporter des corrections dans le code
Essayez-le ^_~
extern double TakeProfit = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int Delta = 100; //Расстояние от цены для установки ордера
extern double LOT = 0.1; //Объём позиции
extern int Magic =2;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int res = 0;
//ИНДИКАТОР RSI
double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
double BuyPrice=Ask+Delta*Point;
double SellPrice=Bid-Delta*Point;
//---- buy stop
if(RSI0>50&&RSI1<50 && Number(OP_BUYSTOP)<0 && Number(OP_BUY)<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
}
//---- sell stop
if(RSI0<50&&RSI1>50 && Number(OP_SELLSTOP)<0 && Number(OP_SELL)<1) // < !!!!!!!!!
{
res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
}
//----
if (RSI0>50&&RSI1<50) OrderDelete_(OP_SELLSTOP);
if (RSI0<50&&RSI1>50)OrderDelete_(OP_BUYSTOP);
}
//+------------------------------------------------------------------+
void OrderDelete_(int Type)
{
bool r;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==Type)
r = OrderDelete(OrderTicket());
}
}
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Number(int Type)
{
int kp=0;
for(int i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==true)
{
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
if(OrderType()==Type)
kp++;
}
}
return(kp);
}
//+------------------------------------------------------------------+
Il y a autre chose à l'intérieur du bloc if(). C'était vraiment censé être comme ça ?
Plus loin. La fonction Counts() accepte une variable globale non initialisée count qui est également déclarée une fois de plus dans la fonction elle-même.
La fonction Counts() compte les ordres mais les compare à un certain ticket qui change plusieurs fois dans la fonction principale. Mais la valeur du ticket est la même pendant l'opération de la fonction. Alors, combien de commandes la fonction va-t-elle calculer ? Y en a-t-il plus d'un ?
Sous cette forme, cette fonction n'a pas besoin d'arguments, il suffit de l'appeler et de la laisser renvoyer le résultat.
Suivant. La fonction FindLastOType() est à nouveau une comparaison avec le ticket. Pouvez-vous garantir qu'il est comparé à un billet valide ? N'est-il pas plus simple d'interrompre la boucle lorsque le premier ordre comportant le numéro magique et le symbole nécessaires est trouvé, puis de renvoyer le type d'ordre ?
Idem avec FindLastOrderOpenPrice() et FindLastLot().
La fonction ModifyOrders() m'a tellement terrifié que je n'y ai pas jeté un œil pendant longtemps pour éviter les cauchemars nocturnes...
Correction
Il n'y a pas d'autre moyen de le dire ailleurs, ce serait des paramètres erronés.
Elle doit prendre en compte les plus récentes
Je vais essayer de le changer.
J'ai essayé d'utiliser la méthode standard OrderModify(), mais elle est interdite si je déplace un grand nombre d'ordres simultanément et constamment.
Merci pour la critique.
Oui, c'est une erreur d'impression sur le support. Le reste de la question est valable.
bool condition;
if(condition) {}
équivalent à
if(condition==true) {}
и
if(!condition) {}
est égal à
if(condition==false) {}
C'est juste plus court et plus familier.