[ARCHIVE] Toute question de débutant, afin de ne pas encombrer le forum. Professionnels, ne passez pas à côté. Nulle part sans toi - 3. - page 497

 
sss2019:

Dites-moi comment écrire un EA dans ces conditions :

Il y a trois paires de devises sur lesquelles l'EA ouvrira des transactions et l'EA est attaché à un seul graphique et sur les deux autres il fonctionne tout seul, en général, multidevises.

La deuxième condition est que lorsque le prix atteint un certain niveau sur l'une des paires de devises, une transaction est ouverte. Une seule opération peut être ouverte à la fois.

Dès que la transaction est fermée, le conseiller expert peut la rouvrir sur n'importe quelle paire si le prix s'approche.

J'ai défini une variable statique de sorte que tant que la valeur de la variable est fausse, les transactions sont autorisées à être ouvertes et dès qu'un ordre est ouvert sur l'une des paires, la variable prend la valeur vraie. Dès que l'ordre est fermé et que la boucle for ne trouve pas de transaction, la variable prend à nouveau la valeur false.

Et si, par exemple, une seule transaction doit être ouverte pour chacune des paires, cela signifie que chaque paire a sa propre variable.

Existe-t-il une solution plus rationnelle à ce problème ?


Il y a un paramètre tel que "Magik" dans l'ordre - il suffit de compter les ordres avec un certain magik et d'autoriser ou d'interdire les transactions.
 

Comment clôturer correctement les commandes et comment recueillir des informations à leur sujet ?

J'ai écrit l'algorithme suivant : je veux ouvrir une position d'achat lorsque l'ouverture est inférieure à la fractale ascendante et que la clôture est supérieure à la fractale ascendante, et une position de vente lorsque l'ouverture est supérieure à la fractale descendante et que la clôture est inférieure ; je veux également fermer toutes les positions si elles sont inférieures de 85 points ou si l'ordre est ouvert dans les 38 bougies (const. S).J'ai l'impression que rien n'est fermé du tout, juste des ordres fermés et en général j'ai l'impression que je traite les ordres de la mauvaise façon, j'opère incorrectement et ensuite je les ferme de la mauvaise façon)) S'il vous plaît, dites-moi comment les fermer correctement, pour qu'ils ne se glissent pas fermés et où sont les erreurs dans ce code. Ou peut être un exemple de la marche de nyu, dans lequel toutes ces opérations sont faites de manière adéquate. Merci d'avance pour votre aide)


extern int S=38 ; //nombre de chandeliers, après lesquels la position sera fermée
extern int SL=85 ; //le stop, auquel les positions seront fermées dans tous les cas
extern int HIGH=0 ; //sur quel délai les extrêmes seront recherchés (5 ou 1 ou 0(D1))
extern int l=1 ; //nombre de lots à négocier
int massorder[30][30] ; //il y a des données sur les lots OUVERTS
int numb=1 ; //le nombre d'el-ta dans le tableau, qui est oot. lot ouvert
int i=0 ;
int ticket=0 ;
int x=0 ;
double down,up=0 ;
double highH1,lowH1=0 ;

int start()

{
if(Hour()>x)
{
searchH1() ;
up=highH1 ;
down=lowH1 ;
i++ ;
}
//----
if(Open[1]<up && Close[1]>up)//si la bougie est plus basse à l'ouverture et plus basse à la fermeture que le niveau fractal haut, alors
{
ticket=OrderSend(Symbol(),OP_BUY,l,Bid,5,Bid-SL*Point,NULL) ;
i=0 ;
savedata() ;
}
if(Open[1]>down && Close[1]<down)//si la bougie est plus haute à l'ouverture et plus basse à la fermeture que le niveau fractal bas, alors
{
ticket=OrderSend(Symbol(),OP_SELL,l,Ask,5,Ask+SL*Point,NULL) ;
i=0 ;
savedata() ;
}
if(i==S)
{
closeAllticket() ;
closeAllPos() ;
}
i++ ;
//----
x=Hour() ;
if(Hour()==23)
x=-1 ;
return(0) ;
}
//+------------------------------------------------------------------+
void closeAllticket()
{
for(int j=0;j<=numb;j++)
{
OrderClose(massorder[j][0],l,Ask,5) ;
OrderClose(massorder[j][0],l,Bid,5) ;
}
numb=0 ;
}
void closeAllPos()
{

for(int j=0;j<=OrdersTotal();j++)
{
OrderSelect(j,SELECT_BY_POS) ;
OrderClose(OrderTicket(),l,Ask,5) ;
OrderClose(OrderTicket(),l,Bid,5) ;
}
}
void searchH1()//fonction permettant de trouver la fractale
{
if(iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)>iHigh(Symbol(),PERIOD_H1,1) &&.&& iHigh(Symbole(),PERIOD_H1,3)>iHigh(Symbole(),PERIOD_H1,4) && iHigh(Symbole(),PERIOD_H1,3)>iHigh(Symbole(),PERIOD_H1,5))
highH1=iHigh(Symbole(),PERIOD_H1,3)

if(iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,2) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,1) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,4) && iHigh(Symbol(),PERIOD_H1,3)<iHigh(Symbol(),PERIOD_H1,5))
lowH1=iHigh(Symbol(),PERIOD_H1,3) ;
return (0) ;

}

void savedata() //programme pour sauvegarder les données dans le tableau
{

OrderSelect(ticket,SELECT_BY_TICKET) ;
massorder[numb][0]=OrderTicket() ;
massorder[numb][1]=OrderOpenPrice() ;
massorder[numb][2]=OrderStopLoss() ;
massorder[numb][3]=OrderTakeProfit() ;
if(OrderType()==OP_BUY)
massorder[numb][4]=0 ;
if(OrderType()==OP_SELL)
massorder[numb][4]=1 ;
numb++ ;

}
 
Qwertee:

Comment clôturer correctement les commandes et comment recueillir des informations à leur sujet ?

J'ai écrit l'algorithme suivant : je veux ouvrir une position d'achat lorsque l'ouverture est inférieure à la fractale ascendante et que la clôture est supérieure à la fractale ascendante, et une position de vente lorsque l'ouverture est supérieure à la fractale descendante et que la clôture est inférieure ; je veux également fermer toutes les positions si elles sont inférieures de 85 points ou si l'ordre est ouvert dans les 38 bougies (const. S).J'ai l'impression que rien n'est fermé du tout, juste des ordres fermés et en général, j'ai l'impression que je traite les ordres de la mauvaise façon, j'opère incorrectement et ensuite je les ferme de la mauvaise façon)) S'il vous plaît, dites-moi comment les fermer correctement, pour qu'ils ne glissent pas fermés et où il y a des erreurs dans ce code. Ou peut être un exemple de la marche de nyu, dans lequel toutes ces opérations sont faites de manière adéquate. Merci d'avance pour votre aide)


Dans les variables globales, où vous avez spécifié des arrêts au début

extern int MagicNumber = 11113;
int cntBuy = 0, cntSell = 0, totalBuy, totalSell;

avant d'ouvrir des ordres :

           totalBuy = CountTradesBuy();
           totalSell = CountTradesSell();

dans le signal d'ouverture

if((Open[1]<up) && (Close[1]>up) && (totalBuy < 1) && (totalSell < 1))

if((Open[1]>down) && (Close[1]<down) && (totalBuy < 1) && (totalSell < 1))

à la fin de l'EE

int CountTradesBuy() {
   int countBuy = 0;
   for (int tradeBuy = OrdersTotal() - 1; tradeBuy >= 0; tradeBuy--) {
      OrderSelect(tradeBuy, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_BUY) countBuy++;
   }
   return (countBuy);
}

int CountTradesSell() {
   int countSell = 0;
   for (int tradeSell = OrdersTotal() - 1; tradeSell >= 0; tradeSell--) {
      OrderSelect(tradeSell, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_SELL) countSell++;
   }
   return (countSell);
}

Je suppose que je n'ai rien oublié

 
belck:


dans les variables globales, où vous avez spécifié les arrêts au début

avant l'ouverture des commandes :

dans le signal d'ouverture

à la fin de l'EE

comme si rien n'avait été oublié



j'ai mis tout ce que vous avez écrit mais rien n'a changé pour une raison quelconque. le résultat est le même qu'avant et reste toujours, les ordres restent ouverts pendant une grande quantité de temps, et j'ai besoin qu'ils se ferment après les barres S, qu'est-ce que c'est ?????????????????

Dossiers :
ikdgna.mq4  7 kb
 
Qwertee:


J'ai mis tout ce que vous avez écrit mais rien n'a changé. le résultat est tel qu'il était et tel qu'il est maintenant, les ordres sont toujours ouverts beaucoup de temps et j'ai besoin qu'ils se ferment après les barres S, quel est le problème ?????????????????.

L'appel à la fermeture des ordres doit être placé avant l'ouverture des ordres. J'ai ceux-ci à la fermeture :

avant le plus global

#include <stdlib.mqh>


Je le dis comme ça avant d'ouvrir les commandes :

if ()
   {
    CloseAllBuy();
    }
    
       
   if () 
   {
   CloseAllSell();
   }

или

if ()
   {
    CloseAllBuy();
    CloseAllSell();
     }

et ceci à la toute fin de l'EA

void CloseAllBuy()
{
        int i;
        int Orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(Orders > 0)
        {
                for(i = Orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_BUY && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 60 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера BUY #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

void CloseAllSell()
{
        int i;
        int orders = OrdersTotal();
        bool result;
        datetime begin;
        
        if(orders > 0)
        {
                for(i = orders-1; i >= 0; i--)
                {
                        if( OrderSelect(i, SELECT_BY_POS, MODE_TRADES) )
                        {
                                if(OrderSymbol() == Symbol() && OrderType() == OP_SELL && OrderMagicNumber() == MagicNumber)
                                {
                                        RefreshRates();
                                        begin = TimeCurrent();
                    result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow); // закрываем все встречные ордера
                                        while(!result && TimeCurrent() - begin <= 120 && !IsTesting())
                                        {
                                                Sleep(100);
                                                RefreshRates();
                   result = OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), slip, Yellow);//закрываем все встречные ордера
                                        }
                                        if(!result)
                                        {
                                                int error = GetLastError();
                                                Print("Ошибка закрытия ордера SELL #" + OrderTicket() + " " + ErrorDescription(error));
                                        }
                                }
                        }
                        else
                        {
                                Print("Не удалось выбрать открытый ордер:" + ErrorDescription(error));
                        }
                }
        }
}

 

Question aux experts, existe-t-il des critères pour les EA, comme le nombre minimum de lots pour une certaine période du test ? Pourcentage de perte, etc.

J'ai juste 2 EAs, et ils font 100 trades par an, et un autre fait 30 trades en tout... (délais de 15 et 30 respectivement). La rentabilité est bonne, la première est en démo sur de vraies cotations, elle est maintenant en test ... mais quelqu'un peut-il me dire s'il en existe une meilleure .... Mais peut-être que quelqu'un me dira s'il existe de meilleurs tests que dans MT4 ?

 
Pouvez-vous me dire comment exécuter une condition ? Nous avons une condition pour ouvrir un ordre d'achat au prix actuel dès que le prix atteint 1.2550. Ainsi, lorsque le prix est supérieur ou égal à 1.2550, l'ordre est ouvert et lorsque l'ordre est ouvert, la variable statique bloque l'ouverture de nouveaux ordres, jusqu'à ce que l'ordre atteigne 0. Ainsi, dès que l'ordre est fermé et qu'il n'y a plus d'ordres avec cette magie, l'interdiction d'ouverture est levée et un nouvel ordre est ouvert, mais le prix s'est déjà éloigné de ce niveau. Nous avons besoin que le conseiller expert ouvre les ordres de marché lorsque le prix atteint ce niveau, et non les ordres en attente.
 

Bonjour à tous les connaisseurs))))

Il existe un indicateur qui trace une ligne de tendance sur les deux dernières fractales, mais il la trace après une "fractale non confirmée", c'est-à-dire que la deuxième barre ne s'est pas encore formée après la fractale mais la ligne a déjà été tracée. Comment faire pour qu'il s'affiche après la deuxième barre mais pas après la première ? L'indicateur se trouve dans l'onglet.

Dossiers :
 
rigc:

Bonjour à tous les connaisseurs))))

Il existe un indicateur qui trace une ligne de tendance sur les deux dernières fractales, mais il la trace après une "fractale non confirmée", c'est-à-dire que la deuxième barre ne s'est pas encore formée après la fractale mais la ligne a déjà été tracée. Comment faire pour qu'il s'affiche après la deuxième barre mais pas après la première ? L'indicateur se trouve dans l'onglet.


Essayez
Dossiers :
 
Figar0:

Essayez
pas de dessin du tout)))