Questions des débutants MQL4 MT4 MetaTrader 4 - page 112

 
Николай Цепелев:

Bonjour. J'ai écrit dans mon EA le calcul du lot comme ceci :

lot=NormalizeDouble(AccountBalance()*risk/(SL*MarketInfo(Symbol(),MODE_TICKVALUE)),2) ;

L'objectif est d'obtenir la taille de lot correcte, quelle que soit la devise et la paire du compte, pour le risque et le seuil de perte spécifiés. Lerisque est défini comme un pourcentage des pertes lorsque le Stop Loss est déclenché. Stop Loss SL en pips (où pips est la plus petite variation possible du prix de la paire). Je vais commencer cet EA sur un compte réel. Mais j'ai des doutes. Si quelqu'un parmi les programmeurs plus expérimentés pouvait me dire quelles erreurs peuvent se produire, je lui en serais très reconnaissant.
Testeur de stratégie d'abord. Ensuite, nous avons un compte de démonstration. Et seulement ensuite le vrai compte. Pour vérifier la formule, écrivez un script. Ou calculez-la sur une feuille de papier. J'ai pris balance=100, risque=0.1 SL=100, Tick=0.00001 Lot=100*0.1 / (100*0.00001) = 10 / 0.001 = 10000 lot de plus que la balance ? Devrions-nous considérer l'effet de levier ?
 
STARIJ:
Premier testeur de stratégie. Puis un compte de démonstration. Et seulement alors un vrai. Pour vérifier la formule, écrivez un script. Ou calculez-la sur une feuille de papier. J'ai pris balance=100, risque=0.1 SL=100, Tick=0.00001 Lot=100*0.1 / (100*0.00001) = 10 / 0.001 = 10000 lot de plus que la balance ? Devrions-nous considérer l'effet de levier ?

MarketInfo(Symbol(),MODE_TICKVALUE)) ne renvoie pas la taille minimale des tick. C'est écrit dans l'aide :

Taille de la variation minimale du prix du symbole dans la monnaie de dépôt.


Mais en fait, il renvoie la valeur de la variation minimale du prix du symbole dans la devise de dépôt d'un lot du contrat.


Dans votre exemple,MarketInfo(Symbol(),MODE_TICKVALUE)) retournera 1. Et alors tout est correct. Je l'ai essayé sur des comptes en dollars réels et en roubles et cela fonctionne. Voici le script que j'ai utilisé pour le vérifier :

#property copyright "Copyright 2016, MetaQuotes Software Corp.

#lien de propriété "https://www.mql5.com"

#propriété version "1.00"

#propriété stricte

#property show_inputs

extern double risk=0.10 ;

extern int sl=1000 ;

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

//| Fonction de démarrage du programme de script |

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

void OnStart()

{

Alert(NormalizeDouble(AccountBalance()*risk/(sl*MarketInfo(Symbol(),MODE_TICKVALUE),2)))

}

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

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Библиотеки: Black or White Text Black or White Text...
 

Vous avez raison. La vérification à l'aide d'un script est plus rapide et plus fiable

//+------------------------------------------------------------------+ 
//| Расчет лота                                                      | 
//+------------------------------------------------------------------+ 
#property strict
#property show_inputs
extern double risk=0.10;
extern int    sl  =100;
void OnStart() 
{ 
   Alert(MarketInfo(Symbol(),MODE_TICKVALUE), "   ",NormalizeDouble(AccountBalance()*risk/(sl*MarketInfo(Symbol(),MODE_TICKVALUE)),2));
}
 
Николай Цепелев:
Votre scénario occupe 19 cm de hauteur sur l'écran, le mien fait 8,1 cm, soit la moitié de sa longueur. Et la couleur est différente
 

Nous devons également faire en sorte que la précision de la fonction NormaliseDouble dépende du lot minimum autorisé. Si vous passez un lot à la fonction OrderSend, par exemple 0,11, et que l'outil n'est négocié qu'avec des lots multiples de 0,1, il y aura une erreur.

 

Je ne comprends pas pourquoi les transactions ouvertes ne sont pas supprimées en une seule fois, c'est-à-dire que l'EA en supprime certaines, mais l'erreur orderdelete 4108, l'ordre de marché ne peut pas être supprimé plusieurs fois, et ce n'est qu'ensuite qu'il les supprime.

  int start()                                     
  {
  
  while(!IsStopped())     
      {               

Refreshrates();

  
   if(cont==true&&NormalizeDouble(AccountProfit(),2)>=0)
    {
     for(i=1; i<=OrdersTotal(); i++)       
        { RefreshRates(); 
         if(OrderSelect(i-1,SELECT_BY_POS)==true
           {                                    
              while(OrderType()==OP_BUYLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
               }
              while(OrderType()==OP_BUY)
              {
               res=false;
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_BID),Slippage);  
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELLLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELL)
              {
               res=false;     
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_ASK),Slippage);
               if(res==true)
               break;
              }     
           }  
         }
}
}  
 
Yevgen Butov:

Je ne comprends pas pourquoi les transactions ouvertes ne sont pas supprimées en une seule fois, c'est-à-dire que l'EA en supprime certaines, mais l'erreur orderdelete 4108, l'ordre de marché ne peut pas être supprimé plusieurs fois, et ce n'est qu'ensuite qu'il les supprime.

Cette page explique comment supprimer. Vous avez 2 erreurs.

 
Bon après-midi. Je demande de l'aide. J'ai cherché sur le NET et sur le forum. Je teste l'Expert Advisor en mode standard, tout est OK... Aucune erreur ou avertissement. J'ai téléchargé les données tick et les ai ajoutées. (J'ai tout fait comme décrit ici - Comment tester les Expert Advisors avec une qualité de 99% - facile, gratuit, légal) et ici - "Comment obtenir une qualité de simulation de 99 % dans le testeur de stratégie Metatrader 4") Au démarrage, erreur constante 'array out of range in 'expert1.0.mq4' (69,25)... Je comprends qu'il s'agit d'un tableau. Je ne sais pas quoi faire. Mais puisque tout est OK en mode standard... Veuillez m'aider
 
qroner:
Au démarrage, il y a une erreur constante array out of range dans 'expert1.0.mq4' (69,25)... J'ai compris que c'est à propos du tableau. Je ne sais pas quoi faire.

J'ai besoin de voir le code, ou un morceau de code, qui gère ce tableau.

Télépathes, reposez-vous aujourd'hui.

 
Konstantin Nikitin:

Vous devez regarder le code ou une partie du code qui gère le tableau.

Télépathes, reposez-vous aujourd'hui.

void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8]){
ArrayInitialize(_Mas, 0) ;
int Ticket=-1 ;
for(int pos=OrdersTotal()-1 ; pos>=0 ; pos--){
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol&&.
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket){
Ticket=OrderTicket() ;
switch(OrderType()){
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}

}

Voici la fonction.

Je pensais juste que le problème n'était pas dans le code car il n'y a pas d'erreurs en mode standard.

Raison: