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

 

Oui, en effet. J'ai regardé, mais je ne l'ai pas vu.

Merci. (gloussements)

Je ralentis aujourd'hui. Je dois me reposer pour le week-end.

 
rid >> :

C'est à peu près ça -



Merci ! !! Je vais utiliser....

 
 

Tout de même, le code ne fonctionne pas, a fait toute l'action sur 2 bougies. et a dû apprendre que la position ont déjà plus ne s'ouvrent pas ... parce qu'il a ouvert à tous que je pouvais tout le dépôt utilisé (( Rid regarder, peut-être ce que vous devez ajouter ... serait très reconnaissant

 

Aide. Je veux un EA qui fasse des transactions la nuit. J'écris du code

int start()
{
string Symb;
Symb=Symbol();
string Vremya;
Vremya=TimeToStr(TimeLocal(),TIME_MINUTES);
if(Vremya > 23:00 || Vremya < 06:00 )
{
// тут торговые функции
}
}

Il génère une erreur

'||' - la condition ne peut pas être une chaîne de caractères

Et si la condition est raccourcie à

if(Vremya > 23:00

ça va marcher,

et s'il va sur

si(Vremya < 06:00 )

ça ne marchera pas.


Je ne comprends pas ce qui ne va pas. Pouvez-vous me dire comment régler l'heure ?


 
morok >> :

Tout de même, le code n'a pas fonctionné, j'ai fait toutes les transactions sur 2 chandeliers.

Oui, en effet....

J'ai oublié de régler le magik dans le fi de l'ORDERSEND.

Il fonctionne bien maintenant. Vérifié. Il ne peut y avoir plus de deux transactions dirigées différemment ou plus d'une transaction unidirectionnelle.

S'il n'est pas nécessaire d'avoir plus d'une donne de n'importe quel type, il est nécessaire dans f-ki NumberOfPositions(c) de remplacer le type de donne par -1 (moins un).

extern int   Magic = 777;
extern int       Ema1=14;
extern int       Ema2=48;
double Ema_1;
double Ema_2;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   //int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);   
   int ticket;
//------------------------------------------------
 if ( NumberOfPositions(NULL,OP_BUY, Magic)< 1 && Ema_1> Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.5,Ask,10,Ask-850*Point,Ask+550*Point,"kupil", Magic,0,Green);
    } 
//------------------------------------------------------
   if ( NumberOfPositions(NULL,OP_SELL, Magic)< 1 && Ema_1< Ema_2) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.5,Bid,10,Ask+850*Point,Bid-550*Point,"kupil", Magic,0,Violet);
    } 
//------------------------------------------------------
   return(0);
  }

//жжжжжжжжж Пользовательские функции жжжжжжж

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++)                                    {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()== sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op)                   {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}
  return( kp);
}




 
alderru >> :

Veuillez me dire ce que la fonction iTime indique.

Quel est ce charabia de 10 chiffres ? Des secondes ?

Comment les traduire en année-mois-jour-heure-minute ?

>> Comme ceci : il suffit de définir le décalage de la barre pour obtenir l'heure et la date par défaut (si time=1 ou true, vous obtenez uniquement l'heure).

Fonction très pratique, je la recommande.

string Times(int Sdvig, bool time=0)
{//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  string YAER   = TimeYear( Time[ Sdvig]);
  string DAY    = TimeDay( Time[ Sdvig]);
  string HOUR   = TimeHour( Time[ Sdvig]);
  string MINUTE = TimeMinute( Time[ Sdvig]);
  int month = TimeMonth( Time[ Sdvig]);
  string MONTH;
  switch( month)
    {case 1: MONTH = "янв ";break;
     case 2: MONTH = "фев ";break;
     case 3: MONTH = "март";break;
     case 4: MONTH = "апр ";break;
     case 5: MONTH = "май ";break;
     case 6: MONTH = "июнь";break;
     case 7: MONTH = "июль";break;
     case 8: MONTH = "авг ";break;
     case 9: MONTH = "сен ";break;
     case 10: MONTH = "окт ";break;
     case 11: MONTH = "нояб";break;
     case 12: MONTH = "дек ";break;              
     default: MONTH = "----";break;
    }
 if(TimeHour( Time[ Sdvig])<10) HOUR= "0"+ HOUR;     
 if( MINUTE=="0") MINUTE="00";
 if( time)return( HOUR+":"+ MINUTE);                   
 else return( YAER+"   "+ MONTH+" "+ DAY+"   "+ HOUR+":"+ MINUTE);
}//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

J'ai essayé d'ajuster le deuxième niveau, mais ça n'a pas marché.

J'ai essayé de le faire mais il ouvrait et fermait un ordre immédiatement après le test.

extern int   Magic = 777;
extern int       Ema1=14;
extern int       Ema2=48;
extern int       Ema3=100;
double Ema_1;
double Ema_2;
double Ema_3;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   //int Orders = OrdersTotal(); 
   Ema_1 =iMA(NULL, 0, Ema1, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_2 =iMA(NULL, 0, Ema2, 0,MODE_SMMA, PRICE_MEDIAN, 0);
   Ema_3 =iMA(NULL, 0, Ema3, 0,MODE_SMMA, PRICE_MEDIAN, 0);     
   int ticket;
//------------------------------------------------
 if ( NumberOfPositions(NULL,OP_BUY, Magic)< 1 && Ema_1> Ema_2 && Ema_2> Ema_3) 
    {
      ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,0,"kupil", Magic,0,Green);
    } 
//------------------------------------------------------
   if ( NumberOfPositions(NULL,OP_SELL, Magic)< 1 && Ema_1< Ema_2 && Ema_2< Ema_3) 
    {
      ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,10,0,0,"kupil", Magic,0,Violet);
    } 
//--------------------------------------------------------
 if ( NumberOfPositions(NULL,OP_BUY, Magic)>= 1 && Ema_1< Ema_2) //--проверяю есть ли ордер BUY и крою его если линии ема пересеклись
    {
      ticket=OrderClose(OrderTicket(),0.1,Bid,300,Violet);
    } 
//------------------------------------------------------
 if ( NumberOfPositions(NULL,OP_SELL, Magic)>= 1 && Ema_1> Ema_2) //--проверяю есть ли ордер SEll и крою его если линии ема пересеклись
    {
      ticket=OrderClose(OrderTicket(),0.1,Ask,300,Green);
    } 
//------------------------------------------------------
   return(0);
  }

//жжжжжжжжж Пользовательские функции жжжжжжж

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++)                                    {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()== sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( op<0 || OrderType()== op)                   {
            if ( mn<0 || OrderMagicNumber()== mn) kp++;
          }}}}}
  return( kp);
}
 
rid писал(а) >>

Je l'ai. Pour déterminer s'il y a eu des positions sur l'historique, vous pouvez procéder comme suit :

Mais alors votre code ne fonctionnera que dans le testeur. Sinon, il faudrait changer de magik à chaque fois que vous allumez l'EA en ligne.


Exactement, c'est exactement ce dont nous avons besoin !

Veuillez m'indiquer comment insérer ce code correctement dans cette grille :

(Si je le pose directement, le testeur s'arrête juste à l'ouverture de la première position)

for (int i=0; i< OrdersTotal(); i++)                          {

    if (!(OrderSelect( i, SELECT_BY_POS, MODE_HISTORY ))) continue;

//выбираем из истории счета

    if (OrderSymbol() != Symbol()) continue;    

     if ( OrderMagicNumber()== Magic)                            {

              позиции = true;

                                                             }}



//Открытие позиции:



bool Open_Buy() {

   bool res=false; 

if( условие_1)      {

            if ( советник еще не открывал позиций с Магическим номером)    {

                    res=true;     }}

else    {

    if( условие_1)       { 

   if ( условие_2 опирается на данные прошлого ордера)       { 

   res=true;     }}}

return( res);

}
 
morok >> :

J'ai essayé d'ajuster le deuxième niveau, mais ça n'a pas marché.

Cela semble tout à fait logique mais dans le test, il ouvre et couvre les ordres en même temps.

Je me suis occupé de la fermeture des positions lors de mon passage ici -

https://www.mql5.com/ru/forum/105913

//==================Закрытие позиций ============================
 
//----------------------------------------------------------------------
  for (int v=0; v<OrdersTotal(); v++)                             {       
      if (OrderSelect( v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()== Magic)      { 
//-----------------------------------------------------                  
if(OrderType()== OP_BUY) { // если открыта бай-позиция                                   
  if( вот здесь вставляй свои условия закрытия)  {
    OrderClose(OrderTicket(),OrderLots(),Bid,3,Вlack); // закрываем позицию
                                 }       
                               }  
 //--------------------------------------------------------
if(OrderType()== OP_SELL) { // если открыта селл-позиция 
 if( вот здесь вставляй свои условия закрытия)    {
   OrderClose(OrderTicket(),OrderLots(),Ask,3,Yellow); // закрываем позицию
                     }       
                   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
//------------конец блока закрытия позиций-----------------

Ce bloc doit être inséré dans la fonction START, peut-être au tout début, juste après le calcul de Ema_1, Ema_2, Ema_3.
Et, apparemment, il est nécessaire de faire fonctionner le conseiller par les PRIX OUVERTS, sinon le croisement de la MA fermera constamment les positions ouvertes sur presque chaque tick.

Et de la manière dont vous l'avez fait - cela ne fonctionnerait pas correctement en ligne, car l'EA fermera toutes les positions, même celles ouvertes par un autre EA ou manuellement.

Mais j'ai déjà écrit comment le rendre encore plus simple. Au lieu de NumberOfPositions(NULL,OP_BUY,Magic) et au lieu de NumberOfPositions(NULL,OP_SELL,Magic) lors de l'ouverture des positions, il suffit d'indiquer

NombreDePositions(NULL,-1,Magic)

et alors il n'y aura pas plus d'une position sur le marché en permanence. Sans aucun bloc de fermeture.

Raison: