Pendant le test des conseillers experts : Exp_TEMA.mq5, de l'article : "Création d'un conseiller expert qui négocie sur différents symboles". L'expression Told[] Tnew[1]prend les valeurs suivantes : Told[] L'expression n'a pas pu être évaluée Tnew[1] Plage de tableau non valide.
Et My_First_EA.mq5, de l'article : "Un guide pas à pas pour écrire des conseillers experts MQL5 pour les débutants", l'expression New_Time[1] obtient la valeur:Invalid array range
Que signifient les valeurs Expression could not be evaluated, Invalid array range, et comment affectent-elles les résultats des experts ?
Veuillez m'indiquer comment ouvrir une seule transaction par condition. Avec mon code, le terminal ouvre plusieurs transactions sur cette condition, mais je n'en ai besoin que d'une seule.
if(Buy_Signal) { mrequest.price = NormalizeDouble(latest_price.ask,_Digits); // последняя цена ask mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit mrequest.type = ORDER_TYPE_BUY; // ордер на покупку //--- отсылаем ордер OrderSend(mrequest,mresult); }
if(Sell_Signal) { mrequest.price = NormalizeDouble(latest_price.bid,_Digits); // последняя цена Bid mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit mrequest.type= ORDER_TYPE_SELL; // ордер на продажу //--- отсылаем ордер OrderSend(mrequest,mresult); }
Le résultat est l'image suivante :
Comment puis-je vérifier si une transaction a été effectuée avec cette condition ou non ? J'ai essayé de cette façon, mais ça ne marche pas :
// в этом цикле поочередно перебираем все открытые позиции for(i=0;i<PositionsTotal();i++) { // выбираем позиции только по "нашему" инструменту if(Symbol()==PositionGetSymbol(i)) ... }
Veuillez m'indiquer comment ouvrir une seule transaction par condition. Avec mon code, le terminal ouvre plusieurs transactions sur cette condition, mais je n'en ai besoin que d'une seule.
Le résultat est l'image suivante :
Comment puis-je vérifier si une transaction a été effectuée avec cette condition ou non ? J'ai essayé de cette façon, mais ça ne marche pas :
Et pourquoi organiser la recherche dans la boucle s'il existe une chose aussi merveilleuse que PositionSelect?
Nous vérifions simplement l'existence de la position sur le symbole intéressant et si c'est vrai, nous allons boire du cognac et fumer des cigares... :)
PS
Si je comprends bien,PositionGetString sansPositionSelect ne devrait pas fonctionner. Nous n'avons pas besoin de connaître les symboles de toutes les poses ouvertes, n'est-ce pas ?
Il n'est pas nécessaire de chercher dans la boucle quand il existe une chose aussi merveilleuse que PositionSelect?
Il suffit de vérifier la présence d'une position sur l'outil qui nous intéresse et si le résultat est positif, nous allons tranquillement boire du cognac et fumer des cigares... :)
PS
Si je comprends bien,PositionGetString sansPositionSelect ne devrait pas fonctionner. Nous n'avons pas besoin de connaître les symboles de toutes les poses ouvertes, n'est-ce pas ?
Ce code tient compte de la présence d'une position ouverte :
if(Buy_Signal && PositionSelect(Symbol())==false) { mrequest.type = ORDER_TYPE_BUY; // ордер на покупку mrequest.price = NormalizeDouble(latest_price.ask,_Digits); // последняя цена ask mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit OrderSend(mrequest,mresult); // отсылаем ордер }
Mais il continue à ouvrir des positions lorsque la condition Buy_Signal est remplie. Ce que je veux, c'est qu'avant que Sell_Signal ne se produise, une position à Buy_Signal ne soit pas réouverte. J'essaie de l'implémenter de cette façon :
Ce code tient compte de la présence d'une position ouverte :
Mais il continue à ouvrir des positions lorsque la condition Buy_Signal est remplie. Je dois m'assurer qu'avant que la condition Sell_Signal ne se produise, aucune autre position ne sera ouverte par Buy_Signal. J'essaie de le mettre en œuvre de cette façon :
Ce n'est pas le cas.
Pourquoi ce code ? Cela ne ressemble guère à ce que je voulais dire (je doute que tout y soit correct).
if(Buy_Signal && PositionSelect(Symbol())==false)
{
mrequest.type = ORDER_TYPE_BUY; // ордер на покупку
mrequest.price = NormalizeDouble(latest_price.ask,_Digits); // последняя цена ask
mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit OrderSend(mrequest,mresult); // отсылаем ордер
}
Et je voulais dire quelque chose comme ça :
Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
SL = NormalizeDouble(Ask - 500*_Point,_Digits); // Stop Loss
TP = NormalizeDouble(Ask + 1500*_Point,_Digits); // Take Profitif(Buy_Signal)
//Получен сигнал на market buy
{
if(!PositionSelect(_Symbol))
//Позиции по данному символу отсутствуют
{
mrequest.action = TRADE_ACTION_DEAL; //Установка рыночного ордера (позиция)
mrequest.type = ORDER_TYPE_BUY; //Ордер на покупку
mrequest.magic = 18072010; //ORDER_MAGIC
mrequest.symbol = _Symbol; //Инструмент
mrequest.volume = 0.1; //Объем в 0.1 лот
mrequest.price = Ask; //Цена открытия
mrequest.sl = SL; //Stop Loss
mrequest.tp = TP; //Take Profit
mrequest.deviation = 5; //Отклонение в 5 пунктов OrderSend(mrequest,mresult); //Отсылаем ордер
}
}
Ce code et le code ci-dessus n'ouvrent pas de position tant qu'ils ne sont pas fermés, mais ils en ouvrent une nouvelle après la fermeture sur la prochaine barre si la condition est remplie. Je l'ai mis en œuvre de cette façon :
bool BuyOne = true, SellOne = true; // только один ордер. глобальные переменные
if(Buy_Signal && // покупаем если есть сигнал на покупку PositionSelect(Symbol())==false && // ордер закрыт BuyOne) // при условии на покупку ставим только один ордер { mrequest.type = ORDER_TYPE_BUY; // ордер на покупку mrequest.price = NormalizeDouble(latest_price.ask,_Digits); // последняя цена ask mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit OrderSend(mrequest,mresult); // отсылаем ордер BuyOne = false; // на покупку только один ордер SellOne = true; // меняем флаг одного ордера на продажу }
Merci ! J'ai tenu compte de tous vos souhaits et tout fonctionne maintenant. J'ai posté le conseiller expert pour publication. Je peux faire quelques changements supplémentaires dans le code. Il n'y a pas de limite à la séduction))))
Je n'ai pas trouvé de description des codes de réponse (Retcode) pour la structure des résultats de contrôle des demandes de commerce MqlTradeCheckResult dans la documentation. Y en aura-t-il ?
Pendant le test des conseillers experts :
Exp_TEMA.mq5, de l'article : "Création d'un conseiller expert qui négocie sur différents symboles". L'expression Told[] Tnew[1]prend les valeurs suivantes :
Told[] L'expression n'a pas pu être évaluée
Tnew[1] Plage de tableau non valide.
Et My_First_EA.mq5, de l'article : "Un guide pas à pas pour écrire des conseillers experts MQL5 pour les débutants", l'expression
New_Time[1] obtient la valeur:Invalid array range
Que signifient les valeurs Expression could not be evaluated, Invalid array range, et comment affectent-elles les résultats des experts ?
Told - tableau vide sans taille
Tnew[1] - hors tableau, le tableau est décrit comme Tnew[1], donc ses éléments ne peuvent être accédés que comme Tnew[0], car l'index commence à zéro.
Told - tableau vide sans taille
Tnew[1] - hors tableau, le tableau est décrit comme Tnew[1], donc ses éléments ne peuvent être accédés que comme Tnew[0], car l'index commence à zéro.
Veuillez m'indiquer comment ouvrir une seule transaction par condition. Avec mon code, le terminal ouvre plusieurs transactions sur cette condition, mais je n'en ai besoin que d'une seule.
Le résultat est l'image suivante :
Comment puis-je vérifier si une transaction a été effectuée avec cette condition ou non ? J'ai essayé de cette façon, mais ça ne marche pas :
Veuillez m'indiquer comment ouvrir une seule transaction par condition. Avec mon code, le terminal ouvre plusieurs transactions sur cette condition, mais je n'en ai besoin que d'une seule.
Le résultat est l'image suivante :
Comment puis-je vérifier si une transaction a été effectuée avec cette condition ou non ? J'ai essayé de cette façon, mais ça ne marche pas :
Et pourquoi organiser la recherche dans la boucle s'il existe une chose aussi merveilleuse que PositionSelect?
Nous vérifions simplement l'existence de la position sur le symbole intéressant et si c'est vrai, nous allons boire du cognac et fumer des cigares... :)
PS
Si je comprends bien, PositionGetString sansPositionSelect ne devrait pas fonctionner. Nous n'avons pas besoin de connaître les symboles de toutes les poses ouvertes, n'est-ce pas ?
Il n'est pas nécessaire de chercher dans la boucle quand il existe une chose aussi merveilleuse que PositionSelect?
Il suffit de vérifier la présence d'une position sur l'outil qui nous intéresse et si le résultat est positif, nous allons tranquillement boire du cognac et fumer des cigares... :)
PS
Si je comprends bien, PositionGetString sansPositionSelect ne devrait pas fonctionner. Nous n'avons pas besoin de connaître les symboles de toutes les poses ouvertes, n'est-ce pas ?
Ce code tient compte de la présence d'une position ouverte :
Mais il continue à ouvrir des positions lorsque la condition Buy_Signal est remplie. Ce que je veux, c'est qu'avant que Sell_Signal ne se produise, une position à Buy_Signal ne soit pas réouverte. J'essaie de l'implémenter de cette façon :
Ça ne va pas.Ce code tient compte de la présence d'une position ouverte :
Mais il continue à ouvrir des positions lorsque la condition Buy_Signal est remplie. Je dois m'assurer qu'avant que la condition Sell_Signal ne se produise, aucune autre position ne sera ouverte par Buy_Signal. J'essaie de le mettre en œuvre de cette façon :
Ce n'est pas le cas.Pourquoi ce code ? Cela ne ressemble guère à ce que je voulais dire (je doute que tout y soit correct).
Et je voulais dire quelque chose comme ça :
On pourrait au moins le faire en bloc.
Pourquoi ce code particulier ? Ce n'est pas du tout similaire à ce que je voulais dire (je doute même que ce soit juste).
Et je voulais dire quelque chose comme ça :
Au minimum, tout peut être fait dans un bloc.
Ce code et le code ci-dessus n'ouvrent pas de position tant qu'ils ne sont pas fermés, mais ils en ouvrent une nouvelle après la fermeture sur la prochaine barre si la condition est remplie. Je l'ai mis en œuvre de cette façon :
Merci ! J'ai tenu compte de tous vos souhaits et tout fonctionne maintenant. J'ai posté le conseiller expert pour publication. Je peux faire quelques changements supplémentaires dans le code. Il n'y a pas de limite à la séduction))))