[Archive] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Je ne peux aller nulle part sans toi - 2. - page 82

 
nemo811:
Merci pour votre aide. J'ai compris la logique de l'activation du drapeau et la fonction de retour du nombre de commandes. Mais je suis également intéressé par le moment où l'ordre est fermé. Il semble que la condition de drapeau essaie de placer un ordre à nouveau mais la fonction renvoyant le numéro d'ordre dit qu'il a diminué de 1 et initialise l'ouverture d'une position également. Corrigez-moi si j'ai manqué quelque chose.


Dans le code que vous avez fourni, la condition est à un endroit (BUY=true) et jusqu'à ce que le drapeau change, la réouverture n'aura pas lieu... parce que l'appel de fonction pour ouvrir une position vient de ce bloc de condition... Et le drapeau dans ce code ne peut changer qu'après le redémarrage de l'EA, lorsque la variable avec la valeur true sera initialisée.

Ou peut-être que je ne comprends pas la question :)

 
NameLess:


L'indicateur dans ce code ne peut changer qu'après le redémarrage de l'Expert Advisor, lorsque la variable avec la valeur true est initialisée.

ou je ne comprends pas la question :)


Merci, vous avez raison. Je vais l'appliquer maintenant.
 
NameLess:


C'est la version qui s'est avérée fonctionner. Un grand merci à vous et à IgorM:

extern bool BUY = true;
extern int Magic = 0;
extern double Lot = 0.1;
extern int takeprofit = 0;
extern int stoploss = 0;
extern int slippage = 3; 
double SL,TP;
int init(){
return(0);
}
int start()
{
if (BUY)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP=0;
if (stoploss!=0) SL = NormalizeDouble(Ask - stoploss*Point,Digits); else SL=0; 
OPENORDER ("Buy");

BUY=false;
}

return(0);
}
void OPENORDER(string ord)
{
int ticket = -1;
while (ticket<0)
{
if (ord=="Buy") ticket=OrderSend(Symbol(),OP_BUY, Lot,NormalizeDouble(Ask,Digits),slippage,SL,TP,"",Magic,0);
Sleep(500);
}
return;
}
 

string Val="";
Val = iBands(NULL,0,50,2,0,PRICE_CLOSE,MODE_LOWER,0);
string substr=StringSubstr(Val,0,1);
point_low=StrToDouble(substr);
substr=StringSubstr(Val,2,1);
point_low+=StrToDouble(substr)/10;
substr=StringSubstr(Val,3,1);
point_low+=StrToDouble(substr)/100;
substr=StringSubstr(Val,4,1);
point_low+=StrToDouble(substr)/1000;
substr=StringSubstr(Val,5,1);
point_low+=StrToDouble(substr)/10000;
substr=StringSubstr(Val,6,1);
point_low+=StrToDouble(substr)/100000;

substr=StringSubstr(Val,7,1);
point_low+=StrToDouble(substr)/1000000; //тут плюсуем 6-ю цифру после запятой.

Les gens, rien n'aide ! Je n'arrive pas à obtenir une valeur avec 5 décimales. J'ai essayé toutes les options auxquelles j'ai pensé, j'ai traduit une chaîne en un nombre, j'ai traduit une sous-chaîne en un nombre, j'ai enlevé des chiffres (exemple ci-dessus) et je les ai stupidement ajoutés un par un, au-delà de 4 décimales, ça ne s'additionne pas et ça commence à arrondir à 4 décimales. J'ai même ajouté la 6e décimale.

Se peut-il qu'Alert n'affiche pas les doubles variables au-delà du 4ème signe ? Je ne sais pas quoi penser... une sorte de mystère(

 

J'ai écrit deux EAs liés entre eux (ils ne traitent pas, ils créent juste des gobals) et je pense que je peux les utiliser pour faire un indicateur graphique de volume équi similaire au graphique de prix régulier dans mt4. Ou si quelqu'un a déjà utilisé quelque chose de similaire, merci de partager le code :)

Dossiers :
eqvol.rar  3 kb
 
NameLess:

Se peut-il qu'Alert n'affiche pas les doubles variables au-delà du quatrième chiffre (il affiche la chaîne entière) ? je ne sais pas quoi penser... une sorte de mystère(

Oui. Il affiche (comme Print) les 4 chiffres standard si un seul numéro est sorti.

Utilisez DoubleToStr pour être plus précis.

 

Rrrrrrrrrrrrr. c'est vrai, le terminal d'Alert n'affiche pas plus de 4 caractères. j'ai remis le double sur la ligne et l'ai sorti pour regarder l'écran - tout est correct.

j'ai tué une demi-journée pour cette absurdité. c'est un peu léger, et tout fonctionnait initialement(

 
NameLess:

Les gens, rien n'aide ! Je n'arrive pas à obtenir une valeur avec 5 décimales. J'ai essayé toutes les options auxquelles j'ai pensé, j'ai traduit une chaîne en un nombre, j'ai traduit une sous-chaîne en un nombre, j'ai enlevé des chiffres (exemple ci-dessus) et je les ai stupidement ajoutés un par un, au-delà de 4 décimales, ça ne s'additionne pas et ça commence à arrondir à 4 décimales. J'ai même ajouté la 6e décimale.

Se peut-il qu'Alert n'affiche pas plus que le 4ième chiffre de la variable double ? (La chaîne de caractères affiche tout) Je ne sais pas quoi penser.

Eh bien, comme toujours, tout repose sur l'expérience. Nous écrivons le scénario :

#property copyright ""
#property link      ""
#include <Basic_dll.mqh>

//+------------------------------------------------------------------+
//|                 Старт работы скрипта                             |
//+------------------------------------------------------------------+
int start(){
  string Stroka,Podstroka,SMB;
        int DGS,BezDrobi;
        double Rezult;
        SMB=Symbol();
        //DGS=MarketInfo(SMB,MODE_DIGITS);
        DGS=5;// дигитс задаём принудительно, чтоб можно было проверить на любой валюте
        // передаём левое значение в переменную
        Rezult=1.252546987;
        // возводим число в степень
        for(int i=1;i<=DGS;i++){
                Rezult=Rezult*10;
        }
        // В степень возвели. Теперь отбрасываем дробную часть.
        BezDrobi=OtbrosDrobnChasti(Rezult);// функция отбрасывает дробную часть числа
        Alert("BezDrobi = ",BezDrobi);
        // теперь ставим на место запятую
        Rezult=BezDrobi*1.0;
        for(i=1;i<=DGS;i++){
                Rezult=Rezult/10;
                Alert("Rezult = ",Rezult);
        }
        Alert("----------- ",SMB," -----------");
        return(0);
}

Comme nous pouvons le voir, il y a une carte dll connectée au script. Il n'a qu'une seule fonction qui élimine la partie fractionnaire du nombre. Le fichier dll est joint à ce message. Maintenant, nous devons appliquer séquentiellement le script à 2 paires de devises. Je l'ai mis sur la livre et l'euro-japonais. Dans la livre, j'ai 4 décimales. Sur la paire de devises euro-japonaise - deux. Voici le résultat de l'opération de script :

Dans la fourrière, vous pouvez voir comment la virgule se déplace de manière cohérente. Et vous pouvez également voir que la dernière division laisse 4 chiffres dans la partie fractionnaire. Nous pouvons supposer que puisque mes chiffres = 4, le cinquième chiffre après la virgule est coupé. Ainsi, l'EuroJaponais devrait également aboutir à seulement 2 chiffres après la virgule, puisque les chiffres sur celle-ci = 2. Cependant, l'expérience montre qu'elle donne également lieu à 4 chiffres après la virgule. Notre hypothèse n'est donc pas correcte et des arrondis peuvent avoir lieu. Essayons de remplacer le 4 final par 7. Le résultat :

Que voyons-nous ? Le cinq obtenu devient maintenant un six. Par conséquent, l'arrondi automatique a lieu.

Je ne sais pas comment le script se comportera sur le caractère à cinq chiffres, mais je n'étais pas satisfait du travail sur les caractères à quatre et deux chiffres - le terminal interférait et arrondissait sans qu'on lui demande de le faire. Je dois donc poser des questions aux développeurs. Ou - option 2 - prendre les lectures de l'indicateur, les mettre dans une chaîne, envoyer la chaîne à une dll, traiter les données là comme nous en avons besoin et retourner l'ordre de transaction de la dll.

Dossiers :
experts.rar  42 kb
 

Information de l'aide (Selon l'alerte) :

Данные типа double выводятся с 4 десятичными цифрами после точки. Для вывода чисел с большей точностью используйте функцию DoubleToStr().

Allez comprendre pourquoi les développeurs ont fait ça...

 
drknn:


Merci, j'ai étudié le code, très intéressant. Tout, comme je l'ai décrit ci-dessus, s'est avéré plus simple : le terminal n'affiche tout simplement pas plus loin que le 4ème chiffre dans la fenêtre. et toutes les idées ont fonctionné, elles ont juste résolu le problème de conversion de manière différente :)

zy. Une fois de plus, je suis convaincu que tous les problèmes sont résolus logiquement, et ici la situation était à l'origine illogique, donc nous cherchions un problème au mauvais endroit :)

Raison: