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

 

Je n'arrive pas à terminer le Conseiller Expert. L'essentiel est simple : je dessine d'abord un rectangle, qui est un déclencheur d'achat, au cas où le prix se trouve dans sa zone, puis je dessine le second - lorsque le prix s'y trouve, la transaction doit être conclue.

Mais c'est le contraire qui se produit : le prix commence à s'ouvrir et à se fermer à l'intérieur de la zone. Qu'est-ce que je fais de mal ?


//+------------------------------------------------------------------+

| RECTANGLES OP_BUY.mq4 |

//+------------------------------------------------------------------+

#property copyright ""

#propriété lien ""

#propriété version "1.00"

#propriété stricte


extern int Magic = 777701 ;

extern double Lot = 0.01 ;

extern int Slippage = 3 ;



int ticket ;

int OrderOfSymbol ;




//+------------------------------------------------------------------+

//| Fonction d'initialisation de l'expert |

//+------------------------------------------------------------------+

int OnInit()

{

//---

return(INIT_SUCCEEDED) ;

}

//+------------------------------------------------------------------+

//| Fonction de désinitialisation experte |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

//---

}

//+------------------------------------------------------------------+

//| fonction tick expert |

//+------------------------------------------------------------------+

void OnTick()

{

//---

//Check for a rectangle:

if(ObjectsTotal(OBJ_RECTANGLE)==0)

{Comment("Dessinez un rectangle pour ouvrir une transaction d'achat !");}


//Recevoir le NOM du rectangle :

for(int n=0;n<ObjectsTotal();n++)

{

chaîne de caractères name=ObjectName(n) ;

if(ObjectType(name)==OBJ_RECTANGLE)

{

datetime t1a = (datetime) ObjectGet(name,OBJPROP_TIME1) ;

datetime t2a = (datetime) ObjectGet(name,OBJPROP_TIME2) ;


double p1a=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE1),Digits) ;

double p2a=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE2),Digits) ;

OrderOfSymbol=CounterOrderTradeType(-1) ;

si (OrderOfSymbol<1)

si (Close[1]>Open[1])

if(TimeCurrent()>t1a && TimeCurrent()< t2a &&

Bid < p1a && Bid > p2a )

{

ticket = OrderSend(Symbol(),OP_BUY, Lot, Ask, Slippage, 0, 0, "open buy order", Magic, 0, Blue) ;

}

}

}

//Check s'il y a déjà un deuxièmerectangle:

if(ObjectsTotal(OBJ_RECTANGLE)==1)

{Comment("Dessinez un deuxième rectangle pour clôturer la transaction d'achat !");}


//Recevoir le NOM du rectangle :

for(int n=0;n<ObjectsTotal();n++)

{

chaîne de caractères name=ObjectName(n) ;

if(ObjectType(name)==OBJ_RECTANGLE)

{

datetime t1b = (datetime) ObjectGet(name,OBJPROP_TIME1) ;

datetime t2b = (datetime) ObjectGet(name,OBJPROP_TIME2) ;


double p1b=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE1),Digits) ;

double p2b=NormalizeDouble(ObjectGet(name,OBJPROP_PRICE2),Digits) ;


if(TimeCurrent()>t1b && TimeCurrent()< t2b &&

Bid < p1b && Bid > p2b )

CloseBuyPositions1() ;

}

}

//Check pour voir s'il y a déjà un 2ème rectangle:

si(ObjectsTotal(OBJ_CHANNEL)==2)

{Comment("Les zones d'ouverture et de fermeture de l'ordre d'achat sont définies - l'opération est lancée !");}


}

//+------------------------------------------------------------------+

void CloseBuyPositions1()

{

for(int i = OrdersTotal() - 1 ; i >= 0 ; i--)

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

si(OrderMagicNumber() == Magique)

si(OrderSymbol() == Symbol())

{



si(OrderType()==OP_BUY)

{

if(OrderClose(OrderTicket(), OrderLots(), Bid, 3, NULL)){Print("Order Close");}

}

}

}

//+------------------------------------------------------------------+

//| Comptage des commandes |

//+------------------------------------------------------------------+

int CounterOrderTradeType(ENUM_ORDER_TYPE type_d'ordre)

{

int cnt=0 ;

//----

for(int pos=OrdersTotal()-1;pos>=0;pos--)

{

si(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)==false) continuer ;

si(OrderSymbol()!=_Symbol) continuer ;

if(order_type == OrderType() || order_type == -1) cnt++ ;

}

//----

retour(cnt) ;

}

 
Порт-моне тв:

Il y a une fonction pour poster du code comme celui-ci, cela facilitera la lecture de votre code par tout le monde pour vous aider.

 
MakarFX:

Il y a une fonction pour poster du code comme celui-ci, cela faciliterait la lecture de votre code par tout le monde pour vous aider.

Ça ne l'aidera pas. Les lignes vierges ne sont lues que par des gens comme lui.

 

Порт-моне тв:

Qu'est-ce que je fais de mal ?

Il n'y a pas d'unicité dans le nom du carré, vous avez n'importe quel carré comme condition pour acheter et vendre

 
Порт-моне тв:

Cela vous aidera également


 

Veuillez indiquer comment corriger l'erreur

//+------------------------------------------------------------------+
#property copyright   "Copyright 2020,"
#property version     "1.0"
#property strict

//--- Inputs
int   side_position                    = 1;
input ENUM_BASE_CORNER  CornerInfo     = CORNER_RIGHT_UPPER; 
input ENUM_BASE_CORNER  CornerInfo1    = CORNER_LEFT_UPPER; 
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(side_position == 2)
   {
   CornerInfo  = CORNER_RIGHT_LOWER; 
   CornerInfo1 = CORNER_LEFT_LOWER;
   }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+

Voici l'erreur

'CornerInfo' - constant cannot be modified      Wa.mq4  22      1
'CornerInfo1' - constant cannot be modified     Wa.mq4  23      1
2 errors, 0 warnings            3       1
 
Forallf:

Merci !

Vous êtes les bienvenus)

MakarFX:

Pouvez-vous me dire comment corriger l'erreur ?

Voici une erreur

Lesvariables d'entrée ne peuvent pas être modifiées.

Vous pouvez le faire comme ça :

input ENUM_BASE_CORNER  CornerInfo     = CORNER_RIGHT_UPPER; 

ENUM_BASE_CORNER  MyCornerInfo     = CornerInfo; 


.......

if(side_position == 2)
   {
   MyCornerInfo  = CORNER_RIGHT_LOWER; 



 
Aleksei Stepanenko:

Vous êtes les bienvenus)

lesvariables d'entrée ne peuvent pas être modifiées.

Vous pouvez le faire comme ceci :

Merci. Je l'ai.

 
MakarFX:

Cela vous aidera aussi.


Ce n'est pas le cas. Et j'ai réalisé que les valeurs carrées ne sont pas prises sur deux comme elles devraient l'être, mais sur la dernière. Je ne sais pas comment battre ça. Je n'aurais pas pu le découvrir par moi-même. Je ne parle pas couramment le mql, c'est pourquoi je vous demande ici et vous me proposez des peignes.

 
Порт-моне тв:

n'a pas aidé. Et je me suis rendu compte que les valeurs carrées ne sont pas prises sur deux comme elles devraient l'être, mais sur la dernière. Je ne sais pas comment battre ça. Je ne l'aurais pas deviné moi-même. Je ne parle pas couramment le mql, c'est pourquoi je vous le demande, et vous me proposez des peignes.

Je vous offre des peignes pour rendre votre code facile à lire pour ceux à qui vous vous adressez (aucune malice ici).

Quant à vos carrés, pour bien les identifier, vous devez comprendre leur origine, c'est-à-dire que c'est vous qui les dessinez ou un conseiller...