Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 461

 
wolfovik:

Aidez à résoudre un problème !

L'EA du testeur se bloque lors de l'utilisation de la fonction ICustom. Existe-t-il des solutions à ce problème ?

En outre, dans le testeur de stratégie, il y a une erreur constante PB Trade EURUSD,H1 : OrderSend error 130.

Bien que les arrêts soient à 300 points !

ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-300*Point,Bid+300*Point);

Ça ne marche pas comme ça !

RefreshRates();
ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,Bid-300*Point,Bid+300*Point);

Où ai-je fait fausse route ?


 
Dmitry01110:
Bonjour, pourriez-vous me dire comment éditer un fichier créé par la fonction FileOpen, par exemple en supprimant un octet de la position actuelle et en insérant un autre à sa place !


J'essaie également de faire quelque chose de similaire.

Il existe un fichier *.csv qui ne comporte qu'une seule colonne, c'est-à-dire que les chiffres qu'il contient se suivent. J'essaie de faire en sorte que chaque fois qu'un chiffre est utilisé, il y ait une icône à côté, indiquant que ce chiffre a déjà été utilisé par l'EA.

Vous pouvez préparer un fichier *.csv avec deux colonnes - [NUMERO] ; [SIGNE].

 
wolfovik:

De plus, dans le testeur, il y a une erreur constante PB Trade EURUSD,H1 : OrderSend error 130.

Bien que les stops soient à 300 pips !

Ça ne marche pas comme ça !

Où ai-je fait fausse route ?


Les prix calculés dans l'ordre de négociation doivent être normalisés en chiffres :

ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,NormalizeDouble(Bid-300*Point,Digits),NormalizeDouble(Bid+300*Point,Digits));

Vous devez également vérifier la validité des valeurs des ordres stop par rapport aux exigences de StopLevel :

input int  StopLoss    =  300;   // Значение Stop Loss в пунктах
input int  TakeProfit  =  300;   // Значение Take Profit в пунктах
int   level=0, spread=0;
//+------------------------------------------------------------------+
//|   Старт                                                          |
//+------------------------------------------------------------------+
void OnTick() {
   level=MarketInfo(Symbol(),MODE_STOPLEVEL);
   spread=MarketInfo(Symbol(),MODE_SPREAD);
   if(level==0) level=spread*2;
//---
   int    ticket=0;
   double sl=0, tp=0;
   if(StopLoss>0) sl=NormalizeDouble(MathMin(Bid-StopLoss*Point,Bid-(level+1)*Point),Digits);
   if(TakeProfit>0) tp=NormalizeDouble(MathMax(Bid+TakeProfit*Point,Bid+(level+1)*Point),Digits);
   ticket = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,sl,tp);
   return;
}

Pour Buy, à peu près comme ceci

 
Dmitry01110:
Bonjour, pourriez-vous me dire comment éditer un fichier créé avec la fonction FileOpen, par exemple supprimer un octet de la position actuelle et en insérer un autre à sa place !
Vous appelez tout le texte du fichier dans une variable de type chaîne, vous l'éditez comme une simple variable, puis vous appelez ce fichier uniquement pour l'écriture et vous renvoyez cette variable.
 
Roger:
Vous appelez le texte entier d'un fichier dans une variable de type chaîne, vous l'éditez comme une simple variable, puis vous appelez ce fichier en écriture seule et vous renvoyez cette variable.

Que se passe-t-il si le nombre de caractères du fichier dépasse la taille maximale des caractères de la variable chaîne ?
 
J'ai un peu compris ! Pour remplacer une valeur à un endroit quelconque du fichier, il suffit de placer un pointeur sur l'octet précédent à l'aide de FileSeek, puis, à l'aide de FileWriteInteger, par exemple, d'écrire une nouvelle valeur à cet endroit, qui écrasera l'ancienne. L'essentiel est que les anciennes et les nouvelles valeurs soient de la même taille, par exemple LONG_VALUE pour int.
 
J'ai fait mettre à jour mon terminal aujourd'hui. Maintenant, il ne peut pas voir les indicateurs... Que faire et est-ce que je l'ai mis correctement. Dans le même dossier (chemin) que précédemment.
 

for(int l = StringLen(tfs)-1 ; l >= 0 ; l--) { int char = StringGetChar(tfs,l) ; }

Il y a une erreur dans le code. Pourquoi "Char" a-t-il prêté serment ? Comment et par quoi puis-je le remplacer ?

 
artmedia70:
Que se passe-t-il si le nombre de caractères du fichier dépasse la taille maximale des caractères de la variable chaîne ?

Il n'y a pas de limite à la variable chaîne. Ou plutôt, il y en a une, mais elle est très grande. Pour MT4 à partir de la version 529, il s'agit de 2147483647 caractères, soit 2 fois moins si MT4 est sous un système d'exploitation 32 bits. Et ce n'est pas toujours le cas. Il existe différentes clés et PAE.

Dmitry01110:
J'ai un peu compris ! Pour remplacer une valeur à un emplacement quelconque du fichier, il suffit de placer un pointeur sur l'octet précédent à l'aide de FileSeek, puis, à l'aide de FileWriteInteger, par exemple, d'y écrire la nouvelle valeur, qui écrasera l'ancienne. L'essentiel est que les anciennes et les nouvelles valeurs doivent être de la même taille, par exemple LONG_VALUE pour int.
Oui, et pour le CSV, le nombre de caractères doit correspondre.

Zolotai:

for(int l = StringLen(tfs)-1 ; l >= 0 ; l--) { int nChar = StringGetChar(tfs,l) ; }

Il y a une erreur dans le code. Pourquoi "Char" a-t-il prêté serment ? Comment et par quoi puis-je le remplacer ?

 
cp
Raison: