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

 

Bonjour qui peut aider à résoudre un problème, peut-être que je fais quelque chose de mal,

J'ai un bloc Klima qui renvoie le drapeau de clôture de la dernière position au niveau du take profit et de même pour le stop,

//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}

mais voici comment je l'utilise.

bool Buystop=isCloseLastPosByStop(NULL,OP_BUY,MagBuy);
bool BuyTake=isCloseLastPosByTake(NULL,OP_BUY,MagBuy);
bool Sellstop=isCloseLastPosByStop(NULL,OP_SELL,MagBuy);
bool SellTake=isCloseLastPosByTake(NULL,OP_SELL,MagBuy);

//--------------------------------------------------------------------------------+
if(total==1) 
  {
   if(Buystop==True)
   {   OpenPosition(NULL, OP_SELL, Lot,Bid+Sl3*Point, Bid-Tp3*Point,MagBuy);
   }  
   if(BuyTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    }     
    
   if(Sellstop==True)
   {   OpenPosition(NULL, OP_BUY,  Lot, 0, Ask+Tp*Point,MagBuy);
   }  
   if(SellTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    } }

et au début tout se passe comme prévu et au lot 4 ouvre celui dont j'ai besoin et celui-ci

if(Buystop==True)
   {   OpenPosition(NULL, OP_SELL, Lot,Bid+Sl3*Point, Bid-Tp3*Point,MagBuy);
   } 

Je n'arrive pas à savoir à quoi ça sert.

pour plus de clarté

Temps Type Commandez Volume Prix S / L T / P Profit Balance
1 2011.01.03 00:00 acheter 1 1.00 1.3346 1.3146 1.3446
2 2011.01.03 00:00 vendre 2 1.00 1.3344 0.0000 0.0000
3 2011.01.05 15:18 s/l 1 1.00 1.3146 1.3146 1.3446 -2001.70 47998.30
4 2011.01.05 15:18 vendre 3 1.00 1.3146 1.3546 1.2946
5 2011.01.07 14:38 t/p 3 1.00 1.2946 1.3546 1.2946 1983.88 49982.18
6 2011.01.07 14:38 vendre 4 1.00 1.2944 1.3344 1.2744
7 2011.01.07 14:38 acheter 5 1.00 1.2946 1.2746 1.3046

 
FoxUA:

Je n'arrive pas à savoir à quoi ça sert.


C'est vrai,

La première vérification (total==1) a lieu lorsque l'ordre est encore 1. À l'intérieur du bloc, vous trouvez la dernière vente fermée -> ouverte, le dernier achat fermé -> ouvert à nouveau. Cela fait 3 commandes.

 
Figar0:


Oui, c'est ça,

La première vérification (total==1) a lieu lorsque l'ordre est encore 1. À l'intérieur du bloc, vous trouvez la dernière vente fermée -> ouverte, le dernier achat fermé -> ouvert à nouveau. Cela donne déjà lieu à 3 commandes.


Oui, mais comment faire pour qu'il n'y ait que 2 commandes, afin de ne pas ouvrir une commande sous le numéro 6,

Temps Type Commandez Volume Prix S / L T / P Profit Balance
1 2011.01.03 00:00 acheter 1 1.00 1.3346 1.3146 1.3446
2 2011.01.03 00:00 vendre 2 1.00 1.3344 0.0000 0.0000
3 2011.01.05 15:18 s/l 1 1.00 1.3146 1.3146 1.3446 -2001.70 47998.30
4 2011.01.05 15:18 vendre 3 1.00 1.3146 1.3546 1.2946
5 2011.01.07 14:38 t/p 3 1.00 1.2946 1.3546 1.2946 1983.88 49982.18
6 2011.01.07 14:38 vendre 4 1.00 1.2944 1.3344 1.2744
7 2011.01.07 14:38 acheter 5 1.00 1.2946 1.2746 1.3046

 

Le moyen le plus simple est de vérifier la présence d'un ordre ouvert de type Achat ou Vente. Prenez ceci (les variables BuyOrders, SellOrders, TotalOrders sont des variables globales du programme ; elles doivent être déclarées dans la fonction start() comme int BuyOrders, SellOrders, TotalOrders ;) :

void OrdersRecount()
{
  BuyOrders=0; SellOrders=0; TotalOrders=0;
  if (OrdersTotal()>0)
  {
    for (int j = 0; j < OrdersTotal(); j++) 
    {
      if (OrderSelect(j, SELECT_BY_POS)) 
      {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagBuy)
        {
          if (OrderType() == OP_BUY) BuyOrders++;
          if (OrderType() == OP_SELL) SellOrders++;        
          TotalOrders++;
        }
      }
    } 
  }
}
 
Figar0:

Il existe de nombreuses possibilités, la plus simple étant de vérifier si un ordre d'achat ou de vente est ouvert. Prends celui-là :


Je ne comprends pas comment l'utiliser, aidez-moi s'il vous plaît.

 
FoxUA:


Je ne comprends pas comment l'utiliser, alors aidez-moi si vous le pouvez.


Je le ferai, mais je ne comprends toujours pas la logique de votre code :

   if(Buystop==True)
   {   OpenPosition(NULL, OP_SELL, Lot,Bid+Sl3*Point, Bid-Tp3*Point,MagBuy);
   }  
   if(BuyTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    }     
    
   if(Sellstop==True)
   {   OpenPosition(NULL, OP_BUY,  Lot, 0, Ask+Tp*Point,MagBuy);
   }  
   if(SellTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    } }
Êtes-vous sûr qu'il ouvre l'achat dans trois caisses et la vente dans une seule ? Ce n'est pas symétrique...
 
Figar0:


Je vais vous aider, mais je ne comprends pas encore la logique de votre code :

Êtes-vous sûr que dans trois cas vous ouvrez une position de vente et dans un cas une position d'achat ? Ce n'est pas symétrique...


Je veux qu'il s'ouvre lorsqu'il n'y a pas de position sur le marché et que si l'une des valeurs est correcte, il ouvre un ordre et attende la fermeture de la position. J'ai essayé de le faire de cette façon mais rien ne fonctionne.

bool totalBuy=ExistPositions(NULL,OP_BUY,MagBuy) ;
bool totalSell=ExistPositions(NULL,OP_SELL,MagBuy) ;


if(totalBuy==False||totalSell==False) 
 
FoxUA:

Je veux qu'il s'ouvre uniquement lorsqu'il n'y a pas de position sur le marché et que si l'une des valeurs choisies est correcte, il ouvre un ordre et attende la fermeture de la position.

Il s'avère donc que vous pouvez avoir 2 ordres d'achat et pas de vente ?
 

Figar0:

Т.е. получается что возможна ситуация когда у вас будет 2 ордера на покупку и не одного на продаж

Non au contraire, il ne devrait y avoir que 2 positions, y compris la vente sans arrêt et le suivi, l'énoncé montre comment cela se passe. tout est correct, mais une position supplémentaire sous le numéro 6 ouvre
 
FoxUA:
Non vice versa, les positions devraient être juste 2 y compris la vente sans stops et keepers, la déclaration montre comment cela fonctionne. d'accord, mais une position supplémentaire s'ouvre sous le numéro 6


Décrivez en mots comment l'algorithme doit fonctionner et j'essaierai de vous aider pendant que j'y suis).

- 2 positions sont possibles en même temps ;

- Ouvrez d'abord 2 positions : acheter et vendre ;

- si la position longue est fermée par un stop loss -> ouvrir une position courte avec un SL et un TP triplés, on obtient deux positions de vente, une avec un SL et un TP réguliers, et une avec un TP triplé ;

Suivant ?

Raison: