Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 31

 
Vitalie Postolache:
L'erreur se situe quelque part plus haut dans le code, dans la zone de sélection des commandes.
Je ne touche pas au reste.
 
spoiltboy:
Je ne touche pas au reste.
Dans tous les cas, vous devez voir le code précédent et suivant, et pas seulement les lignes de condition.
 
Artyom Trishkin:
Dans tous les cas, vous devez voir le code précédent et le code suivant, et pas seulement les lignes de condition.
extern int pointsl=100, pointtp=100, MagicB=11111111, MagicS=2222, bars=10 ; extern double lotB=0.1, lotS=0.1 ;
double slB, tpB, slS, tpS ; double x=0, z=0 ;


void OnTick()
{
double maxpr1=9999 ; double minpr1=9999 ;

for(int shift1=0 ; shift1<bars ; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1) ;
si (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0 ; shiftA1<bars ; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1) ;
if (y<minpr1) {minpr1=y;}}

si (BuyLimitCount()==0 && BuyCount()==0){
slB=NormaliserDouble(minpr1-pointsl*Point,5) ;
tpB=NormaliserDouble(minpr1+pointsl*Point,5) ;
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red) ;
si (ticketUP==-1) Print("ERROR OP_BUY") ; sinon Print("OP_BUY OK");}

si (SellLimitCount()==0 && SellCount() ==0){
slS=NormaliserDouble(maxpr1+pointsl*Point,5) ;
tpS=NormaliserDouble(maxpr1+pointsl*Point,5) ;
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue) ;
si (ticketD==-1) Print("ERROR OP_SELL") ; sinon Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1 ; OrderDelete(ticketD);}
if (z!=minpr1){z=minpr1 ; OrderDelete(ticketUP);}


double maxpr=-9999 ; double minpr=9999 ;

for(int shift=0 ; shift<bars ; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift) ;
si (e>maxpr){maxpr=e;}}

for(int shiftA=0 ; shiftA<bars ; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA) ;
si (r<minpr) {minpr=r;}}

chaîne a ;
if(bars==1)a="bar :";
else a= IntegerToString(bars,1) + " bars : " ;
Comment("Last ", a, "max ", DoubleToStr(maxpr, 5), ", min ", DoubleToStr(minpr, 5)," ;
}

int BuyLimitCount(){
int count=0 ;
for(int i=OrdersTotal()-1 ; i>=0 ; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
si(OrderMagicNumber()==MagicB){
si(OrderType()==OP_BUYLIMIT)
count++;}}return(count);}

int BuyCount(){
int count=0 ;
for(int i=OrdersTotal()-1 ; i>=0 ; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
si(OrderMagicNumber()==MagicB){
si(OrderType()==OP_BUY)
count++;}}}return(count);}

int SellLimitCount(){
int count=0 ;
for(int i=OrdersTotal()-1 ; i>=0 ; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
si(OrderMagicNumber()==MagicS){
si(OrderType()==OP_SELLLIMIT)
count++;}}}return(count);}

int SellCount(){
int count=0 ;
for(int i=OrdersTotal()-1 ; i>=0 ; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
si(OrderMagicNumber()==MagicS){
si(OrderType()==OP_SELL)
count++;}}}return(count);}
 
spoiltboy:
...
Et de toute façon, qu'est-ce que vous essayez de faire avec ce, désolé, code effrayant ?
 
spoiltboy:

Voulez-vous nettoyer le code et le coller correctement, en utilisant le SRC ?

Pourquoi n'appliquez vous pas OrderSelect avant d'essayer de supprimer ?

 
spoiltboy:
...

Je ne sais pas pourquoi vous avez besoin de tant de boucles à cet endroit, alors que vous pouvez remplir les champs de structure requis concernant le nombre d'ordres et de positions en une seule fois.

J'ai supprimé les choses inutiles, et j'ai également supprimé la suppression. Il n'est pas nécessaire de supprimer par ticket (il faut quand même le connaître avant de supprimer), mais dans la boucle pour trouver le bon ordre par index, et le supprimer.

Donc, nous avons besoin d'une fonction supplémentaire pour rechercher et supprimer les ordres, qui devrait être appelée en cas de condition, mais quel type de condition - je n'ai pas compris tout de suite en regardant votre code, et je n'ai pas eu le temps de le regarder. Décrivez les conditions nécessaires en mots et nous vous dirons comment supprimer.

Je l'avais écrit tout seul, sans regarder, donc il peut y avoir des erreurs dans la fonction qui remplit la structure avec le nombre d'ordres et de positions - je ne l'ai pas vérifié.

//--- input variables
input    double   LotB=0.1;      // Лот Buy
input    double   LotS=0.1;      // Лот Sell
input    int      Pointsl=100;   // StopLoss в пунктах
input    int      Pointtp=100;   // TakeProfit в пунктах
input    int      NumBars=10;    // Количество баров для поиска Max/Min
input    int      Magic=100500;  // Magic

//--- global variables
struct DataNumOrders
  {
   int buy;          // Количество позиций Buy
   int sell;         // Количество позиций Sell
   int buy_limit;    // Количество ордеров BuyLimit
   int buy_stop;     // Количество ордеров BuyStop
   int sell_limit;   // Количество ордеров SellLimit
   int sell_stop;    // Количество ордеров SellStop
  };
DataNumOrders numOrders;   // Количество ордеров
double lotB, lotS;
int    pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   numBars=(NumBars<1?1:NumBars>Bars?Bars:NumBars);
   pointsl=(Pointsl<0?0:Pointsl);
   pointtp=(Pointtp<0?0:Pointtp);
   double minLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   double maxLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
   lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //--- заполним структуру количеством ордеров и позиций
   GetNumOrders(Symbol(),Magic,numOrders);
  
   //--- найдём максимальную и минимальную цены за bars свечей
   double maxPrice=0.0; double minPrice=DBL_MAX;
   for(int i=0; i<numBars; i++) {
      double max_i=iHigh(Symbol(),PERIOD_CURRENT,i);
      if(max_i>maxPrice) maxPrice=max_i;
      double min_i=iLow(Symbol(),PERIOD_CURRENT,i);
      if(min_i<minPrice) minPrice=min_i;
      }

   //--- выставим BuyLimit
   if(numOrders.buy_limit==0 && numOrders.buy==0) {
      double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits()));
      double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits()));
      int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed);
      if(ticketUP==-1) Print("ERROR OP_BUY");
      else Print("OP_BUY OK");
      }
   //--- выставим SellLimit
   if(numOrders.buy_limit==0 && numOrders.sell==0) {
      double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits()));
      double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits()));
      int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue);
      if(ticketD==-1) Print("ERROR OP_SELL");
      else Print("OP_SELL OK");
      }

   //--- Тут должно быть удаление, но не понятно при каких условиях. Опишите их
  
  
   //---
   string a=(numBars==1)?"bar: ":IntegerToString(numBars,1)+" bar's: ";
   Comment("Last ", a, "max ", DoubleToStr(maxPrice, Digits()), ", min ", DoubleToStr(minPrice, Digits()),".");
  }
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров   |
//+------------------------------------------------------------------+
void GetNumOrders(string symbol_name, int magic_number, DataNumOrders &number_of) {
   ZeroMemory(number_of);
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS)) {
         if(OrderMagicNumber()!=magic_number) continue;
         if(OrderSymbol()!=symbol_name)       continue;
         if(OrderType()==OP_BUY)       number_of.buy++;
         if(OrderType()==OP_BUYLIMIT)  number_of.buy_limit++;
         if(OrderType()==OP_BUYSTOP)   number_of.buy_stop++;
         if(OrderType()==OP_SELL)      number_of.sell++;
         if(OrderType()==OP_SELLLIMIT) number_of.sell_limit++;
         if(OrderType()==OP_SELLSTOP)  number_of.sell_stop++;
         }
      }
}
//+------------------------------------------------------------------+
 
Artyom Trishkin:
En général, qu'essayez-vous de faire avec ce code, désolé, effrayant ?
L'EA compte les min et max des dernières X barres et place des ordres sur celles-ci. Ensuite, si le haut ou le bas diminue ou augmente, nous devons supprimer l'ordre et l'ouvrir en utilisant les nouvelles données.


 

comment écrire ce qui suit :

Si le prix a changé de 1%, disons que le jour d'ouverture est supérieur au jour de fermeture de 1%.

 
Movlat Baghiyev:

comment écrire ce qui suit :

Si le prix a changé de 1%, disons que le jour OUVERT est supérieur au jour FERME de 1%.

C'est différent, maintenant on sait clairement à quoi se rapporte le 1% ;)

if(Open[x] > Close[x]+Open[x]*0.01) {code}
 
spoiltboy:
L'Expert Advisor compte les min et max des X dernières barres et place des ordres en fonction de ceux-ci. En outre, s'il y a une diminution du maximum ou une augmentation du minimum, vous devez supprimer l'ordre correspondant et l'ouvrir avec les nouvelles données.


Pourquoi supprimer quand on peut modifier le prix de fixation et le stop et le takeout par rapport au nouveau niveau ? Après tout, vous ne placez des ordres en attente que lorsqu'il n'y a pas d'ordres en attente ni de positions sur le marché. Donc : s'il y a un ordre en attente sur le marché et qu'il n'y a pas de position correspondante sur le marché, il suffit de modifier les prix de l'ordre en attente - le prix fixé à un nouveau niveau et son ordre stop - respectivement au nouveau niveau.

A chaque fois, vous devez vous souvenir des prix trouvés de Max et Min. Si le prix actuel trouvé de Max est inférieur au précédent, nous modifions la BuyLimit en attente et mémorisons le nouveau prix de Max. Pour le prix de Min, le miroir.

Raison: