Erreurs, bugs, questions - page 623

 
MetaDriver:
Tu vas avoir un réveil brutal... :))

Probablement,

J'ai lu l'essentiel du problème, je ne comprends pas pourquoi chaque indicateur doit avoir un timer, et pourquoi il y a tant d'indicateurs,

s'il est possible d'obtenir les offres de l'instrument requis directement dans le timer EA et de les mettre dans l'assemblée générale,

Si vous voulez utiliser un indicateur, vous aurez besoin de beaucoup d'indicateurs, car la résolution sera fine.

c'est différent avec les espions - ils n'ont pas d'horloges et les événements pour tous les instruments peuvent ne pas se produire pendant un long moment, ou ils peuvent commencer à faire tic-tac l'un après l'autre.

Par exemple, dans les transactions où il y a un dernier prix, les données Bid ne sont pas toujours présentes, il faut donc vérifier et écrire soit Bid soit Last.

 

MetaDriver:

Je propose un compromis : vous attrapez les ticks avec des espions et les envoyez immédiatement au conseiller expert principal avec une étiquette en millisecondes (GetTickCount()). Expert Advisor les classe en fonction de leurs étiquettes et les découpe en seconds blocs.

Ce n'est pas très simple, mais ce sera précis.

Ce n'est pas une mauvaise variante. À mon avis, c'est la seule qui vaille la peine d'être prise comme base.

Urain:

À propos, dans les transactions où il y a un dernier prix, les données de l'offre ne sont pas toujours présentes, il faut donc vérifier et écrire soit l'offre, soit le dernier prix.

Bonne clarification, je n'ai pas rencontré cela. Il faudra en tenir compte.
 

MetaDriver:

Предлагаю компромисс: ловишь тики шпионами и сразу отправляешь в головной эксперт, снабдив милисекундной меткой(GetTickCount()). Эксперт их упорядочивает в соответствии с метками и нарезает секундные блоки.

Не очень просто, зато с точностью будет порядок.

Intéressant:

Ce n'est pas une mauvaise option. A mon avis, le seul qui vaille la peine d'être pris comme base.

Bonne clarification, je n'ai pas rencontré cela. Il faudra en tenir compte.

Ce n'est peut-être pas une mauvaise variante, mais le mécanisme d'envoi de ticks est absent du terminal. Essayez de penser à 5-10 ticks/sec sur 16 paires. Encore une fois - c'est déjà parti)).

Et vous n'avez pas besoin d'une telle précision - 1 seconde suffit.

Grâce à vous tous, le sujet est terminé.

 

Le problème est très désagréable en raison de la substitution des barres de minutes par des barres d'horizons temporels plus élevés dans un passé historique lointain, lorsque l'historique minute par minute n'était pas encore disponible. La seule solution qui vient à l'esprit est la conversion complexe de fausses barres en vraies barres, mais elle ne peut garantir l'exactitude. Il ne s'agit pas tant de la complexité que des doutes sur l'exactitude d'une telle conversion.

La tâche initiale consiste à vérifier la pertinence des fuseaux horaires de Fibonacci qui sont tracés. Si la zone est trop éloignée et que la largeur de travail de toutes ses sous-zones (jusqu'à 34 largeurs de base par défaut) est si étroite que le bord droit n'atteint pas le moment présent, nous ne la construisons pas, sinon nous créons un objet sur le graphique. J'ai essayé de résoudre ce problème de deux manières similaires, dont une que je cite. La seule différence, c'est que dans le premier cas, je dansais dès le début de l'histoire en utilisant le système d'enregistrement des données.

   datetime firstDate=(datetime)SeriesInfoInteger(_Symbol,_Period,SERIES_FIRSTDATE);
Et dans la seconde - au contraire (je cite cette méthode), l'essence et les résultats sont absolument les mêmes. Testé sur NZD/USD.

Si vous avez un faux historique se terminant à une date autre que 2009, comme c'est mon cas, réarrangez les deux fuseaux horaires Fibo de sorte que l'un d'eux passe par cette date de basculement, et que le second soit déjà complètement à droite de l'historique, où toutes les barres sont réelles. Dans ce cas, n'oubliez pas de modifier les valeurs de startTime1, endTime1 et, si nécessaire, startTime2, endTime2 dans le script ; vous ne pouvez pas ajuster les prix - ce n'est pas important. Maintenant vous pouvez le tester... Le résultat sera triste : si l'algorithme de vérification des deux fuseaux horaires reste inchangé, il ne fonctionnera correctement que pour la zone qui a un pied avant la date du tournant et un autre pied après, l'algorithme la filtrera à tort et nous empêchera de la construire. Notez que les deux fuseaux sont assez proches l'un de l'autre et ont des largeurs similaires, et ces deux largeurs s'étendent loin dans le futur et seront pertinentes pendant longtemps, en fait aucun des deux ne devrait être filtré (commentez les conditions et voyez que les deux fuseaux horaires sont construits).

void OnStart()
  {
   datetime startTime1=D'2009.07.08 18:00:00';
   datetime endTime1=D'2009.11.03 12:17:00';
   datetime startTime2=D'2009.06.30 08:00:00';
   datetime endTime2=D'2009.10.21 20:16:00';

   double startPrice1=0.61930;
   double endPrice1=0.70948;
   double startPrice2=0.65470;
   double endPrice2=0.76300;

   int FTZ1pos1,FTZ2pos1,bandwidth;
   datetime Arr[],time1;

   CopyTime(_Symbol,PERIOD_M1,0,1,Arr);
   time1=Arr[0];

   FTZ1pos1=CopyTime(_Symbol,PERIOD_M1,time1,startTime1,Arr);
   bandwidth=CopyTime(_Symbol,PERIOD_M1,endTime1,startTime1,Arr)*(34+2); // +2 - небольшой запас общей ширины
                                                                         // зоны на всякий случай

   if(FTZ1pos1<=bandwidth)
      ObjectCreate(0,"FTZ1",OBJ_FIBOTIMES,0,
                   startTime1,startPrice1,
                   endTime1,endPrice1
                  );


// ---
   FTZ2pos1=CopyTime(_Symbol,PERIOD_M1,time1,startTime2,Arr);
   bandwidth=CopyTime(_Symbol,PERIOD_M1,endTime2,startTime2,Arr)*(34+2); // +2 - небольшой запас общей ширины
                                                                         // зоны на всякий случай

   if(FTZ2pos1<=bandwidth)
      ObjectCreate(0,"FTZ2",OBJ_FIBOTIMES,0,
                   startTime2,startPrice2,
                   endTime2,endPrice2
                  );
  }

Résultat souhaité :Il doit y avoir deux fuseaux horaires Fibo

Quelque part entre la première et la deuxième ligne de base 0, il existe un point de basculement qui sépare les fausses barres minutes des vraies.

Si l'on rejette les calculs en nombre de barres et que tout est calculé avec des dates, cela ne donnera certainement pas la précision souhaitée, car il faut soustraire les week-ends (+/- l'heure de fermeture/ouverture du marché), les jours fériés, etc., sans parler des barres manquantes en l'absence de ticks supérieurs à une minute et de divergence par rapport à la ligne de temps.

Que conseillez-vous comme solution fiable ?

 

Erreur de chargement de fichier dans Expert Advisor. Trouvez 10 différences. Le premier code fait référence au script, le second à l'Expert Advisor, ils sont identiques Ctrl-C Ctrl-V. Le code fonctionne dans le script, il ne fonctionne pas dans l'Expert Advisor.

#include <\\MyClass\RegulFind-v1-1.mqh>
#include <Trade\Trade.mqh>
int hMa,hRsi ;
double mMa[],mRsi[];                             
Kohonen  koh;
CTrade trade ;
void OnStart()
  {
   koh.LoadMap("KitMaRsi.csv") ;
   hMa=iMA(_Symbol,Period(),10,0,MODE_EMA,PRICE_CLOSE) ;
   if(hMa ==INVALID_HANDLE)
      Print("Ошибка загрузки машки====================== ",GetLastError());
   hRsi=iRSI(_Symbol,Period(),10,PRICE_CLOSE);
   if(hRsi ==INVALID_HANDLE)
      Print(" Ошибка загрузки РСИ ==========");   
   
  }
#include <\\MyClass\RegulFind-v1-1.mqh>
#include <Trade\Trade.mqh>
int hMa,hRsi ;
double mMa[],mRsi[];                             
Kohonen  koh;
CTrade trade ;
int OnInit()
  {
   koh.LoadMap("KitMaRsi.csv") ;
   hMa=iMA(_Symbol,Period(),10,0,MODE_EMA,PRICE_CLOSE) ;
   if(hMa ==INVALID_HANDLE)
      Print("Ошибка загрузки машки====================== ",GetLastError());
   hRsi=iRSI(_Symbol,Period(),10,PRICE_CLOSE);
   if(hRsi ==INVALID_HANDLE)
      Print(" Ошибка загрузки РСИ ==========");   
   return(0);
  }
 
ivandurak:

Erreur de chargement de fichier dans Expert Advisor. Trouvez 10 différences. Le premier code fait référence au script, le second à l'Expert Advisor, ils sont identiques Ctrl-C Ctrl-V. Le code fonctionne dans le script, il ne fonctionne pas dans l'Expert Advisor.

Le testeur dispose d'un sandbox de fichiers différent. Si vous voulez que l'Expert Advisor dans le testeur et la manière normale de travailler avec un fichier *.csv, mettez-le dans le répertoire commun et ouvrez le fichier avec le modificateur FILE_COMMON.


P.S. Pour le placer dans le dossier commun, vous devez soit écrire un fichier avec le modificateur
FILE_COMMON, soit trouver quelque chose comme ceci (une variante pour XP) :

C:³ Documents and Settings ³ All Users ³ Application Data ³ MetaQuotes ³ Terminal ³ Common ³ Files ³
.



 
x100intraday:

Que conseillez-vous comme solution fiable ?

Retour à MT4.

J'ai contacté les développeurs au sujet de l'avenir de ce problème, mais ils sont restés silencieux, donc personnellement je n'ai aucune idée de ce que l'avenir nous réserve.

 

L'échange avec les variables de caractères ne semble pas fonctionner...

Au lieu de :

string type = "Buy";

switch(type)
{
case "Buy" : {direction = ORDER_TYPE_BUY;  price = SymbolInfoDouble(zSymbol,SYMBOL_ASK); break;}
case "Sell": {direction = ORDER_TYPE_SELL; price = SymbolInfoDouble(zSymbol,SYMBOL_BID); break;}
default: {return(lot_value);}
}

type' - type d'expression de commutation illégal
Acheter" - l'expression constante n'est pas intégrale

Je dois le dessiner comme ça :

if(zShift == "Buy")  {direction = ORDER_TYPE_BUY;  price = SymbolInfoDouble(zSymbol,SYMBOL_ASK);}
if(zShift == "Sell") {direction = ORDER_TYPE_SELL; price = SymbolInfoDouble(zSymbol,SYMBOL_BID);}
if(zShift != "Buy" || zShift != "Sell") {return(lot_value);}

Ce n'est pas très clair et c'est de travers.

Il fonctionne bien dans d'autres langues.

Devrais-je l'écrire d'une autre manière ?

 
awkozlov:

Switch ne semble pas fonctionner avec les variables de caractère...


La documentation indique (c'est nous qui soulignons) : " Switch operator":

Compare la valeur d'une expression aux constantes dans toutes les variantes de cas et passe le contrôle à l'opérateur qui correspond à la valeur de l'expression. Chaque variante de cas peut être marquée par une constante entière , une constante de caractère ou une expression constante. Une expression constante ne peut pas inclure de variables ou d'appels de fonction. L'expression de l'opérateur decommutation doit être de type entier.

 
awkozlov:

Il fonctionne dans d'autres langues...

Le fait qu'il fonctionne dans d'autres langues est une caractéristique. A l'origine, l'interrupteur n'était prévu que pour les types intégraux. Il n'y a pas de telle caractéristique ici.
Raison: