[ARCHIVE !] Toute question de débutant, pour ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 4. - page 615

 
yosuf:
Quel est le code ?
N'y a-t-il pas un code dans vos EAs ? Dans tous les EA, tout est presque identique ! Ils ne diffèrent que par la manière de coder et les préférences du codeur. Examinez le vôtre et continuez à le faire !
 
rigonich:

Au fait, j'ai longtemps réfléchi à cette question, mais je ne l'ai jamais trouvée, j'ai simplement oublié. Où le testeur obtient-il les valeurs d'arrêt ? Si les valeurs réelles peuvent être modifiées par le serveur, alors le résultat du test devrait dépendre de l'heure du test, ce qui n'est pas le cas, j'ai vérifié. Ou bien la valeur stockée dans les propriétés du symbole et la valeur donnée par le serveur à la demande ne sont pas les mêmes ?
Les variables de l'environnement de marché se trouvent dans le fichier de service symbols.raw (vraisemblablement), qui se trouve dans le dossier historique du serveur. Lorsqu'il n'y a pas de connexion au serveur ou pendant les week-ends, le terminal reprend les dernières données de ce fichier.
 
xant:

rigonich

C'est une sorte de blague ou quoi ? Où est-ce que vous riez ?

TarasBY

Vous ne pouvez pas ? Alors ne le faites pas.

Écoutez, espèce de monstre aux oreilles ternes, vous avez été aidé, et vous ne pouvez même pas introduire un code tout fait dans votre conseiller expert ! Et tu ne fais qu'ouvrir ta bouche. Vous pouvez au moins expliquer à un idiot ! BY.
 

TarasBY

ne bouge pas, connard. C'est toi le monstre. Parce que tu ne peux même pas articuler deux mots correctement en russe.

Tu es un connard ? Eh bien, je n'ai pas besoin de vous torturer. Reposez-vous.

 
TarasBY:
Les variables de l'environnement de marché se trouvent dans le fichier de service symbols.raw (vraisemblablement), qui se trouve dans le dossier historique du serveur. Lorsqu'il n'y a pas de connexion au serveur ou pendant les week-ends, le terminal extrait les dernières données de ce fichier.


Merci.
 
xant:

rigonich

C'est une sorte de blague ou quoi ? Où est-ce que vous riez ?

TarasBY

Vous ne pouvez pas ? Eh bien, tu n'aurais pas dû.

J'ai écrit en russe - il n'y a presque rien sur la déclaration des variables globales dans le manuel. Par exemple, je ne sais pas ce qu'est fGet_MineGV() ;

Est-ce une fonction ? Si c'est le cas, que fait-il ? La recherche de fGet dans le manuel ne donne aucun résultat.

Que dois-je déclarer dans int init() ? Vous avez écrit :

{
fGet_MineGV() ;
}


Ici, dans mon EA, l'initialisation de l'init ressemble à ceci :

int init()
{
ArrayInitialize(buf3,0) ;
ArrayInitialize(b1,0) ;
ArrayInitialize(b2,0) ;
ArrayInitialize(b3,0) ;
ArrayInitialize(b4,0) ;


Comment("Calculer la valeur moyenne "+ind) ;
m1=NormalizeDouble(iCustom(NULL,tf,ind+"_a",0,0),2) ;
string d="Valeur moyenne "+ind+"+DoubleToStr(m1,2) ;
tm=TimeCurrent() ;
int q=0,ticket=-1 ;
double opr=0,lot1=0 ;
for(q=0;q<OrdersTotal();q++)
{

et ainsi de suite, 100 lignes supplémentaires. Où aller, à quel endroit, et surtout, que dois-je déclarer exactement ici ? Est-ce vraiment si difficile d'écrire en russe ? Penchons nous sur nos doigts, oui.

Est-ce une fonction ? Si oui, que fait-il ? La recherche de fGet dans les manuels scolaires ne donne aucun résultat.

Oui, cette fonction, et il ne peut rien y avoir à ce sujet dans le tutoriel, elle n'était pas disponible au moment où le tutoriel a été écrit. Il s'agit d'une fonction définie par l'utilisateur, qui a été écrite spécialement pour vous.

      void fGet_MineGV (string fs_PrefName = ""// префикс имени переменной
       {
        string ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_1");
        if (GlobalVariableCheck (ls_Name)) SUA = GlobalVariableGet (ls_Name);
        ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_2");
        if (GlobalVariableCheck (ls_Name)) SUA1 = GlobalVariableGet (ls_Name);
        ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_3");
        if (GlobalVariableCheck (ls_Name)) BUA = GlobalVariableGet (ls_Name);
        ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_4");
        if (GlobalVariableCheck (ls_Name)) BUA1 = GlobalVariableGet (ls_Name);
        //----
    }
 
Bonsoir ! Un stop suiveur fonctionne immédiatement après que l'ordre a été passé. Et cela ne devrait fonctionner que lorsque l'ordre avec le ticket tocket passera dans l'historique, et il passera strictement au TakeProfit.


//***************************************   
 
  nahodka=false;
 
 
 if (OrderSelect(tocket, SELECT_BY_TICKET , MODE_HISTORY))  
 if (OrderTakeProfit( )-3*Point<profitsell&&OrderTakeProfit( )+3*Point>profitsell) nahodka=true;
     // Находим ордер, сработавший именно по тейкпрофиту 
 
 
  
 if(nahodka){if (OrderSelect(tecket,SELECT_BY_TICKET)){
 if(OrderStopLoss( )>Bid+treylingstop*Point ){ Print ("четвёртаямодифи    " );
 OrderModify(  tecket, OrderOpenPrice(), Bid+treylingstop*Point, OrderTakeProfit(), 0, CLR_NONE);}}}
  // Модифицируем оставшийся ордер
 for ( i = OrdersTotal() - 1; i >= 0; i--)
 

rigonich

Je l'ai fait au début. J'ai inséré ce morceau de code dans la fonction init, je l'ai compilé et j'ai obtenu une note :

Lafonction "fGet_MineGV" n'est pas référencée et sera supprimée du fichier exp.

Cet avertissement est clair pour moi car il n'y a pas encore d'enregistrement, donc il ne peut rien lire, n'est-ce pas ?

Après cela, j'écris la deuxième partie du code à l'intérieur de la fonction start. Ce fragment ressemble à ceci

void fSave_MineGV (string fs_PrefName = "") // préfixe du nom de la variable
{
static datetime ldt_NewBar ;
datetime ldaTBeginBar = iTime (Symbol(), 1, 0)
//---- sauvegarde au début de chaque minute
if (ldt_NewBar == ldaTeginBar) return ;
ldt_NewBar = ldaTBeginBar ;
//---- enregistrer les valeurs de chaque variable à tour de rôle
string ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_1") ;
GlobalVariableSet (ls_Name, SUA) ;
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_2") ;
GlobalVariableSet (ls_Name, SUA1) ;
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_3")
GlobalVariableSet (ls_Name, BUA) ;
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_4") ;
GlobalVariableSet (ls_Name, BUA1) ;
}

Est-ce que tout va bien ici ?

J'insère cette partie du code juste après le calcul de SUA, SUA1, BUA, BUA1.

Mais lors de la compilation, le conseiller expert donne le résultat suivant :

27 erreur(s), 64 avertissement(s)

 

xant:

rigonich

Je l'ai fait au début. J'ai inséré ce morceau de code dans la fonction init, je l'ai compilé et j'ai obtenu une note :

La fonction "fGet_MineGV" n'est pas référencée et sera supprimée du fichier exp.

Cet avertissement est clair pour moi car il n'y a pas encore d'enregistrement, donc il ne peut rien lire, n'est-ce pas ?

Après cela, j'écris la deuxième partie du code à l'intérieur de la fonction start. Ce fragment ressemble à ceci

void fSave_MineGV (string fs_PrefName = "") // préfixe du nom de la variable
{
static datetime ldt_NewBar ;
datetime ldaTBeginBar = iTime (Symbol(), 1, 0)
//---- sauvegarde au début de chaque minute
if (ldt_NewBar == ldaTeginBar) return ;
ldt_NewBar = ldaTBeginBar ;
//---- enregistrer les valeurs de chaque variable à tour de rôle
string ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_1") ;
GlobalVariableSet (ls_Name, SUA) ;
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_2") ;
GlobalVariableSet (ls_Name, SUA1) ;
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_3")
GlobalVariableSet (ls_Name, BUA) ;
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_4") ;
GlobalVariableSet (ls_Name, BUA1) ;
}

Est-ce que tout est correct ici ?


Les descriptions de fonctions ne peuvent être placées ni dans start, ni dans inite, ni dans aucune autre fonction. Elles doivent être placées séparément. Vous pouvez les placer au milieu, au début ou à la fin de votre EA, mais pas dans d'autres fonctions. Vous ne devez mettre l'appel de fonction que dans l'init, vous pouvez le mettre au tout début.

Cette remarque est claire pour moi, puisque l'enregistrement n'a pas encore été créé, il ne peut rien compter, n'est-ce pas ? Exactement, il n'y a pas de description de fonction, que le compilateur cherche là où elle devrait être - en dehors des fonctions pragmatiques.

{

fGet_MineGV() ;
}

Il en va de même pour la deuxième fonction. Il s'agit d'une "introduction", et il est difficile de supposer que quelqu'un qui fait de la programmation, même un débutant, ne puisse pas savoir cela.

 
Dimka-novitsek:
Bonsoir, le trailing stop fonctionne immédiatement après la passation de l'ordre. Et cela ne devrait fonctionner que lorsque l'ordre avec le ticket sera déplacé vers l'historique, et il sera déplacé strictement par TakeProfit.

Mais, si votre historique n'est pas vide, vous y trouverez presque certainement un ordre déclenché exactement à Take Profit ? Apparemment, vous ne recherchez pas dans l'historique un ordre clôturé au TP, mais vous vérifiez dans l'historique comment l'ordre dont vous avez besoin a été clôturé, et s'il a été clôturé tout court. C'est ce que vous devez vérifier, pourquoi vérifiez-vous exactement le prix de clôture de votre ordre ? Trois options - 1. Prix de clôture==0 - si l'ordre est au marché, il n'est pas dans l'historique (OrderSelect() retournera false) 2. Prix de clôture est égal à
OrderTakeProfit()
-- l'ordre a été clôturé au prix stop, 3.
OrderTakeProfit()
-- l'ordre n'a pas été clôturé au stop .