Apprendre et écrire ensemble en MQL5 - page 24

 

Que fait cette fonction de manière claire pour tout le monde ?

int OpenSell(double volume,int slippage=10,string comment="Open Short EUR/USD (Sell)",int magic0=102406)

{

MqlTradeRequest my_trade ;

MqlTradeResult mon_trade_result ;

mon_trade.action=TRADE_ACTION_DEAL ;

mon_marché.symbole=Symbole() ;

my_trade.volume=NormalizeDouble(volume,1) ;

my_trade.price=NormalizeDouble(Bid,_Digits) ;

my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Digits) ;

my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits) ;

mon_trade.deviation=slippage ;

mon_trade.type=ORDER_TYPE_SELL ;

mon_trade.type_filling=ORDER_FILLING_AON ;

mon_trade.comment=comment ;

mon_trade.magic=magique ;


ResetLastError() ;

if(OrderSend(my_trade,my_trade_result))

{

time_oc=TimeLocal() ;

md=0 ;

Print( " Code de résultat de l'opération - " ,my_trade_result.retcode) ;

}

sinon

{

Print("Code de résultat de l'opération - ",my_trade_result.retcode) ;

Print("Erreur d'ouverture de commande = ",GetLastError()) ;

}

retour(0) ;

}

Dans la procédure OnTick()

...

OpenSell(Lots,10, "EUR/USD (Sell)",102406) ;

...

Au tout début :

double StopLoss=250,

TakeProfit=1400 ;

extern double Lots = 0.1 ;

Pourquoi diable 220 $ figurent-ils dans les résultats des tests ?

<DATE> <BALANCE> <ÉQUITÉ> <NIVEAU DE MARGE

01,01,2010 0 :00:00 10000 10000 0

11,01,2010 2 :57:00 9779,29 9841,92 6827

15,01,2010 16:00:00 9829,8 9941,9 6857

22,01,2010 14:32:00 10124,1 10135,9 7167

26,01,2010 2 :14:00 10048,6 10048,6 0

26,01,2010 4 :06:00 10048,6 10038,4 7099

27,01,2010 21:12:00 10188,5 10188,5 0

29,01,2010 2 :16:00 10188,5 10308 7346

29,01,2010 7 :14:00 10188,5 10277,4 7324

04,02,2010 22:05:00 10418,63 10480,83 7592


Si j'ai tort, frappez-moi dans le nez.

Je ne vous laisserai pas voir l'ensemble de l'EA. La fonction sur Buy est similaire...

Je ferme la position avec l'ordre opposé.

 

Très bien. J'ai crié comme un fou. J'apprends juste la langue. Si j'ai offensé quelqu'un, je m'en excuse. Je vais travailler et chercher le problème. Je l'ai probablement fait moi-même, mais je veux vraiment apprendre comment faire de bons EAs en utilisant mql5. C'est un très bon système, mais . J'ai des problèmes avec elle jusqu'à présent.

Bien que j'aie 20 conseillers experts sur mql4 sans aucun problème.

 
Khomtchenko:
...
Il serait préférable de donner l'historique des transactions pour la période en question, plutôt que ces chiffres inconnus. Alors peut-être que l'origine de la perte sera plus claire.
 

J'ai commencé à étudier petit à petit la section "Opérations sur les fichiers". Savez-vous s'il existe des tutoriels sur la façon de travailler avec des fichiers dans MQL5 ?

 

Quelle est la bonne façon de supprimer toutes les commandes avec un certain mode ?

J'ai deux fonctions pour cela, check_orders vérifie les commandes avec un certain mode, et remove_sl les supprime :

void remove_sl()
     {
      int counter01;
      ulong counter02;
      while(check_orders()==true)
        {
         for(counter01=0; counter01<OrdersTotal(); counter01++)
           {
            counter02=OrderGetTicket(counter01);
            if(OrderGetInteger(ORDER_MAGIC)!=magick)
               continue;
            remove_request.action=TRADE_ACTION_REMOVE; remove_request.order=counter02;
            if(OrderCheck(start_request,check_result)==true)
               OrderSend(start_request,trade_result);
           }
        }
     }



bool check_orders()
     {
      int counter01;
      bool order_exist=false;
      for(counter01=0; counter01<OrdersTotal(); counter01++)
        {
         OrderGetTicket(counter01);
         if(OrderGetInteger(ORDER_MAGIC)==magick)
           {
            order_exist=true;
            break;
           }
        }
      return(order_exist);
 

Le problème est que ces lignes apparaissent dans le journal de l'EA :

2011.05.11 21:40:19 Trades '726238' : échec de l'annulation de l'ordre #4375237 buy 0.00 at 0.00000 [Requête invalide].
C'est-à-dire qu'il y a des demandes redondantes au serveur de négociation pour supprimer l'ordre ; la demande de suppression a déjà été envoyée.

 

Je pense que j'ai un problème avec les positions de fermeture et d'ouverture.

D'une manière ou d'une autre, au lieu d'avoir une position pour 0,1 lot, j'ai en fait plusieurs lots. Apparemment, les positions d'un symbole se chevauchent et le volume de la position augmente. C'est la seule façon d'expliquer les problèmes mentionnés ci-dessus avec les grandes valeurs d'arrêt et la grande différence lors des tests. Cela signifie que j'analyse mal la présence de transactions ouvertes ou que je ferme mal les pistes.

C'est la procédure que j'utilise pour déterminer s'il y a une position ouverte par un symbole :

int Total()

{

compte=0 ;

for (i=0 ; i<=PositionsTotal() ; i++)

{

si (PositionGetSymbol(i)==_Symbol) {count++;}

}

return(count) ;

}

Bien entendu, la fonction renvoie soit 0 soit 1.

J'utilise l'entrée suivante pour ouvrir des ordres

si (Total()<1)

{

if (# some check on indicators#) OpenBuy(Lots,10, "EUR/USD (Buy)",102406) ;

if (#some check on indicators#) OpenSell(Lots,10, "EUR/USD (Sell)",102406) ;

}

J'ai ouvert l'achat et la vente, on dirait :

int OpenSell(double volume,int slippage=10,string comment="Open Short EUR/USD (Sell)",int magic0=102406)

{

MqlTradeRequest my_trade ;

MqlTradeResult mon_trade_result ;

mon_trade.action=TRADE_ACTION_DEAL ;

mon_marché.symbole=Symbole() ;

my_trade.volume=NormalizeDouble(volume,1) ;

my_trade.price=NormalizeDouble(Bid,_Digits) ;

my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Digits) ;

my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Digits) ;

mon_trade.deviation=slippage ;

mon_trade.type=ORDER_TYPE_SELL ;

mon_trade.type_filling=ORDER_FILLING_AON ;

mon_trade.comment=comment ;

mon_trade.magic=magique ;


ResetLastError() ;

if(OrderSend(my_trade,my_trade_result))

{

time_oc=TimeLocal() ;

md=0 ;

Print( " Code de résultat de l'opération - " ,my_trade_result.retcode) ;

}

sinon

{

Print("Code de résultat de l'opération - ",my_trade_result.retcode) ;

Print("Erreur d'ouverture de commande = ",GetLastError()) ;

}

retour(0) ;

}

Je ferme les transactions dans la procédure principale de la même manière :

si (Total()>0) TryToClose() ;

TryToClose est comme ça :

int TryToClose()
{
for (i=0 ; i<=PositionsTotal() ; i++)
{
si (PositionGetSymbol(i)==_Symbol)
{
si (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
if(# some indicator check#) OpenSell(Lots,10, "EUR/USD (Sell)",102406)
si(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
if(# some indicator check#) OpenBuy(Lots,10, "EUR/USD (Buy)",102406) ;
}
}
retour(0) ;

}

L'indicateur vérifie que s'il doit y avoir une position d'achat et qu'il y a une position de vente, alors nous faisons un achat.

Où j'ai fait une erreur. Pourquoi est-ce que j'ai des positions élargies.

 
Khomtchenko:

Insérez le code via le bouton SRC

Будет читабельнее
Connaissez-vous la différence entre un ordre MT4 et un ordre MT5 ?
 

Dans mql4, les ordres sont soit négociés, soit en attente.

En mql5, un ordre est une transaction en attente. L'entrée sur le marché est l'ouverture d'une position. Lorsque l'ordre est déclenché, une position est ouverte. Il ne peut y avoir qu'une seule position pour un symbole, et il peut y avoir autant de commandes que l'on veut.

Спасибо за подсказку
 

Tout le monde n'arrête pas de faire allusion au fait que je suis stupide. Je suis peut-être stupide. Eh bien, trouvez mes erreurs pour que je puisse les corriger.

 
Khomtchenko:

Je sens comme un soupçon de stupidité. Je suis peut-être stupide. Eh bien, trouvez mes erreurs pour que je puisse les corriger.

Je ne fais aucune allusion, je suis juste passé par là et j'ai demandé quelle était la raison la plus fréquente, je ne connais pas votre niveau d'entraînement.

Je suis ici depuis longtemps, je me suis déjà fait une opinion sur beaucoup de gens (chacun est fort à sa manière), je ne vous connais pas encore, alors je ne vais pas faire d'allusion.


Je ne vois pas la stratégie dans son ensemble. A en juger par la façon dont vous passez les positions, la stratégie est multi-devises.

Mais vous n'avez prescrit qu'un seul outil, si l'outil est unique, pourquoi passer par toutes les positions ?

Si vous connaissez l'instrument, vous n'avez pas besoin de parcourir toutes les positions pour les trouver, il vous suffit d'utiliser cette fonction :

bool  PositionSelect(
   string  symbol     // имя инструмента
   );