Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1632

 
amsgif80 #:

Voici le code que j'ai essayé d'insérer :

En haut du code, lancez ceci :
enum ENUM_DIRECTION{
DIRECTION_BUY = 0, // achat seulement
DIRECTION_SELL = 1, // vente seulement
DIRECTION_ANY = 2, // achat et vente
} ;

input ENUM_DIRECTION inp_direction = DIRECTION_ANY ; // direction de transaction autorisée


plus loin, trouvez où dans le code ouvre l'achat et où vend. Regardez dans la fonction start() ou OnTick()
où l'achat est dans les conditions ajouter :
if(inp_direction!=DIRECTION_SELL)
où la vente est dans les conditions ajouter :
if(inp_direction!=DIRECTION_BUY )

Où l'avez-vous mis ?
 
MakarFX #:
Où l'avez-vous mis ?
//+------------------------------------------------------------------+
//| Moving Averages.mq5 |
//| Copyright 2009-2013, MetaQuotes Software Corp.
//+------------------------------------------------------------------+





#property copyright "Copyright 2009-2013, MetaQuotes Software Corp.
#lien de propriété"https://www.mql5.com"
#propriété version "1.00"

enum ENUM_DIRECTION{
DIRECTION_BUY = 0, // achat uniquement
DIRECTION_SELL = 1, // vente uniquement
DIRECTION_ANY = 2, // acheter et vendre
} ;

input ENUM_DIRECTION inp_direction = DIRECTION_ANY ; // direction de transaction autorisée

#include <Trade\Trade.mqh>

input double MaximumRisk = 0.02 ; // Risque maximum en pourcentage
input double DecreaseFactor = 3 ; // Facteur de décrémentation
input int MovingPeriod = 12 ; // Période de la moyenne mobile
input int MovingShift = 6 ; // Décalage de la moyenne mobile



//---
int ExtHandle=0 ;


//+------------------------------------------------------------------+
//| Fonction d'initialisation de l'expert |
//+------------------------------------------------------------------+




int OnInit(void)
{
//---
ExtHandle=iMA(_Symbol,_Period,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE) ;
si(ExtHandle==INVALID_HANDLE)
{
printf("Erreur lors de la création de l'indicateur MA") ;
return(INIT_FAILED) ;
}
//---
return(INIT_SUCCEEDED) ;
}
//+------------------------------------------------------------------+
//| fonction tick expert |
//+------------------------------------------------------------------+
void OnTick(void)
{
//---
if(PositionSelect(_Symbol))
CheckForClose() ;
sinon
CheckForOpen() ;
//---
}
//+------------------------------------------------------------------+
//| Fonction de désinitialisation experte |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Calculer la taille optimale du lot |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
{
double prix=0.0 ;
double margin=0.0 ;
//--- calculer la taille du lot
if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))
retour(0.0) ;
if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))
retour(0.0) ;
si(margin<=0.0)
retour(0.0) ;

double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_FREEMARGIN)*MaximumRisk/margin,2) ;
//--- calculer la durée d'une série de transactions perdantes ininterrompues.
si(Facteur de diminution>0)
{
//--- demander l'historique complet des transactions
HistorySelect(0,TimeCurrent()) ;
//--
int orders=HistoryDealsTotal() ; //nombre total de transactions
int losses=0 ; // nombre de transactions perdantes dans la série

for(int i=ordres-1;i>=0;i--)
{
ulong ticket=HistoryDealGetTicket(i) ;
si(ticket==0)
{
Print("HistoryDealGetTicket failed, no trade history") ;
pause ;
}
//--- vérifier le symbole commercial
si(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol)
continuer ;
//--- vérifier le bénéfice
double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT) ;
si(profit>0.0)
pause ;
si(profit<0.0)
pertes++ ;
}
//---
si(pertes>1)
lot=NormaliserDouble(lot-lot*pertes/Facteur de réduction,1) ;
}
//--- normaliser et vérifier les valeurs admissibles du volume de transaction
double stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP) ;
lot=stepvol*NormalizeDouble(lot/stepvol,0) ;

double minvol=SymbolInfoDouble(_Symbole,SYMBOL_VOLUME_MIN) ;
si(lot<minvol)
lot=minvol ;

double maxvol=SymbolInfoDouble(_Symbole,SYMBOL_VOLUME_MAX) ;
si(lot>maxvol)
lot=maxvol ;
//---renvoyer la valeur du volume de la transaction
retour(lot) ;
}


//+------------------------------------------------------------------+
//| Vérifier les conditions de position ouverte |
//+------------------------------------------------------------------+
void CheckForOpen(void)
{
MqlRates rt[2] ;
//--- copier les valeurs de prix
if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
{
Print("CopyRates of ",_Symbol," failed, no history") ;
retour ;
}
//---négocier uniquement au premier tick de la nouvelle barre.
if(rt[1].tick_volume>1)
retour ;
//--- obtenir la valeur actuelle de l'indicateur de moyenne mobile
double ma[1] ;
if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
{
Print("CopyBuffer from iMA failed, no data") ;
retour ;
}
//--- vérification du signal
ENUM_ORDER_TYPE signal=WRONG_VALUE ;

if(rt[0].open>ma[0] && rt[0].close<ma[0])
signal=ORDER_TYPE_SELL ; // condition pour vendre if(inp_direction!=DIRECTION_BUY)
sinon
{
if(rt[0].open<ma[0] && rt[0].close>ma[0])
signal=ORDER_TYPE_BUY ; // condition pour acheter if(inp_direction!=DIRECTION_SELL)
}
//--- contrôles supplémentaires
si(signal!=WRONG_VALUE)
if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
si(Bars(_Symbol,_Period)>100)
{
Commerce CTrade ;
trade.PositionOpen(_Symbol,signal,TradeSizeOptimized(),
SymbolInfoDouble(_Symbol,signal==ORDER_TYPE_SELL ? SYMBOL_BID:SYMBOL_ASK,)
0,0) ;
}
//---
}
//+------------------------------------------------------------------+
//| Vérifier les conditions de fermeture de la position |
//+------------------------------------------------------------------+
void CheckForClose(void)
{
MqlRates rt[2] ;
//--- copier les valeurs de prix
if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
{
Print("CopyRates of ",_Symbol," failed, no history") ;
retour ;
}
//---négocier uniquement au premier tick de la nouvelle barre.
if(rt[1].tick_volume>1)
retour ;
//--- obtenir la valeur actuelle de l'indicateur Moving Average
double ma[1] ;
if(CopyBuffer(ExtHandle,0,0,1,ma)!=1)
{
Print("CopyBuffer from iMA failed, no data") ;
retour ;
}
//--- obtenir le type de la position, sélectionnée précédemment par la fonction PositionSelect().
bool signal=false ;
long type=PositionGetInteger(POSITION_TYPE) ;

if(type==(long)POSITION_TYPE_BUY && rt[0].open>ma[0] && rt[0].close<ma[0])
signal=true ;
if(type==(long)POSITION_TYPE_SELL && rt[0].open<ma[0] && rt[0].close>ma[0])
signal=true ;
//--- contrôles supplémentaires
si(signal)
if(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
si(Bars(_Symbol,_Period)>100)
{
Commerce CTrade ;
trade.PositionClose(_Symbol,3) ;
}
//---
}
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 

Cette section devrait ressembler à ceci

 //--- проверка сигналов
   ENUM_ORDER_TYPE signal=WRONG_VALUE;

   if(rt[0].open>ma[0] && rt[0].close<ma[0])
     {
      if(inp_direction!=DIRECTION_BUY)
         signal=ORDER_TYPE_SELL;
     }
   else
     {
      if(rt[0].open<ma[0] && rt[0].close>ma[0])
        {
         if(inp_direction!=DIRECTION_SELL)
            signal=ORDER_TYPE_BUY;
        }
     }
 //--- дополнительные проверки 
 
MakarFX #:

Cette section devrait être comme ceci.

Makar, celui-ci.

      if(inp_direction==DIRECTION_SELL||inp_direction==DIRECTION_ANY)

est mieux remplacée par celle-ci.

      if(inp_direction!=DIRECTION_BUY)
 
Alexey Viktorov #:

Makar, celui-ci

est mieux remplacée par celle-ci.

Substitué)
 
MakarFX #:

Cette section devrait ressembler à ceci

Merci du fond du cœur ! Tout a marché en même temps, ça marche. Et je me suis déjà creusé les méninges pour savoir comment faire))

 
Puis-je vous poser à nouveau la même question, mais à propos de mon propre conseiller expert généré par un éditeur ? Je pensais que maintenant j'arriverais à le faire moi-même, mais je ne sais pas où mettre ce code Achat/Vente. Je ne sais pas où coller ce code Achat/Vente.
 
amsgif80 #:
Puis-je vous poser à nouveau la même question, mais à propos de ma propre évaluation environnementale simple générée par un éditeur ? Je pensais que maintenant j'allais réussir à le faire moi-même, mais ce n'est pas si facile. Je n'arrive pas à trouver où coller ce code d'achat/vente.
Montrez-moi
 
amsgif80 #:

Je vous ai montré comment insérer le code dans le forum.


 
MakarFX #:

Tu n'as rien changé.

votre appel

est à l'intérieur.

Makar, merci pour le conseil.

Raison: