[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 - 5. - page 417

 
TarasBY:
Dans le coin inférieur gauche du graphique (où se trouve la date), double-cliquez et dans la fenêtre qui s'ouvre, entrez la date souhaitée au format JJ.MM.AAAA - n'est-ce pas assez "non manuscrit" ?
Oui, merci beaucoup. Ok.
 
Run:

ou en d'autres termes
le script est censé écrire approximativement n nombre de lignes, mais il n'en écrit qu'une seule

Pour commencer, déplacez la procédure d'ouverture et de fermeture du fichier hors de la boucle.
 

Merci, ça marche.

  handle=FileOpen("AUDJPY.csv", FILE_READ|FILE_WRITE, '\t');
  for (int i=NumberOfCandels; i>0; i--) {
    arrowbuy = iCustom(NULL, 0, "xxx", 0, i);
    arrowsell = iCustom(NULL, 0, "xxx", 1, i);
    if(arrowbuy != EMPTY_VALUE && arrowsell == EMPTY_VALUE) {
      if(handle>0) {
        FileWrite(handle, TimeToStr(Time[i], TIME_DATE|TIME_MINUTES), " Buy");
        }
      }
    if(arrowsell != EMPTY_VALUE && arrowbuy == EMPTY_VALUE) {
      if(handle>0) {
        FileWrite(handle, TimeToStr(Time[i], TIME_DATE|TIME_MINUTES), " Sell");
        }
      }
  }
  FileClose(handle);
 
okvseok:


Par exemple, ne faites pas rouler la molette de la souris (touche) 3 minutes vers la gauche ou la droite))), mais entrez simplement une certaine date de barre ou autre chose.

Merci pour la réponse !

Il existe une fonction

int iBarShift( string symbol, int timeframe, datetime time, bool exact=false)
Recherche d'un bar par heure. La fonction renvoie le décalage de la barre à laquelle appartient le temps spécifié. S'il n'y a pas de barre pour le temps spécifié ("trou" dans l'historique), la fonction renvoie, selon le paramètre exact, -1 ou le décalage de la barre la plus proche.
Paramètres :
symbole - Nom du symbole de l'instrument. NULL signifie le symbole actuel.
cadre temporel - Période. Peut être l'un des horizons temporels d'un graphique. 0 signifie la période du graphique actuel.
temps - Valeur du temps pour la recherche.
exact - Valeur retournée si aucune barre n'est trouvée. FALSE - iBarShift retourne au plus proche. TRUE - iBarShift renvoie -1.
Exemple :
 datetime some_time=D'2004.03.21 12:00' ; int shift=iBarShift("EUROUSD",PERIOD_M1,some_time) ; Print("shift of bar with open time ",TimeToStr(some_time)," is ",shift) ;

 
Chiripaha:

: )))))))) (pas de notation... et pas de commentaire)

Entre celui qui pose la question et celui qui y répond, il est plus probable que vous, l'auteur de la question, ne compreniez pas bien ce qui arrive aux ordres en attente lorsqu'ils sont déclenchés. Un ordre en attente est exécuté à N'IMPORTE QUEL prix le plus proche de lui. La règle générale pour un ordre en attente est que si le prix l'a atteint, la transaction sera mise sur le marché. Et le prix n'aura pas d'importance. Cela s'applique également aux Stop Loss, car il s'agit également d'ordres en attente, mais dans la position opposée à la transaction elle-même. C'est légèrement différent des transactions en bourse. C'est peut-être la raison de votre confusion.

En ce sens, beaucoup dépend de la qualité du courtier. Nous entendons par là à la fois les réglementations relatives à l'exécution des transactions et la disponibilité de liquidités chez ce courtier, et peut-être un tas d'autres caractéristiques : l'honnêteté présumée, etc... Si vous lisez le contrat avec presque n'importe quel courtier en devises (DC), il s'avère que votre transaction (et celle de n'importe quel autre trader) peut être clôturée à n'importe quel prix convenable de ce "courtier" et elle sera conforme à la loi et aux règlements, car vous l'avez signé. - Mais ce sont d'autres sujets. Cela n'a rien à voir avec la programmation.


Si vous avez un robot sur la démo, tout s'ouvre généralement bien là pour attirer les gens. Et, je le répète, les commandes qui ont été ouvertes manuellement l'ont été à l'endroit où elles ont été fixées !
 
Ekburg:

En ce qui concerne le courtier en devises, je n'ai pas d'idée précise, mais j'ai négocié sur la démo. Et, encore une fois, je le répète, les ordres qui ont été ouverts manuellement l'ont été exactement là où ils avaient été fixés !

