[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 37

 
skyjet:

Merci beaucoup pour votre réponse ! Mais encore, comment décrire la future barre suivant Ask[0],Bid[0] ?

Dès que cette future barre apparaîtra, elle deviendra nulle. Et la barre qui est maintenant [0] sera [1].


Ask et Bid ne sont PAS des tableaux, il n'y a qu'une seule valeur actuelle, toutes les valeurs antérieures sont oubliées.

 

Veuillez m'aider à comprendre le calcul du dépôt
car mon dépôt estimé coïncide exactement avec le terminal
uniquement lorsque tous les ordres sont entièrement verrouillés
. Lorsque j'ajoute un ordre supplémentaire au système d'ordres - le résultat du dépôt
terminal diffère toujours très légèrement de mon dépôt estimé
mais je n'arrive jamais à être une balle dans une balle !
Voici un exemple très court :

Le compte a 4 ordres de 10.00 lots chacun, dont deux vélos
et deux ventes. Il est clair que le compte est en équilibre et que tous les ordres sont verrouillés
Nous calculons le dépôt standard pour chaque ordre, le divisons par 4 et tout est sur la pointe des pieds
Le terminal frappe exactement.

Nous mettons un byke de plus à 1.00 lot à 1.4059
Nous calculons le dépôt. Il est clair que pour cela nous devons payer le dépôt standard
puisque toutes les commandes existantes sont dans la boîte.
Pour un effet de levier de 1:100, nous avons le gage pour le nouveau vélo

ZALBuy = 140.59*1.00 = 140.59

Par conséquent, l'ancien dépôt doit être augmenté de ce montant,
Ajouter l'ancien dépôt et le dépôt pour notre octet 1.00

ZAL=ZALold + ZALBuy = 1407.23 + 140.59 = 1547.82

Après la mise en place du bye dans le terminal, le dépôt s'est avéré être 1547.91
Cela serait acceptable si j'avais mis le bye 9 points plus haut que
au taux de change 1.4068 Car si nous calculons l'augmentation réelle du dépôt
comme la différence du dépôt avant et après, nous obtenons exactement le dépôt standard
pour 1.00 lot au taux 1.4068

1547.91 - 1407.23 = 140.6801

J'ai changé la version du terminal, hélas, cela n'a pas aidé !

-----------------------------------------------

Veuillez me pardonner de prendre votre temps, mais ces
petites divergences constantes me dérangent vraiment
parce que ma machine compte différentes options,
et le dépôt comme solde et profit est utilisé pour calculer
tous les paramètres du compte après certaines actions avant qu'elles ne soient mises en œuvre
. La précision est donc très souhaitable ici.
Peut-être que je ne comprends pas quelque chose, mais j'ai cherché dans la documentation
et je n'ai pas trouvé la raison de cette divergence.
Je vous serais très reconnaissant de votre aide !


Salutations MADZX
 
keep87:


Vous pouvez oublier ce paramètre. Une nouvelle citation se produit si la cantine veut prendre votre argent, ils ne se soucient pas de l'écart, ils le feront de toute façon). C'est la réalité de l'algotraderie, la plupart des sociétés d'escroquerie qui se disent "le meilleur courtier XXXXX" (XXXXXX - insérer le nom d'un continent ou d'une galaxie, peu importe).

Changer ou ne pas changer le décor, tout reste inchangé.


Tout à fait exact ! Je l'ai vu aussi !
 
skyjet:
Bonjour ! Pouvez-vous me donner la description d'un vrai bar +1. Par exemple, j'ai besoin du prix de la prochaine barre, et non de la barre actuelle.

Si je comprends bien, vous essayez d'obtenir des informations de la machine du futur.
Si vous trouvez un moyen - partagez, je vous en serais reconnaissant :)
 
Kobalerro:
Salutations à tous. Je suis moi-même novice en matière de programmation, alors veuillez résoudre le problème.

Il est nécessaire que plusieurs EAs sur le même compte, ouvrent un nombre limité d'ordres.

Par exemple : 10 EAs mais ne peuvent ouvrir que 5 ordres, mais pas plus d'un par paire de devises.

Cela a été mis en œuvre comme suit, mais cela ne fonctionne pas de cette façon.

extern int МаксКолОрдеров   = 5;

//+------------------------------------------------------------------+

int ПодсчетОткрОрдеров() {
  int k=OrdersTotal();
   if (Символ=="0") Символ=Symbol();
    for (int i=МаксКолОрдеров; i<k; i++) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Символ || Символ=="") {
       if (МагикНомер<0 || OrderMagicNumber()==МагикНомер) {
      if (OrderMagicNumber()<1) return(True);
     }
    }
   }
  }
 return;

}

//+------------------------------------------------------------------+
int start()
  {
   if(ПодсчетОткрОрдеров()==0)ПровТоргУсловий();
   }


Je mettrais en œuvre un tel spectacle de la manière suivante :
Vos 10 chevaux travaillent chacun selon son propre programme, comme s'ils se trouvaient dans des pièces adjacentes
et donc aucun d'entre eux ne sait ce que fait son voisin derrière le mur - c'est le principal problème
pour votre idée !
Par conséquent, je demanderais à chaque EE d'écrire ses actions dans un fichier disque
qui sera disponible pour tous les chevaux, car il se trouve dans le répertoire du terminal .
Si l'un d'entre eux a le désir ardent de faire quelque chose dans sa fenêtre
devrait d'abord analyser ce dossier et vérifier la possibilité de réaliser le souhait de
!
en ce qui concerne votre scénario, vous devez ajouter dans le fichier le nombre d'ordres
et les paires de devises sur lesquelles ils sont ouverts
. Par exemple :
EURUSD 1
GBPUSD 1
EURGBP 0

Nous voyons ici que nous ne pouvons pas ouvrir de transactions surEURUSD etGBPUSD parce que le script ne permet pas à
d'avoir plus d'un ordre par paire.
Il est clair qu'il y aura autant de lignes qu'il y a de paires en jeu.
Avec cette solution, tous vos chevaux seront toujours au courant de ce qui se passe à l'heure actuelle
, et pourront calculer si une action est autorisée ou non à ce moment-là.
Lorsque vous passez un ordre sur n'importe quelle paire, vous devez mettre 1 dans la ligne de droite
Lorsque vous le fermez, remplacez-le par zéro
Cela fonctionnera certainement, bien que ce soit un peu compliqué pour un débutant
. Mais allez-y, car tout le monde était là - comme un débutant jusqu'au moment venu !

Bonne chasse !
MADZX

 

J'écris une stratégie de repli. Je dois placer un ordre stop au-dessus (en dessous) de l'extremum de la bougie correspondante. Voici un exemple :

Il est clair que si la clôture est inférieure à l'ouverture, il s'agit d'une bougie baissière, et vice versa - d'une bougie haussière. Je veux savoir comment faire une condition disant que la bougie précédente est haussière.... ... untel ou untel.

Logiquement, je fais une fonction qui va déterminer le type de bougie.

int CandleType()
{
  if(Open[1] > Close[1])
    return(BullCandle);
    
  if{Open[1] < Close[1]}
    return(BearCandle);
    
  return(dodji);
}

Ensuite, vous devriez en quelque sorte demander si la barre avec l'indice 1 est haussière ou baissière.... ...et faire quelque chose...

Comment dois-je m'y prendre ?

 
madzx:


Je mettrais en œuvre un tel spectacle de la manière suivante :
Vos 10 chevaux travaillent chacun selon leur propre horaire, comme s'ils se trouvaient dans des pièces adjacentes
et, par conséquent, aucun d'entre eux ne sait ce que fait son voisin derrière le mur - c'est le principal problème
pour votre idée !
Par conséquent, je demanderais à chaque EE d'écrire ses actions dans un fichier disque
qui sera disponible pour tous les chevaux, car il se trouve dans le répertoire du terminal .
Si l'un d'entre eux a le désir ardent de faire quelque chose dans sa fenêtre
devrait d'abord analyser ce dossier et vérifier la possibilité de réaliser le souhait de
!
en ce qui concerne votre scénario, vous devez ajouter dans le fichier le nombre d'ordres
et les paires de devises sur lesquelles ils sont ouverts
. Par exemple :
EURUSD 1
GBPUSD 1
EURGBP 0

Nous voyons ici que nous ne pouvons pas ouvrir de transactions surEURUSD etGBPUSD car le script ne permet pas à
d'avoir plus d'un ordre par paire.
Il est clair qu'il y aura autant de lignes que de paires en opération.
Avec cette solution, tous vos chevaux seront toujours au courant de ce qui se passe à l'heure actuelle
, et pourront calculer si une action est autorisée ou non à ce moment-là.
Lorsque vous passez un ordre sur n'importe quelle paire, vous devez mettre 1 dans la ligne de droite
Lorsque vous le fermez, remplacez-le par zéro
Cela fonctionnera certainement, bien que ce soit un peu compliqué pour un débutant
. Mais allez-y, car tout le monde était là - comme un débutant jusqu'au moment venu !

Bonne chasse !
MADZX

Merci pour le conseil, mais c'est un peu trop compliqué. Et puis dans votre version il s'avère que tout fonctionne, et il faut 10 pour vérifier la condition d'entrée,

Ils n'ouvrent que les cinq premiers qui ont réussi et ensuite, quand l'un d'eux ferme, le premier qui correspond aux conditions ouvre à nouveau,

non limité à EURUSD 1 , GBPUSD 1 , EURGBP 0.

Je pense qu'il devrait y avoir une solution plus simple. Cela devrait être similaire au comptage du nombre total de commandes avec une condition de limitation par un paramètre donné.

Et la limitation peut être fixée soit par un symbole, soit par un nombre magique ne dépassant pas un.

Votre version fonctionnerait probablement aussi, mais je n'arrive pas à décider comment l'implémenter dans le code.

 
hoz:

J'ai un truc bizarre qui se passe ici. Voici la fonction des ordres d'ouverture :

Voici l'erreur :

if(SL < g_stopLevel)
    SL = g_stopLevel*pt;

si le niveau de stop = 5, alors vous essayez de mettre un stop loss à 0.00005.

La deuxième erreur est que vous ne vérifiez pas où vous placez l'ordre. Si le chandelier a clôturé à ou près de son haut bas, vous obtiendrez l'erreur 130. Comme vous pouvez le voir dans l'image, le serveur a ouvert un ordre de vente au lieu d'un sellstop parce que vous avez essayé d'ouvrir un ordre sellstop à un prix supérieur ou égal au prix actuel.

Apprenez à utiliser l'empreinte. Il suffit de mettre Print() ; au bon endroit, de mettre les variables requises entre parenthèses et de les séparer par ceci : ," ", comme ceci : Print(Price," ",SL) ; et pendant le test, au moment d'ouvrir un ordre dans l'onglet "Experts", vous verrez à quoi ces variables sont égales, et vous pourrez comprendre ce qui ne va pas.

Le journal montrera également ce que l'EA essaie de faire, où définir un Stop Loss et un Take Profit. Vous y trouverez tout ce dont vous avez besoin.

Logiquement, je fais une fonction qui va détecter le type de bougie.

Travaillons à l'intérieur de la fonction start.

Tout d'abord, nous créons une variable dans laquelle nous allons écrire la direction de la bougie précédente.

int Candle=-1;

Nous le remplirons avec quelques valeurs, dont l'une indiquera une hausse, une autre - une baisse. Si -1, c'est rien (il n'a pas été déterminé ou il n'a pas de direction close=open).

Valeur que je propose d'utiliser par analogie avec un ordre de transaction : 0 - achat, 1 - vente ;

alors nous devons écrire :

si(Close[1]>Open[1]) Candle=0 ; sinon
si(Close[1]<Open[1]) Candle=1 ;

Nous avons maintenant une direction définie et nous pouvons l'utiliser directement dans la fonction OrderSend( string symbol, int cmd, ...other stuff...) ;

if(Candle!=-1) OrderSend( Symbol(),Candle, ...autres trucs...) ;

ou en suivant votre analogie :

if(Candle==0) OpenBuy() ;
if(Candle==1) OpenSell();

 
Kobalerro:

Merci pour le conseil, mais c'est un peu trop compliqué. Et puis il s'avère qu'ils fonctionnent tous dans votre version et qu'il en faut 10 pour vérifier la condition d'entrée,

et ils n'en ouvrent d'abord que cinq qui sont arrivés à temps, puis quand l'un d'eux se ferme, le premier qui correspond aux conditions s'ouvre à nouveau,

non limité à EURUSD 1 , GBPUSD 1 , EURGBP 0.

Je pense qu'il devrait y avoir une solution plus simple. Cela devrait être comme compter le nombre total de commandes avec une condition de limitation par un paramètre donné.

Et nous devons limiter ce nombre soit par un symbole, soit par un nombre magique, soit par un seul.

Bien que, peut-être, votre variante fonctionnera également, mais comment le mettre en œuvre dans le code, je ne peux pas penser.


Ou peut-être comme ceci :

if(NumberOfPositions("EURUSD")==0 && NumberOfPositions()<10)
Voici une fonction
 
keep87:

il y a une erreur ici :

si le niveau de stop = 5, alors vous essayez de mettre un stop loss à 0.00005.

La deuxième erreur est que vous ne vérifiez pas où vous placez l'ordre. Si le chandelier a clôturé à ou près de son haut bas, vous obtiendrez l'erreur 130. Comme vous pouvez le voir dans l'image, le serveur a ouvert un ordre de vente au lieu d'un sellstop car vous avez essayé d'ouvrir un sellstop à un prix supérieur ou égal au prix actuel.

Apprenez à utiliser l'empreinte. Il suffit de mettre Print() ; au bon endroit, de mettre les variables requises entre parenthèses et de les séparer par ceci : ," ", comme ceci : Print(Price," ",SL) ; et pendant le test, au moment d'ouvrir un ordre dans l'onglet "Experts", vous verrez à quoi ces variables sont égales, et vous pourrez comprendre ce qui ne va pas.

Le journal montrera également ce que l'EA essaie de faire, où définir un Stop Loss et un Take Profit. Il montrera tout ce qui est nécessaire.

Je l'utilise de cette façon de temps en temps. Regarde, maintenant les fonctions ressemblent à ça :

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
  int ticket = -1;
  string myNote = "Сов баянул";
  
  double price = High[1] + i_thresholdFromInput*pt;
  Print("price = ", price);
  double SL = Low[1] - i_thresholdFromBasedSL*pt ;
  Print("SL = ", SL);

  if(price > Ask)
  {
    ticket = OrderSend(Symbol(),OP_BUYSTOP,0.1,NormalizeDouble(price,Digits),i_slippage,0,0,myNote,i_myMagic,TimeCurrent() + 600,Navy);
  }
  
  if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    if(!OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,Digits),NormalizeDouble(High[1] + i_tp*pt,Digits),0,Navy))
    return(false);
  
  return(true);
}
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  int ticket = -1;
  string myNote = "Сов шортанул";
  
  double price = Low[1] - i_thresholdFromInput*pt;
  Print("price = ", price);
  double SL = High[1] + i_thresholdFromBasedSL*pt;
  Print("SL = ", SL);
  
  if(price < Bid)
  {
    ticket = OrderSend(Symbol(),OP_SELLSTOP,0.1,NormalizeDouble(price,Digits),i_slippage,0,0,myNote,i_myMagic,TimeCurrent() + 600,Red);
  }
  
  if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES) == true)
    if(!OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,Digits),NormalizeDouble(Low[1] - i_tp*pt,Digits),0,Red))
    return(false);
    
  return(true);
}

J'ai lu dans le journal :

2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: modify #1 buy stop 0.10 EURUSD at 1.32103 sl: 1.32007 tp: 1.32243 ok
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: open #1 buy stop 0.10 EURUSD at 1.32103 ok
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: SL = 1.3201
2012.12.25 18:20:16     2012.02.13 00:05  5_minites_TS_by_Philippe Nell EURUSD,M5: price = 1.321
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: OrderSend error 130
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: SL = 1.3194
2012.12.25 18:20:14     2012.02.13 00:00  5_minites_TS_by_Philippe Nell EURUSD,M5: price = 1.3204
2012.12.25 18:20:14     5_minites_TS_by_Philippe Nell inputs: i_fastMaPeriod=10; i_slowMaPeriod=21; i_filtrMaPeriod=50; i_trading_TF=5; i_thresholdFromInput=1; i_thresholdFromBasedSL=1; i_slippage=3; i_tp=15; i_myMagic=33330215; 
2012.12.25 18:20:12     5_minites_TS_by_Philippe Nell EURUSD,M5: loaded successfully

Donc, initialement, entre le prix d'achat et le stop, la différence était de 1,3204 - 1,3194 = 0,001 point.

Plus loin 1.3210 - 1.3201 = 0.009 points

Et pour une raison quelconque, dans le second cas, le stop était plus proche du prix d'entrée, mais il n'y avait pas d'erreur ! J'y ai réfléchi et je ne l'ai pas compris.

J'ai corrigé l'erreur plus tard d'une manière différente. Il y a déjà des conditions dans le code :

if(price > Ask) && if(price < Bid) respectivement pour l'achat et la vente. Ou y avait-il une autre variante ? Maintenant, nous n'avons plus d'erreurs. Mais, néanmoins, j'aimerais entendre l'opinion d'un programmeur plus expérimenté.

Raison: