PDA

Afficher la version compl?te : Utiliser Bid in While Loop?



Mopass
23/09/2006, 17h20
J'essayais de r?diger une ?valuation environnementale et de vous aider ? pr?ciser le prix avant de passer un ordre de vente (dans une tene haussi?re marqu?e), j'essaie d'utiliser une boucle while faire ainsi, il semble que le testeur passe dans une boucle infinie - il n???ex?cute tout simplement pas le script bien qu???il n???y ait pas d???erreur lors de la compilation.

Vous trouverez ci-dessous la boucle. Si quelqu'un peut dire pourquoi cela ne fonctionne pas ou donner des suggestions pour l'ajuster ou le modifier, je l'appr?cierais.

BuyPriceMax = Bid- (TrailingBuy * Point);
while (Bidgt; = BuyPriceMax) {
si (Bidgt; BuyPriceMax (TrailingBuy * Point)) {
BuyPriceMax = Bid- (TrailingBuy * Point);
Sommeil (10000);/SOMMEIL 10 SECONDES
RefreshRates ();
}
}
Le code suit une instruction if pour s'assurer que la tene est ? la hausse. Pour ce faire, proc?dez comme suit: D?finissez un prix de fuite (BuyPriceMax) auquel une ench?re peut ?tre compar?e. Lorsque le prix de l'offre est gt; = BuyPriceMax, v?rifiez le prix de l'offre pour vous tenir au fait de l'augmentation. Si le prix augmente, augmentez BuyPriceMax par rapport au cours acheteur moins TrailingBuy - une variable que j???utilise pour permettre au prix de plonger l?g?rement ? la hausse, sans exercer l???ordre (ce qui est similaire ? ce que vous pourriez d?finir comme point de fuite suivi). La boucle doit cesser d???ex?cuter et la commande sera pass?e au prix de l???offre. Si quelqu'un peut m'aider ? comprendre pourquoi Bid semble toujours ?tre gt; = BuyPriceMax, je l'appr?cierais. Il semble qu'avec la commande d'actualisation, une fois que Bid a chut? suffisamment, il doit mettre fin ? la boucle pour que ma commande puisse ?tre pass?e.

Merci!

Ledeldixxa
10/12/2021, 01h01
Cela a pris un certain temps, mais je n???ai jamais aim? laisser une question sans r?ponse, alors j???ai compris la chose pour vous. Voici ce qu'il en est: Disons ceci: Bid = 1,2700 TrailingBuy = 30 Donc, alors ceci-- BuyPriceMax = Bid- (TrailingBuy * Point); while (Bidgt; = BuyPriceMax) {if (Bidgt; BuyPriceMax (TrailingBuy * Point)) {BuyPriceMax = Bid- (TrailingBuy * Point); Sommeil (10000);/SLEEP 10 SECONDES RefreshRates (); }} Devient this-- BuyPriceMax = 1.2700- (30 * Point);/BuyPriceMax devient 1.2670 while (1.2700gt; = 1.2670) {//Cela est vrai, la boucle if est renvoy?e si (1.2700gt; 1.2670 (30 * Point)) {//1,2700 n'est PAS sup?rieure ? 1,2700 BuyPriceMax = Bid- (TrailingBuy * Point);/Par cons?quent, il saute cette ligne Sleep (10000);/SLEEP 10 SECONDES/et cette ligne RefreshRates ();/et cette ligne}/fin de la boucle if///ici, il fait d?filer la boucle while sans rafra?chir les taux, de sorte que votre ench?re est toujours ? 1,2700, ce qui en fait une boucle infinie} Wow, ?a fait du bien de r?soudre ce probl?me. En ce qui concerne la modifiion du code pour rem?dier ? cela, voici ce que j???ai trouv?: Code ins?r? BuyPriceMax = Bid- (TrailingBuy * Point); while (Bidgt; = BuyPriceMax) {RefreshRates (); if (Bidgt; BuyPriceMax (TrailingBuy * Point)) {BuyPriceMax = Bid- (TrailingBuy * Point); } Sommeil (10000);/SLEEP 10 SECONDES} REMARQUE: Vous pouvez et souhaitez ?ventuellement placer la ligne de veille et RefreshRates () avant ou apr?s l'instruction if. Je suis s?r que ?a n'affectera rien. Dans le pire des cas, l'ordinateur effectuera une boucle suppl?mentaire dans la boucle, ce qui prendra environ un milli?me de seconde. Lorsque le prix augmente: BuyPriceMax = 1,2700- (30 * points);/BuyPriceMax devient 1.2670 while (1.2700gt; = 1.2670) {//Ceci est vrai RefreshRates ();/Maintenant, l'ench?re est pass?e ? 1.2703 si (1.2703gt; 1.2670 (30 * Point)) {//1.2703 est sup?rieur ? 1.2700, il passe donc ? la ligne suivante. BuyPriceMax = 1.2703- (30 * Point);/New BuyPriceMax vaut 1,2773} Sleep (10000);/SLEEP 10 SECONDES} Et quand le prix baisse: BuyPriceMax = 1.2700- (30 * Point);/BuyPriceMax devient 1.2670 while (1.2700gt; = 1.2670) {//Ceci est vrai RefreshRates ();/Maintenant, l'ench?re est pass?e ? 1,2660 si (1,2660gt; 1,2670 (30 * points)) {//1,2660 n'est pas sup?rieur ? 1,2700, il saute donc la ligne suivante. BuyPriceMax = Bid- (TrailingBuy * Point);/ligne saut?e} Sleep (10000);/SLEEP 10 SECONDES} Ensuite, il reviendra dans la boucle while ... while (1.2660gt; = 1.2670) {//Faux, il va donc sortir de la boucle et ex?cuter la commande ...} Sorry it C'?tait un si long post, mais je voulais l'expliquer ? fond.

Ledeldixxa
10/12/2021, 02h22
O? sont mes mani?res? Je viens de me rendre compte que c'?tait votre premier article, alors bienvenue ? la Factory! Il y a beaucoup de gens formidables ici pr?ts ? vous aider, ainsi qu'une richesse de connaissances pour apprendre.

Mopass
10/12/2021, 03h42
Merci - ?a aide vraiment! Merci pour l'accueil. Ce forum est g?nial.

Mopass
10/12/2021, 05h03
Eh bien, je pensais que tout irait avec le d?placement de la fr?quence de rafra?chissement avant l'instruction if, mais lorsque j'essaie de faire un backtesting, il semble toujours se figer comme si c'?tait dans une boucle infinie. Si je commente la boucle while, il semble bien tester le reste de mon script. Il reste donc quelque chose dans la boucle qui me pose des probl?mes. Est-il possible d'imprimer les r?sultats de la boucle ? chaque it?ration pour que je puisse voir ce qu'il fait? Peut-?tre que les rafra?chissements ne fonctionnent pas r?ellement lorsque vous testez ? l???arri?re-plan?

Mopass
10/12/2021, 06h24
J'ai ajout? les deux lignes suivantes avant la ligne Veille pour imprimer certaines valeurs dans le journal. testcomments = StringConenate (Bid =, Bid;; BuyPriceMax =, BuyPriceMax, Time =, TimeToStr (iTime (NULL, 0,0)); Imprimer (testcomments); Ensuite, lorsque je lance le script et v?rifie le journal, toutes les valeurs, y compris l'heure, sont identiques. Le temps NE JAMAIS semble augmenter, il continue de cracher les m?mes valeurs Bid et BuyPriceMax avec la m?me valeur temps. Cela semble indiquer que pour une raison quelconque, l'actualisation n'a pas d'effet et que le temps ne change pas lors des tests en arri?re. Mais lorsque je l'ex?cute sans boucle, des valeurs temporelles apparaissent pour chaque barre de l'?cran des r?sultats. Par cons?quent, ?tant donn? qu'il existe des donn?es historiques lors de tests sans boucle, je ne sais pas pourquoi ces donn?es historiques travaillez pas dans cette boucle? Des pens?es suppl?mentaires? Tr?s appr?ci?e :-)

Ledeldixxa
10/12/2021, 07h45
Lorsque vous effectuez un backtest, essayez peut-?tre la m?thode Every tick? L'avez-vous d?j? fait? Je ne sais pas, cela pourrait ?tre difficile.

dcz
10/12/2021, 09h05
Bonjour, je voudrais juste vous lancer une autre id?e, coder quelque chose comme cela sans boucle ... int mostBarin10 = Plus ?lev? (Symbol (), 0, MODE_HIGH, 10,1);/trouve la barre la plus haute dans les 10 derni?res barres (d?calage d'une barre) ... changez-la en plus de barres si vous devez int BuyPriceMax = High [LowestBarin10]; Vous donne le prix de cette barre haute si (Bid lt; BuyPriceMax-30 * point) {OrderSend (Symbol (), etc, etc, etc.)} N'utilise pas de boucle, cela ne pose que le temps n?cessaire pour ex?cuter de nouveaux ticks . Je pr?f?re une configuration comme celle-ci, car je consid?rerais un mod?le qui prend plus de x barres ? d?velopper, mais ne vaut pas la peine d'?tre ?chang?, etc. Juste une pens?e incertain de savoir si cela convient ? votre EA ou non.

callsslamuzo
10/12/2021, 10h26
Je ne sais pas ce que vous savez sur les boucles while et combien je sais par rapport ? vous, alors je me trompe peut-?tre, mais en regardant le code que vous avez ?crit, il me semble que dans la boucle while vous assignez la m?me valeur que BuyPriceMax = Bid- (trailingBuy * Point) comme avant la boucle. Ainsi, la valeur qui provoque l'it?ration de la boucle while n'est pas incr?ment?e mais est toujours la m?me. De plus, je sais que la boucle while ira dans la boucle infinie si la valeur de l'it?ration n'est pas incr?ment?e. Solution possible? Je ne sais pas. Essayez == au lieu de =. Cela n'attribuerait pas la valeur ? BuyPriceMax, mais le rendrait ?gal ? Bid- (trailingBuy * Point). J'esp?re que cela vous aidera. (Encore ? apprendre).

Mopass
10/12/2021, 11h47
Bonjour, Je pensais que le taux d???ench?re devrait ?tre mis ? jour ? chaque devis affich?. Par cons?quent, il ne devrait pas toujours ?tre identique, mais s???ajusterait. Rafra?chir devrait tirer la derni?re citation. Par cons?quent, j???ai pens? que les valeurs s???ajusteraient ? la hausse ou ? la baisse comme le prix de l???offre, puis si elle atteignait un point tel que la condition n????tait plus remplie, elle serait retir?e de la boucle et passerait la commande. Merci Fishtank pour votre contribution. Cela semble prometteur pour un autre signal, mais pour ce que j'essaie de faire - je ne sais pas si cela fonctionnerait. Je recherche certaines conditions ? remplir avant que mon EA ne mette en place un ?change. Cette boucle est plus un r?glage fin pour essayer d'entrer ? un meilleur point. Par exemple, si j'essaie d'entrer dans une position courte lorsque le prix d?passe la bande sup?rieure de Bollinger, j'aimerais que l'EA d?termine si le prix continue de s'?lever au-dessus de la bande - car souvent, le prix peut continuer jusqu'? plusieurs barres avant de commencer. tomber ? nouveau - donc je ne veux pas entrer dans le commerce jusqu'? ce qu'il soit plus proche de son apog?e. Cette boucle devait ?tre utilis?e pour retarder l'entr?e jusqu'? ce qu'il soit d?termin? que le prix est en train de changer. Donc, j'appelle cela mon achat de fuite. Je veux permettre au prix de continuer ? monter, puis quand il commence ? tomber en dessous de mon prix court ajust?, prenez la commande court au taux du march?. Cela signifie que toutes les comparaisons de prix peuvent avoir lieu dans la m?me barre ou s'?tendre sur plusieurs barres. Comme il s'agit d'un d?lai, je pense que cela doit ?tre fait via une boucle, mais si Bid fonctionne en boucle, je ne sais pas vraiment. Jusqu'? pr?sent, il ne semble pas y avoir la derni?re citation.

callsslamuzo
10/12/2021, 13h08
Finalement je l'ai trouv? sur le web; il existe une expliion professionnelle sur la mani?re dont les valeurs bool?ennes sont assign?es en C. MQL a beaucoup en commun avec C, C ; Et c'est ce que j'essayais d'expliquer dans mon post. Peut-?tre que ce n???est pas tr?s pertinent pour vous, vous pouvez r?soudre le probl?me de diff?rentes mani?res, mais il est int?ressant de savoir: Voici la citation du tutoriel:/quote Nous avons maintenant rencontr? le plus facile ? tr?bucher sur ` `gotcha! '' en C: l'op?rateur de test d'?galit? est ==, pas un seul =, qui est une assignation. Si vous ?crivez accidentellement si (a = 0) (et vous le ferez probablement ? un moment donn?, tout le monde commet cette erreur), il ne testera pas si a est ?gal ? z?ro, comme vous le souhaitiez probablement. Au lieu de cela, il assignera 0 ? a, puis effectuera la branche `` true '' de l'instruction if si a est diff?rent de z?ro. Mais la valeur 0 vient d????tre affect?e ? a, donc la branche `` true '' ne sera jamais prise! (Cela pourrait vous rendre fou pendant le d?bogage - vous vouliez faire quelque chose si a ?tait 0, et apr?s le test, a est 0, que cela soit suppos? ou non, mais la branche `` true '' n'est n?anmoins pas prise .)/Fin de citation. Bonne programmation.
https://www.sundytrading.com/attachments/1529199428.png

Mopass
10/12/2021, 14h29
Mon op?rateur dans l'instruction while ?tait un gt; = pas un =, il aurait donc d? fonctionner (je pense). J'ai essay? de le scinder en 2 conditions en utilisant seulement un gt; || un ==, mais cela n'a pas fonctionn? non plus. Ce que j'ai fini par faire est d'?liminer la boucle while et de la remplacer par la boucle for suivante. Cela a permis de s???assurer que la boucle s???incr?mente pendant une p?riode donn?e et s???arr?te ensuite sauf si elle est d?j? interrompue en raison d???un int?rieur si la d?claration n???est pas respect?e:

BuyPriceMax = Bid- (TrailingBuy * Point); for (x = 1; xlt; = 1000; x ) {if (Bidgt; = BuyPriceMax) {RefreshRates (); if (Bidgt; BuyPriceMax (TrailingBuy * Point)) {BuyPriceMax = Bid- (TrailingBuy * Point); } Sommeil (10000);/SOMMEIL 10 SECONDES} else {break; }}
Cela semble avoir r?solu le probl?me. Il limite la boucle et se termine ? un moment donn? et permet ?galement de v?rifier si le prix augmente avant de placer BUY (plus pr?s du sommet). Merci ? tous pour vos commentaires.