Bottom line : Bien sûr, on pourrait, par intérêt, vous demander de décrire les conditions de manière plus détaillée, puisque vous n'avez fourni qu'une description générale : quand les ordres du robot ont-ils été fixés (à l'avance ou non ; manuellement à peu près en même temps que le robot ou non, etc.) Mais de toute façon, même dans ce cas, vous n'aurez à traiter qu'avec votre courtier, car il a son propre fil de discussion qui met probablement les transactions en attente. Supposons que l'ordre manuel en attente ait été placé en premier, le moment de son exécution sera différent (y compris la file d'attente des autres clients), et le prix peut donc être différent. Si le robot a placé les ordres dans la période des signaux formés, alors l'arrivée des ordres dans la file d'attente n'est pas évidente - d'où le biais possible dans le prix d'exécution. De plus, elle peut être affectée par la taille des positions sur lesquelles vous n'écrivez rien... etc...

Mais... tout de même, cela ne peut être clarifié qu'avec un courtier (DC). Et je suppose qu'il trouvera un tas de raisons que je n'ai pas mentionnées. - Et le conseil était juste : le journal dans vos mains et au courtier, sauf si bien sûr vous pensez toujours que vos ordres en attente ont bougé. Mais il ne faut pas confondre deux concepts différents : un ordre en attente et une transaction sur cet ordre en attente. L'ordre à cours limité est une instruction d'entrer sur le marché à tout prix le plus proche avec un volume déclaré. Et le Deal - est le prix auquel il a été possible d'exécuter votre ordre pour le volume d'argent (lot) déclaré. - Et les prix de ces commandes sont susceptibles d'être différents (notamment sur le marché rapide, dont on vous a donné le lien). Dans le cas d'un ordre à cours limité, le prix de l'ordre et le prix de l'exécution sont égaux (par définition).

Et le fait que les ordres démo et réels du courtier ne diffèrent pas est une bonne chose ! - Cela montre que le courtier ne truque pas les transactions pour attirer les clients (comme vous le dites). - Il n'y a pas de divergence à constater dans ce cas.

 
Zhunko:

1. Comment avez-vous commencé ? Vous devez d'abord l'exécuter sans mise à jour. C'est-à-dire IsRefreshRates = false. Les données ne seront pas mises à jour.

2. Vous devez alors l'exécuter avec IsRefreshRates = true. Les données seront mises à jour.

Voici une capture d'écran 1 : capture d'écran 2 :

Notez les horaires des bars. Vous pouvez également voir que MarketInfo() prend les données de l'aperçu du marché.

Voici le conseiller expert. Je l'ai un peu corrigé. J'ai coché le nom de l'instrument.


1. J'ai utilisé un terminal peu importe comment, avec ou sans mise à jour, l'écran est le même ! J'ai téléchargé le terminal ainsi que les scripts pour le test avec 99% de citation de Dookie. Je les ai versés car ils ne s'attachent pas à cause de leur taille excessive. Voici le lien: http://www.load.to/PqWVW2JQ75/Тиковые_котировки_для_тестера_MT4_от_DukasCopy.zip

2) Dans tout autre terminal, la situation est déjà différente. Ici, sur Oanda, par exemple :

2.1 Initialement dans le cas :

IsRefreshRates = false

Donc :

2.2 Plus loin dans l'affaire :

IsRefreshRates = true

comme ça.

Comme vous pouvez le voir dans le premier mode, les prix sont loin de la paire AUDNZD... et dans le second mode, les prix sont exactement ce que nous voulons voir...

Il s'avère que la fonction RefreshRates() "tire" toujours des citations du serveur. Le support est endormi, cette variante est donc plus proche que l'original.

 
Zhunko:
RefreshRates() ne met à jour que ce sur quoi l'expert travaille. C'est comme ça qu'il le découvre. Par l'expert. Il y a longtemps, quelqu'un de Metakvot a écrit à ce sujet.


Vadim, je doute que RefreshRates() soit conscient des outils dont l'Expert Advisor a besoin. Tous les Expert Advisors n'ont pas un nom d'outil défini dans les paramètres globaux, n'est-ce pas ? Eh bien... Si c'est le cas, on peut se demander sur quelle baseRefreshRates() sait quelles données de marché de l'outil doivent être mises à jour et lesquelles ne doivent pas l'être ?
 
Integer:

Junko, page 409, tout en bas du post - il est dit pourquoi les données sont mises à jour. Parce que iOpen(), iClose() sont appelés, et vous le prouvez à partir de RefreshRates(). La première fois, le script a été exécuté sans RefreshRates(), mais les fonctions iOpen() et iClose() ont été appelées, et c'est à partir de là que le terminal charge les données. Au deuxième passage, les données étaient déjà là et nous savons que la barre de zéro est chargée en premier, donc l'impression est que les données sont toutes chargées, mais elles ne sont peut-être pas toutes chargées, mais elles sont peut-être en cours.

...Et pourtant vous prouvez que vous avez compris le chargement des données..... de quels flux et synchronisations pouvons-nous parler ici...


PourquoiiOpen() tirerait-il des données du serveur ? Il est écrit dans la documentation qu'il retourne une valeur... Donc c'est un retour, pas un téléchargement.
 
TarasBY:

Voici une des façons possibles de rechercher les N tickets des derniers ordres clôturés, et vous pouvez filtrer les ordres par type (ACHAT, VENTE) et par rentabilité (déficitaire, profitable) :

Après que la fonction fGet_TicketsLastCloseOrd() soit appelée et qu'elle renvoie la quantité de billets trouvés selon les paramètres spécifiés, vous pouvez (je le ferais) vérifier avec la quantité spécifiée de billets (fi_NUM) et la valeur renvoyée par la fonction. Tous les tickets collectés seront dans le tableau passé à la fonction par référence.

Et dans cette variante, il n'est pas important de savoir combien de ces derniers billets sont recherchés. :)

Et si vous avez besoin de faire du profit grâce à ces derniers ordres fermés, c'est encore plus facile :


Pouvez-vous m'apprendre comment l'utiliser de manière pratique ?

disons que j'ai besoin d'obtenir le profit total des 12 dernières positions fermées, où dois-je entrer le nombre 12 dans ce code ?

J'ai essayé de cette façon

      Print (fGet_TicketLastClosePos(-2,0,iTime (NULL, PERIOD_D1, 0)),fGet_TicketsLastCloseOrd(12,0),fGet_ProfitLastCloseOrd(12,-2));

il est indiqué '0' - types incompatibles


Raison: