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

 
pourquoi les points de temps et de prix de 2 à 30 sont disponibles dansObjectCreate? j'ai essayé de les ajouter au graphique, mais seul le premier point est affiché
ObjectCreate(0,"name",OBJ_ARROW_LEFT_PRICE,0,TimeCurrent()-600,1.29400,TimeCurrent()-1200,1.29500);   
 
Valerius:

Vous n'avez pas besoin d'écrire ce code dans OnInit, mais dans OnTick().

J'ai essayé, ça ne marche pas du tout.
1 avertissement
 
Igor Makanu:

Non, tu ne peux pas.

Je ne peux pas expliquer comment les modèles.... fonctionnent. c'est comme ça - tant que vous n'appelez pas une telle fonction, le compilateur ne sait rien de son existence (souvent, il n'y a même pas d'erreurs de compilation s'il n'y a pas d'appel)

vous appelez alors une telle fonction modèle et le compilateur remplit les types nécessaires et vérifie ensuite que tout fonctionne correctement.

et ensuite vous faites un autre appel au modèle avec différents types de paramètres - et le compilateur crée une nouvelle fonction, c'est-à-dire une de plus, c'est-à-dire comme si vous écriviez 2 fonctions, qui font la même chose, mais avec différents types de paramètres


whew, c'est comme ça que ça marche ))))



UPD :

vous pouvez, mais si les types dans le modèle correspondent, voici un exemple, cela fonctionne correctement :

Merci, encore plus clair que dans les docs) Il s'avère que dans le modèle la prédéfinition des variables ne permet pas de ne pas les spécifier. J'en ai besoin pour imprimer dans un fichier. Le journal ne me donne pas la possibilité de fractionner les enregistrements. J'aimerais qu'il y ait 5 bûches). En conséquence, les modèles donnent une option pour ne pas amener le type de variable à celui désiré, cela peut être fait à l'intérieur d'une fonction de modèle, mais le nombre de variables doit être spécifié en entier. Une fonction simple avec des variables prédéfinies du type requis donne la possibilité de spécifier moins de variables à un appel, mais les types de variables doivent être amenés au bon. Bien sûr, cela peut être fait à l'appel, mais l'enregistrement sera trop long.

 
Valerius:

Bonjour à tous !

J'ai créé une fonction pour modifier le stoploss. Mais quand il fonctionne, il donne EURUSD,H1 : OrderModify error 130.

Et le prix est loin de l'endroit où le stoploss devrait être fixé.

Voici la fonction :


....
    err=OrderModify(OrderTicket(), OrderOpenPrice(),New_Stop( NormalizeDouble(OrderOpenPrice()+spred*point, 
digits)), OrderProfit(), 0, clrNONE);// Цена открытия плюс спред может быть в зоне заморозки.
.....
.....
double New_Stop(double Parametr) // Проверка стоп-прик.
  {
   double Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
   if(Parametr<Min_Dist) // Если меньше допуст.
     {
      Parametr=Min_Dist;                        // Установим допуст.
      Alert("Increased the distance of a stop order or the opening price of pending orders.");
     }
   return(Parametr);                            // Возврат значения
  }
 
Valerius:

Essayez de cette façon :


Merci, ça a marché !

Mais deux autres nuances :

1 quelle condition ajouter pour ne pas fermer les ordres qui ont été ouverts le vendredi de la semaine en cours, et les vendredis des semaines précédentes, respectivement, ont été fermés ?

2. comment corriger le code - OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE) ;

pour supprimer l'avertissement"perte possible de données due à la conversion de type" ? Il semble s'agir de "...MarketInfo(nameSym,MODE_DIGITS)...".

 
Bonsoir. A quoi doit ressembler le code qui sélectionne l'ordre le plus récemment clôturé ? Est-ce vraiment comme cela :"OrderSelect(OrdersHistoryTotal, SELECT_BY_POS, MODE_HISTORY" ?
 
La fonction GetAmountLotFromOpenPos renvoie -1717986918 ; comment puis-je y remédier ?
 

Veuillez me conseiller.

Dans le testeur, la valeur de retour de la fonction de sommation de lots GetAmountLotFromOpenPos donne une valeur de -1717986918.

 
Valeriy Yastremskiy:

J'ai trouvé la raison. J'aurais dû mettre OrderTakeProfit() dans OrderModify au lieu de OrderProft(). Je l'ai parcouru un peu.

Merci quand même pour votre aide.

 
Yerkin Sagandykov:

Merci, ça a marché !

Mais deux autres nuances :

1 quelle condition ajouter pour ne pas fermer les ordres qui ont été ouverts le vendredi de la semaine en cours, et les vendredis des semaines précédentes, respectivement, ont été fermés ?

2. comment corriger le code - OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE) ;

pour supprimer l'avertissement"perte possible de données due à la conversion de type" ? Il doit s'agir de "...MarketInfo(nameSym,MODE_DIGITS)...".

Pour la première question, vous devez réaliser cette fonction :


for(int is=OrdersTotal()-1 ; is>=0 ; is--)
{
if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))
{//Fermeture des ordres qui ont été ouverts le vendredi de la semaine qui n'est pas la semaine en cours. Dans ce cas, nous ne clôturons pas les ordres le vendredi de la semaine en cours.
if(OrderMagicNumber()==Magic && TimeDayOfWeek(TimeCurrent())==5 && TimeDayOfWeek(OrderOpenTime())==5 && TimeDayOfYear(OrderOpenTime())<TimeDayOfYear(TimeCurrent())
{
if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE) ;
si (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE) ;
if(!result) {error=GetLastError() ; Print("LastError = ",error, ",Symbol()) ; }
else {error=0;}
sinon
{Print("NoMagic ",OrderMagicNumber();} // pour le débogage
sinon

{Print("Erreur lors de la sélection de la commande ", GetLastError();}


Pour la deuxième question, il devrait y avoir l'entrée suivante :

OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(MarketInfo(nameSym,MODE_ASK)), 3, clrNONE) ;

Bonne chance.