[Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas votre chemin. Je ne peux aller nulle part sans toi. - page 768

 
FoxUA:


J'ai juste besoin d'appeler la fonction, c'est tout ce dont j'ai besoin, une seule ligne "S'il y a plus de commandes qu'une .... et c'est tout" - et vous me proposez une fonction entière

Voici comment je stocke mes données de commande


C'est simple, mettez-le dans la bibliothèque.

Le type d'ordre à compter et son maître sont donnés en entrée, il retourne le nombre d'ordres ouverts ou fixés.

int ChPos( int TypePos,int Magic) 
{
// возвращает кол-во позицй которые открыты или выставленн отложками с магиком  Magic 
   int i;
   int count=0 ;
   for( i=0; i < OrdersTotal(); i++)         
   {
      if(OrderSelect(i,SELECT_BY_POS)==true) 
       {                                   
           if(OrderType()==OP_BUY && TypePos==OP_BUY && Magic==OrderMagicNumber()){count++;}
           if(OrderType()==OP_SELL && TypePos==OP_SELL && Magic==OrderMagicNumber()){count++;}
           if(OrderType()==OP_BUYLIMIT && TypePos==OP_BUYLIMIT && Magic==OrderMagicNumber()){count++;}
           if(OrderType()==OP_BUYSTOP && TypePos==OP_BUYSTOP && Magic==OrderMagicNumber()){count++;}
           if(OrderType()==OP_SELLLIMIT && TypePos==OP_SELLLIMIT && Magic==OrderMagicNumber()){count++;}
           if(OrderType()==OP_SELLSTOP && TypePos==OP_SELLSTOP && Magic==OrderMagicNumber()){count++;}
       }
    }   
return(count);
}

Vous pouvez l'utiliser de la manière suivante

si ((FastEma - SmallEma) > Compartor*Point && ChPos(OP_BUY,1111) < OpenPosition)

 
ivandurak:


Ce n'est pas compliqué, mettez-le dans la bibliothèque.

L'entrée est le type d'ordre à compter et son maître, il retourne le nombre d'ordres ouverts ou fixés.

Cela peut être utilisé de la manière suivante

si ((FastEma - SmallEma) > Compartor*Point && ChPos(OP_BUY,1111) < OpenPosition)

J'ai une telle fonction et je n'en ai pas besoin, j'ai juste besoin...
juste une ligne "s'il y a plus de commandes qu'une ....". alors" et c'est tout

mes données pour la même fonction que vous avez montrée sont stockées ici

int total_order;            // переменная в которой хранится общее количество открытых ордеров в терминале
int my_total_order;         // переменная в которой хранится общее количество открытых ордеров с нашим Magic

et voici à quoi cela ressemble

void Myorders(){
      int cnt;
      total_order = OrdersTotal();
      my_total_order = 0;
      HaveBuyOrder          = false;
      HaveSellOrder         = false;
      HaveBuyStopOrder      = false;
      HaveSellStopOrder     = false;
      HaveBuyLimitOrder     = false;
      HaveSellLimitOrder    = false;
      HaveBuyLimitOrderEnd  = false;
      HaveSellLimitOrderEnd = false;      
      for(cnt = total_order - 1; cnt >= 0; cnt--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Curr_symb && OrderMagicNumber() == Magic) {
         if (OrderType() == OP_BUY)       {HaveBuyOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELL)      {HaveSellOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYSTOP)   {HaveBuyStopOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELLSTOP)  {HaveSellStopOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYLIMIT)  {HaveBuyLimitOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELLLIMIT) {HaveSellLimitOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYLIMIT)  {HaveBuyLimitOrderEnd = true;  my_total_order++;}
         if (OrderType() == OP_SELLLIMIT) {HaveSellLimitOrderEnd = true; my_total_order++;}
} } }
 

Je pense que je l'ai.

static int aaa = OrdersHistoryTotal()+ OrdersTotal()

si (votre condition && aaa < OrdersHistoryTotal()+ OrdersTotal() )

{

opérateurs

aaa=OrdersHistoryTotal()+ OrdersTotal()

}

Si c'est le cas, il est toujours préférable de le mettre dans une fonction destinée aux magiciens . Pouvez-vous nous dire sur quoi vous travaillez ? La logique est un peu étrange si j'ai bien compris, lorsqu'un ordre supplémentaire est ouvert, n'est-il pas plus facile d'ouvrir des ordres qui ne sont pas plus grands que la position ouverte ?

Votre fonction renvoie le nombre total d'ordres ouverts et d'ordres placés en attente, mais elle n'indique pas le nombre d'ordres OP_BUY, OP_BUYLIMIT OP_SELLLIMIT OP_SELL, etc.

 
ivandurak:

J'ai tout compris, maintenant le problème avec la fonction if est que je ne sais pas quel est le problème.

if(bt==1&&bl==7) 
{OpenBuyStopOrder(Lot,PRBidS);
OpenBuyLimitOrder(Lot*3,PRAskL); 
  if (HaveBuyLimitOrderEnd== true) 
  {ModifyBuyStopOrder(PRAskS);  // Выбираем            
  } }          
  

l'essentiel est que la première valeur soit exécutée.

Celle-ci ne fonctionne pas si (HaveBuyLimitOrderEnd== true)
{ModifyBuyStopOrder(PRAskS) ; // Sélectionner
} }

en d'autres termes, s'il existe un ordre HaveBuyLimitOrderEnd, modifiez-le avec un changement de prix PRAskS

Je n'arrive pas à comprendre ce qui ne va pas. La valeur de HaveBuyLimitOrderEnd est prise dans void Myorders() dans le code ci-dessus.

la valeur if(bt==1&&bl==7) est principale, donc si elle est vraie, utilisez tout ce qui suit


il est probable que haveBuyLimitOrderEnd== true car j'ai défini OrderLots()==3*Lot tout fonctionne seulement il modifie les ordres avec 0.3 lot

 
void Myorders(){
      int cnt;
      total_order = OrdersTotal();
      my_total_order = 0;
      HaveBuyOrder          = false;
      HaveSellOrder         = false;
      HaveBuyStopOrder      = false;
      HaveSellStopOrder     = false;
      HaveBuyLimitOrder     = false;
      HaveSellLimitOrder    = false;
      HaveBuyLimitOrderEnd  = false;
      HaveSellLimitOrderEnd = false;      
      for(cnt = total_order - 1; cnt >= 0; cnt--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Curr_symb && OrderMagicNumber() == Magic) {
         if (OrderType() == OP_BUY)       {HaveBuyOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELL)      {HaveSellOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYSTOP)   {HaveBuyStopOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELLSTOP)  {HaveSellStopOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYLIMIT)  {HaveBuyLimitOrder = true;  my_total_order++;}
         if (OrderType() == OP_SELLLIMIT) {HaveSellLimitOrder = true; my_total_order++;}
         if (OrderType() == OP_BUYLIMIT)  {HaveBuyLimitOrderEnd = true;  my_total_order++;}
         if (OrderType() == OP_SELLLIMIT) {HaveSellLimitOrderEnd = true; my_total_order++;}
} } }
Veuillez noter qu'elle est surlignée en rouge. Le type d'ordres de transaction est le même et les variables dans le tuyau sont définies différemment, c'est ainsi que cela devrait être.
 
ivandurak:
Remarquez ce qui est souligné en rouge . Le type d'ordres de transaction est le même et les variables du tuyau sont différentes, il devrait en être ainsi.

Oui, il devrait être, parce qu'il ya différentes fonctions d'ouverture et je ne fais pas une demande pour OrderType () et a demandé le drapeau si elle est ouverte, mais le problème est plutôt pas dans cette fonction parce que les autres demandes aussi ne fonctionnent pas ce que j'ai d'abord jeté, ET SUR LA MÊME FONCTION OUVRIR NORMALEMENT

DONC LE PROBLÈME EST AVEC LA DEMANDE DANS L'OPÉRATEUR

 

Le problème semble être ailleurs. Mais vous devriez probablement voir le code.

 
Vinin:

Le problème semble être ailleurs. Mais je pense que j'ai besoin de voir le code.


Ce n'est certainement pas ailleurs, tout le reste fonctionne, le problème est que la requête (HaveBuyLimitOrderEnd== true) est erronée, donc je me demande comment lui dire de modifier et de supprimer,

ou la requête elle-même est erronée

si(bs==1&&bl==3)
{OpenBuyLimitOrderEnd(Lot*15,PRAskL) ;

si (HaveBuyLimitOrderEnd== true)

{ModifyBuyStopOrder(PRAskS) ;
} }

 
FoxUA:

Oui, il devrait être, parce qu'il ya différentes fonctions d'ouverture et je ne fais pas une demande pour OrderType () et a demandé le drapeau si elle est ouverte, mais le problème est très probablement pas dans cette fonction parce que les autres demandes aussi ne fonctionnent pas ce que j'ai d'abord jeté, ET SUR LA MÊME FONCTION OUVERT NORMALEMENT

DONC LE PROBLÈME EST AVEC LA REQUÊTE DANS L'OPÉRATEUR

if(bt==1&&bl==7) 
{OpenBuyStopOrder(Lot,PRBidS);
OpenBuyLimitOrder(Lot*3,PRAskL); 
  if (HaveBuyLimitOrderEnd== true) 
  {ModifyBuyStopOrder(PRAskS);  // Выбираем            
  } }         


Je me demande si dans les fonctions marquées en rouge HaveBuyLimitOrderEnd est défini dans le tuyau. Si non, vous devez appeler Myorders() avant if. Sinon, vous ne savez pas ce qu'il y a là. Et juste au cas où, les drapeaux (variables)

HaveBuyOrder = false ;
HaveSellOrder = false ;
HaveBuyStopOrder = false ;
HaveSellStopOrder = false ;
HaveBuyLimitOrder = false ;
HaveSellLimitOrder = false ;
HaveBuyLimitOrderEnd = false ;
HaveSellLimitOrderEnd = false ;
doivent être définis au niveau global .

 
ivandurak:


Je me demande si le drapeau HaveBuyLimitOrderEnd est activé en rouge dans le tuyau. Si ce n'est pas le cas, vous devez appeler Myorders() avant if. Sinon, vous ne savez pas ce qu'il y a là. Et juste au cas où, les drapeaux (variables)

HaveBuyOrder = false ;
HaveSellOrder = false ;
HaveBuyStopOrder = false ;
HaveSellStopOrder = false ;
HaveBuyLimitOrder = false ;
HaveSellLimitOrder = false ;
HaveBuyLimitOrderEnd = false ;
HaveSellLimitOrderEnd = false ;
doit être défini de manière globale.

c'est à un niveau glabal


bool HaveBuyOrder ; // indique s'il existe des ordres d'achat sur le marché ouvert.
bool HaveSellOrder ; // indicateur des ordres de marché ouverts à vendre
bool HaveBuyStopOrder ; // indicateur des ordres d'achat en attente ouverts
bool HaveSellStopOrder ; // drapeau des ordres de vente en attente ouverts
bool HaveBuyLimitOrder ; // drapeau des ordres d'achat ouverts en attente.
bool HaveSellLimitOrder ; // drapeau des ordres de vente ouverts en attente.
bool HaveBuyLimitOrderEnd ; // indicateur de présence d'ordres d'achat en attente ouverts
bool HaveSellLimitOrderEnd ; // signale l'ouverture des ordres de vente en attente

c'est dans la fonction d'ouverture de l'ordre.

ticket = OrderSend(Curr_symb,OP_BUYSTOP, Lot, PRAskS, Slippage, SL, TP, 0, Magic, 0, CLR_NONE) ;
if (ticket > 0) {
HaveBuyStopOrder = true ;

si (OrderSelect(ticket, SELECT_BY_TICKET,MODE_TRADES)) Print("fonction pour placer un ordre BuyStop : ", OrderOpenPrice())
}
else Print("Erreur # ", GetLastError(), " fonction pour placer un ordre BuyStop",MarketInfo(Curr_symb,MODE_ASK)) ;
retour(ticket) ;
}

DONC TOUT LE RESTE FONCTIONNE

Raison: