[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 - 2. - page 29

 

Bonjour...

J'ai écrit un EA mais j'ai rencontré ce problème :

J'ai des ordres opposés et par exemple pour l'achat j'ai un stop de 150 pips et un profit de 150 pips, pour la vente les mêmes niveaux sont fixés, mais seulement inversés (c'est-à-dire que ce qui est pour le profit de l'achat, est ensuite pour le stop de la vente), c'est-à-dire qu'en fait je dois tout fermer simultanément, à la fois la vente avec l'achat et l'achat avec la vente..... mais il y a autre chose, le spread !)))) Et à partir de ces deux ordres opposés, les 8 autres sont déjà ouverts (bien sûr, si les huit sont nécessaires, les conditions sont différentes pour eux, ils sont aussi opposés 4/4).


Comment puis-je programmer correctement le code pour fermer tous les ordres lorsqu'ils atteignent le même prix simultanément ? Car dans le testeur, lorsque je teste, le prix atteint parfois un niveau souhaité, par exemple, vente fermée (n'atteignant pas un niveau prédéterminé, je crois qu'il s'agit d'un spread) et achat suspendu et après un court moment chute et achat fermé au stop, donc je ne peux pas voir le résultat correct.


Je vous serais reconnaissant si vous pouviez exprimer votre idée de manière programmatique, c'est-à-dire en code.


Afin de le comprendre plus en détail, je vous donne la partie où mes deux (premiers) ordres opposés sont ouverts.

if (by == FALSE) 
   {   g_ticket_112 = OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask, Digits), 1, NormalizeDouble(Ask - SL * Point, Digits), 
       NormalizeDouble(Ask + TP * Point, Digits), "", 111, 0, Blue);
   if (g_ticket_112 > 0) by = TRUE;
   } 
     
     if (se == false) 
   {for (g_pos_116 = OrdersTotal() - 1; g_pos_116 >= 0; g_pos_116--) 
   {if (OrderSelect(g_pos_116, SELECT_BY_POS, MODE_TRADES)) 
   {if (OrderSymbol() != Symbol() || OrderMagicNumber() != 111) continue;
    if (se == false) 
   {g_ticket_113 = OrderSend(Symbol(), OP_SELL, Lots, NormalizeDouble(Bid, Digits), 1, 
    OrderTakeProfit(),OrderStopLoss() , "", 222, 0, Blue);
    if (g_ticket_113 > 0) se = TRUE;}}}} 
 
Avez-vous un script qui étire le planning sur tous les week-ends, c'est-à-dire que le planning ne fusionne pas avec le lundi, et reste vide le samedi et le dimanche.
 

Bonjour à tous.

La question est de savoir si vous disposez d'une fonction qui détecte l'ouverture d'une nouvelle barre(quelle que soit l'unité de temps), ou, plus précisément, de différentes variantes de détection d'une nouvelle barre.

 
dmitriy086:

Bonjour à tous.

La question est de savoir si vous disposez d'une fonction qui détecte l'ouverture d'une nouvelle barre (quelle que soit l'unité de temps) ou, plus précisément, si différentes variantes (remorques) peuvent trouver une nouvelle barre.


Mémoriser le temps oldtime = Time[0] et comparer le temps mémorisé if( oldtime !=Time[0])Print("Hourra pour un nouveau bar ! !!") ;

SZY : les remorques sont dans la fonction iTime().

:)

 
//+------------------------------------------------------------------+
bool fNewBar()
  {
   static datetime NewTime=0;
   if(NewTime!=iTime (Symbol(),0,0))
    {
     if(NewTime==0)
      {
       NewTime=iTime (Symbol(),0,1);return(false);
      }      
     NewTime=iTime (Symbol(),0,0);
     return(true);
    }
   return(false);     
  }
//+----------------------------------------------------------------------------+

IgorM, le problème est que ce f-fi est sur un graphique synthétique où iTime[0] peut être égal à iTime[1], donc comment pouvons-nous nous débarrasser du temps pour que le Conseiller Expert n'ouvre qu'une seule transaction sur une nouvelle barre?
 
dmitriy086:
IgorM, le problème est que ce f-fi est sur un graphique synthétique où iTime[0] peut être égal à iTime[1], alors comment pouvons-nous nous débarrasser du temps pour que l'EA n'ouvre qu'un seul trade sur une nouvelle barre ?


si les heures des barres 0 et 1 ne peuvent pas correspondre pour une raison inconnue - le type datetime stocke les données en secondes, modifiez l'heure de la barre d'au moins 1 seconde.

essayez ensuite de vous souvenir de toutes les caractéristiques de la première barre fermée, c'est-à-dire OHLC, volume et temps d'ouverture - si vous changez ne serait-ce qu'un seul paramètre, cela signifie qu'il s'agit d'une nouvelle barre.

iBars() affichera le nombre de barres dans le cadre temporel actuel, et sera limité par les paramètres du terminal, vous pouvez essayer de comparer le nombre de barres avec le numéro de barre stocké et au moment de l'apparition d'une nouvelle barre, ces valeurs sont différentes - mais pas toujours, cela a fonctionné pour moi de cette façon, mais probablement en raison du numéro de construction de MT4, cette option peut ne pas fonctionner.

 
Auriez-vous, par hasard, un morceau de code prêt à l'emploi ? Je n'arrive pas à trouver comment mémoriser OHLC[1] et le comparer à OHLC[0]...
 
dmitriy086:
Auriez-vous par hasard un bout de code prêt à l'emploi ? Je n'arrive pas à trouver comment mémoriser OHLC[1] et le comparer à OHLC[0]...


OHLC est un acronyme courant pour Open, High, Low, Close (ouverture, hauteur, bas, fermeture).

comparer non pas avec le zéro, mais le premier avec celui mémorisé précédemment, c'est à dire

init(){

oldHigh = High[1] ;

///

}

start(){

double tmp = High[1] ;

if(tmp !=oldHigh) {oldHigh = tmp ;

//vérifier le reste des paramètres de la barre

}

}

 

Merci pour le conseil, je vais m'en occuper...

 

Veuillez m'indiquer comment régler le contrôle correct dans la condition d'ouverture de la position - qu'il y ait une position ouverte ou non pour cet instrument. Et s'il existe une position pour le symbole (une vente ou un achat), alors l'ouverture n'a pas lieu, sinon le signal d'ouverture de la position est déclenché ?

Voici le code (je pense qu'il est responsable de l'ouverture des positions) :

if (NumberOfPositions("" ,-1,Magic)>=2)  флаг1=1;//если число позиций >= 2
if (NumberOfPositions("" ,-1,Magic)<1 )  флаг1=0;//если нет откр. позиций
if ( TradeDOWN==true && флаг1==0) {//если условия соответствуют заданным  
//продаем 1-й символ и покупаем второй символ
//----------------------------------------
if (NumberOfPositions(Symbol_1,OP_SELL,Magic)<1){//если нет поз.селл и поз.бай по 1-му символу
 if (NumberOfPositions(Symbol_1,OP_BUY,Magic)<1)
 {
 SL=0;TP=0;//открываем позицию, задаем стопы :
if(StopLoss_1>0)   SL=Bid_Tiker1+POINT_Tiker1*StopLoss_1;
if(TakeProfit_1>0) TP=Bid_Tiker1-POINT_Tiker1*TakeProfit_1; 
 ti=OpenPosition(Symbol_1, OP_SELL, Lots_1,0 ,0,Magic);
if(StopLoss_1>0 || TakeProfit_1>0) {//ставим стопы 
if (OrderSelect(ti, SELECT_BY_TICKET)) ModifyOrder(-1, SL, TP, clModifySell);}
                                   }}//если нет поз.селл и поз.бай по 1-му символу
//--------------------------------------
if (NumberOfPositions(Symbol_2,OP_BUY,Magic)<1){//если нет поз. бай и поз. селл по 2-му символу 
 if (NumberOfPositions(Symbol_2,OP_SELL,Magic)<1)
 {
   SL=0;TP=0;//открываем позицию, задаем стопы :
if(StopLoss_2>0)   SL=Bid_Tiker2-POINT_Tiker2*StopLoss_2;
if(TakeProfit_2>0) TP=Ask_Tiker2+POINT_Tiker2*TakeProfit_2;   
ti=OpenPosition(Symbol_2, OP_BUY, Lots_2,0,0,Magic);
if(StopLoss_2>0 || TakeProfit_2>0) {//ставим стопы 
if (OrderSelect(ti, SELECT_BY_TICKET))ModifyOrder(-1, SL, TP, clModifyBuy); }
                                   }}//если нет поз. бай и поз. селл по 2-му символу

La logique semble correcte, mais cela ouvre quand même plusieurs positions pour un seul symbole.

P.S. Je ne suis pas le programmeur. Si c'est possible, expliquez plus en détail à l'imbécile.

Raison: