Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 6. - page 155

 

Si l'un des ordres en suspens se déclenche, je place un autre ordre en suspens dans la direction opposée et je double le volume, par exemple, si je place un ordre d'achat, je place un arrêt de vente 25 pips plus bas que l'achat, et si je place un ordre de vente, je place un arrêt d'achat 25 pips plus haut. Si l'un des ordres en suspens se déclenche, nous plaçons un autre ordre en suspens opposé à l'ordre déclenché, au prix du premier ordre ouvert, et s'il se déclenche également, nous plaçons à nouveau un ordre en suspens opposé à l'ordre déclenché dans les 25 points, etc. Ainsi, tous les ordres d'achat doivent être à un seul prix, et tous les ordres de vente doivent également être à un seul prix. Si quelqu'un comprend ce que j'ai écrit ici, s'il vous plaît aidez avec le code :))

int A = 0;
if (OrdersTotal()==0)
   {
   A = 0;
   if ( Close[2] < Close[1])
      {
      OrderSend (Symbol(),OP_BUY,1,Ask,3,Ask-50*Point,Ask+25*Point,0,1);                 // первый вариант событий
      OrderSend (Symbol(),OP_SELLSTOP,2,Bid-25*Point,3,Bid+25*Point,Bid-50*Point,0,2);
      A=1;
      }
      
   if ( Close[2] > Close[1])
      {
      OrderSend (Symbol(),OP_SELL,1,Bid,3,Bid+50*Point,Bid-25*Point,0,1);               //второй вариант событий
      OrderSend (Symbol(),OP_BUYSTOP,2,Ask+25*Point,3,Ask-25*Point,Ask+50*Point,0,2);
      A=2;
      }
   }
//------------------------------------------------------------------------------------------------------------------+
OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES);            //цена открытия первого ордера
int price = OrderOpenPrice();
//------------------------------------------------------------------------------------------------------------------+   
int sells = 0;                                                                                                                              
for (int B = 0; B < OrdersTotal(); B++)
   {
   OrderSelect (B,SELECT_BY_POS,MODE_TRADES);       //количество ордеров sell
   if (OrderType() == OP_SELL) sells++;
   }
   
int buys = 0;                                                                                                                        
for (int b = 0; b < OrdersTotal(); b++)
   {
   OrderSelect (b,SELECT_BY_POS,MODE_TRADES);       //количество ордеров buy 
   if (OrderType() == OP_BUY) buys++;
   }
int sellstops = 0;                                                                                                                              
for (int C = 0; C < OrdersTotal(); C++)
   {
   OrderSelect (C,SELECT_BY_POS,MODE_TRADES);       //количество ордеров sellstop
   if (OrderType() == OP_SELL) sellstops++;
   }

int buystops = 0;                                                                                                                        
for (int c = 0; c < OrdersTotal(); c++)
   {
   OrderSelect (c,SELECT_BY_POS,MODE_TRADES);       //количество ордеров buystop 
   if (OrderType() == OP_BUY) buystops++;
   }
//-----------------------------------------------------------------------------------------------------------------+
if (OrdersTotal()==1)
   {                                               //удаление отложенного ордера..
   OrderDelete(2);                                 //..который остался после срабатываения tp и sl
   }  
//-----------------------------------------------------------------------------------------------------------------+
if (OrdersTotal()>1 && A ==1)
   {
   if (sells == buys && buystops == 0)
      {
      OrderSend (Symbol(),OP_BUYSTOP,2,price,3,price-50*Point,price+25*Point,0,2);     //условия для первого варианта
      }
   if (buys > sells && sellstops == 0)
      {
      OrderSend (Symbol(),OP_SELLSTOP,2,price-28*Point,3,price+22*Point,price-53*Point,0,2);
      }
   }
   
if (OrdersTotal()>1 && A ==2)
   {
   if (sells == buys && sellstops == 0)
      {
      OrderSend (Symbol(),OP_SELLSTOP,1,price,3,price+50*Point,price-25*Point,0,2);     //условия для второго варианта
      }
   if (buys < sells && buystops == 0) 
      {
      OrderSend (Symbol(),OP_BUYSTOP,2,price+22*Point,3,price-28*Point,price+47*Point,0,2);
      }
   }
//-----------------------------------------------------------------------------------------------------------------+
   
   return(0);
   }
 
artmedia70:
Est-ce que cela provient d'un indicateur ou d'un EA ? Il y a une différence. En général, pour éviter de dessiner la flèche, vous devez vérifier la barre adjacente précédente dans l'indicateur et si elle a une valeur non nulle ou non vide, cela signifie que la flèche sur la barre adjacente existe déjà et qu'il n'est pas nécessaire d'entrer la valeur dans le tampon de la barre actuelle. Pour un EA, si la barre adjacente précédente contient déjà un fait de croisement dans la même direction que la barre actuelle et que la flèche marque déjà ce fait, le fait de croisement sur la barre actuelle peut ne pas être enregistré (s'il existe) et la flèche ne doit pas non plus être affichée.
Je ne peux rien vous dire d'autre sur votre code. S'il y a des télépathes dans le coin, ils seront probablement capables de comprendre votre code dans une plus large mesure ;)

Ceci est tiré de l'indicateur. Intersection de 2 glissements, donne la direction. Je ne comprends pas bien, la direction n'est donnée que lors du croisement et non sur chaque barre. A partir de là, juger par la barre précédente est impossible..... Dites-moi, nous construisons un tableau, n'est-ce pas ? Comment vérifier la cellule précédente ? Deux tampons, l'un dit CrossUp[i]=Low[i] - Range*0.75 ;, l'autre dit Cr[i]=Low[i] + Range*0.75 ;(je ne veux pas entrer à nouveau dans les dossiers et le code).
 
zaqwsx123:

Si l'un des ordres en suspens se déclenche, je place un autre ordre en suspens dans la direction opposée et je double le volume, par exemple, si je place un ordre d'achat, je place un arrêt de vente 25 pips plus bas que l'achat, et si je place un ordre de vente, je place un arrêt d'achat 25 pips plus haut. Si l'un des ordres en suspens se déclenche, nous plaçons un autre ordre en suspens dans la direction opposée à l'ordre déclenché, au prix du premier ordre ouvert, et s'il se déclenche également, nous plaçons à nouveau un ordre en suspens dans la direction opposée à l'ordre déclenché, à moins de 25 points, etc. Ainsi, tous les ordres d'achat doivent être à un seul prix, et tous les ordres de vente doivent également être à un seul prix. Si quelqu'un comprend ce que j'ai écrit ici, s'il vous plaît aidez-moi avec le code) :)

Vous avez écrit beaucoup d'absurdités... Au moins ça :

OrderSelect(1,SELECT_BY_TICKET,MODE_TRADES);            //цена открытия первого ордера

êtes-vous sûr que l'ordre est choisi ? Vous êtes sûr que c'est le prix ? Êtes-vous sûr que la commande a un ticket == 1 ? Lors de la sélection par ticket, le pool n'est pas pertinent, donc MODE_TRADES est superflu dans ce cas. Après une sélection réussie par ticket, nous devons également vérifier l'heure de clôture de l'ordre sélectionné. S'il == 0, l'ordre est sur le marché et a été sélectionné dans la liste des ordres sur le marché. Si l'heure de clôture > 0, l'ordre a été fermé ou est un ordre en attente supprimé et a été sélectionné dans la liste des ordres fermés.

Je ne veux pas regarder plus loin dans le code. Peut-être devriez-vous d'abord vous familiariser avec les bases. Lisez le tutoriel et la documentation - ils se trouvent à un endroit bien visible ici.

 
artmedia70:


Je ne veux pas regarder plus loin dans le code...


qui ont attiré mon attention)) Pourquoi 4 poussins identiques ? et l'échantillon n'est pas ce qui est dans le commentaire

if (OrderType() == OP_BUY) buystops++   //количество ордеров buystop

Il en va de même pour le selstop. Vous avez besoin de OP_BUYSTOP et OP_SELLSTOP.

 
ALXIMIKS:


qui ont attiré mon attention)) Pourquoi 4 poussins identiques ? et l'échantillon n'est pas ce qui est dans le commentaire

similaire avec selestop. vous avez besoin de OP_BUYSTOP et OP_SELLSTOP

Je n'en suis pas arrivé là. Lorsque vous regardez le code et que vous voyez que vous n'avez pas besoin d'expliquer les erreurs, mais que vous commencez à enseigner à une personne à partir des bases, qu'elle peut lire elle-même, alors ... ... je ne veux pas. Vous pouvez enseigner sur une base payante, mais pas lorsque vous vous contentez d'aider à trouver des erreurs dans le code et non le code parmi les erreurs.
 
Zolotai:

Ceci est tiré de l'indicateur. Intersection de 2 diapositives, donne la direction. Je ne comprends pas bien, il ne donne des indications que lors des croisements et pas sur chaque barre. D'ici, il est impossible de juger de la bar.... précédente. Dites-moi, nous construisons un tableau, n'est-ce pas ? Comment vérifier la cellule précédente ? Il y a deux tampons : un CrossUp[i]=Low[i] - Range*0.75 ; et un autre, disons, Cr[i]=Low[i] + Range*0.75 ;(je ne veux pas chercher à nouveau dans les dossiers et le code).
Il n'y a pas de données sources. Essayez de chercher ici.
 
Il existe un ordre BUY_STOP qui a été supprimé avant l'exécution :




Vérifiez le code :
            for(int cnt_1=OrdersHistoryTotal()-1; cnt_1>=0; cnt_1--) {
               if(OrderSelect(cnt_1, SELECT_BY_POS, MODE_HISTORY)==true ) {
                  if(OrderSymbol()==Symbol()   &&   OrderCloseTime()!=0   &&   OrderMagicNumber()==My_Magic_Number ) {
                     Print("OrderProfit()=",OrderProfit(), "   OrderCloseTime()=",TimeToStr(OrderCloseTime(),TIME_DATE|TIME_SECONDS), "   OrderType()=",OrderType(), "   OrderTicket()=",OrderTicket(), "   OrderClosePrice()=",OrderClosePrice(), "   OrderOpenPrice()=",OrderOpenPrice() );
                  } // if(OrderSymbol()==Symbol()   &&   OrderCloseTime()!=0   &&   OrderMagicNumber()==My_Magic_Number ) {
               }
            } // for(int cnt_1=0; cnt_1<OrdersHistoryTotal(); cnt_1++) {

Chaîne avec le résultat :
OrderProfit()=0   OrderCloseTime()=2001.01.26 06:15:00   OrderType()=4   OrderTicket()=24   OrderClosePrice()=0.9237   OrderOpenPrice()=0.9419

1, OrderType=4 - "4" est OP_SELLLIMIT, non ?
2. OrderClosePrice()=0.9237 OrderOpenPrice()=0.9419 - D'où vient la valeur de OrderClosePrice() non égale à OrderOpenPrice() ?

 
chief2000:

Il existe un ordre BUY_STOP qui a été supprimé avant l'exécution :




Vérifiez le code :

Chaîne avec le résultat :

1, OrderType=4 - "4" est OP_SELLLIMIT, non ?
2. OrderClosePrice()=0.9237 OrderOpenPrice()=0.9419 - d'où vient la valeur de OrderClosePrice() non égale à OrderOpenPrice() ?

et dans le mode de visualisation du testeur, sur tous les ticks, en mode pas à pas (F12 sur pause) trouver le moment de sa suppression et regarder le prix actuel, peut être que le chien y est caché ?
 
artmedia70:
et vous dans le testeur en mode visualisation, oui sur tous les ticks, en mode pas à pas (F12 sur pause) trouvez le moment de son retrait et voyez le prix actuel, c'est peut-être là que le chien est enterré ?


BINGO ! Je ne le savais pas, mais tout se passe comme vous l'avez écrit, c'est-à-dire que le prix de clôture dans ce cas est la valeur du prix au moment où l'ordre a été supprimé. Merci !
 

Souvent, je déclarais une variable comme celle-ci à l'intérieur des fonctions :

int err = GetLastError();

Plus loin, à une certaine condition, je l'appelle déjà pour voir s'il y a une erreur. Eh bien, ce n'est pas seulement moi, mais de nombreux autres endroits du code que j'ai rencontrés. Pour ainsi dire, c'est une situation typique. J'ai pensé aujourd'hui qu'il n'est pas logique de déclarer la même variable à chaque fois dans chaque fonction où l'on veut contrôler les erreurs. J'y ai réfléchi et j'en suis arrivé à la conclusion qu'il serait plus facile de déclarer globalement une fois et de l'initialiser dans le init. C'est comme ça :

// Объявили на глобальном уровне
int err;

// Инициируем данную переменную:
int init()
{
    err = GetLastError();
}

Et encore, lorsque vous devez appeler la variable err dans des fonctions utilisateur, sachant qu'elle a déjà une valeur. En fait, GetLastError() sort le code de la dernière erreur, donc si cette variable err est appelée dans chaque fonction à la fin de tous les calculs, qui est responsable de la sortie du code d'erreur, et appelle GetLastError(), alors tout sera correct, non ?

Mais si vous n'appelez pas cette variable à la fin d'une fonction (en suivant la chaîne d'exécution du code), elle ne sera pas réinitialisée, et il pourrait y avoir une erreur d'exécution, dans le cas où il y avait une erreur dans la chaîne d'exécution précédente, mais pas dans la chaîne actuelle, mais le code d'erreur est retourné en dernier... Et pour la réinitialiser, vous devez appeler cette fonction GetLastError(). C'est-à-dire qu'ici tout dépend du fait qu'il ait été appelé ou non. Si vous n'êtes pas sûr qu'il sera partout, il est plus facile de le réassurer et de le remettre à zéro à chaque fois, non ?