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
J'ai besoin d'aide.
http://forum.mql4.com/ru/67309#1011467
Veuillez me conseiller : les ordres ne sont pas ouverts tous les jours ; le trawling ne fonctionne pas et les ordres ouverts ne sont pas fermés en fonction du TP. Qu'est-ce que je fais de mal ?
input int StartHour = 23; // Время ачало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 40; // StopLoss
input int Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 20; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = true; // Использовать шаг или нет
void OnTick()
{
static bool IsFirstTick = false;
static int ticket = 0;
double lot=Lot_Normalize(Symbol(),Lots,1);
double sl= Dist_Normalize(Symbol(),Trals);
double step= Dist_Normalize(Symbol(),_Step);
int h= TimeHour(TimeCurrent());
if(h == StartHour)
{
Alert("TimeHor: ", h);
if (IsFirstTick == true)
IsFirstTick = false;
bool res;
res= OrderSelect(ticket, SELECT_BY_TICKET);
if(res == true)
{
if(OrderCloseTime() == 0)
{
bool res2;
res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10);
if(res2 == false)
{
Alert("Error Closing Order #", ticket);
} Alert("Closing Order #", ticket);
}
}
if(Open[0] < Open[StartHour])
{
ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot");
Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
if(ticket < 0)
{
Alert("Error Sending Order!");
} Alert("Sending Order! BUY_LIMIT");
}
else
{
ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot");
Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
if(ticket < 0)
{
Alert("Error Sending Order!");
} Alert("Sending Order! SEL_LLIMIT");
}
}
}
double Dist_Normalize(string Smv, int _Distancia)
{
int Dig= int(MarketInfo(Smv,MODE_DIGITS));
double Pip=MarketInfo(Smv,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*10*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
double Lot_Normalize(string Smv, double _lot, double _mult)
{
double minlot=MarketInfo(Smv,MODE_MINLOT);
double maxlot=MarketInfo(Smv,MODE_MAXLOT);
double steplot=MarketInfo(Smv,MODE_LOTSTEP);
double lot= _lot*_mult;
if(lot<=minlot) lot+minlot;
else if(lot>=maxlot) lot=minlot;
else if(lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
void Tralling_Stop(string Smv, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Symbol,MODE_DIGITS));
for(int pos=OrdersTotal()-1; pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Smv &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if(OrderType()==OP_BUY)
{
if(_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Error modifi Order!: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Error modifi Order!: ",GetLastError());
}
}
}
}
}
}
Veuillez me conseiller : les ordres ne sont pas ouverts tous les jours ; le trawling ne fonctionne pas et les ordres ouverts ne sont pas fermés en fonction du TP. Qu'est-ce que je fais de mal ?
input int StartHour = 23; // Время ачало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 40; // StopLoss
input int Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 20; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = true; // Использовать шаг или нет
void OnTick()
{
......
IsFirstTick = false;
Je remplacerais cette pièce par
Où la variable TM est déclarée comme DateTime en dehors de la fonction OnTick(), c'est-à-dire qu'elle est globale pour ce module.
Je ne comprends pas ce code : if(Open[0] < Open[StartHour])
Le StartHour est égal à 23 et il suggère que le prix ouvert de la barre zéro sera comparé au prix ouvert de la 23ème barre qui la précède. Bon, ok, peut-être que c'est une astuce de l'Expert Advisor.
Mais cette conception n'est pas du tout appropriée.
Que se passe-t-il si la variable ticket est égale à zéro, ou si l'EA a été réinitialisée et que cette variable a été réinitialisée par défaut ?
StartHour est l'heure à laquelle l'EA doit fonctionner. Il devrait être 1 heure du matin. Pourquoi le chalutage ne fonctionne-t-il pas ?
Vous devez analyser le code pour comprendre pourquoi il ne fonctionne pas.
Essayez d'insérerla fonction Print("Tralling_Stop") dans la fonctionTralling_Stop(), et voyez si ce message (Tralling_Stop) apparaît dans le journal, si non, alors cette fonction n'est pas appelée. Si vous l'avez, analysez la fonction Tralling_Stop() elle-même, elle contient peut-être quelques erreurs logiques.
En général, lorsqu'il y a des conditions logiques de type "si", insérez Print(" condition 1" ), Print(" condition 2" ), etc. Exécutez le conseiller expert dans le testeur de stratégie et dans le journal, vous pouvez suivre la logique de votre EA.
Vous devez analyser le code pour comprendre pourquoi il ne fonctionne pas.
Essayez d'insérerla fonction Print("Tralling_Stop") dans la fonctionTralling_Stop(), et voyez si ce message (Tralling_Stop) apparaît dans le journal, si non, alors cette fonction n'est pas appelée. Si oui, analysez la fonction Tralling_Stop() elle-même - elle contient peut-être des erreurs logiques.
En général, lorsqu'il y a des conditions logiques de type "si", insérez Print(" condition 1" ), Print(" condition 2" ), etc. Exécutez le conseiller expert dans le testeur de stratégie et dans le journal, vous pourrez suivre la logique de votre conseiller expert.
J'ai essayé de le réécrire mais il ne fonctionne toujours pas comme je le souhaite. Les commandes ne sont pas ouvertes quand je veux qu'elles le soient, puis elles ne trillent pas. Selon cette idée, le conseiller expert devrait fonctionner de la manière suivante : à la clôture de la dernière bougie d'une journée (à 00:00), il devrait ouvrir deux ordres en attente : High (pour l'achat) et Low (pour la vente), puis les exécuter.
input int StartHour = 1; // Начало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 10; // StopLoss
extern double Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 5; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = false; // Использовать шаг или неT
void OnTick()
{
static bool IsFirstTick = false;
Trailing();
if (StartHour != Hour()) { return;}
if (OrdersTotal()>0)
{
OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
}
}
//+------------------------------------------------------------------+
void Trailing()
{
if (_StepUse)
{
for (int trall=0; trall<OrdersTotal(); trall++) {
if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() == OP_BUY ) {
if (Bid-OrderOpenPrice() > StopLoss*Point || OrderMagicNumber()==Magic) {
if (OrderStopLoss() < Bid-(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), Bid-StopLoss*Point, OrderTakeProfit(), 0, Blue);
}
}
}
if (OrderType() == OP_SELL) {
if (OrderOpenPrice()-Ask > StopLoss*Point || OrderMagicNumber()==Magic) {
if (OrderStopLoss() > Ask+(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask+StopLoss*Point, OrderTakeProfit(), 0, Blue);
}
}
}
}
}
}
//+------------------------------------------------------------------+
Essayez
Remplacer par :
Remplacer par :
En outre, les prix doivent être normalisés à l'aide de NormalizeDouble(). Autrement dit, au lieu deLow[1]-StopLoss*Point, vous devez écrire NormalizeDouble(Low[1]-StopLoss*Point,Digits()).
De plus, selon votre code, si la variable _StepUse est égale à false, votre trailing stop ne fonctionnera pas. Regardez attentivement le code de la fonction Trailing()
Essayez
Remplacer par :
Remplacer par :
En outre, les prix doivent être normalisés à l'aide de NormalizeDouble(). Autrement dit, au lieu deLow[1]-StopLoss*Point, vous devez écrire NormalizeDouble(Low[1]-StopLoss*Point,Digits()).
De plus, selon votre code, si la variable _StepUse est égale à false, votre trailing stop ne fonctionnera pas. Regardez attentivement le code de la fonction Trailing().
Vous êtes en contact ? Envoyez-moi un message à http://vk.com/computerwizard116. Je ne sais plus comment résoudre le problème de l'EA. Sur mon compte de démonstration, je travaille sur cette stratégie depuis une semaine.
Et ça marche. Et en testant, ce coquin ne ferme même pas l'ordre au point d'enlèvement(((((( Sur la photo, vous pouvez voir que le prix a dépassé le point d'enlèvement et est revenu en arrière, mais il a clôturé en perte, bon sang !((((
Pourquoi fait-il ça ?
Vous êtes en contact ? Envoyez-moi un courriel à http://vk.com/computerwizard116. Je ne sais plus comment résoudre le problème de l'EA. J'utilise cette stratégie depuis une semaine sur un compte de démonstration.
et ça marche. Mais lors des tests, ce coquin ne ferme même pas l'ordre à emporter. (((((( Sur la photo, vous pouvez voir que le prix a dépassé l'ordre à emporter et est revenu en arrière, mais il a clôturé en perte.
Pourquoi fait-il ça ?
Je ne suis pas en contact.
Lesordres Take profit et Stop loss ne dépendent pas du conseiller, ils sont exécutés sur le serveur du courtier. L'EA ne fait que définir le take profit et le stop loss, il ne les exécute pas. Vérifiez si le take profit a déjà été fixé après que le prix ait atteint cette valeur. En d'autres termes, l'ordre a d'abord été ouvert, puis le prix a évolué dans un sens et dans l'autre, et enfin le take profit a été fixé.
Je ne suis pas en contact.
L'exécution des ordres take profit et stop loss ne dépend pas de l'EA, ils sont exécutés sur le serveur du courtier. L'EA se contente de définir les ordres d'achat et d'arrêt, il ne les exécute pas. Vérifiez si le take profit a déjà été fixé après que le prix ait atteint cette valeur. En d'autres termes, l'ordre a d'abord été ouvert, puis le prix a fait des allers-retours, et enfin le take profit a été fixé.