Question pour les connaisseurs

 

Bonjour. Les experts en programmation peuvent vous aider.

Expert Advisor : Achat - croisement des stochastiques et du signal en zone de survente (en dessous de 25), à condition que

Le Pivot est en dessous du niveau des prix (une sorte de support) ; au contraire, le Pivot est au-dessus du niveau des prix.

Les tests ont montré quelques défauts de programmation. 1) Comment n'ouvrir qu'une seule transaction par signal (lors des tests, j'ai tout perdu, alors que le signal est toujours actif (faux), et que la condition de fermeture de la position s'est déjà produite). 2) si j'ai correctement défini la condition que le Pivot est au-dessus / en dessous du niveau de prix. J'ai des doutes, en regardant le graphique de test.

Si je peux vous aider avec des exemples spécifiques. Je connais la programmation au niveau de la simple compilation ! !!!!!!.

extern double Lots = 0.1 ;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double P_up0,P_down0,P_up1,P_down1 ;
double st_m1,st_s1,st_m2,st_s2,Pivot,ma_s1 ;
int cnt, ticket, total ;

si(Bars<100)
{
Print("barres inférieures à 100") ;
retour(0) ;
}
P_up0=iCustom(0,0, "Price channel",11,0,0) ;
P_down0=iCustom(0,0, "Price channel",11,1,0) ;
P_up1=iCustom(0,0, "Price channel",11,0,1) ;
P_down1=iCustom(0,0, "Price channel",11,1,1) ;
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1) ;
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1) ;
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2) ;
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2) ;
Pivot=iCustom(0,0,Pivot,0,1) ;
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1) ;
//set toutes les données

total=OrdersTotal() ;
si(total<1)
{
// Vérifier la marge libre
si(AccountFreeMargin()<(1000*Lots))
{
Print("Nous n'avons pas d'argent. Marge libre = ", AccountFreeMargin() ;
retour(0) ;
}
// condition d'ouverture de la position BUY
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,",0,0,Green) ;
si(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;
}
else Print("Erreur lors de l'ouverture de l'ordre BUY : ",GetLastError()) ;
retour(0) ;
}
//ouverture de la condition de position SELL
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,",0,0,Red) ;
si(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordre de vente ouvert : ",OrderOpenPrice())
}
else Print("Erreur lors de l'ouverture d'un ordre de VENTE : ",GetLastError()) ;
retour(0) ;
}
retour(0) ;
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ;
si(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // position longue ouverte
{
// condition de clôture de la position longue
si(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet) ;
retour(0) ;
}
}
sinon
{
// condition de clôture de la position courte
si(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet) ;
retour(0) ;
}
}
}
}
retour(0) ;
}




Dossiers :
pivot.mq4  2 kb
 
Kostay:

Bonjour. Les experts en programmation peuvent vous aider.

Expert Advisor : Achat - croisement des stochastiques et du signal en zone de survente (en dessous de 25), à condition que

Le Pivot est en dessous du niveau des prix (une sorte de support) ; au contraire, le Pivot est au-dessus du niveau des prix.

Les tests ont montré quelques défauts de programmation. 1) Comment n'ouvrir qu'un seul trade par signal (lors des tests, j'ai tout perdu, alors que le signal est toujours actif (faux), et que la condition de fermeture de position s'est déjà produite). 2) si j'ai correctement défini la condition que le Pivot est au-dessus / en dessous du niveau de prix. J'ai des doutes, en regardant le graphique de test.

Si je peux vous aider avec des exemples spécifiques. Je sais faire de la programmation au niveau de la simple compilation !!!!!!!.

extern double Lots = 0.1 ;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double P_up0,P_down0,P_up1,P_down1 ;
double st_m1,st_s1,st_m2,st_s2,Pivot,ma_s1 ;
int cnt, ticket, total ;

si(Bars<100)
{
Print("barres inférieures à 100") ;
retour(0) ;
}
P_up0=iCustom(0,0, "Price channel",11,0,0) ;
P_down0=iCustom(0,0, "Price channel",11,1,0) ;
P_up1=iCustom(0,0, "Price channel",11,0,1) ;
P_down1=iCustom(0,0, "Price channel",11,1,1) ;
st_m1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,1) ;
st_s1=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,1) ;
st_m2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_MAIN,2) ;
st_s2=iStochastic(0,0,13,5,8,MODE_SMA,0,MODE_SIGNAL,2) ;
Pivot=iCustom(0,0,Pivot,0,1) ;
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1) ;
//set toutes les données

total=OrdersTotal() ;
si(total<1)
{
// Vérifier la marge libre
si(AccountFreeMargin()<(1000*Lots))
{
Print("Nous n'avons pas d'argent. Marge libre = ", AccountFreeMargin() ;
retour(0) ;
}
// condition d'ouverture de la position BUY
if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,",0,0,Green) ;
si(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordre BUY ouvert : ",OrderOpenPrice()) ;
}
else Print("Erreur lors de l'ouverture de l'ordre BUY : ",GetLastError()) ;
retour(0) ;
}
//ouverture de la condition de position SELL
if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,",0,0,Red) ;
si(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Ordre de vente ouvert : ",OrderOpenPrice())
}
else Print("Erreur lors de l'ouverture d'un ordre de VENTE : ",GetLastError()) ;
retour(0) ;
}
retour(0) ;
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ;
si(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // position longue ouverte
{
// condition de clôture de la position longue
si(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet) ;
retour(0) ;
}
}
sinon
{
// condition de clôture de la position courte
si(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet) ;
retour(0) ;
}
}
}
}
retour(0) ;
}

1) comment faire en sorte qu'une seule affaire soit ouverte à un signal donné ?

J'en ai besoin comme ça :

if(total<1) 
     {
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
         

if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1)
{

         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);

         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Alert("Покупка: ",OrderOpenPrice());                      
           }
         else Alert("ошибка:по цене ",OrderOpenPrice()); 
         return(0); 
        }
        
        
     return(0);
     }
 
J'ai perdu tout mon dépôt au même endroit !
 

Je ne comprends toujours pas ce que j'ai changé dans ce code. il semble être le même !

Et encore, comment puis-je le programmer pour qu'il n'ouvre qu'une seule position par signal ?

Et si une position a été fermée sur la même barre (c'est-à-dire que le signal est toujours actif), alors une nouvelle position ne devrait pas être ouverte.

 
Kostay:

...Cependant, comment puis-je le programmer pour qu'il n'ouvre qu'une seule position par signal ?

Et si une position sur la même barre a été fermée (c'est-à-dire que le signal est toujours actif), alors une nouvelle position ne doit pas être ouverte.

Si l'heure d'ouverture des ordres, y compris les ordres fermés, correspond à la barre actuelle (sur laquelle le signal est apparu), alors nous sommes en train de fumer sur la barrière.

Approximativement :

bool flag=true;
int cnt=OrdersTotal()-1;
for(int i=cnt;i>=0;i--) {
   if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
   if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
      flag=false;
      break;
   }
}
cnt=OrdersHistoryTotal()-1;
for(i=cnt;i>=0;i--) {
   if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
   if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
      flag=false;
      break;
   }
}
if(!flag) return; 
 

Comment plus d'une position peut-elle être ouverte à la fois si cela est présent :

total=OrdersTotal();
if(total<1)

?
 

J'ai inséré votre code dans l'EA, mais le résultat est le même.

J'ai dû mal insérer le cadre. Veuillez réviser.

extern double Lots = 0.1 ;
bool flag=true ;
//+------------------------------------------------------------------+
//|
//+------------------------------------------------------------------+
int start()
{
double P_up0,P_down0,P_up1,P_down1 ;
double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1 ;
int cnt, ticket, total ;

if(Bars<100)
{
Print("bars less than 100") ;
return(0) ;
}
P_up0=iCustom(0,0, "Price channel",11,0,0) ;
P_down0=iCustom(0,0, "Canal de prix",11,1,0) ;
P_up1=iCustom(0,0, "Canal de prix".,11,0,1) ;
P_down1=iCustom(0,0, "Price channel",11,1,1) ;
st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1) ;
st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1) ;
st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2) ;
st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2) ;
Pivot=iCustom(0,0, "Pivot",0,1) ;
ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1) ;
//set all data

total=OrdersTotal() ;
if(total<1)
{
// Check free margin
if(AccountFreeMargin()<(1000*Lots))
{
Print("Nous n'avons pas d'argent. Marge libre = ", AccountFreeMargin()) ;
return(0) ;
}
// Condition d'ouverture de la position BUY
if(st_m2>st_s2&st_m1>st_s1&st_m2<25&&Pivot<ma_s1)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green) ;

if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
Alert("Achat : ",OrderOpenPrice()) ;
}
else Alert("erreur:prix ",OrderOpenPrice()) ;
return(0) ;
}
int cn=OrdersTotal()-1 ;
for(int i=cn;i>=0;i--) {
if( !OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue ;
if(OrderOpenTime()>=Time[0]) { // Temps[0] - si la position s'ouvre sur la barre zéro du symbole actuel
flag=false ;
break ;
}
}
cnt=OrdersHistoryTotal()-1 ;
for(i=cn;i>=0;i--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue ;
if(OrderOpenTime()>=Time[0]) { // Time[0] - si la position est ouverte sur la barre zéro du symbole actuel
flag=false ;
break ;
}
}
if( !flag) return ;
// Condition d'ouverture de la position SELL
if(st_m2<st_s2&st_m1<st_s1&st_m2>75&&Pivot>ma_s1)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,",0",0,0,0,Red) ;
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)
Alert("Achat : ",OrderOpenPrice()) ;
}
else Alert("erreur : prix ",OrderOpenPrice()) ;
return(0) ;
}
int c=OrdersTotal()-1 ;
for(int a=c;a>=0;a--) {
if( !OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue ;
if(OrderOpenTime()>=Time[0]) { // Temps[0] - si la position s'ouvre sur la barre zéro du symbole actuel
flag=false ;
break ;
}
}
cnt=OrdersHistoryTotal()-1 ;
for(a=c;a>=0;a--) {
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue ;
if(OrderOpenTime()>=Time[0]) { // Temps[0] - si la position s'ouvre sur la barre zéro du symbole actuel
flag=false ;
break ;
}
}
if(!flag) return ;
return(0) ;
}
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) ;
if(OrderType()<=OP_SELL &&
OrderSymbol()==Symbol())
{
if(OrderType()==OP_BUY) // position longue ouverte
{
// condition pour fermer une position longue
if(P_down1>P_down0)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)
return(0) ;
}
}
else
{
// condition de clôture de position courte
if(P_up1<P_up0)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet) ;
return(0) ;
}
}
}
}
return(0) ;
}




 
D500_Rised:

Comment peut-il y avoir plus d'une position ouverte en même temps si cela est présent :

total=OrdersTotal();
if(total<1)

?

Vous comprenez mal. il n'y a pas plus d'une position ouverte simultanément !!!!!!! signal est apparu - position ouverte. sur la même barre zéro le prix est allé dans la direction opposée et la condition de fermeture de la position est valide. elle est fermée en conséquence, sur la même barre zéro. Mais l'action du signal n'a pas été annulée. La position s'ouvre et se referme, car elle va dans la direction opposée.

La question est donc de savoir comment faire pour qu'un signal n'ouvre qu'une seule position, même s'il se ferme avec un nouveau tick !

 
Ensuite, il faut faire une interdiction sur le commerce intrabar; faites une recherche avec ces mots clés, vous la trouverez.
 
Kostay:

J'ai inséré votre code dans l'EA, mais le résultat est le même.

J'ai dû mal insérer le code.

S'il vous plaît, mais la prochaine fois, collez le code à travers le bouton

Il ne devrait pas y avoir d'erreurs mais je ne l'ai pas testé.

extern double Lots = 0.1;

//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start() {
   double P_up0,P_down0,P_up1,P_down1;
   double st_m1, st_s1, st_m2, st_s2,Pivot,ma_s1;
   int i, cnt, ticket, total;
   bool flag=true;

   if(Bars<100) {
      Print("bars less than 100");
      return(0); 
   }
// Проверяем стоит ли открываться
   
   cnt=OrdersHistoryTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY )) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   cnt=OrdersTotal()-1;
   for(i=cnt;i>=0;i--) {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderOpenTime()>=Time[0]) { // Time[0] - если позиция открывается на нулевом баре текущего символа
         flag=false;
         break;
      }
   }
   if(!flag) return(0); 
//-----------------------------------------------
   P_up0=iCustom(0,0,"Ценовой канал",11,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",11,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",11,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",11,1,1);
   st_m1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,1);
   st_s1=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,1);
   st_m2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_MAIN,2);
   st_s2=iStochastic(0,0,10,3,3,MODE_SMA,0,MODE_SIGNAL,2);
   Pivot=iCustom(0,0,"Pivot",0,1);
   ma_s1=iMA(0,0,4,0,MODE_SMA,PRICE_CLOSE,1);
//задали все данные 

// Проверка свободной маржи
   if(AccountFreeMargin()<(1000*Lots)) {
      Print("We have no money. Free Margin = ", AccountFreeMargin());
      return(0); 
   }
      
// Условие открытие позиции BUY
   if(st_m2>st_s2&&st_m1>st_s1&&st_m2<25&&Pivot<ma_s1) {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",0,0,Green);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
      
// Условие открытие позиции SELL
   if(st_m2<st_s2&&st_m1<st_s1&&st_m2>75&&Pivot>ma_s1) {
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",0,0,Red);
      if(ticket>0) {
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Alert("Покупка: ",OrderOpenPrice()); 
      }  else Alert("ошибка:по цене ",OrderOpenPrice()); 
      return(0); 
   }
  
   for(i=cnt;i>=0;i--) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol()) {
         if(OrderType()==OP_BUY) {// длинная позиция открыта
// условие закрытие длинной позиции
            if(P_down1>P_down0) {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
               return(0); 
            }
         }  else {
// условие закрытия короткой позиции
               if(P_up1<P_up0) {
                  OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
                  return(0); 
               }
            }
      }
   }
   return(0);
}
 

Une chose étrange se passe avec le Conseiller Expert maintenant. Il ne fonctionne pas avec les fermetures de positions. Il peut y avoir plusieurs positions du même type ouvertes et actives en même temps. Et le résultat : tout se perd sur le même problème, bien que dans une version modifiée !

Raison: